From be7be4543a7eb698884fbbd25c793d9291be45bf Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@unibe.ch>
Date: Wed, 27 Sep 2023 13:43:04 +0200
Subject: [PATCH] add summernote pugin

---
 .../summernote/font/summernote.eot            |   Bin 0 -> 14068 bytes
 .../summernote/font/summernote.hash           |     1 +
 .../summernote/font/summernote.ttf            |   Bin 0 -> 13892 bytes
 .../summernote/font/summernote.woff           |   Bin 0 -> 8376 bytes
 .../summernote/font/summernote.woff2          |   Bin 0 -> 6948 bytes
 .../summernote/lang/summernote-ar-AR.js       |   185 +
 .../summernote/lang/summernote-ar-AR.js.map   |     1 +
 .../summernote/lang/summernote-ar-AR.min.js   |     2 +
 .../lang/summernote-ar-AR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-az-AZ.js       |   194 +
 .../summernote/lang/summernote-az-AZ.js.map   |     1 +
 .../summernote/lang/summernote-az-AZ.min.js   |     2 +
 .../lang/summernote-az-AZ.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-bg-BG.js       |   185 +
 .../summernote/lang/summernote-bg-BG.js.map   |     1 +
 .../summernote/lang/summernote-bg-BG.min.js   |     2 +
 .../lang/summernote-bg-BG.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-bn-BD.js       |   189 +
 .../summernote/lang/summernote-bn-BD.js.map   |     1 +
 .../summernote/lang/summernote-bn-BD.min.js   |     2 +
 .../summernote/lang/summernote-ca-ES.js       |   184 +
 .../summernote/lang/summernote-ca-ES.js.map   |     1 +
 .../summernote/lang/summernote-ca-ES.min.js   |     2 +
 .../lang/summernote-ca-ES.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-cs-CZ.js       |   179 +
 .../summernote/lang/summernote-cs-CZ.js.map   |     1 +
 .../summernote/lang/summernote-cs-CZ.min.js   |     2 +
 .../lang/summernote-cs-CZ.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-da-DK.js       |   184 +
 .../summernote/lang/summernote-da-DK.js.map   |     1 +
 .../summernote/lang/summernote-da-DK.min.js   |     2 +
 .../lang/summernote-da-DK.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-de-CH.js       |   186 +
 .../summernote/lang/summernote-de-CH.js.map   |     1 +
 .../summernote/lang/summernote-de-CH.min.js   |     2 +
 .../summernote/lang/summernote-de-DE.js       |   186 +
 .../summernote/lang/summernote-de-DE.js.map   |     1 +
 .../summernote/lang/summernote-de-DE.min.js   |     2 +
 .../lang/summernote-de-DE.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-el-GR.js       |   192 +
 .../summernote/lang/summernote-el-GR.js.map   |     1 +
 .../summernote/lang/summernote-el-GR.min.js   |     2 +
 .../lang/summernote-el-GR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-en-US.js       |   279 +
 .../summernote/lang/summernote-en-US.js.map   |     1 +
 .../summernote/lang/summernote-en-US.min.js   |     2 +
 .../summernote/lang/summernote-es-ES.js       |   191 +
 .../summernote/lang/summernote-es-ES.js.map   |     1 +
 .../summernote/lang/summernote-es-ES.min.js   |     2 +
 .../lang/summernote-es-ES.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-es-EU.js       |   183 +
 .../summernote/lang/summernote-es-EU.js.map   |     1 +
 .../summernote/lang/summernote-es-EU.min.js   |     2 +
 .../lang/summernote-es-EU.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-fa-IR.js       |   184 +
 .../summernote/lang/summernote-fa-IR.js.map   |     1 +
 .../summernote/lang/summernote-fa-IR.min.js   |     2 +
 .../lang/summernote-fa-IR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-fi-FI.js       |   182 +
 .../summernote/lang/summernote-fi-FI.js.map   |     1 +
 .../summernote/lang/summernote-fi-FI.min.js   |     2 +
 .../lang/summernote-fi-FI.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-fr-FR.js       |   185 +
 .../summernote/lang/summernote-fr-FR.js.map   |     1 +
 .../summernote/lang/summernote-fr-FR.min.js   |     2 +
 .../lang/summernote-fr-FR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-gl-ES.js       |   184 +
 .../summernote/lang/summernote-gl-ES.js.map   |     1 +
 .../summernote/lang/summernote-gl-ES.min.js   |     2 +
 .../lang/summernote-gl-ES.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-he-IL.js       |   184 +
 .../summernote/lang/summernote-he-IL.js.map   |     1 +
 .../summernote/lang/summernote-he-IL.min.js   |     2 +
 .../lang/summernote-he-IL.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-hr-HR.js       |   184 +
 .../summernote/lang/summernote-hr-HR.js.map   |     1 +
 .../summernote/lang/summernote-hr-HR.min.js   |     2 +
 .../lang/summernote-hr-HR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-hu-HU.js       |   184 +
 .../summernote/lang/summernote-hu-HU.js.map   |     1 +
 .../summernote/lang/summernote-hu-HU.min.js   |     2 +
 .../lang/summernote-hu-HU.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-id-ID.js       |   184 +
 .../summernote/lang/summernote-id-ID.js.map   |     1 +
 .../summernote/lang/summernote-id-ID.min.js   |     2 +
 .../lang/summernote-id-ID.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-it-IT.js       |   184 +
 .../summernote/lang/summernote-it-IT.js.map   |     1 +
 .../summernote/lang/summernote-it-IT.min.js   |     2 +
 .../lang/summernote-it-IT.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-ja-JP.js       |   184 +
 .../summernote/lang/summernote-ja-JP.js.map   |     1 +
 .../summernote/lang/summernote-ja-JP.min.js   |     2 +
 .../lang/summernote-ja-JP.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-ko-KR.js       |   186 +
 .../summernote/lang/summernote-ko-KR.js.map   |     1 +
 .../summernote/lang/summernote-ko-KR.min.js   |     2 +
 .../lang/summernote-ko-KR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-lt-LT.js       |   184 +
 .../summernote/lang/summernote-lt-LT.js.map   |     1 +
 .../summernote/lang/summernote-lt-LT.min.js   |     2 +
 .../lang/summernote-lt-LT.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-lt-LV.js       |   184 +
 .../summernote/lang/summernote-lt-LV.js.map   |     1 +
 .../summernote/lang/summernote-lt-LV.min.js   |     2 +
 .../lang/summernote-lt-LV.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-mn-MN.js       |   185 +
 .../summernote/lang/summernote-mn-MN.js.map   |     1 +
 .../summernote/lang/summernote-mn-MN.min.js   |     2 +
 .../lang/summernote-mn-MN.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-nb-NO.js       |   183 +
 .../summernote/lang/summernote-nb-NO.js.map   |     1 +
 .../summernote/lang/summernote-nb-NO.min.js   |     2 +
 .../lang/summernote-nb-NO.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-nl-NL.js       |   184 +
 .../summernote/lang/summernote-nl-NL.js.map   |     1 +
 .../summernote/lang/summernote-nl-NL.min.js   |     2 +
 .../lang/summernote-nl-NL.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-pl-PL.js       |   184 +
 .../summernote/lang/summernote-pl-PL.js.map   |     1 +
 .../summernote/lang/summernote-pl-PL.min.js   |     2 +
 .../lang/summernote-pl-PL.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-pt-BR.js       |   185 +
 .../summernote/lang/summernote-pt-BR.js.map   |     1 +
 .../summernote/lang/summernote-pt-BR.min.js   |     2 +
 .../lang/summernote-pt-BR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-pt-PT.js       |   184 +
 .../summernote/lang/summernote-pt-PT.js.map   |     1 +
 .../summernote/lang/summernote-pt-PT.min.js   |     2 +
 .../lang/summernote-pt-PT.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-ro-RO.js       |   184 +
 .../summernote/lang/summernote-ro-RO.js.map   |     1 +
 .../summernote/lang/summernote-ro-RO.min.js   |     2 +
 .../lang/summernote-ro-RO.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-ru-RU.js       |   185 +
 .../summernote/lang/summernote-ru-RU.js.map   |     1 +
 .../summernote/lang/summernote-ru-RU.min.js   |     2 +
 .../lang/summernote-ru-RU.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-sk-SK.js       |   185 +
 .../summernote/lang/summernote-sk-SK.js.map   |     1 +
 .../summernote/lang/summernote-sk-SK.min.js   |     2 +
 .../lang/summernote-sk-SK.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-sl-SI.js       |   184 +
 .../summernote/lang/summernote-sl-SI.js.map   |     1 +
 .../summernote/lang/summernote-sl-SI.min.js   |     2 +
 .../lang/summernote-sl-SI.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-sr-RS-Latin.js |   184 +
 .../lang/summernote-sr-RS-Latin.js.map        |     1 +
 .../lang/summernote-sr-RS-Latin.min.js        |     2 +
 .../summernote-sr-RS-Latin.min.js.LICENSE.txt |     1 +
 .../summernote/lang/summernote-sr-RS.js       |   184 +
 .../summernote/lang/summernote-sr-RS.js.map   |     1 +
 .../summernote/lang/summernote-sr-RS.min.js   |     2 +
 .../lang/summernote-sr-RS.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-sv-SE.js       |   185 +
 .../summernote/lang/summernote-sv-SE.js.map   |     1 +
 .../summernote/lang/summernote-sv-SE.min.js   |     2 +
 .../lang/summernote-sv-SE.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-ta-IN.js       |   184 +
 .../summernote/lang/summernote-ta-IN.js.map   |     1 +
 .../summernote/lang/summernote-ta-IN.min.js   |     2 +
 .../lang/summernote-ta-IN.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-th-TH.js       |   184 +
 .../summernote/lang/summernote-th-TH.js.map   |     1 +
 .../summernote/lang/summernote-th-TH.min.js   |     2 +
 .../lang/summernote-th-TH.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-tr-TR.js       |   186 +
 .../summernote/lang/summernote-tr-TR.js.map   |     1 +
 .../summernote/lang/summernote-tr-TR.min.js   |     2 +
 .../lang/summernote-tr-TR.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-uk-UA.js       |   185 +
 .../summernote/lang/summernote-uk-UA.js.map   |     1 +
 .../summernote/lang/summernote-uk-UA.min.js   |     2 +
 .../lang/summernote-uk-UA.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-uz-UZ.js       |   141 +
 .../summernote/lang/summernote-uz-UZ.js.map   |     1 +
 .../summernote/lang/summernote-uz-UZ.min.js   |     2 +
 .../lang/summernote-uz-UZ.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-vi-VN.js       |   184 +
 .../summernote/lang/summernote-vi-VN.js.map   |     1 +
 .../summernote/lang/summernote-vi-VN.min.js   |     2 +
 .../lang/summernote-vi-VN.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-zh-CN.js       |   184 +
 .../summernote/lang/summernote-zh-CN.js.map   |     1 +
 .../summernote/lang/summernote-zh-CN.min.js   |     2 +
 .../lang/summernote-zh-CN.min.js.LICENSE.txt  |     1 +
 .../summernote/lang/summernote-zh-TW.js       |   184 +
 .../summernote/lang/summernote-zh-TW.js.map   |     1 +
 .../summernote/lang/summernote-zh-TW.min.js   |     2 +
 .../lang/summernote-zh-TW.min.js.LICENSE.txt  |     1 +
 .../databasic/summernote-ext-databasic.css    |    16 +
 .../databasic/summernote-ext-databasic.js     |   291 +
 .../plugin/hello/summernote-ext-hello.js      |    82 +
 .../summernote-ext-specialchars.js            |   311 +
 .../summernote/summernote-bs4.css             |   822 ++
 .../summernote/summernote-bs4.css.map         |     1 +
 .../summernote/summernote-bs4.js              | 10235 +++++++++++++++
 .../summernote/summernote-bs4.js.map          |     1 +
 .../summernote/summernote-bs4.min.css         |     1 +
 .../summernote/summernote-bs4.min.js          |     2 +
 .../summernote-bs4.min.js.LICENSE.txt         |     1 +
 .../summernote/summernote-bs4.min.js.map      |     1 +
 .../summernote/summernote-bs5.css             |   822 ++
 .../summernote/summernote-bs5.css.map         |     1 +
 .../summernote/summernote-bs5.js              | 10235 +++++++++++++++
 .../summernote/summernote-bs5.js.map          |     1 +
 .../summernote/summernote-bs5.min.css         |     1 +
 .../summernote/summernote-bs5.min.js          |     2 +
 .../summernote/summernote-lite.css            |  1505 +++
 .../summernote/summernote-lite.css.map        |     1 +
 .../summernote/summernote-lite.js             | 10783 ++++++++++++++++
 .../summernote/summernote-lite.js.map         |     1 +
 .../summernote/summernote-lite.min.css        |     1 +
 .../summernote/summernote-lite.min.js         |     2 +
 .../summernote-lite.min.js.LICENSE.txt        |     1 +
 .../summernote/summernote-lite.min.js.map     |     1 +
 .../summernote/summernote.css                 |   812 ++
 .../summernote/summernote.css.map             |     1 +
 .../summernote/summernote.js                  | 10229 +++++++++++++++
 .../summernote/summernote.js.map              |     1 +
 .../summernote/summernote.min.css             |     1 +
 .../summernote/summernote.min.js              |     2 +
 .../summernote/summernote.min.js.LICENSE.txt  |     1 +
 .../summernote/summernote.min.js.map          |     1 +
 224 files changed, 55093 insertions(+)
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/font/summernote.eot
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/font/summernote.hash
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/font/summernote.ttf
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/font/summernote.woff
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/font/summernote.woff2
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/plugin/hello/summernote-ext-hello.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/plugin/specialchars/summernote-ext-specialchars.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.css.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.js.map
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.min.css
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.min.js
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.LICENSE.txt
 create mode 100644 public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.map

diff --git a/public_html/vendor/admin-lte-plugins/summernote/font/summernote.eot b/public_html/vendor/admin-lte-plugins/summernote/font/summernote.eot
new file mode 100644
index 0000000000000000000000000000000000000000..bd5e561df9fdc135ae3b9dc49dc42d8842fc34a5
GIT binary patch
literal 14068
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

literal 0
HcmV?d00001

diff --git a/public_html/vendor/admin-lte-plugins/summernote/font/summernote.hash b/public_html/vendor/admin-lte-plugins/summernote/font/summernote.hash
new file mode 100644
index 0000000..05a135b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/font/summernote.hash
@@ -0,0 +1 @@
+9fe8a4284ea6542e5b857380d2288fbd
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/font/summernote.ttf b/public_html/vendor/admin-lte-plugins/summernote/font/summernote.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..4fc4e91aeed39a2921c40199b8672d37609ab1f5
GIT binary patch
literal 13892
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
WmNOPGmN6zVW;5n87BYgCsR95m1CliW

literal 0
HcmV?d00001

diff --git a/public_html/vendor/admin-lte-plugins/summernote/font/summernote.woff b/public_html/vendor/admin-lte-plugins/summernote/font/summernote.woff
new file mode 100644
index 0000000000000000000000000000000000000000..69cda61403f2e22aa4ecfaf190759cbb66aa3e20
GIT binary patch
literal 8376
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

literal 0
HcmV?d00001

diff --git a/public_html/vendor/admin-lte-plugins/summernote/font/summernote.woff2 b/public_html/vendor/admin-lte-plugins/summernote/font/summernote.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..67580535ec6e1760d3c97aafd7d178071994cae2
GIT binary patch
literal 6948
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

literal 0
HcmV?d00001

diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js
new file mode 100644
index 0000000..901ebdf
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'ar-AR': {
+      font: {
+        bold: 'عريض',
+        italic: 'مائل',
+        underline: 'تحته خط',
+        clear: 'مسح التنسيق',
+        height: 'إرتفاع السطر',
+        name: 'الخط',
+        strikethrough: 'فى وسطه خط',
+        subscript: 'مخطوطة',
+        superscript: 'حرف فوقي',
+        size: 'الحجم'
+      },
+      image: {
+        image: 'صورة',
+        insert: 'إضافة صورة',
+        resizeFull: 'الحجم بالكامل',
+        resizeHalf: 'تصغير للنصف',
+        resizeQuarter: 'تصغير للربع',
+        floatLeft: 'تطيير لليسار',
+        floatRight: 'تطيير لليمين',
+        floatNone: 'ثابته',
+        shapeRounded: 'الشكل: تقريب',
+        shapeCircle: 'الشكل: دائرة',
+        shapeThumbnail: 'الشكل: صورة مصغرة',
+        shapeNone: 'الشكل: لا شيء',
+        dragImageHere: 'إدرج الصورة هنا',
+        dropImage: 'إسقاط صورة أو نص',
+        selectFromFiles: 'حدد ملف',
+        maximumFileSize: 'الحد الأقصى لحجم الملف',
+        maximumFileSizeError: 'تم تجاوز الحد الأقصى لحجم الملف',
+        url: 'رابط الصورة',
+        remove: 'حذف الصورة',
+        original: 'Original'
+      },
+      video: {
+        video: 'فيديو',
+        videoLink: 'رابط الفيديو',
+        insert: 'إدراج الفيديو',
+        url: 'رابط الفيديو',
+        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'رابط',
+        insert: 'إدراج',
+        unlink: 'حذف الرابط',
+        edit: 'تعديل',
+        textToDisplay: 'النص',
+        url: 'مسار الرابط',
+        openInNewWindow: 'فتح في نافذة جديدة'
+      },
+      table: {
+        table: 'جدول',
+        addRowAbove: 'إضافة سطر أعلاه',
+        addRowBelow: 'إضافة سطر أدناه',
+        addColLeft: 'إضافة عمود قبله',
+        addColRight: 'إضافة عمود بعده',
+        delRow: 'حذف سطر',
+        delCol: 'حذف عمود',
+        delTable: 'حذف الجدول'
+      },
+      hr: {
+        insert: 'إدراج خط أفقي'
+      },
+      style: {
+        style: 'تنسيق',
+        p: 'عادي',
+        blockquote: 'إقتباس',
+        pre: 'شفيرة',
+        h1: 'عنوان رئيسي 1',
+        h2: 'عنوان رئيسي 2',
+        h3: 'عنوان رئيسي 3',
+        h4: 'عنوان رئيسي 4',
+        h5: 'عنوان رئيسي 5',
+        h6: 'عنوان رئيسي 6'
+      },
+      lists: {
+        unordered: 'قائمة مُنقطة',
+        ordered: 'قائمة مُرقمة'
+      },
+      options: {
+        help: 'مساعدة',
+        fullscreen: 'حجم الشاشة بالكامل',
+        codeview: 'شفيرة المصدر'
+      },
+      paragraph: {
+        paragraph: 'فقرة',
+        outdent: 'محاذاة للخارج',
+        indent: 'محاذاة للداخل',
+        left: 'محاذاة لليسار',
+        center: 'توسيط',
+        right: 'محاذاة لليمين',
+        justify: 'ملئ السطر'
+      },
+      color: {
+        recent: 'تم إستخدامه',
+        more: 'المزيد',
+        background: 'لون الخلفية',
+        foreground: 'لون النص',
+        transparent: 'شفاف',
+        setTransparent: 'بدون خلفية',
+        reset: 'إعادة الضبط',
+        resetToDefault: 'إعادة الضبط',
+        cpSelect: 'اختار'
+      },
+      shortcut: {
+        shortcuts: 'إختصارات',
+        close: 'غلق',
+        textFormatting: 'تنسيق النص',
+        action: 'Action',
+        paragraphFormatting: 'تنسيق الفقرة',
+        documentStyle: 'تنسيق المستند',
+        extraKeys: 'أزرار إضافية'
+      },
+      help: {
+        'insertParagraph': 'إدراج فقرة',
+        'undo': 'تراجع عن آخر أمر',
+        'redo': 'إعادة تنفيذ آخر أمر',
+        'tab': 'إزاحة (تاب)',
+        'untab': 'سحب النص باتجاه البداية',
+        'bold': 'تنسيق عريض',
+        'italic': 'تنسيق مائل',
+        'underline': 'تنسيق خط سفلي',
+        'strikethrough': 'تنسيق خط متوسط للنص',
+        'removeFormat': 'إزالة التنسيقات',
+        'justifyLeft': 'محاذاة لليسار',
+        'justifyCenter': 'محاذاة توسيط',
+        'justifyRight': 'محاذاة لليمين',
+        'justifyFull': 'محاذاة كاملة',
+        'insertUnorderedList': 'قائمة منقّطة',
+        'insertOrderedList': 'قائمة مرقّمة',
+        'outdent': 'إزاحة للأمام على الفقرة الحالية',
+        'indent': 'إزاحة للخلف على الفقرة الحالية',
+        'formatPara': 'تغيير التنسيق للكتلة الحالية إلى فقرة',
+        'formatH1': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 1',
+        'formatH2': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 2',
+        'formatH3': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 3',
+        'formatH4': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 4',
+        'formatH5': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 5',
+        'formatH6': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 6',
+        'insertHorizontalRule': 'إدراج خط أفقي',
+        'linkDialog.show': 'إظهار خصائص الرابط'
+      },
+      history: {
+        undo: 'تراجع',
+        redo: 'إعادة'
+      },
+      specialChar: {
+        specialChar: 'محارف خاصة',
+        select: 'اختر المحرف الخاص'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-ar-AR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js.map
new file mode 100644
index 0000000..6c8ffab
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-ar-AR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-ar-AR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'ar-AR': {\n      font: {\n        bold: 'عريض',\n        italic: 'مائل',\n        underline: 'تحته خط',\n        clear: 'مسح التنسيق',\n        height: 'إرتفاع السطر',\n        name: 'الخط',\n        strikethrough: 'فى وسطه خط',\n        subscript: 'مخطوطة',\n        superscript: 'حرف فوقي',\n        size: 'الحجم',\n      },\n      image: {\n        image: 'صورة',\n        insert: 'إضافة صورة',\n        resizeFull: 'الحجم بالكامل',\n        resizeHalf: 'تصغير للنصف',\n        resizeQuarter: 'تصغير للربع',\n        floatLeft: 'تطيير لليسار',\n        floatRight: 'تطيير لليمين',\n        floatNone: 'ثابته',\n        shapeRounded: 'الشكل: تقريب',\n        shapeCircle: 'الشكل: دائرة',\n        shapeThumbnail: 'الشكل: صورة مصغرة',\n        shapeNone: 'الشكل: لا شيء',\n        dragImageHere: 'إدرج الصورة هنا',\n        dropImage: 'إسقاط صورة أو نص',\n        selectFromFiles: 'حدد ملف',\n        maximumFileSize: 'الحد الأقصى لحجم الملف',\n        maximumFileSizeError: 'تم تجاوز الحد الأقصى لحجم الملف',\n        url: 'رابط الصورة',\n        remove: 'حذف الصورة',\n        original: 'Original',\n      },\n      video: {\n        video: 'فيديو',\n        videoLink: 'رابط الفيديو',\n        insert: 'إدراج الفيديو',\n        url: 'رابط الفيديو',\n        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'رابط',\n        insert: 'إدراج',\n        unlink: 'حذف الرابط',\n        edit: 'تعديل',\n        textToDisplay: 'النص',\n        url: 'مسار الرابط',\n        openInNewWindow: 'فتح في نافذة جديدة',\n      },\n      table: {\n        table: 'جدول',\n        addRowAbove: 'إضافة سطر أعلاه',\n        addRowBelow: 'إضافة سطر أدناه',\n        addColLeft: 'إضافة عمود قبله',\n        addColRight: 'إضافة عمود بعده',\n        delRow: 'حذف سطر',\n        delCol: 'حذف عمود',\n        delTable: 'حذف الجدول',\n      },\n      hr: {\n        insert: 'إدراج خط أفقي',\n      },\n      style: {\n        style: 'تنسيق',\n        p: 'عادي',\n        blockquote: 'إقتباس',\n        pre: 'شفيرة',\n        h1: 'عنوان رئيسي 1',\n        h2: 'عنوان رئيسي 2',\n        h3: 'عنوان رئيسي 3',\n        h4: 'عنوان رئيسي 4',\n        h5: 'عنوان رئيسي 5',\n        h6: 'عنوان رئيسي 6',\n      },\n      lists: {\n        unordered: 'قائمة مُنقطة',\n        ordered: 'قائمة مُرقمة',\n      },\n      options: {\n        help: 'مساعدة',\n        fullscreen: 'حجم الشاشة بالكامل',\n        codeview: 'شفيرة المصدر',\n      },\n      paragraph: {\n        paragraph: 'فقرة',\n        outdent: 'محاذاة للخارج',\n        indent: 'محاذاة للداخل',\n        left: 'محاذاة لليسار',\n        center: 'توسيط',\n        right: 'محاذاة لليمين',\n        justify: 'ملئ السطر',\n      },\n      color: {\n        recent: 'تم إستخدامه',\n        more: 'المزيد',\n        background: 'لون الخلفية',\n        foreground: 'لون النص',\n        transparent: 'شفاف',\n        setTransparent: 'بدون خلفية',\n        reset: 'إعادة الضبط',\n        resetToDefault: 'إعادة الضبط',\n        cpSelect: 'اختار',\n      },\n      shortcut: {\n        shortcuts: 'إختصارات',\n        close: 'غلق',\n        textFormatting: 'تنسيق النص',\n        action: 'Action',\n        paragraphFormatting: 'تنسيق الفقرة',\n        documentStyle: 'تنسيق المستند',\n        extraKeys: 'أزرار إضافية',\n      },\n      help: {\n        'insertParagraph': 'إدراج فقرة',\n        'undo': 'تراجع عن آخر أمر',\n        'redo': 'إعادة تنفيذ آخر أمر',\n        'tab': 'إزاحة (تاب)',\n        'untab': 'سحب النص باتجاه البداية',\n        'bold': 'تنسيق عريض',\n        'italic': 'تنسيق مائل',\n        'underline': 'تنسيق خط سفلي',\n        'strikethrough': 'تنسيق خط متوسط للنص',\n        'removeFormat': 'إزالة التنسيقات',\n        'justifyLeft': 'محاذاة لليسار',\n        'justifyCenter': 'محاذاة توسيط',\n        'justifyRight': 'محاذاة لليمين',\n        'justifyFull': 'محاذاة كاملة',\n        'insertUnorderedList': 'قائمة منقّطة',\n        'insertOrderedList': 'قائمة مرقّمة',\n        'outdent': 'إزاحة للأمام على الفقرة الحالية',\n        'indent': 'إزاحة للخلف على الفقرة الحالية',\n        'formatPara': 'تغيير التنسيق للكتلة الحالية إلى فقرة',\n        'formatH1': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 1',\n        'formatH2': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 2',\n        'formatH3': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 3',\n        'formatH4': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 4',\n        'formatH5': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 5',\n        'formatH6': 'تغيير التنسيق للكتلة الحالية إلى ترويسة 6',\n        'insertHorizontalRule': 'إدراج خط أفقي',\n        'linkDialog.show': 'إظهار خصائص الرابط',\n      },\n      history: {\n        undo: 'تراجع',\n        redo: 'إعادة',\n      },\n      specialChar: {\n        specialChar: 'محارف خاصة',\n        select: 'اختر المحرف الخاص',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js
new file mode 100644
index 0000000..50d1ae4
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"ar-AR":{font:{bold:"عريض",italic:"مائل",underline:"تحته خط",clear:"مسح التنسيق",height:"إرتفاع السطر",name:"الخط",strikethrough:"فى وسطه خط",subscript:"مخطوطة",superscript:"حرف فوقي",size:"الحجم"},image:{image:"صورة",insert:"إضافة صورة",resizeFull:"الحجم بالكامل",resizeHalf:"تصغير للنصف",resizeQuarter:"تصغير للربع",floatLeft:"تطيير لليسار",floatRight:"تطيير لليمين",floatNone:"ثابته",shapeRounded:"الشكل: تقريب",shapeCircle:"الشكل: دائرة",shapeThumbnail:"الشكل: صورة مصغرة",shapeNone:"الشكل: لا شيء",dragImageHere:"إدرج الصورة هنا",dropImage:"إسقاط صورة أو نص",selectFromFiles:"حدد ملف",maximumFileSize:"الحد الأقصى لحجم الملف",maximumFileSizeError:"تم تجاوز الحد الأقصى لحجم الملف",url:"رابط الصورة",remove:"حذف الصورة",original:"Original"},video:{video:"فيديو",videoLink:"رابط الفيديو",insert:"إدراج الفيديو",url:"رابط الفيديو",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"رابط",insert:"إدراج",unlink:"حذف الرابط",edit:"تعديل",textToDisplay:"النص",url:"مسار الرابط",openInNewWindow:"فتح في نافذة جديدة"},table:{table:"جدول",addRowAbove:"إضافة سطر أعلاه",addRowBelow:"إضافة سطر أدناه",addColLeft:"إضافة عمود قبله",addColRight:"إضافة عمود بعده",delRow:"حذف سطر",delCol:"حذف عمود",delTable:"حذف الجدول"},hr:{insert:"إدراج خط أفقي"},style:{style:"تنسيق",p:"عادي",blockquote:"إقتباس",pre:"شفيرة",h1:"عنوان رئيسي 1",h2:"عنوان رئيسي 2",h3:"عنوان رئيسي 3",h4:"عنوان رئيسي 4",h5:"عنوان رئيسي 5",h6:"عنوان رئيسي 6"},lists:{unordered:"قائمة مُنقطة",ordered:"قائمة مُرقمة"},options:{help:"مساعدة",fullscreen:"حجم الشاشة بالكامل",codeview:"شفيرة المصدر"},paragraph:{paragraph:"فقرة",outdent:"محاذاة للخارج",indent:"محاذاة للداخل",left:"محاذاة لليسار",center:"توسيط",right:"محاذاة لليمين",justify:"ملئ السطر"},color:{recent:"تم إستخدامه",more:"المزيد",background:"لون الخلفية",foreground:"لون النص",transparent:"شفاف",setTransparent:"بدون خلفية",reset:"إعادة الضبط",resetToDefault:"إعادة الضبط",cpSelect:"اختار"},shortcut:{shortcuts:"إختصارات",close:"غلق",textFormatting:"تنسيق النص",action:"Action",paragraphFormatting:"تنسيق الفقرة",documentStyle:"تنسيق المستند",extraKeys:"أزرار إضافية"},help:{insertParagraph:"إدراج فقرة",undo:"تراجع عن آخر أمر",redo:"إعادة تنفيذ آخر أمر",tab:"إزاحة (تاب)",untab:"سحب النص باتجاه البداية",bold:"تنسيق عريض",italic:"تنسيق مائل",underline:"تنسيق خط سفلي",strikethrough:"تنسيق خط متوسط للنص",removeFormat:"إزالة التنسيقات",justifyLeft:"محاذاة لليسار",justifyCenter:"محاذاة توسيط",justifyRight:"محاذاة لليمين",justifyFull:"محاذاة كاملة",insertUnorderedList:"قائمة منقّطة",insertOrderedList:"قائمة مرقّمة",outdent:"إزاحة للأمام على الفقرة الحالية",indent:"إزاحة للخلف على الفقرة الحالية",formatPara:"تغيير التنسيق للكتلة الحالية إلى فقرة",formatH1:"تغيير التنسيق للكتلة الحالية إلى ترويسة 1",formatH2:"تغيير التنسيق للكتلة الحالية إلى ترويسة 2",formatH3:"تغيير التنسيق للكتلة الحالية إلى ترويسة 3",formatH4:"تغيير التنسيق للكتلة الحالية إلى ترويسة 4",formatH5:"تغيير التنسيق للكتلة الحالية إلى ترويسة 5",formatH6:"تغيير التنسيق للكتلة الحالية إلى ترويسة 6",insertHorizontalRule:"إدراج خط أفقي","linkDialog.show":"إظهار خصائص الرابط"},history:{undo:"تراجع",redo:"إعادة"},specialChar:{specialChar:"محارف خاصة",select:"اختر المحرف الخاص"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ar-AR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js
new file mode 100644
index 0000000..7c1a741
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js
@@ -0,0 +1,194 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+//Summernote WYSIWYG  editor ucun Azerbaycan dili fayli
+//Tercume etdi: RAMIL ALIYEV
+//Tarix: 20.07.2019
+//Baki Azerbaycan
+//Website: https://ramilaliyev.com
+//Azerbaijan language for Summernote WYSIWYG 
+//Translated by: RAMIL ALIYEV
+//Date: 20.07.2019
+//Baku Azerbaijan
+//Website: https://ramilaliyev.com
+(function ($) {
+  $.extend($.summernote.lang, {
+    'az-AZ': {
+      font: {
+        bold: 'Qalın',
+        italic: 'Əyri',
+        underline: 'Altı xətli',
+        clear: 'Təmizlə',
+        height: 'Sətir hündürlüyü',
+        name: 'Yazı Tipi',
+        strikethrough: 'Üstü xətli',
+        subscript: 'Alt simvol',
+        superscript: 'Üst simvol',
+        size: 'Yazı ölçüsü'
+      },
+      image: {
+        image: 'Şəkil',
+        insert: 'Şəkil əlavə et',
+        resizeFull: 'Original ölçü',
+        resizeHalf: '1/2 ölçü',
+        resizeQuarter: '1/4 ölçü',
+        floatLeft: 'Sola çək',
+        floatRight: 'Sağa çək',
+        floatNone: 'Sola-sağa çəkilməni ləğv et',
+        shapeRounded: 'Şəkil: yuvarlaq künç',
+        shapeCircle: 'Şəkil: Dairə',
+        shapeThumbnail: 'Şəkil: Thumbnail',
+        shapeNone: 'Şəkil: Yox',
+        dragImageHere: 'Bura sürüşdür',
+        dropImage: 'Şəkil və ya mətni buraxın',
+        selectFromFiles: 'Sənəd seçin',
+        maximumFileSize: 'Maksimum sənəd ölçüsü',
+        maximumFileSizeError: 'Maksimum sənəd ölçüsünü keçdiniz.',
+        url: 'Şəkil linki',
+        remove: 'Şəkli sil',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Video linki',
+        insert: 'Video əlavə et',
+        url: 'Video linki?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion və ya Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Link əlavə et',
+        unlink: 'Linki sil',
+        edit: 'Linkə düzəliş et',
+        textToDisplay: 'Ekranda göstəriləcək link adı',
+        url: 'Link ünvanı?',
+        openInNewWindow: 'Yeni pəncərədə aç'
+      },
+      table: {
+        table: 'Cədvəl',
+        addRowAbove: 'Yuxarı sətir əlavə et',
+        addRowBelow: 'Aşağı sətir əlavə et',
+        addColLeft: 'Sola sütun əlavə et',
+        addColRight: 'Sağa sütun əlavə et',
+        delRow: 'Sətiri sil',
+        delCol: 'Sütunu sil',
+        delTable: 'Cədvəli sil'
+      },
+      hr: {
+        insert: 'Üfuqi xətt əlavə et'
+      },
+      style: {
+        style: 'Stil',
+        p: 'p',
+        blockquote: 'İstinad',
+        pre: 'Ön baxış',
+        h1: 'Başlıq 1',
+        h2: 'Başlıq 2',
+        h3: 'Başlıq 3',
+        h4: 'Başlıq 4',
+        h5: 'Başlıq 5',
+        h6: 'Başlıq 6'
+      },
+      lists: {
+        unordered: 'Nizamsız sıra',
+        ordered: 'Nizamlı sıra'
+      },
+      options: {
+        help: 'Kömək',
+        fullscreen: 'Tam ekran',
+        codeview: 'HTML Kodu'
+      },
+      paragraph: {
+        paragraph: 'Paraqraf',
+        outdent: 'Girintini artır',
+        indent: 'Girintini azalt',
+        left: 'Sola çək',
+        center: 'Ortaya çək',
+        right: 'Sağa çək',
+        justify: 'Sola və sağa çək'
+      },
+      color: {
+        recent: 'Son rənk',
+        more: 'Daha çox rənk',
+        background: 'Arxa fon rəngi',
+        foreground: 'Yazı rıngi',
+        transparent: 'Şəffaflıq',
+        setTransparent: 'Şəffaflığı nizamla',
+        reset: 'Sıfırla',
+        resetToDefault: 'Susyama görə sıfırla'
+      },
+      shortcut: {
+        shortcuts: 'Qısayollar',
+        close: 'Bağla',
+        textFormatting: 'Yazı formatlandırmaq',
+        action: 'Hadisə',
+        paragraphFormatting: 'Paraqraf formatlandırmaq',
+        documentStyle: 'Sənəd stili',
+        extraKeys: 'Əlavə'
+      },
+      help: {
+        'insertParagraph': 'Paraqraf əlavə etmək',
+        'undo': 'Son əmri geri alır',
+        'redo': 'Son əmri irəli alır',
+        'tab': 'Girintini artırır',
+        'untab': 'Girintini azaltır',
+        'bold': 'Qalın yazma stilini nizamlayır',
+        'italic': 'İtalik yazma stilini nizamlayır',
+        'underline': 'Altı xətli yazma stilini nizamlayır',
+        'strikethrough': 'Üstü xətli yazma stilini nizamlayır',
+        'removeFormat': 'Formatlandırmanı ləğv edir',
+        'justifyLeft': 'Yazını sola çəkir',
+        'justifyCenter': 'Yazını ortaya çəkir',
+        'justifyRight': 'Yazını sağa çəkir',
+        'justifyFull': 'Yazını hər iki tərəfə yazır',
+        'insertUnorderedList': 'Nizamsız sıra əlavə edir',
+        'insertOrderedList': 'Nizamlı sıra əlavə edir',
+        'outdent': 'Aktiv paraqrafın girintisini azaltır',
+        'indent': 'Aktiv paragrafın girintisini artırır',
+        'formatPara': 'Aktiv bloqun formatını paraqraf (p) olaraq dəyişdirir',
+        'formatH1': 'Aktiv bloqun formatını başlıq 1 (h1) olaraq dəyişdirir',
+        'formatH2': 'Aktiv bloqun formatını başlıq 2 (h2) olaraq dəyişdirir',
+        'formatH3': 'Aktiv bloqun formatını başlıq 3 (h3) olaraq dəyişdirir',
+        'formatH4': 'Aktiv bloqun formatını başlıq 4 (h4) olaraq dəyişdirir',
+        'formatH5': 'Aktiv bloqun formatını başlıq 5 (h5) olaraq dəyişdirir',
+        'formatH6': 'Aktiv bloqun formatını başlıq 6 (h6) olaraq dəyişdirir',
+        'insertHorizontalRule': 'Üfuqi xətt əlavə edir',
+        'linkDialog.show': 'Link parametrləri qutusunu göstərir'
+      },
+      history: {
+        undo: 'Əvvəlki vəziyyət',
+        redo: 'Sonrakı vəziyyət'
+      },
+      specialChar: {
+        specialChar: 'Xüsusi simvollar',
+        select: 'Xüsusi simvolları seçin'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-az-AZ.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js.map
new file mode 100644
index 0000000..fe5d3e7
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-az-AZ.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-az-AZ.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","//Summernote WYSIWYG  editor ucun Azerbaycan dili fayli\n//Tercume etdi: RAMIL ALIYEV\n//Tarix: 20.07.2019\n//Baki Azerbaycan\n//Website: https://ramilaliyev.com\n\n//Azerbaijan language for Summernote WYSIWYG \n//Translated by: RAMIL ALIYEV\n//Date: 20.07.2019\n//Baku Azerbaijan\n//Website: https://ramilaliyev.com\n\n(function($) {\n  $.extend($.summernote.lang, {\n    'az-AZ': {\n      font: {\n        bold: 'Qalın',\n        italic: 'Əyri',\n        underline: 'Altı xətli',\n        clear: 'Təmizlə',\n        height: 'Sətir hündürlüyü',\n        name: 'Yazı Tipi',\n        strikethrough: 'Üstü xətli',\n        subscript: 'Alt simvol',\n        superscript: 'Üst simvol',\n        size: 'Yazı ölçüsü',\n      },\n      image: {\n        image: 'Şəkil',\n        insert: 'Şəkil əlavə et',\n        resizeFull: 'Original ölçü',\n        resizeHalf: '1/2 ölçü',\n        resizeQuarter: '1/4 ölçü',\n        floatLeft: 'Sola çək',\n        floatRight: 'Sağa çək',\n        floatNone: 'Sola-sağa çəkilməni ləğv et',\n        shapeRounded: 'Şəkil: yuvarlaq künç',\n        shapeCircle: 'Şəkil: Dairə',\n        shapeThumbnail: 'Şəkil: Thumbnail',\n        shapeNone: 'Şəkil: Yox',\n        dragImageHere: 'Bura sürüşdür',\n        dropImage: 'Şəkil və ya mətni buraxın',\n        selectFromFiles: 'Sənəd seçin',\n        maximumFileSize: 'Maksimum sənəd ölçüsü',\n        maximumFileSizeError: 'Maksimum sənəd ölçüsünü keçdiniz.',\n        url: 'Şəkil linki',\n        remove: 'Şəkli sil',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Video linki',\n        insert: 'Video əlavə et',\n        url: 'Video linki?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion və ya Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Link əlavə et',\n        unlink: 'Linki sil',\n        edit: 'Linkə düzəliş et',\n        textToDisplay: 'Ekranda göstəriləcək link adı',\n        url: 'Link ünvanı?',\n        openInNewWindow: 'Yeni pəncərədə aç',\n      },\n      table: {\n        table: 'Cədvəl',\n        addRowAbove: 'Yuxarı sətir əlavə et',\n        addRowBelow: 'Aşağı sətir əlavə et',\n        addColLeft: 'Sola sütun əlavə et',\n        addColRight: 'Sağa sütun əlavə et',\n        delRow: 'Sətiri sil',\n        delCol: 'Sütunu sil',\n        delTable: 'Cədvəli sil',\n      },\n      hr: {\n        insert: 'Üfuqi xətt əlavə et',\n      },\n      style: {\n        style: 'Stil',\n        p: 'p',\n        blockquote: 'İstinad',\n        pre: 'Ön baxış',\n        h1: 'Başlıq 1',\n        h2: 'Başlıq 2',\n        h3: 'Başlıq 3',\n        h4: 'Başlıq 4',\n        h5: 'Başlıq 5',\n        h6: 'Başlıq 6',\n      },\n      lists: {\n        unordered: 'Nizamsız sıra',\n        ordered: 'Nizamlı sıra',\n      },\n      options: {\n        help: 'Kömək',\n        fullscreen: 'Tam ekran',\n        codeview: 'HTML Kodu',\n      },\n      paragraph: {\n        paragraph: 'Paraqraf',\n        outdent: 'Girintini artır',\n        indent: 'Girintini azalt',\n        left: 'Sola çək',\n        center: 'Ortaya çək',\n        right: 'Sağa çək',\n        justify: 'Sola və sağa çək',\n      },\n      color: {\n        recent: 'Son rənk',\n        more: 'Daha çox rənk',\n        background: 'Arxa fon rəngi',\n        foreground: 'Yazı rıngi',\n        transparent: 'Şəffaflıq',\n        setTransparent: 'Şəffaflığı nizamla',\n        reset: 'Sıfırla',\n        resetToDefault: 'Susyama görə sıfırla',\n      },\n      shortcut: {\n        shortcuts: 'Qısayollar',\n        close: 'Bağla',\n        textFormatting: 'Yazı formatlandırmaq',\n        action: 'Hadisə',\n        paragraphFormatting: 'Paraqraf formatlandırmaq',\n        documentStyle: 'Sənəd stili',\n        extraKeys: 'Əlavə',\n      },\n      help: {\n        'insertParagraph': 'Paraqraf əlavə etmək',\n        'undo': 'Son əmri geri alır',\n        'redo': 'Son əmri irəli alır',\n        'tab': 'Girintini artırır',\n        'untab': 'Girintini azaltır',\n        'bold': 'Qalın yazma stilini nizamlayır',\n        'italic': 'İtalik yazma stilini nizamlayır',\n        'underline': 'Altı xətli yazma stilini nizamlayır',\n        'strikethrough': 'Üstü xətli yazma stilini nizamlayır',\n        'removeFormat': 'Formatlandırmanı ləğv edir',\n        'justifyLeft': 'Yazını sola çəkir',\n        'justifyCenter': 'Yazını ortaya çəkir',\n        'justifyRight': 'Yazını sağa çəkir',\n        'justifyFull': 'Yazını hər iki tərəfə yazır',\n        'insertUnorderedList': 'Nizamsız sıra əlavə edir',\n        'insertOrderedList': 'Nizamlı sıra əlavə edir',\n        'outdent': 'Aktiv paraqrafın girintisini azaltır',\n        'indent': 'Aktiv paragrafın girintisini artırır',\n        'formatPara': 'Aktiv bloqun formatını paraqraf (p) olaraq dəyişdirir',\n        'formatH1': 'Aktiv bloqun formatını başlıq 1 (h1) olaraq dəyişdirir',\n        'formatH2': 'Aktiv bloqun formatını başlıq 2 (h2) olaraq dəyişdirir',\n        'formatH3': 'Aktiv bloqun formatını başlıq 3 (h3) olaraq dəyişdirir',\n        'formatH4': 'Aktiv bloqun formatını başlıq 4 (h4) olaraq dəyişdirir',\n        'formatH5': 'Aktiv bloqun formatını başlıq 5 (h5) olaraq dəyişdirir',\n        'formatH6': 'Aktiv bloqun formatını başlıq 6 (h6) olaraq dəyişdirir',\n        'insertHorizontalRule': 'Üfuqi xətt əlavə edir',\n        'linkDialog.show': 'Link parametrləri qutusunu göstərir',\n      },\n      history: {\n        undo: 'Əvvəlki vəziyyət',\n        redo: 'Sonrakı vəziyyət',\n      },\n      specialChar: {\n        specialChar: 'Xüsusi simvollar',\n        select: 'Xüsusi simvolları seçin',\n      },\n    },\n  });\n})(jQuery);"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js
new file mode 100644
index 0000000..983a39e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(a,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i();else if("function"==typeof define&&define.amd)define([],i);else{var r=i();for(var l in r)("object"==typeof exports?exports:a)[l]=r[l]}}(self,(function(){return(a=jQuery).extend(a.summernote.lang,{"az-AZ":{font:{bold:"Qalın",italic:"Əyri",underline:"Altı xətli",clear:"Təmizlə",height:"Sətir hündürlüyü",name:"Yazı Tipi",strikethrough:"Üstü xətli",subscript:"Alt simvol",superscript:"Üst simvol",size:"Yazı ölçüsü"},image:{image:"Şəkil",insert:"Şəkil əlavə et",resizeFull:"Original ölçü",resizeHalf:"1/2 ölçü",resizeQuarter:"1/4 ölçü",floatLeft:"Sola çək",floatRight:"Sağa çək",floatNone:"Sola-sağa çəkilməni ləğv et",shapeRounded:"Şəkil: yuvarlaq künç",shapeCircle:"Şəkil: Dairə",shapeThumbnail:"Şəkil: Thumbnail",shapeNone:"Şəkil: Yox",dragImageHere:"Bura sürüşdür",dropImage:"Şəkil və ya mətni buraxın",selectFromFiles:"Sənəd seçin",maximumFileSize:"Maksimum sənəd ölçüsü",maximumFileSizeError:"Maksimum sənəd ölçüsünü keçdiniz.",url:"Şəkil linki",remove:"Şəkli sil",original:"Original"},video:{video:"Video",videoLink:"Video linki",insert:"Video əlavə et",url:"Video linki?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion və ya Youku)"},link:{link:"Link",insert:"Link əlavə et",unlink:"Linki sil",edit:"Linkə düzəliş et",textToDisplay:"Ekranda göstəriləcək link adı",url:"Link ünvanı?",openInNewWindow:"Yeni pəncərədə aç"},table:{table:"Cədvəl",addRowAbove:"Yuxarı sətir əlavə et",addRowBelow:"Aşağı sətir əlavə et",addColLeft:"Sola sütun əlavə et",addColRight:"Sağa sütun əlavə et",delRow:"Sətiri sil",delCol:"Sütunu sil",delTable:"Cədvəli sil"},hr:{insert:"Üfuqi xətt əlavə et"},style:{style:"Stil",p:"p",blockquote:"İstinad",pre:"Ön baxış",h1:"Başlıq 1",h2:"Başlıq 2",h3:"Başlıq 3",h4:"Başlıq 4",h5:"Başlıq 5",h6:"Başlıq 6"},lists:{unordered:"Nizamsız sıra",ordered:"Nizamlı sıra"},options:{help:"Kömək",fullscreen:"Tam ekran",codeview:"HTML Kodu"},paragraph:{paragraph:"Paraqraf",outdent:"Girintini artır",indent:"Girintini azalt",left:"Sola çək",center:"Ortaya çək",right:"Sağa çək",justify:"Sola və sağa çək"},color:{recent:"Son rənk",more:"Daha çox rənk",background:"Arxa fon rəngi",foreground:"Yazı rıngi",transparent:"Şəffaflıq",setTransparent:"Şəffaflığı nizamla",reset:"Sıfırla",resetToDefault:"Susyama görə sıfırla"},shortcut:{shortcuts:"Qısayollar",close:"Bağla",textFormatting:"Yazı formatlandırmaq",action:"Hadisə",paragraphFormatting:"Paraqraf formatlandırmaq",documentStyle:"Sənəd stili",extraKeys:"Əlavə"},help:{insertParagraph:"Paraqraf əlavə etmək",undo:"Son əmri geri alır",redo:"Son əmri irəli alır",tab:"Girintini artırır",untab:"Girintini azaltır",bold:"Qalın yazma stilini nizamlayır",italic:"İtalik yazma stilini nizamlayır",underline:"Altı xətli yazma stilini nizamlayır",strikethrough:"Üstü xətli yazma stilini nizamlayır",removeFormat:"Formatlandırmanı ləğv edir",justifyLeft:"Yazını sola çəkir",justifyCenter:"Yazını ortaya çəkir",justifyRight:"Yazını sağa çəkir",justifyFull:"Yazını hər iki tərəfə yazır",insertUnorderedList:"Nizamsız sıra əlavə edir",insertOrderedList:"Nizamlı sıra əlavə edir",outdent:"Aktiv paraqrafın girintisini azaltır",indent:"Aktiv paragrafın girintisini artırır",formatPara:"Aktiv bloqun formatını paraqraf (p) olaraq dəyişdirir",formatH1:"Aktiv bloqun formatını başlıq 1 (h1) olaraq dəyişdirir",formatH2:"Aktiv bloqun formatını başlıq 2 (h2) olaraq dəyişdirir",formatH3:"Aktiv bloqun formatını başlıq 3 (h3) olaraq dəyişdirir",formatH4:"Aktiv bloqun formatını başlıq 4 (h4) olaraq dəyişdirir",formatH5:"Aktiv bloqun formatını başlıq 5 (h5) olaraq dəyişdirir",formatH6:"Aktiv bloqun formatını başlıq 6 (h6) olaraq dəyişdirir",insertHorizontalRule:"Üfuqi xətt əlavə edir","linkDialog.show":"Link parametrləri qutusunu göstərir"},history:{undo:"Əvvəlki vəziyyət",redo:"Sonrakı vəziyyət"},specialChar:{specialChar:"Xüsusi simvollar",select:"Xüsusi simvolları seçin"}}}),{};var a}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-az-AZ.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js
new file mode 100644
index 0000000..afefe6f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'bg-BG': {
+      font: {
+        bold: 'Удебелен',
+        italic: 'Наклонен',
+        underline: 'Подчертан',
+        clear: 'Изчисти стиловете',
+        height: 'Височина',
+        name: 'Шрифт',
+        strikethrough: 'Задраскано',
+        subscript: 'Долен индекс',
+        superscript: 'Горен индекс',
+        size: 'Размер на шрифта'
+      },
+      image: {
+        image: 'Изображение',
+        insert: 'Постави картинка',
+        resizeFull: 'Цял размер',
+        resizeHalf: 'Размер на 50%',
+        resizeQuarter: 'Размер на 25%',
+        floatLeft: 'Подравни в ляво',
+        floatRight: 'Подравни в дясно',
+        floatNone: 'Без подравняване',
+        shapeRounded: 'Форма: Заоблено',
+        shapeCircle: 'Форма: Кръг',
+        shapeThumbnail: 'Форма: Миниатюра',
+        shapeNone: 'Форма: Без',
+        dragImageHere: 'Пуснете изображението тук',
+        dropImage: 'Пуснете Изображение или Текст',
+        selectFromFiles: 'Изберете файл',
+        maximumFileSize: 'Максимален размер на файла',
+        maximumFileSizeError: 'Достигнат Максимален размер на файла.',
+        url: 'URL адрес на изображение',
+        remove: 'Премахни изображение',
+        original: 'Оригинал'
+      },
+      video: {
+        video: 'Видео',
+        videoLink: 'Видео линк',
+        insert: 'Добави Видео',
+        url: 'Видео URL?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'Връзка',
+        insert: 'Добави връзка',
+        unlink: 'Премахни връзка',
+        edit: 'Промени',
+        textToDisplay: 'Текст за показване',
+        url: 'URL адрес',
+        openInNewWindow: 'Отвори в нов прозорец'
+      },
+      table: {
+        table: 'Таблица',
+        addRowAbove: 'Добави ред отгоре',
+        addRowBelow: 'Добави ред отдолу',
+        addColLeft: 'Добави колона отляво',
+        addColRight: 'Добави колона отдясно',
+        delRow: 'Изтрии ред',
+        delCol: 'Изтрии колона',
+        delTable: 'Изтрии таблица'
+      },
+      hr: {
+        insert: 'Добави хоризонтална линия'
+      },
+      style: {
+        style: 'Стил',
+        p: 'Нормален',
+        blockquote: 'Цитат',
+        pre: 'Код',
+        h1: 'Заглавие 1',
+        h2: 'Заглавие 2',
+        h3: 'Заглавие 3',
+        h4: 'Заглавие 4',
+        h5: 'Заглавие 5',
+        h6: 'Заглавие 6'
+      },
+      lists: {
+        unordered: 'Символен списък',
+        ordered: 'Цифров списък'
+      },
+      options: {
+        help: 'Помощ',
+        fullscreen: 'На цял екран',
+        codeview: 'Преглед на код'
+      },
+      paragraph: {
+        paragraph: 'Параграф',
+        outdent: 'Намаляване на отстъпа',
+        indent: 'Абзац',
+        left: 'Подравняване в ляво',
+        center: 'Център',
+        right: 'Подравняване в дясно',
+        justify: 'Разтягане по ширина'
+      },
+      color: {
+        recent: 'Последния избран цвят',
+        more: 'Още цветове',
+        background: 'Цвят на фона',
+        foreground: 'Цвят на шрифта',
+        transparent: 'Прозрачен',
+        setTransparent: 'Направете прозрачен',
+        reset: 'Възстанови',
+        resetToDefault: 'Възстанови оригиналните',
+        cpSelect: 'Изберете'
+      },
+      shortcut: {
+        shortcuts: 'Клавишни комбинации',
+        close: 'Затвори',
+        textFormatting: 'Форматиране на текста',
+        action: 'Действие',
+        paragraphFormatting: 'Форматиране на параграф',
+        documentStyle: 'Стил на документа',
+        extraKeys: 'Екстра бутони'
+      },
+      help: {
+        'insertParagraph': 'Добави Параграф',
+        'undo': 'Отмени последната промяна',
+        'redo': 'Върни последната промяна',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Удебели',
+        'italic': 'Приложи наклонен стил',
+        'underline': 'Приложи подчераване',
+        'strikethrough': 'Приложи зачеркнат стил',
+        'removeFormat': 'Изчисти стилове',
+        'justifyLeft': 'Подравняване в ляво',
+        'justifyCenter': 'Подравняване в центъра',
+        'justifyRight': 'Подравняване в дясно',
+        'justifyFull': 'Двустранно подравняване',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Вмъкни хоризонтално правило',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Назад',
+        redo: 'Напред'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Избери Специални символи'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-bg-BG.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js.map
new file mode 100644
index 0000000..8bbff40
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-bg-BG.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-bg-BG.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'bg-BG': {\n      font: {\n        bold: 'Удебелен',\n        italic: 'Наклонен',\n        underline: 'Подчертан',\n        clear: 'Изчисти стиловете',\n        height: 'Височина',\n        name: 'Шрифт',\n        strikethrough: 'Задраскано',\n        subscript: 'Долен индекс',\n        superscript: 'Горен индекс',\n        size: 'Размер на шрифта',\n      },\n      image: {\n        image: 'Изображение',\n        insert: 'Постави картинка',\n        resizeFull: 'Цял размер',\n        resizeHalf: 'Размер на 50%',\n        resizeQuarter: 'Размер на 25%',\n        floatLeft: 'Подравни в ляво',\n        floatRight: 'Подравни в дясно',\n        floatNone: 'Без подравняване',\n        shapeRounded: 'Форма: Заоблено',\n        shapeCircle: 'Форма: Кръг',\n        shapeThumbnail: 'Форма: Миниатюра',\n        shapeNone: 'Форма: Без',\n        dragImageHere: 'Пуснете изображението тук',\n        dropImage: 'Пуснете Изображение или Текст',\n        selectFromFiles: 'Изберете файл',\n        maximumFileSize: 'Максимален размер на файла',\n        maximumFileSizeError: 'Достигнат Максимален размер на файла.',\n        url: 'URL адрес на изображение',\n        remove: 'Премахни изображение',\n        original: 'Оригинал',\n      },\n      video: {\n        video: 'Видео',\n        videoLink: 'Видео линк',\n        insert: 'Добави Видео',\n        url: 'Видео URL?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'Връзка',\n        insert: 'Добави връзка',\n        unlink: 'Премахни връзка',\n        edit: 'Промени',\n        textToDisplay: 'Текст за показване',\n        url: 'URL адрес',\n        openInNewWindow: 'Отвори в нов прозорец',\n      },\n      table: {\n        table: 'Таблица',\n        addRowAbove: 'Добави ред отгоре',\n        addRowBelow: 'Добави ред отдолу',\n        addColLeft: 'Добави колона отляво',\n        addColRight: 'Добави колона отдясно',\n        delRow: 'Изтрии ред',\n        delCol: 'Изтрии колона',\n        delTable: 'Изтрии таблица',\n      },\n      hr: {\n        insert: 'Добави хоризонтална линия',\n      },\n      style: {\n        style: 'Стил',\n        p: 'Нормален',\n        blockquote: 'Цитат',\n        pre: 'Код',\n        h1: 'Заглавие 1',\n        h2: 'Заглавие 2',\n        h3: 'Заглавие 3',\n        h4: 'Заглавие 4',\n        h5: 'Заглавие 5',\n        h6: 'Заглавие 6',\n      },\n      lists: {\n        unordered: 'Символен списък',\n        ordered: 'Цифров списък',\n      },\n      options: {\n        help: 'Помощ',\n        fullscreen: 'На цял екран',\n        codeview: 'Преглед на код',\n      },\n      paragraph: {\n        paragraph: 'Параграф',\n        outdent: 'Намаляване на отстъпа',\n        indent: 'Абзац',\n        left: 'Подравняване в ляво',\n        center: 'Център',\n        right: 'Подравняване в дясно',\n        justify: 'Разтягане по ширина',\n      },\n      color: {\n        recent: 'Последния избран цвят',\n        more: 'Още цветове',\n        background: 'Цвят на фона',\n        foreground: 'Цвят на шрифта',\n        transparent: 'Прозрачен',\n        setTransparent: 'Направете прозрачен',\n        reset: 'Възстанови',\n        resetToDefault: 'Възстанови оригиналните',\n        cpSelect: 'Изберете',\n      },\n      shortcut: {\n        shortcuts: 'Клавишни комбинации',\n        close: 'Затвори',\n        textFormatting: 'Форматиране на текста',\n        action: 'Действие',\n        paragraphFormatting: 'Форматиране на параграф',\n        documentStyle: 'Стил на документа',\n        extraKeys: 'Екстра бутони',\n      },\n      help: {\n        'insertParagraph': 'Добави Параграф',\n        'undo': 'Отмени последната промяна',\n        'redo': 'Върни последната промяна',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Удебели',\n        'italic': 'Приложи наклонен стил',\n        'underline': 'Приложи подчераване',\n        'strikethrough': 'Приложи зачеркнат стил',\n        'removeFormat': 'Изчисти стилове',\n        'justifyLeft': 'Подравняване в ляво',\n        'justifyCenter': 'Подравняване в центъра',\n        'justifyRight': 'Подравняване в дясно',\n        'justifyFull': 'Двустранно подравняване',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Вмъкни хоризонтално правило',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Назад',\n        redo: 'Напред',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Избери Специални символи',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js
new file mode 100644
index 0000000..2f0ba2b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var t=r();for(var o in t)("object"==typeof exports?exports:e)[o]=t[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"bg-BG":{font:{bold:"Удебелен",italic:"Наклонен",underline:"Подчертан",clear:"Изчисти стиловете",height:"Височина",name:"Шрифт",strikethrough:"Задраскано",subscript:"Долен индекс",superscript:"Горен индекс",size:"Размер на шрифта"},image:{image:"Изображение",insert:"Постави картинка",resizeFull:"Цял размер",resizeHalf:"Размер на 50%",resizeQuarter:"Размер на 25%",floatLeft:"Подравни в ляво",floatRight:"Подравни в дясно",floatNone:"Без подравняване",shapeRounded:"Форма: Заоблено",shapeCircle:"Форма: Кръг",shapeThumbnail:"Форма: Миниатюра",shapeNone:"Форма: Без",dragImageHere:"Пуснете изображението тук",dropImage:"Пуснете Изображение или Текст",selectFromFiles:"Изберете файл",maximumFileSize:"Максимален размер на файла",maximumFileSizeError:"Достигнат Максимален размер на файла.",url:"URL адрес на изображение",remove:"Премахни изображение",original:"Оригинал"},video:{video:"Видео",videoLink:"Видео линк",insert:"Добави Видео",url:"Видео URL?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"Връзка",insert:"Добави връзка",unlink:"Премахни връзка",edit:"Промени",textToDisplay:"Текст за показване",url:"URL адрес",openInNewWindow:"Отвори в нов прозорец"},table:{table:"Таблица",addRowAbove:"Добави ред отгоре",addRowBelow:"Добави ред отдолу",addColLeft:"Добави колона отляво",addColRight:"Добави колона отдясно",delRow:"Изтрии ред",delCol:"Изтрии колона",delTable:"Изтрии таблица"},hr:{insert:"Добави хоризонтална линия"},style:{style:"Стил",p:"Нормален",blockquote:"Цитат",pre:"Код",h1:"Заглавие 1",h2:"Заглавие 2",h3:"Заглавие 3",h4:"Заглавие 4",h5:"Заглавие 5",h6:"Заглавие 6"},lists:{unordered:"Символен списък",ordered:"Цифров списък"},options:{help:"Помощ",fullscreen:"На цял екран",codeview:"Преглед на код"},paragraph:{paragraph:"Параграф",outdent:"Намаляване на отстъпа",indent:"Абзац",left:"Подравняване в ляво",center:"Център",right:"Подравняване в дясно",justify:"Разтягане по ширина"},color:{recent:"Последния избран цвят",more:"Още цветове",background:"Цвят на фона",foreground:"Цвят на шрифта",transparent:"Прозрачен",setTransparent:"Направете прозрачен",reset:"Възстанови",resetToDefault:"Възстанови оригиналните",cpSelect:"Изберете"},shortcut:{shortcuts:"Клавишни комбинации",close:"Затвори",textFormatting:"Форматиране на текста",action:"Действие",paragraphFormatting:"Форматиране на параграф",documentStyle:"Стил на документа",extraKeys:"Екстра бутони"},help:{insertParagraph:"Добави Параграф",undo:"Отмени последната промяна",redo:"Върни последната промяна",tab:"Tab",untab:"Untab",bold:"Удебели",italic:"Приложи наклонен стил",underline:"Приложи подчераване",strikethrough:"Приложи зачеркнат стил",removeFormat:"Изчисти стилове",justifyLeft:"Подравняване в ляво",justifyCenter:"Подравняване в центъра",justifyRight:"Подравняване в дясно",justifyFull:"Двустранно подравняване",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Вмъкни хоризонтално правило","linkDialog.show":"Show Link Dialog"},history:{undo:"Назад",redo:"Напред"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Избери Специални символи"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bg-BG.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js
new file mode 100644
index 0000000..17c68a6
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js
@@ -0,0 +1,189 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'bn-BD': {
+      font: {
+        bold: 'গাঢ়',
+        italic: 'তির্যক',
+        underline: 'নিন্মরেখা',
+        clear: 'ফন্টের শৈলী সরান',
+        height: 'লাইনের উচ্চতা',
+        name: 'ফন্ট পরিবার',
+        strikethrough: 'অবচ্ছেদন',
+        subscript: 'নিম্নলিপি',
+        superscript: 'উর্ধ্বলিপি',
+        size: 'ফন্টের আকার',
+        sizeunit: 'ফন্টের আকারের একক'
+      },
+      image: {
+        image: 'ছবি',
+        insert: 'ছবি যোগ করুন',
+        resizeFull: 'পূর্ণ আকারে নিন',
+        resizeHalf: 'অর্ধ আকারে নিন',
+        resizeQuarter: 'চতুর্থাংশ আকারে নিন',
+        resizeNone: 'আসল আকার',
+        floatLeft: 'বামে নিন',
+        floatRight: 'ডানে নিন',
+        floatNone: 'দিক সরান',
+        shapeRounded: 'আকৃতি: গোলাকার',
+        shapeCircle: 'আকৃতি: বৃত্ত',
+        shapeThumbnail: 'আকৃতি: থাম্বনেইল',
+        shapeNone: 'আকৃতি: কিছু নয়',
+        dragImageHere: 'এখানে ছবি বা লেখা টেনে আনুন',
+        dropImage: 'ছবি বা লেখা ছাড়ুন',
+        selectFromFiles: 'ফাইল থেকে নির্বাচন করুন',
+        maximumFileSize: 'সর্বোচ্চ ফাইলের আকার',
+        maximumFileSizeError: 'সর্বোচ্চ ফাইলের আকার অতিক্রম করেছে।',
+        url: 'ছবির URL',
+        remove: 'ছবি সরান',
+        original: 'আসল'
+      },
+      video: {
+        video: 'ভিডিও',
+        videoLink: 'ভিডিওর লিঙ্ক',
+        insert: 'ভিডিও সন্নিবেশ করুন',
+        url: 'ভিডিওর URL',
+        providers: '(ইউটিউব, গুগল ড্রাইভ, ভিমিও, ভিন, ইনস্টাগ্রাম, ডেইলিমোশন বা ইউকু)'
+      },
+      link: {
+        link: 'লিঙ্ক',
+        insert: 'লিঙ্ক সন্নিবেশ করুন',
+        unlink: 'লিঙ্কমুক্ত করুন',
+        edit: 'সম্পাদনা করুন',
+        textToDisplay: 'দেখানোর জন্য লেখা',
+        url: 'এই লিঙ্কটি কোন URL-এ যাবে?',
+        openInNewWindow: 'নতুন উইন্ডোতে খুলুন',
+        useProtocol: 'পূর্বনির্ধারিত প্রোটোকল ব্যবহার করুন'
+      },
+      table: {
+        table: 'ছক',
+        addRowAbove: 'উপরে সারি যোগ করুন',
+        addRowBelow: 'নিচে সারি যোগ করুন',
+        addColLeft: 'বামে কলাম যোগ করুন',
+        addColRight: 'ডানে কলাম যোগ করুন',
+        delRow: 'সারি মুছুন',
+        delCol: 'কলাম মুছুন',
+        delTable: 'ছক মুছুন'
+      },
+      hr: {
+        insert: 'বিভাজক রেখা সন্নিবেশ করুন'
+      },
+      style: {
+        style: 'শৈলী',
+        p: 'সাধারণ',
+        blockquote: 'উক্তি',
+        pre: 'কোড',
+        h1: 'শীর্ষক ১',
+        h2: 'শীর্ষক ২',
+        h3: 'শীর্ষক ৩',
+        h4: 'শীর্ষক ৪',
+        h5: 'শীর্ষক ৫',
+        h6: 'শীর্ষক ৬'
+      },
+      lists: {
+        unordered: 'অবিন্যস্ত তালিকা',
+        ordered: 'বিন্যস্ত তালিকা'
+      },
+      options: {
+        help: 'সাহায্য',
+        fullscreen: 'পূর্ণ পর্দা',
+        codeview: 'কোড দৃশ্য'
+      },
+      paragraph: {
+        paragraph: 'অনুচ্ছেদ',
+        outdent: 'ঋণাত্মক প্রান্তিককরণ',
+        indent: 'প্রান্তিককরণ',
+        left: 'বামে সারিবদ্ধ করুন',
+        center: 'কেন্দ্রে সারিবদ্ধ করুন',
+        right: 'ডানে সারিবদ্ধ করুন',
+        justify: 'যথাযথ ফাঁক দিয়ে সাজান'
+      },
+      color: {
+        recent: 'সাম্প্রতিক রং',
+        more: 'আরও রং',
+        background: 'পটভূমির রং',
+        foreground: 'লেখার রং',
+        transparent: 'স্বচ্ছ',
+        setTransparent: 'স্বচ্ছ নির্ধারণ করুন',
+        reset: 'পুনঃস্থাপন করুন',
+        resetToDefault: 'পূর্বনির্ধারিত ফিরিয়ে আনুন',
+        cpSelect: 'নির্বাচন করুন'
+      },
+      shortcut: {
+        shortcuts: 'কীবোর্ড শর্টকাট',
+        close: 'বন্ধ করুন',
+        textFormatting: 'লেখার বিন্যাসন',
+        action: 'কার্য',
+        paragraphFormatting: 'অনুচ্ছেদের বিন্যাসন',
+        documentStyle: 'নথির শৈলী',
+        extraKeys: 'অতিরিক্ত কীগুলি'
+      },
+      help: {
+        'escape': 'এস্কেপ',
+        'insertParagraph': 'অনুচ্ছেদ সন্নিবেশ',
+        'undo': 'শেষ কমান্ড পূর্বাবস্থায় ফেরত',
+        'redo': 'শেষ কমান্ড পুনরায় করা',
+        'tab': 'ট্যাব',
+        'untab': 'অ-ট্যাব',
+        'bold': 'গাঢ় শৈলী নির্ধারণ',
+        'italic': 'তির্যক শৈলী নির্ধারণ',
+        'underline': 'নিম্নরেখার শৈলী নির্ধারণ',
+        'strikethrough': 'অবচ্ছেদনের শৈলী নির্ধারণ',
+        'removeFormat': 'শৈলী পরিষ্কার',
+        'justifyLeft': 'বামের সারিবন্ধন নির্ধারণ',
+        'justifyCenter': 'কেন্দ্রের সারিবন্ধন নির্ধারণ',
+        'justifyRight': 'ডানের সারিবন্ধন নির্ধারণ',
+        'justifyFull': 'পূর্ণ সারিবন্ধন নির্ধারণ',
+        'insertUnorderedList': 'অবিন্যস্ত তালিকা টগল',
+        'insertOrderedList': 'বিন্যস্ত তালিকা টগল',
+        'outdent': 'বর্তমান অনুচ্ছেদে ঋণাত্মক প্রান্তিককরণ',
+        'indent': 'বর্তমান অনুচ্ছেদে প্রান্তিককরণ',
+        'formatPara': 'বর্তমান ব্লকের বিন্যাসটি অনুচ্ছেদ হিসেবে পরিবর্তন (P ট্যাগ)',
+        'formatH1': 'বর্তমান ব্লকের বিন্যাসটি H1 হিসেবে পরিবর্তন',
+        'formatH2': 'বর্তমান ব্লকের বিন্যাসটি H2 হিসেবে পরিবর্তন',
+        'formatH3': 'বর্তমান ব্লকের বিন্যাসটি H3 হিসেবে পরিবর্তন',
+        'formatH4': 'বর্তমান ব্লকের বিন্যাসটি H4 হিসেবে পরিবর্তন',
+        'formatH5': 'বর্তমান ব্লকের বিন্যাসটি H5 হিসেবে পরিবর্তন',
+        'formatH6': 'বর্তমান ব্লকের বিন্যাসটি H6 হিসেবে পরিবর্তন',
+        'insertHorizontalRule': 'বিভাজক রেখা সন্নিবেশ',
+        'linkDialog.show': 'লিংক ডায়ালগ প্রদর্শন'
+      },
+      history: {
+        undo: 'পূর্বাবস্থায় আনুন',
+        redo: 'পুনঃকরুন'
+      },
+      specialChar: {
+        specialChar: 'বিশেষ অক্ষর',
+        select: 'বিশেষ অক্ষর নির্বাচন করুন'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-bn-BD.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js.map
new file mode 100644
index 0000000..cc51504
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-bn-BD.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-bn-BD.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'bn-BD': {\n      font: {\n        bold: 'গাঢ়',\n        italic: 'তির্যক',\n        underline: 'নিন্মরেখা',\n        clear: 'ফন্টের শৈলী সরান',\n        height: 'লাইনের উচ্চতা',\n        name: 'ফন্ট পরিবার',\n        strikethrough: 'অবচ্ছেদন',\n        subscript: 'নিম্নলিপি',\n        superscript: 'উর্ধ্বলিপি',\n        size: 'ফন্টের আকার',\n        sizeunit: 'ফন্টের আকারের একক',\n      },\n      image: {\n        image: 'ছবি',\n        insert: 'ছবি যোগ করুন',\n        resizeFull: 'পূর্ণ আকারে নিন',\n        resizeHalf: 'অর্ধ আকারে নিন',\n        resizeQuarter: 'চতুর্থাংশ আকারে নিন',\n        resizeNone: 'আসল আকার',\n        floatLeft: 'বামে নিন',\n        floatRight: 'ডানে নিন',\n        floatNone: 'দিক সরান',\n        shapeRounded: 'আকৃতি: গোলাকার',\n        shapeCircle: 'আকৃতি: বৃত্ত',\n        shapeThumbnail: 'আকৃতি: থাম্বনেইল',\n        shapeNone: 'আকৃতি: কিছু নয়',\n        dragImageHere: 'এখানে ছবি বা লেখা টেনে আনুন',\n        dropImage: 'ছবি বা লেখা ছাড়ুন',\n        selectFromFiles: 'ফাইল থেকে নির্বাচন করুন',\n        maximumFileSize: 'সর্বোচ্চ ফাইলের আকার',\n        maximumFileSizeError: 'সর্বোচ্চ ফাইলের আকার অতিক্রম করেছে।',\n        url: 'ছবির URL',\n        remove: 'ছবি সরান',\n        original: 'আসল',\n      },\n      video: {\n        video: 'ভিডিও',\n        videoLink: 'ভিডিওর লিঙ্ক',\n        insert: 'ভিডিও সন্নিবেশ করুন',\n        url: 'ভিডিওর URL',\n        providers: '(ইউটিউব, গুগল ড্রাইভ, ভিমিও, ভিন, ইনস্টাগ্রাম, ডেইলিমোশন বা ইউকু)',\n      },\n      link: {\n        link: 'লিঙ্ক',\n        insert: 'লিঙ্ক সন্নিবেশ করুন',\n        unlink: 'লিঙ্কমুক্ত করুন',\n        edit: 'সম্পাদনা করুন',\n        textToDisplay: 'দেখানোর জন্য লেখা',\n        url: 'এই লিঙ্কটি কোন URL-এ যাবে?',\n        openInNewWindow: 'নতুন উইন্ডোতে খুলুন',\n        useProtocol: 'পূর্বনির্ধারিত প্রোটোকল ব্যবহার করুন',\n      },\n      table: {\n        table: 'ছক',\n        addRowAbove: 'উপরে সারি যোগ করুন',\n        addRowBelow: 'নিচে সারি যোগ করুন',\n        addColLeft: 'বামে কলাম যোগ করুন',\n        addColRight: 'ডানে কলাম যোগ করুন',\n        delRow: 'সারি মুছুন',\n        delCol: 'কলাম মুছুন',\n        delTable: 'ছক মুছুন',\n      },\n      hr: {\n        insert: 'বিভাজক রেখা সন্নিবেশ করুন',\n      },\n      style: {\n        style: 'শৈলী',\n        p: 'সাধারণ',\n        blockquote: 'উক্তি',\n        pre: 'কোড',\n        h1: 'শীর্ষক ১',\n        h2: 'শীর্ষক ২',\n        h3: 'শীর্ষক ৩',\n        h4: 'শীর্ষক ৪',\n        h5: 'শীর্ষক ৫',\n        h6: 'শীর্ষক ৬',\n      },\n      lists: {\n        unordered: 'অবিন্যস্ত তালিকা',\n        ordered: 'বিন্যস্ত তালিকা',\n      },\n      options: {\n        help: 'সাহায্য',\n        fullscreen: 'পূর্ণ পর্দা',\n        codeview: 'কোড দৃশ্য',\n      },\n      paragraph: {\n        paragraph: 'অনুচ্ছেদ',\n        outdent: 'ঋণাত্মক প্রান্তিককরণ',\n        indent: 'প্রান্তিককরণ',\n        left: 'বামে সারিবদ্ধ করুন',\n        center: 'কেন্দ্রে সারিবদ্ধ করুন',\n        right: 'ডানে সারিবদ্ধ করুন',\n        justify: 'যথাযথ ফাঁক দিয়ে সাজান',\n      },\n      color: {\n        recent: 'সাম্প্রতিক রং',\n        more: 'আরও রং',\n        background: 'পটভূমির রং',\n        foreground: 'লেখার রং',\n        transparent: 'স্বচ্ছ',\n        setTransparent: 'স্বচ্ছ নির্ধারণ করুন',\n        reset: 'পুনঃস্থাপন করুন',\n        resetToDefault: 'পূর্বনির্ধারিত ফিরিয়ে আনুন',\n        cpSelect: 'নির্বাচন করুন',\n      },\n      shortcut: {\n        shortcuts: 'কীবোর্ড শর্টকাট',\n        close: 'বন্ধ করুন',\n        textFormatting: 'লেখার বিন্যাসন',\n        action: 'কার্য',\n        paragraphFormatting: 'অনুচ্ছেদের বিন্যাসন',\n        documentStyle: 'নথির শৈলী',\n        extraKeys: 'অতিরিক্ত কীগুলি',\n      },\n      help: {\n        'escape': 'এস্কেপ',\n        'insertParagraph': 'অনুচ্ছেদ সন্নিবেশ',\n        'undo': 'শেষ কমান্ড পূর্বাবস্থায় ফেরত',\n        'redo': 'শেষ কমান্ড পুনরায় করা',\n        'tab': 'ট্যাব',\n        'untab': 'অ-ট্যাব',\n        'bold': 'গাঢ় শৈলী নির্ধারণ',\n        'italic': 'তির্যক শৈলী নির্ধারণ',\n        'underline': 'নিম্নরেখার শৈলী নির্ধারণ',\n        'strikethrough': 'অবচ্ছেদনের শৈলী নির্ধারণ',\n        'removeFormat': 'শৈলী পরিষ্কার',\n        'justifyLeft': 'বামের সারিবন্ধন নির্ধারণ',\n        'justifyCenter': 'কেন্দ্রের সারিবন্ধন নির্ধারণ',\n        'justifyRight': 'ডানের সারিবন্ধন নির্ধারণ',\n        'justifyFull': 'পূর্ণ সারিবন্ধন নির্ধারণ',\n        'insertUnorderedList': 'অবিন্যস্ত তালিকা টগল',\n        'insertOrderedList': 'বিন্যস্ত তালিকা টগল',\n        'outdent': 'বর্তমান অনুচ্ছেদে ঋণাত্মক প্রান্তিককরণ',\n        'indent': 'বর্তমান অনুচ্ছেদে প্রান্তিককরণ',\n        'formatPara': 'বর্তমান ব্লকের বিন্যাসটি অনুচ্ছেদ হিসেবে পরিবর্তন (P ট্যাগ)',\n        'formatH1': 'বর্তমান ব্লকের বিন্যাসটি H1 হিসেবে পরিবর্তন',\n        'formatH2': 'বর্তমান ব্লকের বিন্যাসটি H2 হিসেবে পরিবর্তন',\n        'formatH3': 'বর্তমান ব্লকের বিন্যাসটি H3 হিসেবে পরিবর্তন',\n        'formatH4': 'বর্তমান ব্লকের বিন্যাসটি H4 হিসেবে পরিবর্তন',\n        'formatH5': 'বর্তমান ব্লকের বিন্যাসটি H5 হিসেবে পরিবর্তন',\n        'formatH6': 'বর্তমান ব্লকের বিন্যাসটি H6 হিসেবে পরিবর্তন',\n        'insertHorizontalRule': 'বিভাজক রেখা সন্নিবেশ',\n        'linkDialog.show': 'লিংক ডায়ালগ প্রদর্শন',\n      },\n      history: {\n        undo: 'পূর্বাবস্থায় আনুন',\n        redo: 'পুনঃকরুন',\n      },\n      specialChar: {\n        specialChar: 'বিশেষ অক্ষর',\n        select: 'বিশেষ অক্ষর নির্বাচন করুন',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.min.js
new file mode 100644
index 0000000..317341c
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-bn-BD.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"bn-BD":{font:{bold:"গাঢ়",italic:"তির্যক",underline:"নিন্মরেখা",clear:"ফন্টের শৈলী সরান",height:"লাইনের উচ্চতা",name:"ফন্ট পরিবার",strikethrough:"অবচ্ছেদন",subscript:"নিম্নলিপি",superscript:"উর্ধ্বলিপি",size:"ফন্টের আকার",sizeunit:"ফন্টের আকারের একক"},image:{image:"ছবি",insert:"ছবি যোগ করুন",resizeFull:"পূর্ণ আকারে নিন",resizeHalf:"অর্ধ আকারে নিন",resizeQuarter:"চতুর্থাংশ আকারে নিন",resizeNone:"আসল আকার",floatLeft:"বামে নিন",floatRight:"ডানে নিন",floatNone:"দিক সরান",shapeRounded:"আকৃতি: গোলাকার",shapeCircle:"আকৃতি: বৃত্ত",shapeThumbnail:"আকৃতি: থাম্বনেইল",shapeNone:"আকৃতি: কিছু নয়",dragImageHere:"এখানে ছবি বা লেখা টেনে আনুন",dropImage:"ছবি বা লেখা ছাড়ুন",selectFromFiles:"ফাইল থেকে নির্বাচন করুন",maximumFileSize:"সর্বোচ্চ ফাইলের আকার",maximumFileSizeError:"সর্বোচ্চ ফাইলের আকার অতিক্রম করেছে।",url:"ছবির URL",remove:"ছবি সরান",original:"আসল"},video:{video:"ভিডিও",videoLink:"ভিডিওর লিঙ্ক",insert:"ভিডিও সন্নিবেশ করুন",url:"ভিডিওর URL",providers:"(ইউটিউব, গুগল ড্রাইভ, ভিমিও, ভিন, ইনস্টাগ্রাম, ডেইলিমোশন বা ইউকু)"},link:{link:"লিঙ্ক",insert:"লিঙ্ক সন্নিবেশ করুন",unlink:"লিঙ্কমুক্ত করুন",edit:"সম্পাদনা করুন",textToDisplay:"দেখানোর জন্য লেখা",url:"এই লিঙ্কটি কোন URL-এ যাবে?",openInNewWindow:"নতুন উইন্ডোতে খুলুন",useProtocol:"পূর্বনির্ধারিত প্রোটোকল ব্যবহার করুন"},table:{table:"ছক",addRowAbove:"উপরে সারি যোগ করুন",addRowBelow:"নিচে সারি যোগ করুন",addColLeft:"বামে কলাম যোগ করুন",addColRight:"ডানে কলাম যোগ করুন",delRow:"সারি মুছুন",delCol:"কলাম মুছুন",delTable:"ছক মুছুন"},hr:{insert:"বিভাজক রেখা সন্নিবেশ করুন"},style:{style:"শৈলী",p:"সাধারণ",blockquote:"উক্তি",pre:"কোড",h1:"শীর্ষক ১",h2:"শীর্ষক ২",h3:"শীর্ষক ৩",h4:"শীর্ষক ৪",h5:"শীর্ষক ৫",h6:"শীর্ষক ৬"},lists:{unordered:"অবিন্যস্ত তালিকা",ordered:"বিন্যস্ত তালিকা"},options:{help:"সাহায্য",fullscreen:"পূর্ণ পর্দা",codeview:"কোড দৃশ্য"},paragraph:{paragraph:"অনুচ্ছেদ",outdent:"ঋণাত্মক প্রান্তিককরণ",indent:"প্রান্তিককরণ",left:"বামে সারিবদ্ধ করুন",center:"কেন্দ্রে সারিবদ্ধ করুন",right:"ডানে সারিবদ্ধ করুন",justify:"যথাযথ ফাঁক দিয়ে সাজান"},color:{recent:"সাম্প্রতিক রং",more:"আরও রং",background:"পটভূমির রং",foreground:"লেখার রং",transparent:"স্বচ্ছ",setTransparent:"স্বচ্ছ নির্ধারণ করুন",reset:"পুনঃস্থাপন করুন",resetToDefault:"পূর্বনির্ধারিত ফিরিয়ে আনুন",cpSelect:"নির্বাচন করুন"},shortcut:{shortcuts:"কীবোর্ড শর্টকাট",close:"বন্ধ করুন",textFormatting:"লেখার বিন্যাসন",action:"কার্য",paragraphFormatting:"অনুচ্ছেদের বিন্যাসন",documentStyle:"নথির শৈলী",extraKeys:"অতিরিক্ত কীগুলি"},help:{escape:"এস্কেপ",insertParagraph:"অনুচ্ছেদ সন্নিবেশ",undo:"শেষ কমান্ড পূর্বাবস্থায় ফেরত",redo:"শেষ কমান্ড পুনরায় করা",tab:"ট্যাব",untab:"অ-ট্যাব",bold:"গাঢ় শৈলী নির্ধারণ",italic:"তির্যক শৈলী নির্ধারণ",underline:"নিম্নরেখার শৈলী নির্ধারণ",strikethrough:"অবচ্ছেদনের শৈলী নির্ধারণ",removeFormat:"শৈলী পরিষ্কার",justifyLeft:"বামের সারিবন্ধন নির্ধারণ",justifyCenter:"কেন্দ্রের সারিবন্ধন নির্ধারণ",justifyRight:"ডানের সারিবন্ধন নির্ধারণ",justifyFull:"পূর্ণ সারিবন্ধন নির্ধারণ",insertUnorderedList:"অবিন্যস্ত তালিকা টগল",insertOrderedList:"বিন্যস্ত তালিকা টগল",outdent:"বর্তমান অনুচ্ছেদে ঋণাত্মক প্রান্তিককরণ",indent:"বর্তমান অনুচ্ছেদে প্রান্তিককরণ",formatPara:"বর্তমান ব্লকের বিন্যাসটি অনুচ্ছেদ হিসেবে পরিবর্তন (P ট্যাগ)",formatH1:"বর্তমান ব্লকের বিন্যাসটি H1 হিসেবে পরিবর্তন",formatH2:"বর্তমান ব্লকের বিন্যাসটি H2 হিসেবে পরিবর্তন",formatH3:"বর্তমান ব্লকের বিন্যাসটি H3 হিসেবে পরিবর্তন",formatH4:"বর্তমান ব্লকের বিন্যাসটি H4 হিসেবে পরিবর্তন",formatH5:"বর্তমান ব্লকের বিন্যাসটি H5 হিসেবে পরিবর্তন",formatH6:"বর্তমান ব্লকের বিন্যাসটি H6 হিসেবে পরিবর্তন",insertHorizontalRule:"বিভাজক রেখা সন্নিবেশ","linkDialog.show":"লিংক ডায়ালগ প্রদর্শন"},history:{undo:"পূর্বাবস্থায় আনুন",redo:"পুনঃকরুন"},specialChar:{specialChar:"বিশেষ অক্ষর",select:"বিশেষ অক্ষর নির্বাচন করুন"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js
new file mode 100644
index 0000000..9dec298
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'ca-ES': {
+      font: {
+        bold: 'Negreta',
+        italic: 'Cursiva',
+        underline: 'Subratllat',
+        clear: 'Treure estil de lletra',
+        height: 'Alçada de línia',
+        name: 'Font',
+        strikethrough: 'Ratllat',
+        subscript: 'Subíndex',
+        superscript: 'Superíndex',
+        size: 'Mida de lletra'
+      },
+      image: {
+        image: 'Imatge',
+        insert: 'Inserir imatge',
+        resizeFull: 'Redimensionar a mida completa',
+        resizeHalf: 'Redimensionar a la meitat',
+        resizeQuarter: 'Redimensionar a un quart',
+        floatLeft: 'Alinear a l\'esquerra',
+        floatRight: 'Alinear a la dreta',
+        floatNone: 'No alinear',
+        shapeRounded: 'Forma: Arrodonit',
+        shapeCircle: 'Forma: Cercle',
+        shapeThumbnail: 'Forma: Marc',
+        shapeNone: 'Forma: Cap',
+        dragImageHere: 'Arrossegueu una imatge o text aquí',
+        dropImage: 'Deixa anar aquí una imatge o un text',
+        selectFromFiles: 'Seleccioneu des dels arxius',
+        maximumFileSize: 'Mida màxima de l\'arxiu',
+        maximumFileSizeError: 'La mida màxima de l\'arxiu s\'ha superat.',
+        url: 'URL de la imatge',
+        remove: 'Eliminar imatge',
+        original: 'Original'
+      },
+      video: {
+        video: 'Vídeo',
+        videoLink: 'Enllaç del vídeo',
+        insert: 'Inserir vídeo',
+        url: 'URL del vídeo?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)'
+      },
+      link: {
+        link: 'Enllaç',
+        insert: 'Inserir enllaç',
+        unlink: 'Treure enllaç',
+        edit: 'Editar',
+        textToDisplay: 'Text per mostrar',
+        url: 'Cap a quina URL porta l\'enllaç?',
+        openInNewWindow: 'Obrir en una finestra nova'
+      },
+      table: {
+        table: 'Taula',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Inserir línia horitzontal'
+      },
+      style: {
+        style: 'Estil',
+        p: 'p',
+        blockquote: 'Cita',
+        pre: 'Codi',
+        h1: 'Títol 1',
+        h2: 'Títol 2',
+        h3: 'Títol 3',
+        h4: 'Títol 4',
+        h5: 'Títol 5',
+        h6: 'Títol 6'
+      },
+      lists: {
+        unordered: 'Llista desendreçada',
+        ordered: 'Llista endreçada'
+      },
+      options: {
+        help: 'Ajut',
+        fullscreen: 'Pantalla sencera',
+        codeview: 'Veure codi font'
+      },
+      paragraph: {
+        paragraph: 'Paràgraf',
+        outdent: 'Menys tabulació',
+        indent: 'Més tabulació',
+        left: 'Alinear a l\'esquerra',
+        center: 'Alinear al mig',
+        right: 'Alinear a la dreta',
+        justify: 'Justificar'
+      },
+      color: {
+        recent: 'Últim color',
+        more: 'Més colors',
+        background: 'Color de fons',
+        foreground: 'Color de lletra',
+        transparent: 'Transparent',
+        setTransparent: 'Establir transparent',
+        reset: 'Restablir',
+        resetToDefault: 'Restablir per defecte'
+      },
+      shortcut: {
+        shortcuts: 'Dreceres de teclat',
+        close: 'Tancar',
+        textFormatting: 'Format de text',
+        action: 'Acció',
+        paragraphFormatting: 'Format de paràgraf',
+        documentStyle: 'Estil del document',
+        extraKeys: 'Tecles adicionals'
+      },
+      help: {
+        'insertParagraph': 'Inserir paràgraf',
+        'undo': 'Desfer l\'última acció',
+        'redo': 'Refer l\'última acció',
+        'tab': 'Tabular',
+        'untab': 'Eliminar tabulació',
+        'bold': 'Establir estil negreta',
+        'italic': 'Establir estil cursiva',
+        'underline': 'Establir estil subratllat',
+        'strikethrough': 'Establir estil ratllat',
+        'removeFormat': 'Netejar estil',
+        'justifyLeft': 'Alinear a l\'esquerra',
+        'justifyCenter': 'Alinear al centre',
+        'justifyRight': 'Alinear a la dreta',
+        'justifyFull': 'Justificar',
+        'insertUnorderedList': 'Inserir llista desendreçada',
+        'insertOrderedList': 'Inserir llista endreçada',
+        'outdent': 'Reduïr tabulació del paràgraf',
+        'indent': 'Augmentar tabulació del paràgraf',
+        'formatPara': 'Canviar l\'estil del bloc com a un paràgraf (etiqueta P)',
+        'formatH1': 'Canviar l\'estil del bloc com a un H1',
+        'formatH2': 'Canviar l\'estil del bloc com a un H2',
+        'formatH3': 'Canviar l\'estil del bloc com a un H3',
+        'formatH4': 'Canviar l\'estil del bloc com a un H4',
+        'formatH5': 'Canviar l\'estil del bloc com a un H5',
+        'formatH6': 'Canviar l\'estil del bloc com a un H6',
+        'insertHorizontalRule': 'Inserir una línia horitzontal',
+        'linkDialog.show': 'Mostrar panel d\'enllaços'
+      },
+      history: {
+        undo: 'Desfer',
+        redo: 'Refer'
+      },
+      specialChar: {
+        specialChar: 'CARÀCTERS ESPECIALS',
+        select: 'Selecciona caràcters especials'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-ca-ES.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js.map
new file mode 100644
index 0000000..0a0c24f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-ca-ES.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-ca-ES.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'ca-ES': {\n      font: {\n        bold: 'Negreta',\n        italic: 'Cursiva',\n        underline: 'Subratllat',\n        clear: 'Treure estil de lletra',\n        height: 'Alçada de línia',\n        name: 'Font',\n        strikethrough: 'Ratllat',\n        subscript: 'Subíndex',\n        superscript: 'Superíndex',\n        size: 'Mida de lletra',\n      },\n      image: {\n        image: 'Imatge',\n        insert: 'Inserir imatge',\n        resizeFull: 'Redimensionar a mida completa',\n        resizeHalf: 'Redimensionar a la meitat',\n        resizeQuarter: 'Redimensionar a un quart',\n        floatLeft: 'Alinear a l\\'esquerra',\n        floatRight: 'Alinear a la dreta',\n        floatNone: 'No alinear',\n        shapeRounded: 'Forma: Arrodonit',\n        shapeCircle: 'Forma: Cercle',\n        shapeThumbnail: 'Forma: Marc',\n        shapeNone: 'Forma: Cap',\n        dragImageHere: 'Arrossegueu una imatge o text aquí',\n        dropImage: 'Deixa anar aquí una imatge o un text',\n        selectFromFiles: 'Seleccioneu des dels arxius',\n        maximumFileSize: 'Mida màxima de l\\'arxiu',\n        maximumFileSizeError: 'La mida màxima de l\\'arxiu s\\'ha superat.',\n        url: 'URL de la imatge',\n        remove: 'Eliminar imatge',\n        original: 'Original',\n      },\n      video: {\n        video: 'Vídeo',\n        videoLink: 'Enllaç del vídeo',\n        insert: 'Inserir vídeo',\n        url: 'URL del vídeo?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)',\n      },\n      link: {\n        link: 'Enllaç',\n        insert: 'Inserir enllaç',\n        unlink: 'Treure enllaç',\n        edit: 'Editar',\n        textToDisplay: 'Text per mostrar',\n        url: 'Cap a quina URL porta l\\'enllaç?',\n        openInNewWindow: 'Obrir en una finestra nova',\n      },\n      table: {\n        table: 'Taula',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Inserir línia horitzontal',\n      },\n      style: {\n        style: 'Estil',\n        p: 'p',\n        blockquote: 'Cita',\n        pre: 'Codi',\n        h1: 'Títol 1',\n        h2: 'Títol 2',\n        h3: 'Títol 3',\n        h4: 'Títol 4',\n        h5: 'Títol 5',\n        h6: 'Títol 6',\n      },\n      lists: {\n        unordered: 'Llista desendreçada',\n        ordered: 'Llista endreçada',\n      },\n      options: {\n        help: 'Ajut',\n        fullscreen: 'Pantalla sencera',\n        codeview: 'Veure codi font',\n      },\n      paragraph: {\n        paragraph: 'Paràgraf',\n        outdent: 'Menys tabulació',\n        indent: 'Més tabulació',\n        left: 'Alinear a l\\'esquerra',\n        center: 'Alinear al mig',\n        right: 'Alinear a la dreta',\n        justify: 'Justificar',\n      },\n      color: {\n        recent: 'Últim color',\n        more: 'Més colors',\n        background: 'Color de fons',\n        foreground: 'Color de lletra',\n        transparent: 'Transparent',\n        setTransparent: 'Establir transparent',\n        reset: 'Restablir',\n        resetToDefault: 'Restablir per defecte',\n      },\n      shortcut: {\n        shortcuts: 'Dreceres de teclat',\n        close: 'Tancar',\n        textFormatting: 'Format de text',\n        action: 'Acció',\n        paragraphFormatting: 'Format de paràgraf',\n        documentStyle: 'Estil del document',\n        extraKeys: 'Tecles adicionals',\n      },\n      help: {\n        'insertParagraph': 'Inserir paràgraf',\n        'undo': 'Desfer l\\'última acció',\n        'redo': 'Refer l\\'última acció',\n        'tab': 'Tabular',\n        'untab': 'Eliminar tabulació',\n        'bold': 'Establir estil negreta',\n        'italic': 'Establir estil cursiva',\n        'underline': 'Establir estil subratllat',\n        'strikethrough': 'Establir estil ratllat',\n        'removeFormat': 'Netejar estil',\n        'justifyLeft': 'Alinear a l\\'esquerra',\n        'justifyCenter': 'Alinear al centre',\n        'justifyRight': 'Alinear a la dreta',\n        'justifyFull': 'Justificar',\n        'insertUnorderedList': 'Inserir llista desendreçada',\n        'insertOrderedList': 'Inserir llista endreçada',\n        'outdent': 'Reduïr tabulació del paràgraf',\n        'indent': 'Augmentar tabulació del paràgraf',\n        'formatPara': 'Canviar l\\'estil del bloc com a un paràgraf (etiqueta P)',\n        'formatH1': 'Canviar l\\'estil del bloc com a un H1',\n        'formatH2': 'Canviar l\\'estil del bloc com a un H2',\n        'formatH3': 'Canviar l\\'estil del bloc com a un H3',\n        'formatH4': 'Canviar l\\'estil del bloc com a un H4',\n        'formatH5': 'Canviar l\\'estil del bloc com a un H5',\n        'formatH6': 'Canviar l\\'estil del bloc com a un H6',\n        'insertHorizontalRule': 'Inserir una línia horitzontal',\n        'linkDialog.show': 'Mostrar panel d\\'enllaços',\n      },\n      history: {\n        undo: 'Desfer',\n        redo: 'Refer',\n      },\n      specialChar: {\n        specialChar: 'CARÀCTERS ESPECIALS',\n        select: 'Selecciona caràcters especials',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js
new file mode 100644
index 0000000..b25a6d3
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var r=a();for(var t in r)("object"==typeof exports?exports:e)[t]=r[t]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"ca-ES":{font:{bold:"Negreta",italic:"Cursiva",underline:"Subratllat",clear:"Treure estil de lletra",height:"Alçada de línia",name:"Font",strikethrough:"Ratllat",subscript:"Subíndex",superscript:"Superíndex",size:"Mida de lletra"},image:{image:"Imatge",insert:"Inserir imatge",resizeFull:"Redimensionar a mida completa",resizeHalf:"Redimensionar a la meitat",resizeQuarter:"Redimensionar a un quart",floatLeft:"Alinear a l'esquerra",floatRight:"Alinear a la dreta",floatNone:"No alinear",shapeRounded:"Forma: Arrodonit",shapeCircle:"Forma: Cercle",shapeThumbnail:"Forma: Marc",shapeNone:"Forma: Cap",dragImageHere:"Arrossegueu una imatge o text aquí",dropImage:"Deixa anar aquí una imatge o un text",selectFromFiles:"Seleccioneu des dels arxius",maximumFileSize:"Mida màxima de l'arxiu",maximumFileSizeError:"La mida màxima de l'arxiu s'ha superat.",url:"URL de la imatge",remove:"Eliminar imatge",original:"Original"},video:{video:"Vídeo",videoLink:"Enllaç del vídeo",insert:"Inserir vídeo",url:"URL del vídeo?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)"},link:{link:"Enllaç",insert:"Inserir enllaç",unlink:"Treure enllaç",edit:"Editar",textToDisplay:"Text per mostrar",url:"Cap a quina URL porta l'enllaç?",openInNewWindow:"Obrir en una finestra nova"},table:{table:"Taula",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Inserir línia horitzontal"},style:{style:"Estil",p:"p",blockquote:"Cita",pre:"Codi",h1:"Títol 1",h2:"Títol 2",h3:"Títol 3",h4:"Títol 4",h5:"Títol 5",h6:"Títol 6"},lists:{unordered:"Llista desendreçada",ordered:"Llista endreçada"},options:{help:"Ajut",fullscreen:"Pantalla sencera",codeview:"Veure codi font"},paragraph:{paragraph:"Paràgraf",outdent:"Menys tabulació",indent:"Més tabulació",left:"Alinear a l'esquerra",center:"Alinear al mig",right:"Alinear a la dreta",justify:"Justificar"},color:{recent:"Últim color",more:"Més colors",background:"Color de fons",foreground:"Color de lletra",transparent:"Transparent",setTransparent:"Establir transparent",reset:"Restablir",resetToDefault:"Restablir per defecte"},shortcut:{shortcuts:"Dreceres de teclat",close:"Tancar",textFormatting:"Format de text",action:"Acció",paragraphFormatting:"Format de paràgraf",documentStyle:"Estil del document",extraKeys:"Tecles adicionals"},help:{insertParagraph:"Inserir paràgraf",undo:"Desfer l'última acció",redo:"Refer l'última acció",tab:"Tabular",untab:"Eliminar tabulació",bold:"Establir estil negreta",italic:"Establir estil cursiva",underline:"Establir estil subratllat",strikethrough:"Establir estil ratllat",removeFormat:"Netejar estil",justifyLeft:"Alinear a l'esquerra",justifyCenter:"Alinear al centre",justifyRight:"Alinear a la dreta",justifyFull:"Justificar",insertUnorderedList:"Inserir llista desendreçada",insertOrderedList:"Inserir llista endreçada",outdent:"Reduïr tabulació del paràgraf",indent:"Augmentar tabulació del paràgraf",formatPara:"Canviar l'estil del bloc com a un paràgraf (etiqueta P)",formatH1:"Canviar l'estil del bloc com a un H1",formatH2:"Canviar l'estil del bloc com a un H2",formatH3:"Canviar l'estil del bloc com a un H3",formatH4:"Canviar l'estil del bloc com a un H4",formatH5:"Canviar l'estil del bloc com a un H5",formatH6:"Canviar l'estil del bloc com a un H6",insertHorizontalRule:"Inserir una línia horitzontal","linkDialog.show":"Mostrar panel d'enllaços"},history:{undo:"Desfer",redo:"Refer"},specialChar:{specialChar:"CARÀCTERS ESPECIALS",select:"Selecciona caràcters especials"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ca-ES.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js
new file mode 100644
index 0000000..49eb93b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js
@@ -0,0 +1,179 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'cs-CZ': {
+      font: {
+        bold: 'Tučné',
+        italic: 'Kurzíva',
+        underline: 'Podtržené',
+        clear: 'Odstranit styl písma',
+        height: 'Výška řádku',
+        strikethrough: 'Přeškrtnuté',
+        size: 'Velikost písma'
+      },
+      image: {
+        image: 'Obrázek',
+        insert: 'Vložit obrázek',
+        resizeFull: 'Původní velikost',
+        resizeHalf: 'Poloviční velikost',
+        resizeQuarter: 'Čtvrteční velikost',
+        floatLeft: 'Umístit doleva',
+        floatRight: 'Umístit doprava',
+        floatNone: 'Neobtékat textem',
+        shapeRounded: 'Tvar: zaoblený',
+        shapeCircle: 'Tvar: kruh',
+        shapeThumbnail: 'Tvar: náhled',
+        shapeNone: 'Tvar: žádný',
+        dragImageHere: 'Přetáhnout sem obrázek',
+        dropImage: 'Přetáhnout obrázek nebo text',
+        selectFromFiles: 'Vybrat soubor',
+        url: 'URL obrázku',
+        remove: 'Odebrat obrázek',
+        original: 'Originál'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Odkaz videa',
+        insert: 'Vložit video',
+        url: 'URL videa?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion nebo Youku)'
+      },
+      link: {
+        link: 'Odkaz',
+        insert: 'Vytvořit odkaz',
+        unlink: 'Zrušit odkaz',
+        edit: 'Upravit',
+        textToDisplay: 'Zobrazovaný text',
+        url: 'Na jaké URL má tento odkaz vést?',
+        openInNewWindow: 'Otevřít v novém okně'
+      },
+      table: {
+        table: 'Tabulka',
+        addRowAbove: 'Přidat řádek nad',
+        addRowBelow: 'Přidat řádek pod',
+        addColLeft: 'Přidat sloupec vlevo',
+        addColRight: 'Přidat sloupec vpravo',
+        delRow: 'Smazat řádek',
+        delCol: 'Smazat sloupec',
+        delTable: 'Smazat tabulku'
+      },
+      hr: {
+        insert: 'Vložit vodorovnou čáru'
+      },
+      style: {
+        style: 'Styl',
+        p: 'Normální',
+        blockquote: 'Citace',
+        pre: 'Kód',
+        h1: 'Nadpis 1',
+        h2: 'Nadpis 2',
+        h3: 'Nadpis 3',
+        h4: 'Nadpis 4',
+        h5: 'Nadpis 5',
+        h6: 'Nadpis 6'
+      },
+      lists: {
+        unordered: 'Odrážkový seznam',
+        ordered: 'Číselný seznam'
+      },
+      options: {
+        help: 'Nápověda',
+        fullscreen: 'Celá obrazovka',
+        codeview: 'HTML kód'
+      },
+      paragraph: {
+        paragraph: 'Odstavec',
+        outdent: 'Zvětšit odsazení',
+        indent: 'Zmenšit odsazení',
+        left: 'Zarovnat doleva',
+        center: 'Zarovnat na střed',
+        right: 'Zarovnat doprava',
+        justify: 'Zarovnat oboustranně'
+      },
+      color: {
+        recent: 'Aktuální barva',
+        more: 'Další barvy',
+        background: 'Barva pozadí',
+        foreground: 'Barva písma',
+        transparent: 'Průhlednost',
+        setTransparent: 'Nastavit průhlednost',
+        reset: 'Obnovit',
+        resetToDefault: 'Obnovit výchozí',
+        cpSelect: 'Vybrat'
+      },
+      shortcut: {
+        shortcuts: 'Klávesové zkratky',
+        close: 'Zavřít',
+        textFormatting: 'Formátování textu',
+        action: 'Akce',
+        paragraphFormatting: 'Formátování odstavce',
+        documentStyle: 'Styl dokumentu'
+      },
+      help: {
+        'insertParagraph': 'Vložit odstavec',
+        'undo': 'Vrátit poslední příkaz',
+        'redo': 'Opakovat poslední příkaz',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Nastavit tučně',
+        'italic': 'Nastavit kurzívu',
+        'underline': 'Nastavit podtrhnutí',
+        'strikethrough': 'Nastavit přeškrtnutí',
+        'removeFormat': 'Ostranit nastavený styl',
+        'justifyLeft': 'Nastavit zarovnání vlevo',
+        'justifyCenter': 'Nastavit zarovnání na střed',
+        'justifyRight': 'Nastavit zarovnání vpravo',
+        'justifyFull': 'Nastavit zarovnání do bloku',
+        'insertUnorderedList': 'Aplikovat odrážkový seznam',
+        'insertOrderedList': 'Aplikovat číselný seznam',
+        'outdent': 'Zmenšit odsazení aktuálního odstavec',
+        'indent': 'Odsadit aktuální odstavec',
+        'formatPara': 'Změnit formátování aktuálního bloku na odstavec (P tag)',
+        'formatH1': 'Změnit formátování aktuálního bloku na Nadpis 1',
+        'formatH2': 'Změnit formátování aktuálního bloku na Nadpis 2',
+        'formatH3': 'Změnit formátování aktuálního bloku na Nadpis 3',
+        'formatH4': 'Změnit formátování aktuálního bloku na Nadpis 4',
+        'formatH5': 'Změnit formátování aktuálního bloku na Nadpis 5',
+        'formatH6': 'Změnit formátování aktuálního bloku na Nadpis 6',
+        'insertHorizontalRule': 'Vložit horizontální čáru',
+        'linkDialog.show': 'Zobrazit dialog pro odkaz'
+      },
+      history: {
+        undo: 'Krok vzad',
+        redo: 'Krok vpřed'
+      },
+      specialChar: {
+        specialChar: 'SPECIÁLNÍ ZNAKY',
+        select: 'Vyberte speciální znaky'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-cs-CZ.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js.map
new file mode 100644
index 0000000..3aa455f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-cs-CZ.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-cs-CZ.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'cs-CZ': {\n      font: {\n        bold: 'Tučné',\n        italic: 'Kurzíva',\n        underline: 'Podtržené',\n        clear: 'Odstranit styl písma',\n        height: 'Výška řádku',\n        strikethrough: 'Přeškrtnuté',\n        size: 'Velikost písma',\n      },\n      image: {\n        image: 'Obrázek',\n        insert: 'Vložit obrázek',\n        resizeFull: 'Původní velikost',\n        resizeHalf: 'Poloviční velikost',\n        resizeQuarter: 'Čtvrteční velikost',\n        floatLeft: 'Umístit doleva',\n        floatRight: 'Umístit doprava',\n        floatNone: 'Neobtékat textem',\n        shapeRounded: 'Tvar: zaoblený',\n        shapeCircle: 'Tvar: kruh',\n        shapeThumbnail: 'Tvar: náhled',\n        shapeNone: 'Tvar: žádný',\n        dragImageHere: 'Přetáhnout sem obrázek',\n        dropImage: 'Přetáhnout obrázek nebo text',\n        selectFromFiles: 'Vybrat soubor',\n        url: 'URL obrázku',\n        remove: 'Odebrat obrázek',\n        original: 'Originál',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Odkaz videa',\n        insert: 'Vložit video',\n        url: 'URL videa?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion nebo Youku)',\n      },\n      link: {\n        link: 'Odkaz',\n        insert: 'Vytvořit odkaz',\n        unlink: 'Zrušit odkaz',\n        edit: 'Upravit',\n        textToDisplay: 'Zobrazovaný text',\n        url: 'Na jaké URL má tento odkaz vést?',\n        openInNewWindow: 'Otevřít v novém okně',\n      },\n      table: {\n        table: 'Tabulka',\n        addRowAbove: 'Přidat řádek nad',\n        addRowBelow: 'Přidat řádek pod',\n        addColLeft: 'Přidat sloupec vlevo',\n        addColRight: 'Přidat sloupec vpravo',\n        delRow: 'Smazat řádek',\n        delCol: 'Smazat sloupec',\n        delTable: 'Smazat tabulku',\n      },\n      hr: {\n        insert: 'Vložit vodorovnou čáru',\n      },\n      style: {\n        style: 'Styl',\n        p: 'Normální',\n        blockquote: 'Citace',\n        pre: 'Kód',\n        h1: 'Nadpis 1',\n        h2: 'Nadpis 2',\n        h3: 'Nadpis 3',\n        h4: 'Nadpis 4',\n        h5: 'Nadpis 5',\n        h6: 'Nadpis 6',\n      },\n      lists: {\n        unordered: 'Odrážkový seznam',\n        ordered: 'Číselný seznam',\n      },\n      options: {\n        help: 'Nápověda',\n        fullscreen: 'Celá obrazovka',\n        codeview: 'HTML kód',\n      },\n      paragraph: {\n        paragraph: 'Odstavec',\n        outdent: 'Zvětšit odsazení',\n        indent: 'Zmenšit odsazení',\n        left: 'Zarovnat doleva',\n        center: 'Zarovnat na střed',\n        right: 'Zarovnat doprava',\n        justify: 'Zarovnat oboustranně',\n      },\n      color: {\n        recent: 'Aktuální barva',\n        more: 'Další barvy',\n        background: 'Barva pozadí',\n        foreground: 'Barva písma',\n        transparent: 'Průhlednost',\n        setTransparent: 'Nastavit průhlednost',\n        reset: 'Obnovit',\n        resetToDefault: 'Obnovit výchozí',\n        cpSelect: 'Vybrat',\n      },\n      shortcut: {\n        shortcuts: 'Klávesové zkratky',\n        close: 'Zavřít',\n        textFormatting: 'Formátování textu',\n        action: 'Akce',\n        paragraphFormatting: 'Formátování odstavce',\n        documentStyle: 'Styl dokumentu',\n      },\n      help: {\n        'insertParagraph': 'Vložit odstavec',\n        'undo': 'Vrátit poslední příkaz',\n        'redo': 'Opakovat poslední příkaz',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Nastavit tučně',\n        'italic': 'Nastavit kurzívu',\n        'underline': 'Nastavit podtrhnutí',\n        'strikethrough': 'Nastavit přeškrtnutí',\n        'removeFormat': 'Ostranit nastavený styl',\n        'justifyLeft': 'Nastavit zarovnání vlevo',\n        'justifyCenter': 'Nastavit zarovnání na střed',\n        'justifyRight': 'Nastavit zarovnání vpravo',\n        'justifyFull': 'Nastavit zarovnání do bloku',\n        'insertUnorderedList': 'Aplikovat odrážkový seznam',\n        'insertOrderedList': 'Aplikovat číselný seznam',\n        'outdent': 'Zmenšit odsazení aktuálního odstavec',\n        'indent': 'Odsadit aktuální odstavec',\n        'formatPara': 'Změnit formátování aktuálního bloku na odstavec (P tag)',\n        'formatH1': 'Změnit formátování aktuálního bloku na Nadpis 1',\n        'formatH2': 'Změnit formátování aktuálního bloku na Nadpis 2',\n        'formatH3': 'Změnit formátování aktuálního bloku na Nadpis 3',\n        'formatH4': 'Změnit formátování aktuálního bloku na Nadpis 4',\n        'formatH5': 'Změnit formátování aktuálního bloku na Nadpis 5',\n        'formatH6': 'Změnit formátování aktuálního bloku na Nadpis 6',\n        'insertHorizontalRule': 'Vložit horizontální čáru',\n        'linkDialog.show': 'Zobrazit dialog pro odkaz',\n      },\n      history: {\n        undo: 'Krok vzad',\n        redo: 'Krok vpřed',\n      },\n      specialChar: {\n        specialChar: 'SPECIÁLNÍ ZNAKY',\n        select: 'Vyberte speciální znaky',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","strikethrough","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js
new file mode 100644
index 0000000..7574240
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(t,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var o=a();for(var e in o)("object"==typeof exports?exports:t)[e]=o[e]}}(self,(function(){return(t=jQuery).extend(t.summernote.lang,{"cs-CZ":{font:{bold:"Tučné",italic:"Kurzíva",underline:"Podtržené",clear:"Odstranit styl písma",height:"Výška řádku",strikethrough:"Přeškrtnuté",size:"Velikost písma"},image:{image:"Obrázek",insert:"Vložit obrázek",resizeFull:"Původní velikost",resizeHalf:"Poloviční velikost",resizeQuarter:"Čtvrteční velikost",floatLeft:"Umístit doleva",floatRight:"Umístit doprava",floatNone:"Neobtékat textem",shapeRounded:"Tvar: zaoblený",shapeCircle:"Tvar: kruh",shapeThumbnail:"Tvar: náhled",shapeNone:"Tvar: žádný",dragImageHere:"Přetáhnout sem obrázek",dropImage:"Přetáhnout obrázek nebo text",selectFromFiles:"Vybrat soubor",url:"URL obrázku",remove:"Odebrat obrázek",original:"Originál"},video:{video:"Video",videoLink:"Odkaz videa",insert:"Vložit video",url:"URL videa?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion nebo Youku)"},link:{link:"Odkaz",insert:"Vytvořit odkaz",unlink:"Zrušit odkaz",edit:"Upravit",textToDisplay:"Zobrazovaný text",url:"Na jaké URL má tento odkaz vést?",openInNewWindow:"Otevřít v novém okně"},table:{table:"Tabulka",addRowAbove:"Přidat řádek nad",addRowBelow:"Přidat řádek pod",addColLeft:"Přidat sloupec vlevo",addColRight:"Přidat sloupec vpravo",delRow:"Smazat řádek",delCol:"Smazat sloupec",delTable:"Smazat tabulku"},hr:{insert:"Vložit vodorovnou čáru"},style:{style:"Styl",p:"Normální",blockquote:"Citace",pre:"Kód",h1:"Nadpis 1",h2:"Nadpis 2",h3:"Nadpis 3",h4:"Nadpis 4",h5:"Nadpis 5",h6:"Nadpis 6"},lists:{unordered:"Odrážkový seznam",ordered:"Číselný seznam"},options:{help:"Nápověda",fullscreen:"Celá obrazovka",codeview:"HTML kód"},paragraph:{paragraph:"Odstavec",outdent:"Zvětšit odsazení",indent:"Zmenšit odsazení",left:"Zarovnat doleva",center:"Zarovnat na střed",right:"Zarovnat doprava",justify:"Zarovnat oboustranně"},color:{recent:"Aktuální barva",more:"Další barvy",background:"Barva pozadí",foreground:"Barva písma",transparent:"Průhlednost",setTransparent:"Nastavit průhlednost",reset:"Obnovit",resetToDefault:"Obnovit výchozí",cpSelect:"Vybrat"},shortcut:{shortcuts:"Klávesové zkratky",close:"Zavřít",textFormatting:"Formátování textu",action:"Akce",paragraphFormatting:"Formátování odstavce",documentStyle:"Styl dokumentu"},help:{insertParagraph:"Vložit odstavec",undo:"Vrátit poslední příkaz",redo:"Opakovat poslední příkaz",tab:"Tab",untab:"Untab",bold:"Nastavit tučně",italic:"Nastavit kurzívu",underline:"Nastavit podtrhnutí",strikethrough:"Nastavit přeškrtnutí",removeFormat:"Ostranit nastavený styl",justifyLeft:"Nastavit zarovnání vlevo",justifyCenter:"Nastavit zarovnání na střed",justifyRight:"Nastavit zarovnání vpravo",justifyFull:"Nastavit zarovnání do bloku",insertUnorderedList:"Aplikovat odrážkový seznam",insertOrderedList:"Aplikovat číselný seznam",outdent:"Zmenšit odsazení aktuálního odstavec",indent:"Odsadit aktuální odstavec",formatPara:"Změnit formátování aktuálního bloku na odstavec (P tag)",formatH1:"Změnit formátování aktuálního bloku na Nadpis 1",formatH2:"Změnit formátování aktuálního bloku na Nadpis 2",formatH3:"Změnit formátování aktuálního bloku na Nadpis 3",formatH4:"Změnit formátování aktuálního bloku na Nadpis 4",formatH5:"Změnit formátování aktuálního bloku na Nadpis 5",formatH6:"Změnit formátování aktuálního bloku na Nadpis 6",insertHorizontalRule:"Vložit horizontální čáru","linkDialog.show":"Zobrazit dialog pro odkaz"},history:{undo:"Krok vzad",redo:"Krok vpřed"},specialChar:{specialChar:"SPECIÁLNÍ ZNAKY",select:"Vyberte speciální znaky"}}}),{};var t}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-cs-CZ.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js
new file mode 100644
index 0000000..e48d928
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'da-DK': {
+      font: {
+        bold: 'Fed',
+        italic: 'Kursiv',
+        underline: 'Understreget',
+        clear: 'Fjern formatering',
+        height: 'Højde',
+        name: 'Skrifttype',
+        strikethrough: 'Gennemstreget',
+        subscript: 'Sænket skrift',
+        superscript: 'Hævet skrift',
+        size: 'Skriftstørrelse'
+      },
+      image: {
+        image: 'Billede',
+        insert: 'Indsæt billede',
+        resizeFull: 'Original størrelse',
+        resizeHalf: 'Halv størrelse',
+        resizeQuarter: 'Kvart størrelse',
+        floatLeft: 'Venstrestillet',
+        floatRight: 'Højrestillet',
+        floatNone: 'Fjern formatering',
+        shapeRounded: 'Form: Runde kanter',
+        shapeCircle: 'Form: Cirkel',
+        shapeThumbnail: 'Form: Miniature',
+        shapeNone: 'Form: Ingen',
+        dragImageHere: 'Træk billede hertil',
+        dropImage: 'Slip billede',
+        selectFromFiles: 'Vælg billed-fil',
+        maximumFileSize: 'Maks fil størrelse',
+        maximumFileSizeError: 'Filen er større end maks tilladte fil størrelse!',
+        url: 'Billede URL',
+        remove: 'Fjern billede',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Video Link',
+        insert: 'Indsæt Video',
+        url: 'Video URL?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Indsæt link',
+        unlink: 'Fjern link',
+        edit: 'Rediger',
+        textToDisplay: 'Visningstekst',
+        url: 'Hvor skal linket pege hen?',
+        openInNewWindow: 'Åbn i nyt vindue'
+      },
+      table: {
+        table: 'Tabel',
+        addRowAbove: 'Tilføj række over',
+        addRowBelow: 'Tilføj række under',
+        addColLeft: 'Tilføj venstre kolonne',
+        addColRight: 'Tilføj højre kolonne',
+        delRow: 'Slet række',
+        delCol: 'Slet kolonne',
+        delTable: 'Slet tabel'
+      },
+      hr: {
+        insert: 'Indsæt horisontal linje'
+      },
+      style: {
+        style: 'Stil',
+        p: 'p',
+        blockquote: 'Citat',
+        pre: 'Kode',
+        h1: 'Overskrift 1',
+        h2: 'Overskrift 2',
+        h3: 'Overskrift 3',
+        h4: 'Overskrift 4',
+        h5: 'Overskrift 5',
+        h6: 'Overskrift 6'
+      },
+      lists: {
+        unordered: 'Punktopstillet liste',
+        ordered: 'Nummereret liste'
+      },
+      options: {
+        help: 'Hjælp',
+        fullscreen: 'Fuld skærm',
+        codeview: 'HTML-Visning'
+      },
+      paragraph: {
+        paragraph: 'Afsnit',
+        outdent: 'Formindsk indryk',
+        indent: 'Forøg indryk',
+        left: 'Venstrestillet',
+        center: 'Centreret',
+        right: 'Højrestillet',
+        justify: 'Blokjuster'
+      },
+      color: {
+        recent: 'Nyligt valgt farve',
+        more: 'Flere farver',
+        background: 'Baggrund',
+        foreground: 'Forgrund',
+        transparent: 'Transparent',
+        setTransparent: 'Sæt transparent',
+        reset: 'Nulstil',
+        resetToDefault: 'Gendan standardindstillinger'
+      },
+      shortcut: {
+        shortcuts: 'Genveje',
+        close: 'Luk',
+        textFormatting: 'Tekstformatering',
+        action: 'Handling',
+        paragraphFormatting: 'Afsnitsformatering',
+        documentStyle: 'Dokumentstil',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Indsæt paragraf',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Vis Link Dialog'
+      },
+      history: {
+        undo: 'Fortryd',
+        redo: 'Annuller fortryd'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Vælg special karakterer'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-da-DK.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js.map
new file mode 100644
index 0000000..543b879
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-da-DK.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-da-DK.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'da-DK': {\n      font: {\n        bold: 'Fed',\n        italic: 'Kursiv',\n        underline: 'Understreget',\n        clear: 'Fjern formatering',\n        height: 'Højde',\n        name: 'Skrifttype',\n        strikethrough: 'Gennemstreget',\n        subscript: 'Sænket skrift',\n        superscript: 'Hævet skrift',\n        size: 'Skriftstørrelse',\n      },\n      image: {\n        image: 'Billede',\n        insert: 'Indsæt billede',\n        resizeFull: 'Original størrelse',\n        resizeHalf: 'Halv størrelse',\n        resizeQuarter: 'Kvart størrelse',\n        floatLeft: 'Venstrestillet',\n        floatRight: 'Højrestillet',\n        floatNone: 'Fjern formatering',\n        shapeRounded: 'Form: Runde kanter',\n        shapeCircle: 'Form: Cirkel',\n        shapeThumbnail: 'Form: Miniature',\n        shapeNone: 'Form: Ingen',\n        dragImageHere: 'Træk billede hertil',\n        dropImage: 'Slip billede',\n        selectFromFiles: 'Vælg billed-fil',\n        maximumFileSize: 'Maks fil størrelse',\n        maximumFileSizeError: 'Filen er større end maks tilladte fil størrelse!',\n        url: 'Billede URL',\n        remove: 'Fjern billede',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Video Link',\n        insert: 'Indsæt Video',\n        url: 'Video URL?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Indsæt link',\n        unlink: 'Fjern link',\n        edit: 'Rediger',\n        textToDisplay: 'Visningstekst',\n        url: 'Hvor skal linket pege hen?',\n        openInNewWindow: 'Åbn i nyt vindue',\n      },\n      table: {\n        table: 'Tabel',\n        addRowAbove: 'Tilføj række over',\n        addRowBelow: 'Tilføj række under',\n        addColLeft: 'Tilføj venstre kolonne',\n        addColRight: 'Tilføj højre kolonne',\n        delRow: 'Slet række',\n        delCol: 'Slet kolonne',\n        delTable: 'Slet tabel',\n      },\n      hr: {\n        insert: 'Indsæt horisontal linje',\n      },\n      style: {\n        style: 'Stil',\n        p: 'p',\n        blockquote: 'Citat',\n        pre: 'Kode',\n        h1: 'Overskrift 1',\n        h2: 'Overskrift 2',\n        h3: 'Overskrift 3',\n        h4: 'Overskrift 4',\n        h5: 'Overskrift 5',\n        h6: 'Overskrift 6',\n      },\n      lists: {\n        unordered: 'Punktopstillet liste',\n        ordered: 'Nummereret liste',\n      },\n      options: {\n        help: 'Hjælp',\n        fullscreen: 'Fuld skærm',\n        codeview: 'HTML-Visning',\n      },\n      paragraph: {\n        paragraph: 'Afsnit',\n        outdent: 'Formindsk indryk',\n        indent: 'Forøg indryk',\n        left: 'Venstrestillet',\n        center: 'Centreret',\n        right: 'Højrestillet',\n        justify: 'Blokjuster',\n      },\n      color: {\n        recent: 'Nyligt valgt farve',\n        more: 'Flere farver',\n        background: 'Baggrund',\n        foreground: 'Forgrund',\n        transparent: 'Transparent',\n        setTransparent: 'Sæt transparent',\n        reset: 'Nulstil',\n        resetToDefault: 'Gendan standardindstillinger',\n      },\n      shortcut: {\n        shortcuts: 'Genveje',\n        close: 'Luk',\n        textFormatting: 'Tekstformatering',\n        action: 'Handling',\n        paragraphFormatting: 'Afsnitsformatering',\n        documentStyle: 'Dokumentstil',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Indsæt paragraf',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Vis Link Dialog',\n      },\n      history: {\n        undo: 'Fortryd',\n        redo: 'Annuller fortryd',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Vælg special karakterer',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js
new file mode 100644
index 0000000..f27e133
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var t=r();for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"da-DK":{font:{bold:"Fed",italic:"Kursiv",underline:"Understreget",clear:"Fjern formatering",height:"Højde",name:"Skrifttype",strikethrough:"Gennemstreget",subscript:"Sænket skrift",superscript:"Hævet skrift",size:"Skriftstørrelse"},image:{image:"Billede",insert:"Indsæt billede",resizeFull:"Original størrelse",resizeHalf:"Halv størrelse",resizeQuarter:"Kvart størrelse",floatLeft:"Venstrestillet",floatRight:"Højrestillet",floatNone:"Fjern formatering",shapeRounded:"Form: Runde kanter",shapeCircle:"Form: Cirkel",shapeThumbnail:"Form: Miniature",shapeNone:"Form: Ingen",dragImageHere:"Træk billede hertil",dropImage:"Slip billede",selectFromFiles:"Vælg billed-fil",maximumFileSize:"Maks fil størrelse",maximumFileSizeError:"Filen er større end maks tilladte fil størrelse!",url:"Billede URL",remove:"Fjern billede",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Indsæt Video",url:"Video URL?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)"},link:{link:"Link",insert:"Indsæt link",unlink:"Fjern link",edit:"Rediger",textToDisplay:"Visningstekst",url:"Hvor skal linket pege hen?",openInNewWindow:"Åbn i nyt vindue"},table:{table:"Tabel",addRowAbove:"Tilføj række over",addRowBelow:"Tilføj række under",addColLeft:"Tilføj venstre kolonne",addColRight:"Tilføj højre kolonne",delRow:"Slet række",delCol:"Slet kolonne",delTable:"Slet tabel"},hr:{insert:"Indsæt horisontal linje"},style:{style:"Stil",p:"p",blockquote:"Citat",pre:"Kode",h1:"Overskrift 1",h2:"Overskrift 2",h3:"Overskrift 3",h4:"Overskrift 4",h5:"Overskrift 5",h6:"Overskrift 6"},lists:{unordered:"Punktopstillet liste",ordered:"Nummereret liste"},options:{help:"Hjælp",fullscreen:"Fuld skærm",codeview:"HTML-Visning"},paragraph:{paragraph:"Afsnit",outdent:"Formindsk indryk",indent:"Forøg indryk",left:"Venstrestillet",center:"Centreret",right:"Højrestillet",justify:"Blokjuster"},color:{recent:"Nyligt valgt farve",more:"Flere farver",background:"Baggrund",foreground:"Forgrund",transparent:"Transparent",setTransparent:"Sæt transparent",reset:"Nulstil",resetToDefault:"Gendan standardindstillinger"},shortcut:{shortcuts:"Genveje",close:"Luk",textFormatting:"Tekstformatering",action:"Handling",paragraphFormatting:"Afsnitsformatering",documentStyle:"Dokumentstil",extraKeys:"Extra keys"},help:{insertParagraph:"Indsæt paragraf",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Vis Link Dialog"},history:{undo:"Fortryd",redo:"Annuller fortryd"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Vælg special karakterer"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-da-DK.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js
new file mode 100644
index 0000000..99fed94
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js
@@ -0,0 +1,186 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'de-CH': {
+      font: {
+        bold: 'Fett',
+        italic: 'Kursiv',
+        underline: 'Unterstrichen',
+        clear: 'Zurücksetzen',
+        height: 'Zeilenhöhe',
+        name: 'Schriftart',
+        strikethrough: 'Durchgestrichen',
+        subscript: 'Tiefgestellt',
+        superscript: 'Hochgestellt',
+        size: 'Schriftgrösse'
+      },
+      image: {
+        image: 'Bild',
+        insert: 'Bild einfügen',
+        resizeFull: 'Originalgrösse',
+        resizeHalf: '1/2 Grösse',
+        resizeQuarter: '1/4 Grösse',
+        floatLeft: 'Linksbündig',
+        floatRight: 'Rechtsbündig',
+        floatNone: 'Kein Textfluss',
+        shapeRounded: 'Abgerundete Ecken',
+        shapeCircle: 'Kreisförmig',
+        shapeThumbnail: '"Vorschaubild"',
+        shapeNone: 'Kein Rahmen',
+        dragImageHere: 'Bild hierher ziehen',
+        dropImage: 'Bild oder Text nehmen',
+        selectFromFiles: 'Datei auswählen',
+        maximumFileSize: 'Maximale Dateigrösse',
+        maximumFileSizeError: 'Maximale Dateigrösse überschritten',
+        url: 'Bild URL',
+        remove: 'Bild entfernen',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Videolink',
+        insert: 'Video einfügen',
+        url: 'Video URL',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion oder Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Link einfügen',
+        unlink: 'Link entfernen',
+        edit: 'Bearbeiten',
+        textToDisplay: 'Anzeigetext',
+        url: 'Link URL',
+        openInNewWindow: 'In neuem Fenster öffnen',
+        useProtocol: 'Standardprotokoll verwenden'
+      },
+      table: {
+        table: 'Tabelle',
+        addRowAbove: '+ Zeile oberhalb',
+        addRowBelow: '+ Zeile unterhalb',
+        addColLeft: '+ Spalte links',
+        addColRight: '+ Spalte rechts',
+        delRow: 'Zeile löschen',
+        delCol: 'Spalte löschen',
+        delTable: 'Tabelle löschen'
+      },
+      hr: {
+        insert: 'Horizontale Linie einfügen'
+      },
+      style: {
+        style: 'Stil',
+        normal: 'Normal',
+        p: 'Normal',
+        blockquote: 'Zitat',
+        pre: 'Quellcode',
+        h1: 'Überschrift 1',
+        h2: 'Überschrift 2',
+        h3: 'Überschrift 3',
+        h4: 'Überschrift 4',
+        h5: 'Überschrift 5',
+        h6: 'Überschrift 6'
+      },
+      lists: {
+        unordered: 'Aufzählung',
+        ordered: 'Nummerierung'
+      },
+      options: {
+        help: 'Hilfe',
+        fullscreen: 'Vollbild',
+        codeview: 'Quellcode anzeigen'
+      },
+      paragraph: {
+        paragraph: 'Absatz',
+        outdent: 'Einzug verkleinern',
+        indent: 'Einzug vergrössern',
+        left: 'Links ausrichten',
+        center: 'Zentriert ausrichten',
+        right: 'Rechts ausrichten',
+        justify: 'Blocksatz'
+      },
+      color: {
+        recent: 'Letzte Farbe',
+        more: 'Weitere Farben',
+        background: 'Hintergrundfarbe',
+        foreground: 'Schriftfarbe',
+        transparent: 'Transparenz',
+        setTransparent: 'Transparenz setzen',
+        reset: 'Zurücksetzen',
+        resetToDefault: 'Auf Standard zurücksetzen'
+      },
+      shortcut: {
+        shortcuts: 'Tastenkürzel',
+        close: 'Schliessen',
+        textFormatting: 'Textformatierung',
+        action: 'Aktion',
+        paragraphFormatting: 'Absatzformatierung',
+        documentStyle: 'Dokumentenstil',
+        extraKeys: 'Weitere Tasten'
+      },
+      help: {
+        insertParagraph: 'Absatz einfügen',
+        undo: 'Letzte Anweisung rückgängig',
+        redo: 'Letzte Anweisung wiederholen',
+        tab: 'Einzug hinzufügen',
+        untab: 'Einzug entfernen',
+        bold: 'Schrift Fett',
+        italic: 'Schrift Kursiv',
+        underline: 'Unterstreichen',
+        strikethrough: 'Durchstreichen',
+        removeFormat: 'Entfernt Format',
+        justifyLeft: 'Linksbündig',
+        justifyCenter: 'Mittig',
+        justifyRight: 'Rechtsbündig',
+        justifyFull: 'Blocksatz',
+        insertUnorderedList: 'Unnummerierte Liste',
+        insertOrderedList: 'Nummerierte Liste',
+        outdent: 'Aktuellen Absatz ausrücken',
+        indent: 'Aktuellen Absatz einrücken',
+        formatPara: 'Formatiert aktuellen Block als Absatz (P-Tag)',
+        formatH1: 'Formatiert aktuellen Block als H1',
+        formatH2: 'Formatiert aktuellen Block als H2',
+        formatH3: 'Formatiert aktuellen Block als H3',
+        formatH4: 'Formatiert aktuellen Block als H4',
+        formatH5: 'Formatiert aktuellen Block als H5',
+        formatH6: 'Formatiert aktuellen Block als H6',
+        insertHorizontalRule: 'Fügt eine horizontale Linie ein',
+        'linkDialog.show': 'Zeigt den Linkdialog'
+      },
+      history: {
+        undo: 'Rückgängig',
+        redo: 'Wiederholen'
+      },
+      specialChar: {
+        specialChar: 'Sonderzeichen',
+        select: 'Zeichen auswählen'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-de-CH.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js.map
new file mode 100644
index 0000000..1a351c7
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-de-CH.js","mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;ACVA,CAAC,UAASA,CAAT,EAAY;AACXA,EAAAA,CAAC,CAACC,MAAF,CAASD,CAAC,CAACE,UAAF,CAAaC,IAAtB,EAA4B;AAC1B,aAAS;AACPC,MAAAA,IAAI,EAAE;AACJC,QAAAA,IAAI,EAAE,MADF;AAEJC,QAAAA,MAAM,EAAE,QAFJ;AAGJC,QAAAA,SAAS,EAAE,eAHP;AAIJC,QAAAA,KAAK,EAAE,cAJH;AAKJC,QAAAA,MAAM,EAAE,YALJ;AAMJC,QAAAA,IAAI,EAAE,YANF;AAOJC,QAAAA,aAAa,EAAE,iBAPX;AAQJC,QAAAA,SAAS,EAAE,cARP;AASJC,QAAAA,WAAW,EAAE,cATT;AAUJC,QAAAA,IAAI,EAAE;AAVF,OADC;AAaPC,MAAAA,KAAK,EAAE;AACLA,QAAAA,KAAK,EAAE,MADF;AAELC,QAAAA,MAAM,EAAE,eAFH;AAGLC,QAAAA,UAAU,EAAE,gBAHP;AAILC,QAAAA,UAAU,EAAE,YAJP;AAKLC,QAAAA,aAAa,EAAE,YALV;AAMLC,QAAAA,SAAS,EAAE,aANN;AAOLC,QAAAA,UAAU,EAAE,cAPP;AAQLC,QAAAA,SAAS,EAAE,gBARN;AASLC,QAAAA,YAAY,EAAE,mBATT;AAULC,QAAAA,WAAW,EAAE,aAVR;AAWLC,QAAAA,cAAc,EAAE,gBAXX;AAYLC,QAAAA,SAAS,EAAE,aAZN;AAaLC,QAAAA,aAAa,EAAE,qBAbV;AAcLC,QAAAA,SAAS,EAAE,uBAdN;AAeLC,QAAAA,eAAe,EAAE,iBAfZ;AAgBLC,QAAAA,eAAe,EAAE,sBAhBZ;AAiBLC,QAAAA,oBAAoB,EAAE,oCAjBjB;AAkBLC,QAAAA,GAAG,EAAE,UAlBA;AAmBLC,QAAAA,MAAM,EAAE,gBAnBH;AAoBLC,QAAAA,QAAQ,EAAE;AApBL,OAbA;AAmCPC,MAAAA,KAAK,EAAE;AACLA,QAAAA,KAAK,EAAE,OADF;AAELC,QAAAA,SAAS,EAAE,WAFN;AAGLpB,QAAAA,MAAM,EAAE,gBAHH;AAILgB,QAAAA,GAAG,EAAE,WAJA;AAKLK,QAAAA,SAAS,EAAE;AALN,OAnCA;AA0CPC,MAAAA,IAAI,EAAE;AACJA,QAAAA,IAAI,EAAE,MADF;AAEJtB,QAAAA,MAAM,EAAE,eAFJ;AAGJuB,QAAAA,MAAM,EAAE,gBAHJ;AAIJC,QAAAA,IAAI,EAAE,YAJF;AAKJC,QAAAA,aAAa,EAAE,aALX;AAMJT,QAAAA,GAAG,EAAE,UAND;AAOJU,QAAAA,eAAe,EAAE,yBAPb;AAQJC,QAAAA,WAAW,EAAE;AART,OA1CC;AAoDPC,MAAAA,KAAK,EAAE;AACLA,QAAAA,KAAK,EAAE,SADF;AAELC,QAAAA,WAAW,EAAE,kBAFR;AAGLC,QAAAA,WAAW,EAAE,mBAHR;AAILC,QAAAA,UAAU,EAAE,gBAJP;AAKLC,QAAAA,WAAW,EAAE,iBALR;AAMLC,QAAAA,MAAM,EAAE,eANH;AAOLC,QAAAA,MAAM,EAAE,gBAPH;AAQLC,QAAAA,QAAQ,EAAE;AARL,OApDA;AA8DPC,MAAAA,EAAE,EAAE;AACFpC,QAAAA,MAAM,EAAE;AADN,OA9DG;AAiEPqC,MAAAA,KAAK,EAAE;AACLA,QAAAA,KAAK,EAAE,MADF;AAELC,QAAAA,MAAM,EAAE,QAFH;AAGLC,QAAAA,CAAC,EAAE,QAHE;AAILC,QAAAA,UAAU,EAAE,OAJP;AAKLC,QAAAA,GAAG,EAAE,WALA;AAMLC,QAAAA,EAAE,EAAE,eANC;AAOLC,QAAAA,EAAE,EAAE,eAPC;AAQLC,QAAAA,EAAE,EAAE,eARC;AASLC,QAAAA,EAAE,EAAE,eATC;AAULC,QAAAA,EAAE,EAAE,eAVC;AAWLC,QAAAA,EAAE,EAAE;AAXC,OAjEA;AA8EPC,MAAAA,KAAK,EAAE;AACLC,QAAAA,SAAS,EAAE,YADN;AAELC,QAAAA,OAAO,EAAE;AAFJ,OA9EA;AAkFPC,MAAAA,OAAO,EAAE;AACPC,QAAAA,IAAI,EAAE,OADC;AAEPC,QAAAA,UAAU,EAAE,UAFL;AAGPC,QAAAA,QAAQ,EAAE;AAHH,OAlFF;AAuFPC,MAAAA,SAAS,EAAE;AACTA,QAAAA,SAAS,EAAE,QADF;AAETC,QAAAA,OAAO,EAAE,oBAFA;AAGTC,QAAAA,MAAM,EAAE,oBAHC;AAITC,QAAAA,IAAI,EAAE,kBAJG;AAKTC,QAAAA,MAAM,EAAE,sBALC;AAMTC,QAAAA,KAAK,EAAE,mBANE;AAOTC,QAAAA,OAAO,EAAE;AAPA,OAvFJ;AAgGPC,MAAAA,KAAK,EAAE;AACLC,QAAAA,MAAM,EAAE,cADH;AAELC,QAAAA,IAAI,EAAE,gBAFD;AAGLC,QAAAA,UAAU,EAAE,kBAHP;AAILC,QAAAA,UAAU,EAAE,cAJP;AAKLC,QAAAA,WAAW,EAAE,aALR;AAMLC,QAAAA,cAAc,EAAE,oBANX;AAOLC,QAAAA,KAAK,EAAE,cAPF;AAQLC,QAAAA,cAAc,EAAE;AARX,OAhGA;AA0GPC,MAAAA,QAAQ,EAAE;AACRC,QAAAA,SAAS,EAAE,cADH;AAERC,QAAAA,KAAK,EAAE,YAFC;AAGRC,QAAAA,cAAc,EAAE,kBAHR;AAIRC,QAAAA,MAAM,EAAE,QAJA;AAKRC,QAAAA,mBAAmB,EAAE,oBALb;AAMRC,QAAAA,aAAa,EAAE,gBANP;AAORC,QAAAA,SAAS,EAAE;AAPH,OA1GH;AAmHP1B,MAAAA,IAAI,EAAE;AACJ2B,QAAAA,eAAe,EAAE,iBADb;AAEJC,QAAAA,IAAI,EAAE,6BAFF;AAGJC,QAAAA,IAAI,EAAE,8BAHF;AAIJC,QAAAA,GAAG,EAAE,mBAJD;AAKJC,QAAAA,KAAK,EAAE,kBALH;AAMJ9F,QAAAA,IAAI,EAAE,cANF;AAOJC,QAAAA,MAAM,EAAE,gBAPJ;AAQJC,QAAAA,SAAS,EAAE,gBARP;AASJI,QAAAA,aAAa,EAAE,gBATX;AAUJyF,QAAAA,YAAY,EAAE,iBAVV;AAWJC,QAAAA,WAAW,EAAE,aAXT;AAYJC,QAAAA,aAAa,EAAE,QAZX;AAaJC,QAAAA,YAAY,EAAE,cAbV;AAcJC,QAAAA,WAAW,EAAE,WAdT;AAeJC,QAAAA,mBAAmB,EAAE,qBAfjB;AAgBJC,QAAAA,iBAAiB,EAAE,mBAhBf;AAiBJlC,QAAAA,OAAO,EAAE,4BAjBL;AAkBJC,QAAAA,MAAM,EAAE,4BAlBJ;AAmBJkC,QAAAA,UAAU,EAAE,+CAnBR;AAoBJC,QAAAA,QAAQ,EAAE,mCApBN;AAqBJC,QAAAA,QAAQ,EAAE,mCArBN;AAsBJC,QAAAA,QAAQ,EAAE,mCAtBN;AAuBJC,QAAAA,QAAQ,EAAE,mCAvBN;AAwBJC,QAAAA,QAAQ,EAAE,mCAxBN;AAyBJC,QAAAA,QAAQ,EAAE,mCAzBN;AA0BJC,QAAAA,oBAAoB,EAAE,iCA1BlB;AA2BJ,2BAAmB;AA3Bf,OAnHC;AAgJPC,MAAAA,OAAO,EAAE;AACPnB,QAAAA,IAAI,EAAE,YADC;AAEPC,QAAAA,IAAI,EAAE;AAFC,OAhJF;AAoJPmB,MAAAA,WAAW,EAAE;AACXA,QAAAA,WAAW,EAAE,eADF;AAEXC,QAAAA,MAAM,EAAE;AAFG;AApJN;AADiB,GAA5B;AA2JD,CA5JD,EA4JGC,MA5JH","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-de-CH.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'de-CH': {\n      font: {\n        bold: 'Fett',\n        italic: 'Kursiv',\n        underline: 'Unterstrichen',\n        clear: 'Zurücksetzen',\n        height: 'Zeilenhöhe',\n        name: 'Schriftart',\n        strikethrough: 'Durchgestrichen',\n        subscript: 'Tiefgestellt',\n        superscript: 'Hochgestellt',\n        size: 'Schriftgrösse',\n      },\n      image: {\n        image: 'Bild',\n        insert: 'Bild einfügen',\n        resizeFull: 'Originalgrösse',\n        resizeHalf: '1/2 Grösse',\n        resizeQuarter: '1/4 Grösse',\n        floatLeft: 'Linksbündig',\n        floatRight: 'Rechtsbündig',\n        floatNone: 'Kein Textfluss',\n        shapeRounded: 'Abgerundete Ecken',\n        shapeCircle: 'Kreisförmig',\n        shapeThumbnail: '\"Vorschaubild\"',\n        shapeNone: 'Kein Rahmen',\n        dragImageHere: 'Bild hierher ziehen',\n        dropImage: 'Bild oder Text nehmen',\n        selectFromFiles: 'Datei auswählen',\n        maximumFileSize: 'Maximale Dateigrösse',\n        maximumFileSizeError: 'Maximale Dateigrösse überschritten',\n        url: 'Bild URL',\n        remove: 'Bild entfernen',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Videolink',\n        insert: 'Video einfügen',\n        url: 'Video URL',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion oder Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Link einfügen',\n        unlink: 'Link entfernen',\n        edit: 'Bearbeiten',\n        textToDisplay: 'Anzeigetext',\n        url: 'Link URL',\n        openInNewWindow: 'In neuem Fenster öffnen',\n        useProtocol: 'Standardprotokoll verwenden',\n      },\n      table: {\n        table: 'Tabelle',\n        addRowAbove: '+ Zeile oberhalb',\n        addRowBelow: '+ Zeile unterhalb',\n        addColLeft: '+ Spalte links',\n        addColRight: '+ Spalte rechts',\n        delRow: 'Zeile löschen',\n        delCol: 'Spalte löschen',\n        delTable: 'Tabelle löschen',\n      },\n      hr: {\n        insert: 'Horizontale Linie einfügen',\n      },\n      style: {\n        style: 'Stil',\n        normal: 'Normal',\n        p: 'Normal',\n        blockquote: 'Zitat',\n        pre: 'Quellcode',\n        h1: 'Überschrift 1',\n        h2: 'Überschrift 2',\n        h3: 'Überschrift 3',\n        h4: 'Überschrift 4',\n        h5: 'Überschrift 5',\n        h6: 'Überschrift 6',\n      },\n      lists: {\n        unordered: 'Aufzählung',\n        ordered: 'Nummerierung',\n      },\n      options: {\n        help: 'Hilfe',\n        fullscreen: 'Vollbild',\n        codeview: 'Quellcode anzeigen',\n      },\n      paragraph: {\n        paragraph: 'Absatz',\n        outdent: 'Einzug verkleinern',\n        indent: 'Einzug vergrössern',\n        left: 'Links ausrichten',\n        center: 'Zentriert ausrichten',\n        right: 'Rechts ausrichten',\n        justify: 'Blocksatz',\n      },\n      color: {\n        recent: 'Letzte Farbe',\n        more: 'Weitere Farben',\n        background: 'Hintergrundfarbe',\n        foreground: 'Schriftfarbe',\n        transparent: 'Transparenz',\n        setTransparent: 'Transparenz setzen',\n        reset: 'Zurücksetzen',\n        resetToDefault: 'Auf Standard zurücksetzen',\n      },\n      shortcut: {\n        shortcuts: 'Tastenkürzel',\n        close: 'Schliessen',\n        textFormatting: 'Textformatierung',\n        action: 'Aktion',\n        paragraphFormatting: 'Absatzformatierung',\n        documentStyle: 'Dokumentenstil',\n        extraKeys: 'Weitere Tasten',\n      },\n      help: {\n        insertParagraph: 'Absatz einfügen',\n        undo: 'Letzte Anweisung rückgängig',\n        redo: 'Letzte Anweisung wiederholen',\n        tab: 'Einzug hinzufügen',\n        untab: 'Einzug entfernen',\n        bold: 'Schrift Fett',\n        italic: 'Schrift Kursiv',\n        underline: 'Unterstreichen',\n        strikethrough: 'Durchstreichen',\n        removeFormat: 'Entfernt Format',\n        justifyLeft: 'Linksbündig',\n        justifyCenter: 'Mittig',\n        justifyRight: 'Rechtsbündig',\n        justifyFull: 'Blocksatz',\n        insertUnorderedList: 'Unnummerierte Liste',\n        insertOrderedList: 'Nummerierte Liste',\n        outdent: 'Aktuellen Absatz ausrücken',\n        indent: 'Aktuellen Absatz einrücken',\n        formatPara: 'Formatiert aktuellen Block als Absatz (P-Tag)',\n        formatH1: 'Formatiert aktuellen Block als H1',\n        formatH2: 'Formatiert aktuellen Block als H2',\n        formatH3: 'Formatiert aktuellen Block als H3',\n        formatH4: 'Formatiert aktuellen Block als H4',\n        formatH5: 'Formatiert aktuellen Block als H5',\n        formatH6: 'Formatiert aktuellen Block als H6',\n        insertHorizontalRule: 'Fügt eine horizontale Linie ein',\n        'linkDialog.show': 'Zeigt den Linkdialog',\n      },\n      history: {\n        undo: 'Rückgängig',\n        redo: 'Wiederholen',\n      },\n      specialChar: {\n        specialChar: 'Sonderzeichen',\n        select: 'Zeichen auswählen',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","normal","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","insertParagraph","undo","redo","tab","untab","removeFormat","justifyLeft","justifyCenter","justifyRight","justifyFull","insertUnorderedList","insertOrderedList","formatPara","formatH1","formatH2","formatH3","formatH4","formatH5","formatH6","insertHorizontalRule","history","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.min.js
new file mode 100644
index 0000000..d43ca0e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-CH.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var i in r)("object"==typeof exports?exports:e)[i]=r[i]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"de-CH":{font:{bold:"Fett",italic:"Kursiv",underline:"Unterstrichen",clear:"Zurücksetzen",height:"Zeilenhöhe",name:"Schriftart",strikethrough:"Durchgestrichen",subscript:"Tiefgestellt",superscript:"Hochgestellt",size:"Schriftgrösse"},image:{image:"Bild",insert:"Bild einfügen",resizeFull:"Originalgrösse",resizeHalf:"1/2 Grösse",resizeQuarter:"1/4 Grösse",floatLeft:"Linksbündig",floatRight:"Rechtsbündig",floatNone:"Kein Textfluss",shapeRounded:"Abgerundete Ecken",shapeCircle:"Kreisförmig",shapeThumbnail:'"Vorschaubild"',shapeNone:"Kein Rahmen",dragImageHere:"Bild hierher ziehen",dropImage:"Bild oder Text nehmen",selectFromFiles:"Datei auswählen",maximumFileSize:"Maximale Dateigrösse",maximumFileSizeError:"Maximale Dateigrösse überschritten",url:"Bild URL",remove:"Bild entfernen",original:"Original"},video:{video:"Video",videoLink:"Videolink",insert:"Video einfügen",url:"Video URL",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion oder Youku)"},link:{link:"Link",insert:"Link einfügen",unlink:"Link entfernen",edit:"Bearbeiten",textToDisplay:"Anzeigetext",url:"Link URL",openInNewWindow:"In neuem Fenster öffnen",useProtocol:"Standardprotokoll verwenden"},table:{table:"Tabelle",addRowAbove:"+ Zeile oberhalb",addRowBelow:"+ Zeile unterhalb",addColLeft:"+ Spalte links",addColRight:"+ Spalte rechts",delRow:"Zeile löschen",delCol:"Spalte löschen",delTable:"Tabelle löschen"},hr:{insert:"Horizontale Linie einfügen"},style:{style:"Stil",normal:"Normal",p:"Normal",blockquote:"Zitat",pre:"Quellcode",h1:"Überschrift 1",h2:"Überschrift 2",h3:"Überschrift 3",h4:"Überschrift 4",h5:"Überschrift 5",h6:"Überschrift 6"},lists:{unordered:"Aufzählung",ordered:"Nummerierung"},options:{help:"Hilfe",fullscreen:"Vollbild",codeview:"Quellcode anzeigen"},paragraph:{paragraph:"Absatz",outdent:"Einzug verkleinern",indent:"Einzug vergrössern",left:"Links ausrichten",center:"Zentriert ausrichten",right:"Rechts ausrichten",justify:"Blocksatz"},color:{recent:"Letzte Farbe",more:"Weitere Farben",background:"Hintergrundfarbe",foreground:"Schriftfarbe",transparent:"Transparenz",setTransparent:"Transparenz setzen",reset:"Zurücksetzen",resetToDefault:"Auf Standard zurücksetzen"},shortcut:{shortcuts:"Tastenkürzel",close:"Schliessen",textFormatting:"Textformatierung",action:"Aktion",paragraphFormatting:"Absatzformatierung",documentStyle:"Dokumentenstil",extraKeys:"Weitere Tasten"},help:{insertParagraph:"Absatz einfügen",undo:"Letzte Anweisung rückgängig",redo:"Letzte Anweisung wiederholen",tab:"Einzug hinzufügen",untab:"Einzug entfernen",bold:"Schrift Fett",italic:"Schrift Kursiv",underline:"Unterstreichen",strikethrough:"Durchstreichen",removeFormat:"Entfernt Format",justifyLeft:"Linksbündig",justifyCenter:"Mittig",justifyRight:"Rechtsbündig",justifyFull:"Blocksatz",insertUnorderedList:"Unnummerierte Liste",insertOrderedList:"Nummerierte Liste",outdent:"Aktuellen Absatz ausrücken",indent:"Aktuellen Absatz einrücken",formatPara:"Formatiert aktuellen Block als Absatz (P-Tag)",formatH1:"Formatiert aktuellen Block als H1",formatH2:"Formatiert aktuellen Block als H2",formatH3:"Formatiert aktuellen Block als H3",formatH4:"Formatiert aktuellen Block als H4",formatH5:"Formatiert aktuellen Block als H5",formatH6:"Formatiert aktuellen Block als H6",insertHorizontalRule:"Fügt eine horizontale Linie ein","linkDialog.show":"Zeigt den Linkdialog"},history:{undo:"Rückgängig",redo:"Wiederholen"},specialChar:{specialChar:"Sonderzeichen",select:"Zeichen auswählen"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js
new file mode 100644
index 0000000..792116a
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js
@@ -0,0 +1,186 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'de-DE': {
+      font: {
+        bold: 'Fett',
+        italic: 'Kursiv',
+        underline: 'Unterstrichen',
+        clear: 'Zurücksetzen',
+        height: 'Zeilenhöhe',
+        name: 'Schriftart',
+        strikethrough: 'Durchgestrichen',
+        subscript: 'Tiefgestellt',
+        superscript: 'Hochgestellt',
+        size: 'Schriftgröße'
+      },
+      image: {
+        image: 'Bild',
+        insert: 'Bild einfügen',
+        resizeFull: 'Originalgröße',
+        resizeHalf: '1/2 Größe',
+        resizeQuarter: '1/4 Größe',
+        floatLeft: 'Linksbündig',
+        floatRight: 'Rechtsbündig',
+        floatNone: 'Kein Textfluss',
+        shapeRounded: 'Abgerundete Ecken',
+        shapeCircle: 'Kreisförmig',
+        shapeThumbnail: '"Vorschaubild"',
+        shapeNone: 'Kein Rahmen',
+        dragImageHere: 'Bild hierher ziehen',
+        dropImage: 'Bild oder Text nehmen',
+        selectFromFiles: 'Datei auswählen',
+        maximumFileSize: 'Maximale Dateigröße',
+        maximumFileSizeError: 'Maximale Dateigröße überschritten',
+        url: 'Bild URL',
+        remove: 'Bild entfernen',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Videolink',
+        insert: 'Video einfügen',
+        url: 'Video URL',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion oder Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Link einfügen',
+        unlink: 'Link entfernen',
+        edit: 'Bearbeiten',
+        textToDisplay: 'Anzeigetext',
+        url: 'Link URL',
+        openInNewWindow: 'In neuem Fenster öffnen',
+        useProtocol: 'Standardprotokoll verwenden'
+      },
+      table: {
+        table: 'Tabelle',
+        addRowAbove: '+ Zeile oberhalb',
+        addRowBelow: '+ Zeile unterhalb',
+        addColLeft: '+ Spalte links',
+        addColRight: '+ Spalte rechts',
+        delRow: 'Zeile löschen',
+        delCol: 'Spalte löschen',
+        delTable: 'Tabelle löschen'
+      },
+      hr: {
+        insert: 'Horizontale Linie einfügen'
+      },
+      style: {
+        style: 'Stil',
+        normal: 'Normal',
+        p: 'Normal',
+        blockquote: 'Zitat',
+        pre: 'Quellcode',
+        h1: 'Überschrift 1',
+        h2: 'Überschrift 2',
+        h3: 'Überschrift 3',
+        h4: 'Überschrift 4',
+        h5: 'Überschrift 5',
+        h6: 'Überschrift 6'
+      },
+      lists: {
+        unordered: 'Aufzählung',
+        ordered: 'Nummerierung'
+      },
+      options: {
+        help: 'Hilfe',
+        fullscreen: 'Vollbild',
+        codeview: 'Quellcode anzeigen'
+      },
+      paragraph: {
+        paragraph: 'Absatz',
+        outdent: 'Einzug verkleinern',
+        indent: 'Einzug vergrößern',
+        left: 'Links ausrichten',
+        center: 'Zentriert ausrichten',
+        right: 'Rechts ausrichten',
+        justify: 'Blocksatz'
+      },
+      color: {
+        recent: 'Letzte Farbe',
+        more: 'Weitere Farben',
+        background: 'Hintergrundfarbe',
+        foreground: 'Schriftfarbe',
+        transparent: 'Transparenz',
+        setTransparent: 'Transparenz setzen',
+        reset: 'Zurücksetzen',
+        resetToDefault: 'Auf Standard zurücksetzen'
+      },
+      shortcut: {
+        shortcuts: 'Tastenkürzel',
+        close: 'Schließen',
+        textFormatting: 'Textformatierung',
+        action: 'Aktion',
+        paragraphFormatting: 'Absatzformatierung',
+        documentStyle: 'Dokumentenstil',
+        extraKeys: 'Weitere Tasten'
+      },
+      help: {
+        insertParagraph: 'Absatz einfügen',
+        undo: 'Letzte Anweisung rückgängig',
+        redo: 'Letzte Anweisung wiederholen',
+        tab: 'Einzug hinzufügen',
+        untab: 'Einzug entfernen',
+        bold: 'Schrift Fett',
+        italic: 'Schrift Kursiv',
+        underline: 'Unterstreichen',
+        strikethrough: 'Durchstreichen',
+        removeFormat: 'Entfernt Format',
+        justifyLeft: 'Linksbündig',
+        justifyCenter: 'Mittig',
+        justifyRight: 'Rechtsbündig',
+        justifyFull: 'Blocksatz',
+        insertUnorderedList: 'Unnummerierte Liste',
+        insertOrderedList: 'Nummerierte Liste',
+        outdent: 'Aktuellen Absatz ausrücken',
+        indent: 'Aktuellen Absatz einrücken',
+        formatPara: 'Formatiert aktuellen Block als Absatz (P-Tag)',
+        formatH1: 'Formatiert aktuellen Block als H1',
+        formatH2: 'Formatiert aktuellen Block als H2',
+        formatH3: 'Formatiert aktuellen Block als H3',
+        formatH4: 'Formatiert aktuellen Block als H4',
+        formatH5: 'Formatiert aktuellen Block als H5',
+        formatH6: 'Formatiert aktuellen Block als H6',
+        insertHorizontalRule: 'Fügt eine horizontale Linie ein',
+        'linkDialog.show': 'Zeigt den Linkdialog'
+      },
+      history: {
+        undo: 'Rückgängig',
+        redo: 'Wiederholen'
+      },
+      specialChar: {
+        specialChar: 'Sonderzeichen',
+        select: 'Zeichen auswählen'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-de-DE.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js.map
new file mode 100644
index 0000000..e3a9ee9
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-de-DE.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-de-DE.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'de-DE': {\n      font: {\n        bold: 'Fett',\n        italic: 'Kursiv',\n        underline: 'Unterstrichen',\n        clear: 'Zurücksetzen',\n        height: 'Zeilenhöhe',\n        name: 'Schriftart',\n        strikethrough: 'Durchgestrichen',\n        subscript: 'Tiefgestellt',\n        superscript: 'Hochgestellt',\n        size: 'Schriftgröße',\n      },\n      image: {\n        image: 'Bild',\n        insert: 'Bild einfügen',\n        resizeFull: 'Originalgröße',\n        resizeHalf: '1/2 Größe',\n        resizeQuarter: '1/4 Größe',\n        floatLeft: 'Linksbündig',\n        floatRight: 'Rechtsbündig',\n        floatNone: 'Kein Textfluss',\n        shapeRounded: 'Abgerundete Ecken',\n        shapeCircle: 'Kreisförmig',\n        shapeThumbnail: '\"Vorschaubild\"',\n        shapeNone: 'Kein Rahmen',\n        dragImageHere: 'Bild hierher ziehen',\n        dropImage: 'Bild oder Text nehmen',\n        selectFromFiles: 'Datei auswählen',\n        maximumFileSize: 'Maximale Dateigröße',\n        maximumFileSizeError: 'Maximale Dateigröße überschritten',\n        url: 'Bild URL',\n        remove: 'Bild entfernen',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Videolink',\n        insert: 'Video einfügen',\n        url: 'Video URL',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion oder Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Link einfügen',\n        unlink: 'Link entfernen',\n        edit: 'Bearbeiten',\n        textToDisplay: 'Anzeigetext',\n        url: 'Link URL',\n        openInNewWindow: 'In neuem Fenster öffnen',\n        useProtocol: 'Standardprotokoll verwenden',\n      },\n      table: {\n        table: 'Tabelle',\n        addRowAbove: '+ Zeile oberhalb',\n        addRowBelow: '+ Zeile unterhalb',\n        addColLeft: '+ Spalte links',\n        addColRight: '+ Spalte rechts',\n        delRow: 'Zeile löschen',\n        delCol: 'Spalte löschen',\n        delTable: 'Tabelle löschen',\n      },\n      hr: {\n        insert: 'Horizontale Linie einfügen',\n      },\n      style: {\n        style: 'Stil',\n        normal: 'Normal',\n        p: 'Normal',\n        blockquote: 'Zitat',\n        pre: 'Quellcode',\n        h1: 'Überschrift 1',\n        h2: 'Überschrift 2',\n        h3: 'Überschrift 3',\n        h4: 'Überschrift 4',\n        h5: 'Überschrift 5',\n        h6: 'Überschrift 6',\n      },\n      lists: {\n        unordered: 'Aufzählung',\n        ordered: 'Nummerierung',\n      },\n      options: {\n        help: 'Hilfe',\n        fullscreen: 'Vollbild',\n        codeview: 'Quellcode anzeigen',\n      },\n      paragraph: {\n        paragraph: 'Absatz',\n        outdent: 'Einzug verkleinern',\n        indent: 'Einzug vergrößern',\n        left: 'Links ausrichten',\n        center: 'Zentriert ausrichten',\n        right: 'Rechts ausrichten',\n        justify: 'Blocksatz',\n      },\n      color: {\n        recent: 'Letzte Farbe',\n        more: 'Weitere Farben',\n        background: 'Hintergrundfarbe',\n        foreground: 'Schriftfarbe',\n        transparent: 'Transparenz',\n        setTransparent: 'Transparenz setzen',\n        reset: 'Zurücksetzen',\n        resetToDefault: 'Auf Standard zurücksetzen',\n      },\n      shortcut: {\n        shortcuts: 'Tastenkürzel',\n        close: 'Schließen',\n        textFormatting: 'Textformatierung',\n        action: 'Aktion',\n        paragraphFormatting: 'Absatzformatierung',\n        documentStyle: 'Dokumentenstil',\n        extraKeys: 'Weitere Tasten',\n      },\n      help: {\n        insertParagraph: 'Absatz einfügen',\n        undo: 'Letzte Anweisung rückgängig',\n        redo: 'Letzte Anweisung wiederholen',\n        tab: 'Einzug hinzufügen',\n        untab: 'Einzug entfernen',\n        bold: 'Schrift Fett',\n        italic: 'Schrift Kursiv',\n        underline: 'Unterstreichen',\n        strikethrough: 'Durchstreichen',\n        removeFormat: 'Entfernt Format',\n        justifyLeft: 'Linksbündig',\n        justifyCenter: 'Mittig',\n        justifyRight: 'Rechtsbündig',\n        justifyFull: 'Blocksatz',\n        insertUnorderedList: 'Unnummerierte Liste',\n        insertOrderedList: 'Nummerierte Liste',\n        outdent: 'Aktuellen Absatz ausrücken',\n        indent: 'Aktuellen Absatz einrücken',\n        formatPara: 'Formatiert aktuellen Block als Absatz (P-Tag)',\n        formatH1: 'Formatiert aktuellen Block als H1',\n        formatH2: 'Formatiert aktuellen Block als H2',\n        formatH3: 'Formatiert aktuellen Block als H3',\n        formatH4: 'Formatiert aktuellen Block als H4',\n        formatH5: 'Formatiert aktuellen Block als H5',\n        formatH6: 'Formatiert aktuellen Block als H6',\n        insertHorizontalRule: 'Fügt eine horizontale Linie ein',\n        'linkDialog.show': 'Zeigt den Linkdialog',\n      },\n      history: {\n        undo: 'Rückgängig',\n        redo: 'Wiederholen',\n      },\n      specialChar: {\n        specialChar: 'Sonderzeichen',\n        select: 'Zeichen auswählen',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","normal","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","insertParagraph","undo","redo","tab","untab","removeFormat","justifyLeft","justifyCenter","justifyRight","justifyFull","insertUnorderedList","insertOrderedList","formatPara","formatH1","formatH2","formatH3","formatH4","formatH5","formatH6","insertHorizontalRule","history","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js
new file mode 100644
index 0000000..14f6e28
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var i in r)("object"==typeof exports?exports:e)[i]=r[i]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"de-DE":{font:{bold:"Fett",italic:"Kursiv",underline:"Unterstrichen",clear:"Zurücksetzen",height:"Zeilenhöhe",name:"Schriftart",strikethrough:"Durchgestrichen",subscript:"Tiefgestellt",superscript:"Hochgestellt",size:"Schriftgröße"},image:{image:"Bild",insert:"Bild einfügen",resizeFull:"Originalgröße",resizeHalf:"1/2 Größe",resizeQuarter:"1/4 Größe",floatLeft:"Linksbündig",floatRight:"Rechtsbündig",floatNone:"Kein Textfluss",shapeRounded:"Abgerundete Ecken",shapeCircle:"Kreisförmig",shapeThumbnail:'"Vorschaubild"',shapeNone:"Kein Rahmen",dragImageHere:"Bild hierher ziehen",dropImage:"Bild oder Text nehmen",selectFromFiles:"Datei auswählen",maximumFileSize:"Maximale Dateigröße",maximumFileSizeError:"Maximale Dateigröße überschritten",url:"Bild URL",remove:"Bild entfernen",original:"Original"},video:{video:"Video",videoLink:"Videolink",insert:"Video einfügen",url:"Video URL",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion oder Youku)"},link:{link:"Link",insert:"Link einfügen",unlink:"Link entfernen",edit:"Bearbeiten",textToDisplay:"Anzeigetext",url:"Link URL",openInNewWindow:"In neuem Fenster öffnen",useProtocol:"Standardprotokoll verwenden"},table:{table:"Tabelle",addRowAbove:"+ Zeile oberhalb",addRowBelow:"+ Zeile unterhalb",addColLeft:"+ Spalte links",addColRight:"+ Spalte rechts",delRow:"Zeile löschen",delCol:"Spalte löschen",delTable:"Tabelle löschen"},hr:{insert:"Horizontale Linie einfügen"},style:{style:"Stil",normal:"Normal",p:"Normal",blockquote:"Zitat",pre:"Quellcode",h1:"Überschrift 1",h2:"Überschrift 2",h3:"Überschrift 3",h4:"Überschrift 4",h5:"Überschrift 5",h6:"Überschrift 6"},lists:{unordered:"Aufzählung",ordered:"Nummerierung"},options:{help:"Hilfe",fullscreen:"Vollbild",codeview:"Quellcode anzeigen"},paragraph:{paragraph:"Absatz",outdent:"Einzug verkleinern",indent:"Einzug vergrößern",left:"Links ausrichten",center:"Zentriert ausrichten",right:"Rechts ausrichten",justify:"Blocksatz"},color:{recent:"Letzte Farbe",more:"Weitere Farben",background:"Hintergrundfarbe",foreground:"Schriftfarbe",transparent:"Transparenz",setTransparent:"Transparenz setzen",reset:"Zurücksetzen",resetToDefault:"Auf Standard zurücksetzen"},shortcut:{shortcuts:"Tastenkürzel",close:"Schließen",textFormatting:"Textformatierung",action:"Aktion",paragraphFormatting:"Absatzformatierung",documentStyle:"Dokumentenstil",extraKeys:"Weitere Tasten"},help:{insertParagraph:"Absatz einfügen",undo:"Letzte Anweisung rückgängig",redo:"Letzte Anweisung wiederholen",tab:"Einzug hinzufügen",untab:"Einzug entfernen",bold:"Schrift Fett",italic:"Schrift Kursiv",underline:"Unterstreichen",strikethrough:"Durchstreichen",removeFormat:"Entfernt Format",justifyLeft:"Linksbündig",justifyCenter:"Mittig",justifyRight:"Rechtsbündig",justifyFull:"Blocksatz",insertUnorderedList:"Unnummerierte Liste",insertOrderedList:"Nummerierte Liste",outdent:"Aktuellen Absatz ausrücken",indent:"Aktuellen Absatz einrücken",formatPara:"Formatiert aktuellen Block als Absatz (P-Tag)",formatH1:"Formatiert aktuellen Block als H1",formatH2:"Formatiert aktuellen Block als H2",formatH3:"Formatiert aktuellen Block als H3",formatH4:"Formatiert aktuellen Block als H4",formatH5:"Formatiert aktuellen Block als H5",formatH6:"Formatiert aktuellen Block als H6",insertHorizontalRule:"Fügt eine horizontale Linie ein","linkDialog.show":"Zeigt den Linkdialog"},history:{undo:"Rückgängig",redo:"Wiederholen"},specialChar:{specialChar:"Sonderzeichen",select:"Zeichen auswählen"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-de-DE.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js
new file mode 100644
index 0000000..bb94281
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js
@@ -0,0 +1,192 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'el-GR': {
+      font: {
+        bold: 'Έντονα',
+        italic: 'Πλάγια',
+        underline: 'Υπογραμμισμένα',
+        clear: 'Καθαρισμός',
+        height: 'Ύψος',
+        name: 'Γραμματοσειρά',
+        strikethrough: 'Διεγραμμένα',
+        subscript: 'Δείκτης',
+        superscript: 'Εκθέτης',
+        size: 'Μέγεθος',
+        sizeunit: 'Μονάδα μεγέθους'
+      },
+      image: {
+        image: 'Εικόνα',
+        insert: 'Εισαγωγή',
+        resizeFull: 'Πλήρες μέγεθος',
+        resizeHalf: 'Μισό μέγεθος',
+        resizeQuarter: '1/4 μέγεθος',
+        resizeNone: 'Αρχικό μέγεθος',
+        floatLeft: 'Μετατόπιση αριστερά',
+        floatRight: 'Μετατόπιση δεξιά',
+        floatNone: 'Χωρίς μετατόπιση',
+        shapeRounded: 'Σχήμα: Στρογγυλεμένο',
+        shapeCircle: 'Σχήμα: Κύκλος',
+        shapeThumbnail: 'Σχήμα: Μικρογραφία',
+        shapeNone: 'Σχήμα: Κανένα',
+        dragImageHere: 'Σύρτε την εικόνα εδώ',
+        dropImage: 'Αφήστε την εικόνα',
+        selectFromFiles: 'Επιλογή από αρχεία',
+        maximumFileSize: 'Μέγιστο μέγεθος αρχείου',
+        maximumFileSizeError: 'Το μέγεθος είναι μεγαλύτερο από το μέγιστο επιτρεπτό.',
+        url: 'URL',
+        remove: 'Αφαίρεση',
+        original: 'Αρχικό'
+      },
+      link: {
+        link: 'Σύνδεσμος',
+        insert: 'Εισαγωγή συνδέσμου',
+        unlink: 'Αφαίρεση συνδέσμου',
+        edit: 'Επεξεργασία συνδέσμου',
+        textToDisplay: 'Κείμενο συνδέσμου',
+        url: 'Σε ποιo URL πρέπει να πηγαίνει αυτός ο σύνδεσμος;',
+        openInNewWindow: 'Άνοιγμα σε νέο παράθυρο',
+        useProtocol: 'Χρήση προεπιλεγμένου πρωτοκόλλου'
+      },
+      video: {
+        video: 'Βίντεο',
+        videoLink: 'Σύνδεσμος Βίντεο',
+        insert: 'Εισαγωγή',
+        url: 'URL',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ή Youku)'
+      },
+      table: {
+        table: 'Πίνακας',
+        addRowAbove: 'Προσθήκη γραμμής πάνω',
+        addRowBelow: 'Προσθήκη γραμμής κάτω',
+        addColLeft: 'Προσθήκη στήλης αριστερά',
+        addColRight: 'Προσθήκη στήλης δεξία',
+        delRow: 'Διαγραφή γραμμής',
+        delCol: 'Διαγραφή στήλης',
+        delTable: 'Διαγραφή πίνακα'
+      },
+      hr: {
+        insert: 'Εισαγωγή οριζόντιας γραμμής'
+      },
+      style: {
+        style: 'Στυλ',
+        normal: 'Κανονικό',
+        blockquote: 'Παράθεση',
+        pre: 'Ως έχει',
+        h1: 'Κεφαλίδα 1',
+        h2: 'Κεφαλίδα 2',
+        h3: 'Κεφαλίδα 3',
+        h4: 'Κεφαλίδα 4',
+        h5: 'Κεφαλίδα 5',
+        h6: 'Κεφαλίδα 6'
+      },
+      lists: {
+        unordered: 'Αταξινόμητη λίστα',
+        ordered: 'Ταξινομημένη λίστα'
+      },
+      options: {
+        help: 'Βοήθεια',
+        fullscreen: 'Πλήρης οθόνη',
+        codeview: 'Προβολή HTML'
+      },
+      paragraph: {
+        paragraph: 'Παράγραφος',
+        outdent: 'Μείωση εσοχής',
+        indent: 'Άυξηση εσοχής',
+        left: 'Αριστερή στοίχιση',
+        center: 'Στοίχιση στο κέντρο',
+        right: 'Δεξιά στοίχιση',
+        justify: 'Πλήρης στοίχιση'
+      },
+      color: {
+        recent: 'Πρόσφατη επιλογή',
+        more: 'Περισσότερα',
+        background: 'Υπόβαθρο',
+        foreground: 'Μπροστά',
+        transparent: 'Διαφανές',
+        setTransparent: 'Επιλογή διαφάνειας',
+        reset: 'Επαναφορά',
+        resetToDefault: 'Επαναφορά στις προκαθορισμένες τιμές',
+        cpSelect: 'Επιλογή'
+      },
+      shortcut: {
+        shortcuts: 'Συντομεύσεις',
+        close: 'Κλείσιμο',
+        textFormatting: 'Διαμόρφωση κειμένου',
+        action: 'Ενέργεια',
+        paragraphFormatting: 'Διαμόρφωση παραγράφου',
+        documentStyle: 'Στυλ κειμένου',
+        extraKeys: 'Επιπλέον συντομεύσεις'
+      },
+      help: {
+        'escape': 'Έξοδος',
+        'insertParagraph': 'Εισαγωγή παραγράφου',
+        'undo': 'Αναιρεί την προηγούμενη εντολή',
+        'redo': 'Επαναλαμβάνει την προηγούμενη εντολή',
+        'tab': 'Εσοχή',
+        'untab': 'Αναίρεση εσοχής',
+        'bold': 'Ορισμός έντονου στυλ',
+        'italic': 'Ορισμός πλάγιου στυλ',
+        'underline': 'Ορισμός υπογεγραμμένου στυλ',
+        'strikethrough': 'Ορισμός διεγραμμένου στυλ',
+        'removeFormat': 'Αφαίρεση στυλ',
+        'justifyLeft': 'Ορισμός αριστερής στοίχισης',
+        'justifyCenter': 'Ορισμός κεντρικής στοίχισης',
+        'justifyRight': 'Ορισμός δεξιάς στοίχισης',
+        'justifyFull': 'Ορισμός πλήρους στοίχισης',
+        'insertUnorderedList': 'Ορισμός μη-ταξινομημένης λίστας',
+        'insertOrderedList': 'Ορισμός ταξινομημένης λίστας',
+        'outdent': 'Προεξοχή παραγράφου',
+        'indent': 'Εσοχή παραγράφου',
+        'formatPara': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε παράγραφο (P tag)',
+        'formatH1': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H1',
+        'formatH2': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H2',
+        'formatH3': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H3',
+        'formatH4': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H4',
+        'formatH5': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H5',
+        'formatH6': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H6',
+        'insertHorizontalRule': 'Εισαγωγή οριζόντιας γραμμής',
+        'linkDialog.show': 'Εμφάνιση διαλόγου συνδέσμου'
+      },
+      history: {
+        undo: 'Αναίρεση',
+        redo: 'Επαναληψη'
+      },
+      specialChar: {
+        specialChar: 'ΕΙΔΙΚΟΙ ΧΑΡΑΚΤΗΡΕΣ',
+        select: 'Επιλέξτε ειδικούς χαρακτήρες'
+      },
+      output: {
+        noSelection: 'Δεν έγινε επιλογή!'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-el-GR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js.map
new file mode 100644
index 0000000..9ae081e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-el-GR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-el-GR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'el-GR': {\n      font: {\n        bold: 'Έντονα',\n        italic: 'Πλάγια',\n        underline: 'Υπογραμμισμένα',\n        clear: 'Καθαρισμός',\n        height: 'Ύψος',\n        name: 'Γραμματοσειρά',\n        strikethrough: 'Διεγραμμένα',\n        subscript: 'Δείκτης',\n        superscript: 'Εκθέτης',\n        size: 'Μέγεθος',\n        sizeunit: 'Μονάδα μεγέθους',\n      },\n      image: {\n        image: 'Εικόνα',\n        insert: 'Εισαγωγή',\n        resizeFull: 'Πλήρες μέγεθος',\n        resizeHalf: 'Μισό μέγεθος',\n        resizeQuarter: '1/4 μέγεθος',\n        resizeNone: 'Αρχικό μέγεθος',\n        floatLeft: 'Μετατόπιση αριστερά',\n        floatRight: 'Μετατόπιση δεξιά',\n        floatNone: 'Χωρίς μετατόπιση',\n        shapeRounded: 'Σχήμα: Στρογγυλεμένο',\n        shapeCircle: 'Σχήμα: Κύκλος',\n        shapeThumbnail: 'Σχήμα: Μικρογραφία',\n        shapeNone: 'Σχήμα: Κανένα',\n        dragImageHere: 'Σύρτε την εικόνα εδώ',\n        dropImage: 'Αφήστε την εικόνα',\n        selectFromFiles: 'Επιλογή από αρχεία',\n        maximumFileSize: 'Μέγιστο μέγεθος αρχείου',\n        maximumFileSizeError: 'Το μέγεθος είναι μεγαλύτερο από το μέγιστο επιτρεπτό.',\n        url: 'URL',\n        remove: 'Αφαίρεση',\n        original: 'Αρχικό',\n      },\n      link: {\n        link: 'Σύνδεσμος',\n        insert: 'Εισαγωγή συνδέσμου',\n        unlink: 'Αφαίρεση συνδέσμου',\n        edit: 'Επεξεργασία συνδέσμου',\n        textToDisplay: 'Κείμενο συνδέσμου',\n        url: 'Σε ποιo URL πρέπει να πηγαίνει αυτός ο σύνδεσμος;',\n        openInNewWindow: 'Άνοιγμα σε νέο παράθυρο',\n        useProtocol: 'Χρήση προεπιλεγμένου πρωτοκόλλου',\n      },\n      video: {\n        video: 'Βίντεο',\n        videoLink: 'Σύνδεσμος Βίντεο',\n        insert: 'Εισαγωγή',\n        url: 'URL',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ή Youku)',\n      },\n      table: {\n        table: 'Πίνακας',\n        addRowAbove: 'Προσθήκη γραμμής πάνω',\n        addRowBelow: 'Προσθήκη γραμμής κάτω',\n        addColLeft: 'Προσθήκη στήλης αριστερά',\n        addColRight: 'Προσθήκη στήλης δεξία',\n        delRow: 'Διαγραφή γραμμής',\n        delCol: 'Διαγραφή στήλης',\n        delTable: 'Διαγραφή πίνακα',\n      },\n      hr: {\n        insert: 'Εισαγωγή οριζόντιας γραμμής',\n      },\n      style: {\n        style: 'Στυλ',\n        normal: 'Κανονικό',\n        blockquote: 'Παράθεση',\n        pre: 'Ως έχει',\n        h1: 'Κεφαλίδα 1',\n        h2: 'Κεφαλίδα 2',\n        h3: 'Κεφαλίδα 3',\n        h4: 'Κεφαλίδα 4',\n        h5: 'Κεφαλίδα 5',\n        h6: 'Κεφαλίδα 6',\n      },\n      lists: {\n        unordered: 'Αταξινόμητη λίστα',\n        ordered: 'Ταξινομημένη λίστα',\n      },\n      options: {\n        help: 'Βοήθεια',\n        fullscreen: 'Πλήρης οθόνη',\n        codeview: 'Προβολή HTML',\n      },\n      paragraph: {\n        paragraph: 'Παράγραφος',\n        outdent: 'Μείωση εσοχής',\n        indent: 'Άυξηση εσοχής',\n        left: 'Αριστερή στοίχιση',\n        center: 'Στοίχιση στο κέντρο',\n        right: 'Δεξιά στοίχιση',\n        justify: 'Πλήρης στοίχιση',\n      },\n      color: {\n        recent: 'Πρόσφατη επιλογή',\n        more: 'Περισσότερα',\n        background: 'Υπόβαθρο',\n        foreground: 'Μπροστά',\n        transparent: 'Διαφανές',\n        setTransparent: 'Επιλογή διαφάνειας',\n        reset: 'Επαναφορά',\n        resetToDefault: 'Επαναφορά στις προκαθορισμένες τιμές',\n        cpSelect: 'Επιλογή',\n      },\n      shortcut: {\n        shortcuts: 'Συντομεύσεις',\n        close: 'Κλείσιμο',\n        textFormatting: 'Διαμόρφωση κειμένου',\n        action: 'Ενέργεια',\n        paragraphFormatting: 'Διαμόρφωση παραγράφου',\n        documentStyle: 'Στυλ κειμένου',\n        extraKeys: 'Επιπλέον συντομεύσεις',\n      },\n      help: {\n        'escape': 'Έξοδος',\n        'insertParagraph': 'Εισαγωγή παραγράφου',\n        'undo': 'Αναιρεί την προηγούμενη εντολή',\n        'redo': 'Επαναλαμβάνει την προηγούμενη εντολή',\n        'tab': 'Εσοχή',\n        'untab': 'Αναίρεση εσοχής',\n        'bold': 'Ορισμός έντονου στυλ',\n        'italic': 'Ορισμός πλάγιου στυλ',\n        'underline': 'Ορισμός υπογεγραμμένου στυλ',\n        'strikethrough': 'Ορισμός διεγραμμένου στυλ',\n        'removeFormat': 'Αφαίρεση στυλ',\n        'justifyLeft': 'Ορισμός αριστερής στοίχισης',\n        'justifyCenter': 'Ορισμός κεντρικής στοίχισης',\n        'justifyRight': 'Ορισμός δεξιάς στοίχισης',\n        'justifyFull': 'Ορισμός πλήρους στοίχισης',\n        'insertUnorderedList': 'Ορισμός μη-ταξινομημένης λίστας',\n        'insertOrderedList': 'Ορισμός ταξινομημένης λίστας',\n        'outdent': 'Προεξοχή παραγράφου',\n        'indent': 'Εσοχή παραγράφου',\n        'formatPara': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε παράγραφο (P tag)',\n        'formatH1': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H1',\n        'formatH2': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H2',\n        'formatH3': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H3',\n        'formatH4': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H4',\n        'formatH5': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H5',\n        'formatH6': 'Αλλαγή της μορφής του τρέχοντος μπλοκ σε H6',\n        'insertHorizontalRule': 'Εισαγωγή οριζόντιας γραμμής',\n        'linkDialog.show': 'Εμφάνιση διαλόγου συνδέσμου',\n      },\n      history: {\n        undo: 'Αναίρεση',\n        redo: 'Επαναληψη',\n      },\n      specialChar: {\n        specialChar: 'ΕΙΔΙΚΟΙ ΧΑΡΑΚΤΗΡΕΣ',\n        select: 'Επιλέξτε ειδικούς χαρακτήρες',\n      },\n      output: {\n        noSelection: 'Δεν έγινε επιλογή!',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","video","videoLink","providers","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","normal","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js
new file mode 100644
index 0000000..8cb42da
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"el-GR":{font:{bold:"Έντονα",italic:"Πλάγια",underline:"Υπογραμμισμένα",clear:"Καθαρισμός",height:"Ύψος",name:"Γραμματοσειρά",strikethrough:"Διεγραμμένα",subscript:"Δείκτης",superscript:"Εκθέτης",size:"Μέγεθος",sizeunit:"Μονάδα μεγέθους"},image:{image:"Εικόνα",insert:"Εισαγωγή",resizeFull:"Πλήρες μέγεθος",resizeHalf:"Μισό μέγεθος",resizeQuarter:"1/4 μέγεθος",resizeNone:"Αρχικό μέγεθος",floatLeft:"Μετατόπιση αριστερά",floatRight:"Μετατόπιση δεξιά",floatNone:"Χωρίς μετατόπιση",shapeRounded:"Σχήμα: Στρογγυλεμένο",shapeCircle:"Σχήμα: Κύκλος",shapeThumbnail:"Σχήμα: Μικρογραφία",shapeNone:"Σχήμα: Κανένα",dragImageHere:"Σύρτε την εικόνα εδώ",dropImage:"Αφήστε την εικόνα",selectFromFiles:"Επιλογή από αρχεία",maximumFileSize:"Μέγιστο μέγεθος αρχείου",maximumFileSizeError:"Το μέγεθος είναι μεγαλύτερο από το μέγιστο επιτρεπτό.",url:"URL",remove:"Αφαίρεση",original:"Αρχικό"},link:{link:"Σύνδεσμος",insert:"Εισαγωγή συνδέσμου",unlink:"Αφαίρεση συνδέσμου",edit:"Επεξεργασία συνδέσμου",textToDisplay:"Κείμενο συνδέσμου",url:"Σε ποιo URL πρέπει να πηγαίνει αυτός ο σύνδεσμος;",openInNewWindow:"Άνοιγμα σε νέο παράθυρο",useProtocol:"Χρήση προεπιλεγμένου πρωτοκόλλου"},video:{video:"Βίντεο",videoLink:"Σύνδεσμος Βίντεο",insert:"Εισαγωγή",url:"URL",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion ή Youku)"},table:{table:"Πίνακας",addRowAbove:"Προσθήκη γραμμής πάνω",addRowBelow:"Προσθήκη γραμμής κάτω",addColLeft:"Προσθήκη στήλης αριστερά",addColRight:"Προσθήκη στήλης δεξία",delRow:"Διαγραφή γραμμής",delCol:"Διαγραφή στήλης",delTable:"Διαγραφή πίνακα"},hr:{insert:"Εισαγωγή οριζόντιας γραμμής"},style:{style:"Στυλ",normal:"Κανονικό",blockquote:"Παράθεση",pre:"Ως έχει",h1:"Κεφαλίδα 1",h2:"Κεφαλίδα 2",h3:"Κεφαλίδα 3",h4:"Κεφαλίδα 4",h5:"Κεφαλίδα 5",h6:"Κεφαλίδα 6"},lists:{unordered:"Αταξινόμητη λίστα",ordered:"Ταξινομημένη λίστα"},options:{help:"Βοήθεια",fullscreen:"Πλήρης οθόνη",codeview:"Προβολή HTML"},paragraph:{paragraph:"Παράγραφος",outdent:"Μείωση εσοχής",indent:"Άυξηση εσοχής",left:"Αριστερή στοίχιση",center:"Στοίχιση στο κέντρο",right:"Δεξιά στοίχιση",justify:"Πλήρης στοίχιση"},color:{recent:"Πρόσφατη επιλογή",more:"Περισσότερα",background:"Υπόβαθρο",foreground:"Μπροστά",transparent:"Διαφανές",setTransparent:"Επιλογή διαφάνειας",reset:"Επαναφορά",resetToDefault:"Επαναφορά στις προκαθορισμένες τιμές",cpSelect:"Επιλογή"},shortcut:{shortcuts:"Συντομεύσεις",close:"Κλείσιμο",textFormatting:"Διαμόρφωση κειμένου",action:"Ενέργεια",paragraphFormatting:"Διαμόρφωση παραγράφου",documentStyle:"Στυλ κειμένου",extraKeys:"Επιπλέον συντομεύσεις"},help:{escape:"Έξοδος",insertParagraph:"Εισαγωγή παραγράφου",undo:"Αναιρεί την προηγούμενη εντολή",redo:"Επαναλαμβάνει την προηγούμενη εντολή",tab:"Εσοχή",untab:"Αναίρεση εσοχής",bold:"Ορισμός έντονου στυλ",italic:"Ορισμός πλάγιου στυλ",underline:"Ορισμός υπογεγραμμένου στυλ",strikethrough:"Ορισμός διεγραμμένου στυλ",removeFormat:"Αφαίρεση στυλ",justifyLeft:"Ορισμός αριστερής στοίχισης",justifyCenter:"Ορισμός κεντρικής στοίχισης",justifyRight:"Ορισμός δεξιάς στοίχισης",justifyFull:"Ορισμός πλήρους στοίχισης",insertUnorderedList:"Ορισμός μη-ταξινομημένης λίστας",insertOrderedList:"Ορισμός ταξινομημένης λίστας",outdent:"Προεξοχή παραγράφου",indent:"Εσοχή παραγράφου",formatPara:"Αλλαγή της μορφής του τρέχοντος μπλοκ σε παράγραφο (P tag)",formatH1:"Αλλαγή της μορφής του τρέχοντος μπλοκ σε H1",formatH2:"Αλλαγή της μορφής του τρέχοντος μπλοκ σε H2",formatH3:"Αλλαγή της μορφής του τρέχοντος μπλοκ σε H3",formatH4:"Αλλαγή της μορφής του τρέχοντος μπλοκ σε H4",formatH5:"Αλλαγή της μορφής του τρέχοντος μπλοκ σε H5",formatH6:"Αλλαγή της μορφής του τρέχοντος μπλοκ σε H6",insertHorizontalRule:"Εισαγωγή οριζόντιας γραμμής","linkDialog.show":"Εμφάνιση διαλόγου συνδέσμου"},history:{undo:"Αναίρεση",redo:"Επαναληψη"},specialChar:{specialChar:"ΕΙΔΙΚΟΙ ΧΑΡΑΚΤΗΡΕΣ",select:"Επιλέξτε ειδικούς χαρακτήρες"},output:{noSelection:"Δεν έγινε επιλογή!"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-el-GR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js
new file mode 100644
index 0000000..8599160
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js
@@ -0,0 +1,279 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("jQuery"));
+	else if(typeof define === 'function' && define.amd)
+		define(["jQuery"], factory);
+	else {
+		var a = typeof exports === 'object' ? factory(require("jQuery")) : factory(root["jQuery"]);
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {
+return /******/ (() => { // webpackBootstrap
+/******/ 	"use strict";
+/******/ 	var __webpack_modules__ = ({
+
+/***/ 1145:
+/***/ ((module) => {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;
+
+/***/ })
+
+/******/ 	});
+/************************************************************************/
+/******/ 	// The module cache
+/******/ 	var __webpack_module_cache__ = {};
+/******/ 	
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// Check if module is in cache
+/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
+/******/ 		if (cachedModule !== undefined) {
+/******/ 			return cachedModule.exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = __webpack_module_cache__[moduleId] = {
+/******/ 			// no module.id needed
+/******/ 			// no module.loaded needed
+/******/ 			exports: {}
+/******/ 		};
+/******/ 	
+/******/ 		// Execute the module function
+/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/ 	
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/compat get default export */
+/******/ 	(() => {
+/******/ 		// getDefaultExport function for compatibility with non-harmony modules
+/******/ 		__webpack_require__.n = (module) => {
+/******/ 			var getter = module && module.__esModule ?
+/******/ 				() => (module['default']) :
+/******/ 				() => (module);
+/******/ 			__webpack_require__.d(getter, { a: getter });
+/******/ 			return getter;
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	(() => {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = (exports, definition) => {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	(() => {
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/make namespace object */
+/******/ 	(() => {
+/******/ 		// define __esModule on exports
+/******/ 		__webpack_require__.r = (exports) => {
+/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 			}
+/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1145);
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
+
+(jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) = (jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) || {
+  lang: {}
+};
+jquery__WEBPACK_IMPORTED_MODULE_0___default().extend((jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote.lang), {
+  'en-US': {
+    font: {
+      bold: 'Bold',
+      italic: 'Italic',
+      underline: 'Underline',
+      clear: 'Remove Font Style',
+      height: 'Line Height',
+      name: 'Font Family',
+      strikethrough: 'Strikethrough',
+      subscript: 'Subscript',
+      superscript: 'Superscript',
+      size: 'Font Size',
+      sizeunit: 'Font Size Unit'
+    },
+    image: {
+      image: 'Picture',
+      insert: 'Insert Image',
+      resizeFull: 'Resize full',
+      resizeHalf: 'Resize half',
+      resizeQuarter: 'Resize quarter',
+      resizeNone: 'Original size',
+      floatLeft: 'Float Left',
+      floatRight: 'Float Right',
+      floatNone: 'Remove float',
+      shapeRounded: 'Shape: Rounded',
+      shapeCircle: 'Shape: Circle',
+      shapeThumbnail: 'Shape: Thumbnail',
+      shapeNone: 'Shape: None',
+      dragImageHere: 'Drag image or text here',
+      dropImage: 'Drop image or Text',
+      selectFromFiles: 'Select from files',
+      maximumFileSize: 'Maximum file size',
+      maximumFileSizeError: 'Maximum file size exceeded.',
+      url: 'Image URL',
+      remove: 'Remove Image',
+      original: 'Original'
+    },
+    video: {
+      video: 'Video',
+      videoLink: 'Video Link',
+      insert: 'Insert Video',
+      url: 'Video URL',
+      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)'
+    },
+    link: {
+      link: 'Link',
+      insert: 'Insert Link',
+      unlink: 'Unlink',
+      edit: 'Edit',
+      textToDisplay: 'Text to display',
+      url: 'To what URL should this link go?',
+      openInNewWindow: 'Open in new window',
+      useProtocol: 'Use default protocol'
+    },
+    table: {
+      table: 'Table',
+      addRowAbove: 'Add row above',
+      addRowBelow: 'Add row below',
+      addColLeft: 'Add column left',
+      addColRight: 'Add column right',
+      delRow: 'Delete row',
+      delCol: 'Delete column',
+      delTable: 'Delete table'
+    },
+    hr: {
+      insert: 'Insert Horizontal Rule'
+    },
+    style: {
+      style: 'Style',
+      p: 'Normal',
+      blockquote: 'Quote',
+      pre: 'Code',
+      h1: 'Header 1',
+      h2: 'Header 2',
+      h3: 'Header 3',
+      h4: 'Header 4',
+      h5: 'Header 5',
+      h6: 'Header 6'
+    },
+    lists: {
+      unordered: 'Unordered list',
+      ordered: 'Ordered list'
+    },
+    options: {
+      help: 'Help',
+      fullscreen: 'Full Screen',
+      codeview: 'Code View'
+    },
+    paragraph: {
+      paragraph: 'Paragraph',
+      outdent: 'Outdent',
+      indent: 'Indent',
+      left: 'Align left',
+      center: 'Align center',
+      right: 'Align right',
+      justify: 'Justify full'
+    },
+    color: {
+      recent: 'Recent Color',
+      more: 'More Color',
+      background: 'Background Color',
+      foreground: 'Text Color',
+      transparent: 'Transparent',
+      setTransparent: 'Set transparent',
+      reset: 'Reset',
+      resetToDefault: 'Reset to default',
+      cpSelect: 'Select'
+    },
+    shortcut: {
+      shortcuts: 'Keyboard shortcuts',
+      close: 'Close',
+      textFormatting: 'Text formatting',
+      action: 'Action',
+      paragraphFormatting: 'Paragraph formatting',
+      documentStyle: 'Document Style',
+      extraKeys: 'Extra keys'
+    },
+    help: {
+      'escape': 'Escape',
+      'insertParagraph': 'Insert Paragraph',
+      'undo': 'Undo the last command',
+      'redo': 'Redo the last command',
+      'tab': 'Tab',
+      'untab': 'Untab',
+      'bold': 'Set a bold style',
+      'italic': 'Set a italic style',
+      'underline': 'Set a underline style',
+      'strikethrough': 'Set a strikethrough style',
+      'removeFormat': 'Clean a style',
+      'justifyLeft': 'Set left align',
+      'justifyCenter': 'Set center align',
+      'justifyRight': 'Set right align',
+      'justifyFull': 'Set full align',
+      'insertUnorderedList': 'Toggle unordered list',
+      'insertOrderedList': 'Toggle ordered list',
+      'outdent': 'Outdent on current paragraph',
+      'indent': 'Indent on current paragraph',
+      'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+      'formatH1': 'Change current block\'s format as H1',
+      'formatH2': 'Change current block\'s format as H2',
+      'formatH3': 'Change current block\'s format as H3',
+      'formatH4': 'Change current block\'s format as H4',
+      'formatH5': 'Change current block\'s format as H5',
+      'formatH6': 'Change current block\'s format as H6',
+      'insertHorizontalRule': 'Insert horizontal rule',
+      'linkDialog.show': 'Show Link Dialog'
+    },
+    history: {
+      undo: 'Undo',
+      redo: 'Redo'
+    },
+    specialChar: {
+      specialChar: 'SPECIAL CHARACTERS',
+      select: 'Select Special characters'
+    },
+    output: {
+      noSelection: 'No Selection Made!'
+    }
+  }
+});
+})();
+
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-en-US.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js.map
new file mode 100644
index 0000000..fd1f60b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-en-US.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///external umd \"jQuery\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/lang/summernote-en-US.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jQuery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jQuery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jQuery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {\nreturn ","module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n"],"names":["$","summernote","lang","extend","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.min.js
new file mode 100644
index 0000000..07c95d5
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-en-US.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("jQuery"));else if("function"==typeof define&&define.amd)define(["jQuery"],t);else{var r="object"==typeof exports?t(require("jQuery")):t(e.jQuery);for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(e){return(()=>{"use strict";var t={1145:t=>{t.exports=e}},r={};function o(e){var a=r[e];if(void 0!==a)return a.exports;var n=r[e]={exports:{}};return t[e](n,n.exports,o),n.exports}o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var r in t)o.o(t,r)&&!o.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};return(()=>{o.r(a);var e=o(1145),t=o.n(e);t().summernote=t().summernote||{lang:{}},t().extend(t().summernote.lang,{"en-US":{font:{bold:"Bold",italic:"Italic",underline:"Underline",clear:"Remove Font Style",height:"Line Height",name:"Font Family",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript",size:"Font Size",sizeunit:"Font Size Unit"},image:{image:"Picture",insert:"Insert Image",resizeFull:"Resize full",resizeHalf:"Resize half",resizeQuarter:"Resize quarter",resizeNone:"Original size",floatLeft:"Float Left",floatRight:"Float Right",floatNone:"Remove float",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Drag image or text here",dropImage:"Drop image or Text",selectFromFiles:"Select from files",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Image URL",remove:"Remove Image",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Insert Video",url:"Video URL",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)"},link:{link:"Link",insert:"Insert Link",unlink:"Unlink",edit:"Edit",textToDisplay:"Text to display",url:"To what URL should this link go?",openInNewWindow:"Open in new window",useProtocol:"Use default protocol"},table:{table:"Table",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Insert Horizontal Rule"},style:{style:"Style",p:"Normal",blockquote:"Quote",pre:"Code",h1:"Header 1",h2:"Header 2",h3:"Header 3",h4:"Header 4",h5:"Header 5",h6:"Header 6"},lists:{unordered:"Unordered list",ordered:"Ordered list"},options:{help:"Help",fullscreen:"Full Screen",codeview:"Code View"},paragraph:{paragraph:"Paragraph",outdent:"Outdent",indent:"Indent",left:"Align left",center:"Align center",right:"Align right",justify:"Justify full"},color:{recent:"Recent Color",more:"More Color",background:"Background Color",foreground:"Text Color",transparent:"Transparent",setTransparent:"Set transparent",reset:"Reset",resetToDefault:"Reset to default",cpSelect:"Select"},shortcut:{shortcuts:"Keyboard shortcuts",close:"Close",textFormatting:"Text formatting",action:"Action",paragraphFormatting:"Paragraph formatting",documentStyle:"Document Style",extraKeys:"Extra keys"},help:{escape:"Escape",insertParagraph:"Insert Paragraph",undo:"Undo the last command",redo:"Redo the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Undo",redo:"Redo"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"},output:{noSelection:"No Selection Made!"}}})})(),a})()}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js
new file mode 100644
index 0000000..2abe9f8
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js
@@ -0,0 +1,191 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'es-ES': {
+      font: {
+        bold: 'Negrita',
+        italic: 'Cursiva',
+        underline: 'Subrayado',
+        clear: 'Eliminar estilo de letra',
+        height: 'Altura de línea',
+        name: 'Tipo de letra',
+        strikethrough: 'Tachado',
+        subscript: 'Subíndice',
+        superscript: 'Superíndice',
+        size: 'Tamaño de la fuente',
+        sizeunit: 'Unidad del tamaño de letra'
+      },
+      image: {
+        image: 'Imagen',
+        insert: 'Insertar imagen',
+        resizeFull: 'Redimensionar a tamaño completo',
+        resizeHalf: 'Redimensionar a la mitad',
+        resizeQuarter: 'Redimensionar a un cuarto',
+        resizeNone: 'Tamaño original',
+        floatLeft: 'Flotar a la izquierda',
+        floatRight: 'Flotar a la derecha',
+        floatNone: 'No flotar',
+        shapeRounded: 'Forma: Redondeado',
+        shapeCircle: 'Forma: Círculo',
+        shapeThumbnail: 'Forma: Miniatura',
+        shapeNone: 'Forma: Ninguna',
+        dragImageHere: 'Arrastre una imagen o texto aquí',
+        dropImage: 'Suelte una imagen o texto',
+        selectFromFiles: 'Seleccione un fichero',
+        maximumFileSize: 'Tamaño máximo del fichero',
+        maximumFileSizeError: 'Superado el tamaño máximo de fichero.',
+        url: 'URL de la imagen',
+        remove: 'Eliminar la imagen',
+        original: 'Original'
+      },
+      video: {
+        video: 'Vídeo',
+        videoLink: 'Enlace del vídeo',
+        insert: 'Insertar un vídeo',
+        url: 'URL del vídeo',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)'
+      },
+      link: {
+        link: 'Enlace',
+        insert: 'Insertar un enlace',
+        unlink: 'Quitar el enlace',
+        edit: 'Editar',
+        textToDisplay: 'Texto a mostrar',
+        url: '¿A qué URL lleva este enlace?',
+        openInNewWindow: 'Abrir en una nueva ventana',
+        useProtocol: 'Usar el protocolo predefinido'
+      },
+      table: {
+        table: 'Tabla',
+        addRowAbove: 'Añadir una fila encima',
+        addRowBelow: 'Añadir una fila debajo',
+        addColLeft: 'Añadir una columna a la izquierda',
+        addColRight: 'Añadir una columna a la derecha',
+        delRow: 'Borrar la fila',
+        delCol: 'Borrar la columna',
+        delTable: 'Borrar la tabla'
+      },
+      hr: {
+        insert: 'Insertar una línea horizontal'
+      },
+      style: {
+        style: 'Estilo',
+        p: 'Normal',
+        blockquote: 'Cita',
+        pre: 'Código',
+        h1: 'Título 1',
+        h2: 'Título 2',
+        h3: 'Título 3',
+        h4: 'Título 4',
+        h5: 'Título 5',
+        h6: 'Título 6'
+      },
+      lists: {
+        unordered: 'Lista',
+        ordered: 'Lista numerada'
+      },
+      options: {
+        help: 'Ayuda',
+        fullscreen: 'Pantalla completa',
+        codeview: 'Ver el código fuente'
+      },
+      paragraph: {
+        paragraph: 'Párrafo',
+        outdent: 'Reducir la sangría',
+        indent: 'Aumentar la sangría',
+        left: 'Alinear a la izquierda',
+        center: 'Centrar',
+        right: 'Alinear a la derecha',
+        justify: 'Justificar'
+      },
+      color: {
+        recent: 'Último color',
+        more: 'Más colores',
+        background: 'Color de fondo',
+        foreground: 'Color del texto',
+        transparent: 'Transparente',
+        setTransparent: 'Establecer transparente',
+        reset: 'Restablecer',
+        resetToDefault: 'Restablecer a los valores predefinidos',
+        cpSelect: 'Seleccionar'
+      },
+      shortcut: {
+        shortcuts: 'Atajos de teclado',
+        close: 'Cerrar',
+        textFormatting: 'Formato de texto',
+        action: 'Acción',
+        paragraphFormatting: 'Formato de párrafo',
+        documentStyle: 'Estilo de documento',
+        extraKeys: 'Teclas adicionales'
+      },
+      help: {
+        insertParagraph: 'Insertar un párrafo',
+        undo: 'Deshacer la última acción',
+        redo: 'Rehacer la última acción',
+        tab: 'Tabular',
+        untab: 'Eliminar tabulación',
+        bold: 'Establecer estilo negrita',
+        italic: 'Establecer estilo cursiva',
+        underline: 'Establecer estilo subrayado',
+        strikethrough: 'Establecer estilo tachado',
+        removeFormat: 'Limpiar estilo',
+        justifyLeft: 'Alinear a la izquierda',
+        justifyCenter: 'Alinear al centro',
+        justifyRight: 'Alinear a la derecha',
+        justifyFull: 'Justificar',
+        insertUnorderedList: 'Insertar lista',
+        insertOrderedList: 'Insertar lista numerada',
+        outdent: 'Reducir sangría del párrafo',
+        indent: 'Aumentar sangría del párrafo',
+        formatPara: 'Cambiar el formato del bloque actual a párrafo (etiqueta P)',
+        formatH1: 'Cambiar el formato del bloque actual a H1',
+        formatH2: 'Cambiar el formato del bloque actual a H2',
+        formatH3: 'Cambiar el formato del bloque actual a H3',
+        formatH4: 'Cambiar el formato del bloque actual a H4',
+        formatH5: 'Cambiar el formato del bloque actual a H5',
+        formatH6: 'Cambiar el formato del bloque actual a H6',
+        insertHorizontalRule: 'Insertar una línea horizontal',
+        'linkDialog.show': 'Mostrar el panel de enlaces'
+      },
+      history: {
+        undo: 'Deshacer',
+        redo: 'Rehacer'
+      },
+      specialChar: {
+        specialChar: 'CARACTERES ESPECIALES',
+        select: 'Seleccionar caracteres especiales'
+      },
+      output: {
+        noSelection: '¡No ha seleccionado nada!'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-es-ES.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js.map
new file mode 100644
index 0000000..45b14d9
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-es-ES.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-es-ES.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'es-ES': {\n      font: {\n        bold: 'Negrita',\n        italic: 'Cursiva',\n        underline: 'Subrayado',\n        clear: 'Eliminar estilo de letra',\n        height: 'Altura de línea',\n        name: 'Tipo de letra',\n        strikethrough: 'Tachado',\n        subscript: 'Subíndice',\n        superscript: 'Superíndice',\n        size: 'Tamaño de la fuente',\n        sizeunit: 'Unidad del tamaño de letra',\n      },\n      image: {\n        image: 'Imagen',\n        insert: 'Insertar imagen',\n        resizeFull: 'Redimensionar a tamaño completo',\n        resizeHalf: 'Redimensionar a la mitad',\n        resizeQuarter: 'Redimensionar a un cuarto',\n        resizeNone: 'Tamaño original',\n        floatLeft: 'Flotar a la izquierda',\n        floatRight: 'Flotar a la derecha',\n        floatNone: 'No flotar',\n        shapeRounded: 'Forma: Redondeado',\n        shapeCircle: 'Forma: Círculo',\n        shapeThumbnail: 'Forma: Miniatura',\n        shapeNone: 'Forma: Ninguna',\n        dragImageHere: 'Arrastre una imagen o texto aquí',\n        dropImage: 'Suelte una imagen o texto',\n        selectFromFiles: 'Seleccione un fichero',\n        maximumFileSize: 'Tamaño máximo del fichero',\n        maximumFileSizeError: 'Superado el tamaño máximo de fichero.',\n        url: 'URL de la imagen',\n        remove: 'Eliminar la imagen',\n        original: 'Original',\n      },\n      video: {\n        video: 'Vídeo',\n        videoLink: 'Enlace del vídeo',\n        insert: 'Insertar un vídeo',\n        url: 'URL del vídeo',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)',\n      },\n      link: {\n        link: 'Enlace',\n        insert: 'Insertar un enlace',\n        unlink: 'Quitar el enlace',\n        edit: 'Editar',\n        textToDisplay: 'Texto a mostrar',\n        url: '¿A qué URL lleva este enlace?',\n        openInNewWindow: 'Abrir en una nueva ventana',\n        useProtocol: 'Usar el protocolo predefinido',\n      },\n      table: {\n        table: 'Tabla',\n        addRowAbove: 'Añadir una fila encima',\n        addRowBelow: 'Añadir una fila debajo',\n        addColLeft: 'Añadir una columna a la izquierda',\n        addColRight: 'Añadir una columna a la derecha',\n        delRow: 'Borrar la fila',\n        delCol: 'Borrar la columna',\n        delTable: 'Borrar la tabla',\n      },\n      hr: {\n        insert: 'Insertar una línea horizontal',\n      },\n      style: {\n        style: 'Estilo',\n        p: 'Normal',\n        blockquote: 'Cita',\n        pre: 'Código',\n        h1: 'Título 1',\n        h2: 'Título 2',\n        h3: 'Título 3',\n        h4: 'Título 4',\n        h5: 'Título 5',\n        h6: 'Título 6',\n      },\n      lists: {\n        unordered: 'Lista',\n        ordered: 'Lista numerada',\n      },\n      options: {\n        help: 'Ayuda',\n        fullscreen: 'Pantalla completa',\n        codeview: 'Ver el código fuente',\n      },\n      paragraph: {\n        paragraph: 'Párrafo',\n        outdent: 'Reducir la sangría',\n        indent: 'Aumentar la sangría',\n        left: 'Alinear a la izquierda',\n        center: 'Centrar',\n        right: 'Alinear a la derecha',\n        justify: 'Justificar',\n      },\n      color: {\n        recent: 'Último color',\n        more: 'Más colores',\n        background: 'Color de fondo',\n        foreground: 'Color del texto',\n        transparent: 'Transparente',\n        setTransparent: 'Establecer transparente',\n        reset: 'Restablecer',\n        resetToDefault: 'Restablecer a los valores predefinidos',\n        cpSelect: 'Seleccionar',\n      },\n      shortcut: {\n        shortcuts: 'Atajos de teclado',\n        close: 'Cerrar',\n        textFormatting: 'Formato de texto',\n        action: 'Acción',\n        paragraphFormatting: 'Formato de párrafo',\n        documentStyle: 'Estilo de documento',\n        extraKeys: 'Teclas adicionales',\n      },\n      help: {\n        insertParagraph: 'Insertar un párrafo',\n        undo: 'Deshacer la última acción',\n        redo: 'Rehacer la última acción',\n        tab: 'Tabular',\n        untab: 'Eliminar tabulación',\n        bold: 'Establecer estilo negrita',\n        italic: 'Establecer estilo cursiva',\n        underline: 'Establecer estilo subrayado',\n        strikethrough: 'Establecer estilo tachado',\n        removeFormat: 'Limpiar estilo',\n        justifyLeft: 'Alinear a la izquierda',\n        justifyCenter: 'Alinear al centro',\n        justifyRight: 'Alinear a la derecha',\n        justifyFull: 'Justificar',\n        insertUnorderedList: 'Insertar lista',\n        insertOrderedList: 'Insertar lista numerada',\n        outdent: 'Reducir sangría del párrafo',\n        indent: 'Aumentar sangría del párrafo',\n        formatPara: 'Cambiar el formato del bloque actual a párrafo (etiqueta P)',\n        formatH1: 'Cambiar el formato del bloque actual a H1',\n        formatH2: 'Cambiar el formato del bloque actual a H2',\n        formatH3: 'Cambiar el formato del bloque actual a H3',\n        formatH4: 'Cambiar el formato del bloque actual a H4',\n        formatH5: 'Cambiar el formato del bloque actual a H5',\n        formatH6: 'Cambiar el formato del bloque actual a H6',\n        insertHorizontalRule: 'Insertar una línea horizontal',\n        'linkDialog.show': 'Mostrar el panel de enlaces',\n      },\n      history: {\n        undo: 'Deshacer',\n        redo: 'Rehacer',\n      },\n      specialChar: {\n        specialChar: 'CARACTERES ESPECIALES',\n        select: 'Seleccionar caracteres especiales',\n      },\n      output: {\n        noSelection: '¡No ha seleccionado nada!',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","insertParagraph","undo","redo","tab","untab","removeFormat","justifyLeft","justifyCenter","justifyRight","justifyFull","insertUnorderedList","insertOrderedList","formatPara","formatH1","formatH2","formatH3","formatH4","formatH5","formatH6","insertHorizontalRule","history","specialChar","select","output","noSelection","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js
new file mode 100644
index 0000000..75e0419
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var r=a();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"es-ES":{font:{bold:"Negrita",italic:"Cursiva",underline:"Subrayado",clear:"Eliminar estilo de letra",height:"Altura de línea",name:"Tipo de letra",strikethrough:"Tachado",subscript:"Subíndice",superscript:"Superíndice",size:"Tamaño de la fuente",sizeunit:"Unidad del tamaño de letra"},image:{image:"Imagen",insert:"Insertar imagen",resizeFull:"Redimensionar a tamaño completo",resizeHalf:"Redimensionar a la mitad",resizeQuarter:"Redimensionar a un cuarto",resizeNone:"Tamaño original",floatLeft:"Flotar a la izquierda",floatRight:"Flotar a la derecha",floatNone:"No flotar",shapeRounded:"Forma: Redondeado",shapeCircle:"Forma: Círculo",shapeThumbnail:"Forma: Miniatura",shapeNone:"Forma: Ninguna",dragImageHere:"Arrastre una imagen o texto aquí",dropImage:"Suelte una imagen o texto",selectFromFiles:"Seleccione un fichero",maximumFileSize:"Tamaño máximo del fichero",maximumFileSizeError:"Superado el tamaño máximo de fichero.",url:"URL de la imagen",remove:"Eliminar la imagen",original:"Original"},video:{video:"Vídeo",videoLink:"Enlace del vídeo",insert:"Insertar un vídeo",url:"URL del vídeo",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)"},link:{link:"Enlace",insert:"Insertar un enlace",unlink:"Quitar el enlace",edit:"Editar",textToDisplay:"Texto a mostrar",url:"¿A qué URL lleva este enlace?",openInNewWindow:"Abrir en una nueva ventana",useProtocol:"Usar el protocolo predefinido"},table:{table:"Tabla",addRowAbove:"Añadir una fila encima",addRowBelow:"Añadir una fila debajo",addColLeft:"Añadir una columna a la izquierda",addColRight:"Añadir una columna a la derecha",delRow:"Borrar la fila",delCol:"Borrar la columna",delTable:"Borrar la tabla"},hr:{insert:"Insertar una línea horizontal"},style:{style:"Estilo",p:"Normal",blockquote:"Cita",pre:"Código",h1:"Título 1",h2:"Título 2",h3:"Título 3",h4:"Título 4",h5:"Título 5",h6:"Título 6"},lists:{unordered:"Lista",ordered:"Lista numerada"},options:{help:"Ayuda",fullscreen:"Pantalla completa",codeview:"Ver el código fuente"},paragraph:{paragraph:"Párrafo",outdent:"Reducir la sangría",indent:"Aumentar la sangría",left:"Alinear a la izquierda",center:"Centrar",right:"Alinear a la derecha",justify:"Justificar"},color:{recent:"Último color",more:"Más colores",background:"Color de fondo",foreground:"Color del texto",transparent:"Transparente",setTransparent:"Establecer transparente",reset:"Restablecer",resetToDefault:"Restablecer a los valores predefinidos",cpSelect:"Seleccionar"},shortcut:{shortcuts:"Atajos de teclado",close:"Cerrar",textFormatting:"Formato de texto",action:"Acción",paragraphFormatting:"Formato de párrafo",documentStyle:"Estilo de documento",extraKeys:"Teclas adicionales"},help:{insertParagraph:"Insertar un párrafo",undo:"Deshacer la última acción",redo:"Rehacer la última acción",tab:"Tabular",untab:"Eliminar tabulación",bold:"Establecer estilo negrita",italic:"Establecer estilo cursiva",underline:"Establecer estilo subrayado",strikethrough:"Establecer estilo tachado",removeFormat:"Limpiar estilo",justifyLeft:"Alinear a la izquierda",justifyCenter:"Alinear al centro",justifyRight:"Alinear a la derecha",justifyFull:"Justificar",insertUnorderedList:"Insertar lista",insertOrderedList:"Insertar lista numerada",outdent:"Reducir sangría del párrafo",indent:"Aumentar sangría del párrafo",formatPara:"Cambiar el formato del bloque actual a párrafo (etiqueta P)",formatH1:"Cambiar el formato del bloque actual a H1",formatH2:"Cambiar el formato del bloque actual a H2",formatH3:"Cambiar el formato del bloque actual a H3",formatH4:"Cambiar el formato del bloque actual a H4",formatH5:"Cambiar el formato del bloque actual a H5",formatH6:"Cambiar el formato del bloque actual a H6",insertHorizontalRule:"Insertar una línea horizontal","linkDialog.show":"Mostrar el panel de enlaces"},history:{undo:"Deshacer",redo:"Rehacer"},specialChar:{specialChar:"CARACTERES ESPECIALES",select:"Seleccionar caracteres especiales"},output:{noSelection:"¡No ha seleccionado nada!"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-ES.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js
new file mode 100644
index 0000000..f0fdf74
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js
@@ -0,0 +1,183 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'es-EU': {
+      font: {
+        bold: 'Lodia',
+        italic: 'Etzana',
+        underline: 'Azpimarratua',
+        clear: 'Estiloa kendu',
+        height: 'Lerro altuera',
+        name: 'Tipografia',
+        strikethrough: 'Marratua',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Letren neurria'
+      },
+      image: {
+        image: 'Irudia',
+        insert: 'Irudi bat txertatu',
+        resizeFull: 'Jatorrizko neurrira aldatu',
+        resizeHalf: 'Neurria erdira aldatu',
+        resizeQuarter: 'Neurria laurdenera aldatu',
+        floatLeft: 'Ezkerrean kokatu',
+        floatRight: 'Eskuinean kokatu',
+        floatNone: 'Kokapenik ez ezarri',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Irudi bat ezarri hemen',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Zure fitxategi bat aukeratu',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'Irudiaren URL helbidea',
+        remove: 'Remove Image',
+        original: 'Original'
+      },
+      video: {
+        video: 'Bideoa',
+        videoLink: 'Bideorako esteka',
+        insert: 'Bideo berri bat txertatu',
+        url: 'Bideoaren URL helbidea',
+        providers: '(YouTube, Vimeo, Vine, Instagram edo DailyMotion)'
+      },
+      link: {
+        link: 'Esteka',
+        insert: 'Esteka bat txertatu',
+        unlink: 'Esteka ezabatu',
+        edit: 'Editatu',
+        textToDisplay: 'Estekaren testua',
+        url: 'Estekaren URL helbidea',
+        openInNewWindow: 'Leiho berri batean ireki'
+      },
+      table: {
+        table: 'Taula',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Marra horizontala txertatu'
+      },
+      style: {
+        style: 'Estiloa',
+        p: 'p',
+        blockquote: 'Aipamena',
+        pre: 'Kodea',
+        h1: '1. izenburua',
+        h2: '2. izenburua',
+        h3: '3. izenburua',
+        h4: '4. izenburua',
+        h5: '5. izenburua',
+        h6: '6. izenburua'
+      },
+      lists: {
+        unordered: 'Ordenatu gabeko zerrenda',
+        ordered: 'Zerrenda ordenatua'
+      },
+      options: {
+        help: 'Laguntza',
+        fullscreen: 'Pantaila osoa',
+        codeview: 'Kodea ikusi'
+      },
+      paragraph: {
+        paragraph: 'Paragrafoa',
+        outdent: 'Koska txikiagoa',
+        indent: 'Koska handiagoa',
+        left: 'Ezkerrean kokatu',
+        center: 'Erdian kokatu',
+        right: 'Eskuinean kokatu',
+        justify: 'Justifikatu'
+      },
+      color: {
+        recent: 'Azken kolorea',
+        more: 'Kolore gehiago',
+        background: 'Atzeko planoa',
+        foreground: 'Aurreko planoa',
+        transparent: 'Gardena',
+        setTransparent: 'Gardendu',
+        reset: 'Lehengoratu',
+        resetToDefault: 'Berrezarri lehenetsia'
+      },
+      shortcut: {
+        shortcuts: 'Lasterbideak',
+        close: 'Itxi',
+        textFormatting: 'Testuaren formatua',
+        action: 'Ekintza',
+        paragraphFormatting: 'Paragrafoaren formatua',
+        documentStyle: 'Dokumentuaren estiloa'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Desegin',
+        redo: 'Berregin'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-es-EU.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js.map
new file mode 100644
index 0000000..398c970
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-es-EU.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-es-EU.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'es-EU': {\n      font: {\n        bold: 'Lodia',\n        italic: 'Etzana',\n        underline: 'Azpimarratua',\n        clear: 'Estiloa kendu',\n        height: 'Lerro altuera',\n        name: 'Tipografia',\n        strikethrough: 'Marratua',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Letren neurria',\n      },\n      image: {\n        image: 'Irudia',\n        insert: 'Irudi bat txertatu',\n        resizeFull: 'Jatorrizko neurrira aldatu',\n        resizeHalf: 'Neurria erdira aldatu',\n        resizeQuarter: 'Neurria laurdenera aldatu',\n        floatLeft: 'Ezkerrean kokatu',\n        floatRight: 'Eskuinean kokatu',\n        floatNone: 'Kokapenik ez ezarri',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Irudi bat ezarri hemen',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Zure fitxategi bat aukeratu',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'Irudiaren URL helbidea',\n        remove: 'Remove Image',\n        original: 'Original',\n      },\n      video: {\n        video: 'Bideoa',\n        videoLink: 'Bideorako esteka',\n        insert: 'Bideo berri bat txertatu',\n        url: 'Bideoaren URL helbidea',\n        providers: '(YouTube, Vimeo, Vine, Instagram edo DailyMotion)',\n      },\n      link: {\n        link: 'Esteka',\n        insert: 'Esteka bat txertatu',\n        unlink: 'Esteka ezabatu',\n        edit: 'Editatu',\n        textToDisplay: 'Estekaren testua',\n        url: 'Estekaren URL helbidea',\n        openInNewWindow: 'Leiho berri batean ireki',\n      },\n      table: {\n        table: 'Taula',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Marra horizontala txertatu',\n      },\n      style: {\n        style: 'Estiloa',\n        p: 'p',\n        blockquote: 'Aipamena',\n        pre: 'Kodea',\n        h1: '1. izenburua',\n        h2: '2. izenburua',\n        h3: '3. izenburua',\n        h4: '4. izenburua',\n        h5: '5. izenburua',\n        h6: '6. izenburua',\n      },\n      lists: {\n        unordered: 'Ordenatu gabeko zerrenda',\n        ordered: 'Zerrenda ordenatua',\n      },\n      options: {\n        help: 'Laguntza',\n        fullscreen: 'Pantaila osoa',\n        codeview: 'Kodea ikusi',\n      },\n      paragraph: {\n        paragraph: 'Paragrafoa',\n        outdent: 'Koska txikiagoa',\n        indent: 'Koska handiagoa',\n        left: 'Ezkerrean kokatu',\n        center: 'Erdian kokatu',\n        right: 'Eskuinean kokatu',\n        justify: 'Justifikatu',\n      },\n      color: {\n        recent: 'Azken kolorea',\n        more: 'Kolore gehiago',\n        background: 'Atzeko planoa',\n        foreground: 'Aurreko planoa',\n        transparent: 'Gardena',\n        setTransparent: 'Gardendu',\n        reset: 'Lehengoratu',\n        resetToDefault: 'Berrezarri lehenetsia',\n      },\n      shortcut: {\n        shortcuts: 'Lasterbideak',\n        close: 'Itxi',\n        textFormatting: 'Testuaren formatua',\n        action: 'Ekintza',\n        paragraphFormatting: 'Paragrafoaren formatua',\n        documentStyle: 'Dokumentuaren estiloa',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Desegin',\n        redo: 'Berregin',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js
new file mode 100644
index 0000000..025b4c9
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var r=a();for(var t in r)("object"==typeof exports?exports:e)[t]=r[t]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"es-EU":{font:{bold:"Lodia",italic:"Etzana",underline:"Azpimarratua",clear:"Estiloa kendu",height:"Lerro altuera",name:"Tipografia",strikethrough:"Marratua",subscript:"Subscript",superscript:"Superscript",size:"Letren neurria"},image:{image:"Irudia",insert:"Irudi bat txertatu",resizeFull:"Jatorrizko neurrira aldatu",resizeHalf:"Neurria erdira aldatu",resizeQuarter:"Neurria laurdenera aldatu",floatLeft:"Ezkerrean kokatu",floatRight:"Eskuinean kokatu",floatNone:"Kokapenik ez ezarri",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Irudi bat ezarri hemen",dropImage:"Drop image or Text",selectFromFiles:"Zure fitxategi bat aukeratu",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Irudiaren URL helbidea",remove:"Remove Image",original:"Original"},video:{video:"Bideoa",videoLink:"Bideorako esteka",insert:"Bideo berri bat txertatu",url:"Bideoaren URL helbidea",providers:"(YouTube, Vimeo, Vine, Instagram edo DailyMotion)"},link:{link:"Esteka",insert:"Esteka bat txertatu",unlink:"Esteka ezabatu",edit:"Editatu",textToDisplay:"Estekaren testua",url:"Estekaren URL helbidea",openInNewWindow:"Leiho berri batean ireki"},table:{table:"Taula",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Marra horizontala txertatu"},style:{style:"Estiloa",p:"p",blockquote:"Aipamena",pre:"Kodea",h1:"1. izenburua",h2:"2. izenburua",h3:"3. izenburua",h4:"4. izenburua",h5:"5. izenburua",h6:"6. izenburua"},lists:{unordered:"Ordenatu gabeko zerrenda",ordered:"Zerrenda ordenatua"},options:{help:"Laguntza",fullscreen:"Pantaila osoa",codeview:"Kodea ikusi"},paragraph:{paragraph:"Paragrafoa",outdent:"Koska txikiagoa",indent:"Koska handiagoa",left:"Ezkerrean kokatu",center:"Erdian kokatu",right:"Eskuinean kokatu",justify:"Justifikatu"},color:{recent:"Azken kolorea",more:"Kolore gehiago",background:"Atzeko planoa",foreground:"Aurreko planoa",transparent:"Gardena",setTransparent:"Gardendu",reset:"Lehengoratu",resetToDefault:"Berrezarri lehenetsia"},shortcut:{shortcuts:"Lasterbideak",close:"Itxi",textFormatting:"Testuaren formatua",action:"Ekintza",paragraphFormatting:"Paragrafoaren formatua",documentStyle:"Dokumentuaren estiloa"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Desegin",redo:"Berregin"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-es-EU.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js
new file mode 100644
index 0000000..b82e0e8
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'fa-IR': {
+      font: {
+        bold: 'درشت',
+        italic: 'خمیده',
+        underline: 'میان خط',
+        clear: 'پاک کردن فرمت فونت',
+        height: 'فاصله ی خطی',
+        name: 'اسم فونت',
+        strikethrough: 'Strike',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'اندازه ی فونت'
+      },
+      image: {
+        image: 'تصویر',
+        insert: 'وارد کردن تصویر',
+        resizeFull: 'تغییر به اندازه ی کامل',
+        resizeHalf: 'تغییر به اندازه نصف',
+        resizeQuarter: 'تغییر به اندازه یک چهارم',
+        floatLeft: 'چسباندن به چپ',
+        floatRight: 'چسباندن به راست',
+        floatNone: 'بدون چسبندگی',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'یک تصویر را اینجا بکشید',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'فایل ها را انتخاب کنید',
+        maximumFileSize: 'حداکثر اندازه پرونده',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'آدرس تصویر',
+        remove: 'حذف تصویر',
+        original: 'Original'
+      },
+      video: {
+        video: 'ویدیو',
+        videoLink: 'لینک ویدیو',
+        insert: 'افزودن ویدیو',
+        url: 'آدرس ویدیو ؟',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion یا Youku)'
+      },
+      link: {
+        link: 'لینک',
+        insert: 'اضافه کردن لینک',
+        unlink: 'حذف لینک',
+        edit: 'ویرایش',
+        textToDisplay: 'متن جهت نمایش',
+        url: 'این لینک به چه آدرسی باید برود ؟',
+        openInNewWindow: 'در یک پنجره ی جدید باز شود'
+      },
+      table: {
+        table: 'جدول',
+        addRowAbove: 'افزودن ردیف بالا',
+        addRowBelow: 'افزودن ردیف پایین',
+        addColLeft: 'افزودن ستون چپ',
+        addColRight: 'افزودن ستون راست',
+        delRow: 'حذف ردیف',
+        delCol: 'حذف ستون',
+        delTable: 'حذف جدول'
+      },
+      hr: {
+        insert: 'افزودن خط افقی'
+      },
+      style: {
+        style: 'استیل',
+        p: 'نرمال',
+        blockquote: 'نقل قول',
+        pre: 'کد',
+        h1: 'سرتیتر 1',
+        h2: 'سرتیتر 2',
+        h3: 'سرتیتر 3',
+        h4: 'سرتیتر 4',
+        h5: 'سرتیتر 5',
+        h6: 'سرتیتر 6'
+      },
+      lists: {
+        unordered: 'لیست غیر ترتیبی',
+        ordered: 'لیست ترتیبی'
+      },
+      options: {
+        help: 'راهنما',
+        fullscreen: 'نمایش تمام صفحه',
+        codeview: 'مشاهده ی کد'
+      },
+      paragraph: {
+        paragraph: 'پاراگراف',
+        outdent: 'کاهش تو رفتگی',
+        indent: 'افزایش تو رفتگی',
+        left: 'چپ چین',
+        center: 'میان چین',
+        right: 'راست چین',
+        justify: 'بلوک چین'
+      },
+      color: {
+        recent: 'رنگ اخیرا استفاده شده',
+        more: 'رنگ بیشتر',
+        background: 'رنگ پس زمینه',
+        foreground: 'رنگ متن',
+        transparent: 'بی رنگ',
+        setTransparent: 'تنظیم حالت بی رنگ',
+        reset: 'بازنشاندن',
+        resetToDefault: 'حالت پیش فرض'
+      },
+      shortcut: {
+        shortcuts: 'دکمه های میان بر',
+        close: 'بستن',
+        textFormatting: 'فرمت متن',
+        action: 'عملیات',
+        paragraphFormatting: 'فرمت پاراگراف',
+        documentStyle: 'استیل سند',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'افزودن پاراگراف',
+        'undo': 'آخرین فرمان را لغو می کند',
+        'redo': 'دستور آخر را دوباره اجرا می کند',
+        'tab': 'تب',
+        'untab': 'لغو تب',
+        'bold': 'استایل ضخیم میدهد',
+        'italic': 'استایل مورب میدهد',
+        'underline': 'استایل زیرخط دار میدهد',
+        'strikethrough': 'استایل خط خورده میدهد',
+        'removeFormat': 'حذف همه استایل ها',
+        'justifyLeft': 'چپ چین',
+        'justifyCenter': 'وسط چین',
+        'justifyRight': 'راست چین',
+        'justifyFull': 'چینش در کل عرض',
+        'insertUnorderedList': 'تغییر بع لیست غیرترتیبی',
+        'insertOrderedList': 'تغییر بع لیست ترتیبی',
+        'outdent': 'گذر از پاراگراف فعلی',
+        'indent': 'قرارگیری بر روی پاراگراف جاری',
+        'formatPara': 'تغییر فرمت متن به تگ <p>',
+        'formatH1': 'تغییر فرمت متن به تگ <h1>',
+        'formatH2': 'تغییر فرمت متن به تگ <h2>',
+        'formatH3': 'تغییر فرمت متن به تگ <h3>',
+        'formatH4': 'تغییر فرمت متن به تگ <h4>',
+        'formatH5': 'تغییر فرمت متن به تگ <h5>',
+        'formatH6': 'تغییر فرمت متن به تگ <h6>',
+        'insertHorizontalRule': 'وارد کردن به صورت افقی',
+        'linkDialog.show': 'نمایش پیام لینک'
+      },
+      history: {
+        undo: 'واچیدن',
+        redo: 'بازچیدن'
+      },
+      specialChar: {
+        specialChar: 'کاراکتر خاص',
+        select: 'انتخاب کاراکتر خاص'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-fa-IR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js.map
new file mode 100644
index 0000000..18fae3e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-fa-IR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-fa-IR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'fa-IR': {\n      font: {\n        bold: 'درشت',\n        italic: 'خمیده',\n        underline: 'میان خط',\n        clear: 'پاک کردن فرمت فونت',\n        height: 'فاصله ی خطی',\n        name: 'اسم فونت',\n        strikethrough: 'Strike',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'اندازه ی فونت',\n      },\n      image: {\n        image: 'تصویر',\n        insert: 'وارد کردن تصویر',\n        resizeFull: 'تغییر به اندازه ی کامل',\n        resizeHalf: 'تغییر به اندازه نصف',\n        resizeQuarter: 'تغییر به اندازه یک چهارم',\n        floatLeft: 'چسباندن به چپ',\n        floatRight: 'چسباندن به راست',\n        floatNone: 'بدون چسبندگی',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'یک تصویر را اینجا بکشید',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'فایل ها را انتخاب کنید',\n        maximumFileSize: 'حداکثر اندازه پرونده',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'آدرس تصویر',\n        remove: 'حذف تصویر',\n        original: 'Original',\n      },\n      video: {\n        video: 'ویدیو',\n        videoLink: 'لینک ویدیو',\n        insert: 'افزودن ویدیو',\n        url: 'آدرس ویدیو ؟',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion یا Youku)',\n      },\n      link: {\n        link: 'لینک',\n        insert: 'اضافه کردن لینک',\n        unlink: 'حذف لینک',\n        edit: 'ویرایش',\n        textToDisplay: 'متن جهت نمایش',\n        url: 'این لینک به چه آدرسی باید برود ؟',\n        openInNewWindow: 'در یک پنجره ی جدید باز شود',\n      },\n      table: {\n        table: 'جدول',\n        addRowAbove: 'افزودن ردیف بالا',\n        addRowBelow: 'افزودن ردیف پایین',\n        addColLeft: 'افزودن ستون چپ',\n        addColRight: 'افزودن ستون راست',\n        delRow: 'حذف ردیف',\n        delCol: 'حذف ستون',\n        delTable: 'حذف جدول',\n      },\n      hr: {\n        insert: 'افزودن خط افقی',\n      },\n      style: {\n        style: 'استیل',\n        p: 'نرمال',\n        blockquote: 'نقل قول',\n        pre: 'کد',\n        h1: 'سرتیتر 1',\n        h2: 'سرتیتر 2',\n        h3: 'سرتیتر 3',\n        h4: 'سرتیتر 4',\n        h5: 'سرتیتر 5',\n        h6: 'سرتیتر 6',\n      },\n      lists: {\n        unordered: 'لیست غیر ترتیبی',\n        ordered: 'لیست ترتیبی',\n      },\n      options: {\n        help: 'راهنما',\n        fullscreen: 'نمایش تمام صفحه',\n        codeview: 'مشاهده ی کد',\n      },\n      paragraph: {\n        paragraph: 'پاراگراف',\n        outdent: 'کاهش تو رفتگی',\n        indent: 'افزایش تو رفتگی',\n        left: 'چپ چین',\n        center: 'میان چین',\n        right: 'راست چین',\n        justify: 'بلوک چین',\n      },\n      color: {\n        recent: 'رنگ اخیرا استفاده شده',\n        more: 'رنگ بیشتر',\n        background: 'رنگ پس زمینه',\n        foreground: 'رنگ متن',\n        transparent: 'بی رنگ',\n        setTransparent: 'تنظیم حالت بی رنگ',\n        reset: 'بازنشاندن',\n        resetToDefault: 'حالت پیش فرض',\n      },\n      shortcut: {\n        shortcuts: 'دکمه های میان بر',\n        close: 'بستن',\n        textFormatting: 'فرمت متن',\n        action: 'عملیات',\n        paragraphFormatting: 'فرمت پاراگراف',\n        documentStyle: 'استیل سند',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'افزودن پاراگراف',\n        'undo': 'آخرین فرمان را لغو می کند',\n        'redo': 'دستور آخر را دوباره اجرا می کند',\n        'tab': 'تب',\n        'untab': 'لغو تب',\n        'bold': 'استایل ضخیم میدهد',\n        'italic': 'استایل مورب میدهد',\n        'underline': 'استایل زیرخط دار میدهد',\n        'strikethrough': 'استایل خط خورده میدهد',\n        'removeFormat': 'حذف همه استایل ها',\n        'justifyLeft': 'چپ چین',\n        'justifyCenter': 'وسط چین',\n        'justifyRight': 'راست چین',\n        'justifyFull': 'چینش در کل عرض',\n        'insertUnorderedList': 'تغییر بع لیست غیرترتیبی',\n        'insertOrderedList': 'تغییر بع لیست ترتیبی',\n        'outdent': 'گذر از پاراگراف فعلی',\n        'indent': 'قرارگیری بر روی پاراگراف جاری',\n        'formatPara': 'تغییر فرمت متن به تگ <p>',\n        'formatH1': 'تغییر فرمت متن به تگ <h1>',\n        'formatH2': 'تغییر فرمت متن به تگ <h2>',\n        'formatH3': 'تغییر فرمت متن به تگ <h3>',\n        'formatH4': 'تغییر فرمت متن به تگ <h4>',\n        'formatH5': 'تغییر فرمت متن به تگ <h5>',\n        'formatH6': 'تغییر فرمت متن به تگ <h6>',\n        'insertHorizontalRule': 'وارد کردن به صورت افقی',\n        'linkDialog.show': 'نمایش پیام لینک',\n      },\n      history: {\n        undo: 'واچیدن',\n        redo: 'بازچیدن',\n      },\n      specialChar: {\n        specialChar: 'کاراکتر خاص',\n        select: 'انتخاب کاراکتر خاص',\n      },      \n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js
new file mode 100644
index 0000000..713926f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var t=r();for(var o in t)("object"==typeof exports?exports:e)[o]=t[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"fa-IR":{font:{bold:"درشت",italic:"خمیده",underline:"میان خط",clear:"پاک کردن فرمت فونت",height:"فاصله ی خطی",name:"اسم فونت",strikethrough:"Strike",subscript:"Subscript",superscript:"Superscript",size:"اندازه ی فونت"},image:{image:"تصویر",insert:"وارد کردن تصویر",resizeFull:"تغییر به اندازه ی کامل",resizeHalf:"تغییر به اندازه نصف",resizeQuarter:"تغییر به اندازه یک چهارم",floatLeft:"چسباندن به چپ",floatRight:"چسباندن به راست",floatNone:"بدون چسبندگی",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"یک تصویر را اینجا بکشید",dropImage:"Drop image or Text",selectFromFiles:"فایل ها را انتخاب کنید",maximumFileSize:"حداکثر اندازه پرونده",maximumFileSizeError:"Maximum file size exceeded.",url:"آدرس تصویر",remove:"حذف تصویر",original:"Original"},video:{video:"ویدیو",videoLink:"لینک ویدیو",insert:"افزودن ویدیو",url:"آدرس ویدیو ؟",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion یا Youku)"},link:{link:"لینک",insert:"اضافه کردن لینک",unlink:"حذف لینک",edit:"ویرایش",textToDisplay:"متن جهت نمایش",url:"این لینک به چه آدرسی باید برود ؟",openInNewWindow:"در یک پنجره ی جدید باز شود"},table:{table:"جدول",addRowAbove:"افزودن ردیف بالا",addRowBelow:"افزودن ردیف پایین",addColLeft:"افزودن ستون چپ",addColRight:"افزودن ستون راست",delRow:"حذف ردیف",delCol:"حذف ستون",delTable:"حذف جدول"},hr:{insert:"افزودن خط افقی"},style:{style:"استیل",p:"نرمال",blockquote:"نقل قول",pre:"کد",h1:"سرتیتر 1",h2:"سرتیتر 2",h3:"سرتیتر 3",h4:"سرتیتر 4",h5:"سرتیتر 5",h6:"سرتیتر 6"},lists:{unordered:"لیست غیر ترتیبی",ordered:"لیست ترتیبی"},options:{help:"راهنما",fullscreen:"نمایش تمام صفحه",codeview:"مشاهده ی کد"},paragraph:{paragraph:"پاراگراف",outdent:"کاهش تو رفتگی",indent:"افزایش تو رفتگی",left:"چپ چین",center:"میان چین",right:"راست چین",justify:"بلوک چین"},color:{recent:"رنگ اخیرا استفاده شده",more:"رنگ بیشتر",background:"رنگ پس زمینه",foreground:"رنگ متن",transparent:"بی رنگ",setTransparent:"تنظیم حالت بی رنگ",reset:"بازنشاندن",resetToDefault:"حالت پیش فرض"},shortcut:{shortcuts:"دکمه های میان بر",close:"بستن",textFormatting:"فرمت متن",action:"عملیات",paragraphFormatting:"فرمت پاراگراف",documentStyle:"استیل سند",extraKeys:"Extra keys"},help:{insertParagraph:"افزودن پاراگراف",undo:"آخرین فرمان را لغو می کند",redo:"دستور آخر را دوباره اجرا می کند",tab:"تب",untab:"لغو تب",bold:"استایل ضخیم میدهد",italic:"استایل مورب میدهد",underline:"استایل زیرخط دار میدهد",strikethrough:"استایل خط خورده میدهد",removeFormat:"حذف همه استایل ها",justifyLeft:"چپ چین",justifyCenter:"وسط چین",justifyRight:"راست چین",justifyFull:"چینش در کل عرض",insertUnorderedList:"تغییر بع لیست غیرترتیبی",insertOrderedList:"تغییر بع لیست ترتیبی",outdent:"گذر از پاراگراف فعلی",indent:"قرارگیری بر روی پاراگراف جاری",formatPara:"تغییر فرمت متن به تگ <p>",formatH1:"تغییر فرمت متن به تگ <h1>",formatH2:"تغییر فرمت متن به تگ <h2>",formatH3:"تغییر فرمت متن به تگ <h3>",formatH4:"تغییر فرمت متن به تگ <h4>",formatH5:"تغییر فرمت متن به تگ <h5>",formatH6:"تغییر فرمت متن به تگ <h6>",insertHorizontalRule:"وارد کردن به صورت افقی","linkDialog.show":"نمایش پیام لینک"},history:{undo:"واچیدن",redo:"بازچیدن"},specialChar:{specialChar:"کاراکتر خاص",select:"انتخاب کاراکتر خاص"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fa-IR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js
new file mode 100644
index 0000000..9a90dcb
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js
@@ -0,0 +1,182 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'fi-FI': {
+      font: {
+        bold: 'Lihavointi',
+        italic: 'Kursivointi',
+        underline: 'Alleviivaus',
+        clear: 'Tyhjennä muotoilu',
+        height: 'Riviväli',
+        name: 'Kirjasintyyppi',
+        strikethrough: 'Yliviivaus',
+        subscript: 'Alaindeksi',
+        superscript: 'Yläindeksi',
+        size: 'Kirjasinkoko'
+      },
+      image: {
+        image: 'Kuva',
+        insert: 'Lisää kuva',
+        resizeFull: 'Koko leveys',
+        resizeHalf: 'Puolikas leveys',
+        resizeQuarter: 'Neljäsosa leveys',
+        floatLeft: 'Sijoita vasemmalle',
+        floatRight: 'Sijoita oikealle',
+        floatNone: 'Ei sijoitusta',
+        shapeRounded: 'Muoto: Pyöristetty',
+        shapeCircle: 'Muoto: Ympyrä',
+        shapeThumbnail: 'Muoto: Esikatselukuva',
+        shapeNone: 'Muoto: Ei muotoilua',
+        dragImageHere: 'Vedä kuva tähän',
+        selectFromFiles: 'Valitse tiedostoista',
+        maximumFileSize: 'Maksimi tiedosto koko',
+        maximumFileSizeError: 'Maksimi tiedosto koko ylitetty.',
+        url: 'URL-osoitteen mukaan',
+        remove: 'Poista kuva',
+        original: 'Alkuperäinen'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Linkki videoon',
+        insert: 'Lisää video',
+        url: 'Videon URL-osoite',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion tai Youku)'
+      },
+      link: {
+        link: 'Linkki',
+        insert: 'Lisää linkki',
+        unlink: 'Poista linkki',
+        edit: 'Muokkaa',
+        textToDisplay: 'Näytettävä teksti',
+        url: 'Linkin URL-osoite',
+        openInNewWindow: 'Avaa uudessa ikkunassa'
+      },
+      table: {
+        table: 'Taulukko',
+        addRowAbove: 'Lisää rivi yläpuolelle',
+        addRowBelow: 'Lisää rivi alapuolelle',
+        addColLeft: 'Lisää sarake vasemmalle puolelle',
+        addColRight: 'Lisää sarake oikealle puolelle',
+        delRow: 'Poista rivi',
+        delCol: 'Poista sarake',
+        delTable: 'Poista taulukko'
+      },
+      hr: {
+        insert: 'Lisää vaakaviiva'
+      },
+      style: {
+        style: 'Tyyli',
+        p: 'Normaali',
+        blockquote: 'Lainaus',
+        pre: 'Koodi',
+        h1: 'Otsikko 1',
+        h2: 'Otsikko 2',
+        h3: 'Otsikko 3',
+        h4: 'Otsikko 4',
+        h5: 'Otsikko 5',
+        h6: 'Otsikko 6'
+      },
+      lists: {
+        unordered: 'Luettelomerkitty luettelo',
+        ordered: 'Numeroitu luettelo'
+      },
+      options: {
+        help: 'Ohje',
+        fullscreen: 'Koko näyttö',
+        codeview: 'HTML-näkymä'
+      },
+      paragraph: {
+        paragraph: 'Kappale',
+        outdent: 'Pienennä sisennystä',
+        indent: 'Suurenna sisennystä',
+        left: 'Tasaa vasemmalle',
+        center: 'Keskitä',
+        right: 'Tasaa oikealle',
+        justify: 'Tasaa'
+      },
+      color: {
+        recent: 'Viimeisin väri',
+        more: 'Lisää värejä',
+        background: 'Korostusväri',
+        foreground: 'Tekstin väri',
+        transparent: 'Läpinäkyvä',
+        setTransparent: 'Aseta läpinäkyväksi',
+        reset: 'Palauta',
+        resetToDefault: 'Palauta oletusarvoksi'
+      },
+      shortcut: {
+        shortcuts: 'Pikanäppäimet',
+        close: 'Sulje',
+        textFormatting: 'Tekstin muotoilu',
+        action: 'Toiminto',
+        paragraphFormatting: 'Kappaleen muotoilu',
+        documentStyle: 'Asiakirjan tyyli'
+      },
+      help: {
+        'insertParagraph': 'Lisää kappale',
+        'undo': 'Kumoa viimeisin komento',
+        'redo': 'Tee uudelleen kumottu komento',
+        'tab': 'Sarkain',
+        'untab': 'Sarkainmerkin poisto',
+        'bold': 'Lihavointi',
+        'italic': 'Kursiivi',
+        'underline': 'Alleviivaus',
+        'strikethrough': 'Yliviivaus',
+        'removeFormat': 'Poista asetetut tyylit',
+        'justifyLeft': 'Tasaa vasemmalle',
+        'justifyCenter': 'Keskitä',
+        'justifyRight': 'Tasaa oikealle',
+        'justifyFull': 'Tasaa',
+        'insertUnorderedList': 'Luettelomerkillä varustettu lista',
+        'insertOrderedList': 'Numeroitu lista',
+        'outdent': 'Pienennä sisennystä',
+        'indent': 'Suurenna sisennystä',
+        'formatPara': 'Muuta kappaleen formaatti p',
+        'formatH1': 'Muuta kappaleen formaatti H1',
+        'formatH2': 'Muuta kappaleen formaatti H2',
+        'formatH3': 'Muuta kappaleen formaatti H3',
+        'formatH4': 'Muuta kappaleen formaatti H4',
+        'formatH5': 'Muuta kappaleen formaatti H5',
+        'formatH6': 'Muuta kappaleen formaatti H6',
+        'insertHorizontalRule': 'Lisää vaakaviiva',
+        'linkDialog.show': 'Lisää linkki'
+      },
+      history: {
+        undo: 'Kumoa',
+        redo: 'Toista'
+      },
+      specialChar: {
+        specialChar: 'ERIKOISMERKIT',
+        select: 'Valitse erikoismerkit'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-fi-FI.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js.map
new file mode 100644
index 0000000..c084ec6
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-fi-FI.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-fi-FI.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'fi-FI': {\n      font: {\n        bold: 'Lihavointi',\n        italic: 'Kursivointi',\n        underline: 'Alleviivaus',\n        clear: 'Tyhjennä muotoilu',\n        height: 'Riviväli',\n        name: 'Kirjasintyyppi',\n        strikethrough: 'Yliviivaus',\n        subscript: 'Alaindeksi',\n        superscript: 'Yläindeksi',\n        size: 'Kirjasinkoko',\n      },\n      image: {\n        image: 'Kuva',\n        insert: 'Lisää kuva',\n        resizeFull: 'Koko leveys',\n        resizeHalf: 'Puolikas leveys',\n        resizeQuarter: 'Neljäsosa leveys',\n        floatLeft: 'Sijoita vasemmalle',\n        floatRight: 'Sijoita oikealle',\n        floatNone: 'Ei sijoitusta',\n        shapeRounded: 'Muoto: Pyöristetty',\n        shapeCircle: 'Muoto: Ympyrä',\n        shapeThumbnail: 'Muoto: Esikatselukuva',\n        shapeNone: 'Muoto: Ei muotoilua',\n        dragImageHere: 'Vedä kuva tähän',\n        selectFromFiles: 'Valitse tiedostoista',\n        maximumFileSize: 'Maksimi tiedosto koko',\n        maximumFileSizeError: 'Maksimi tiedosto koko ylitetty.',\n        url: 'URL-osoitteen mukaan',\n        remove: 'Poista kuva',\n        original: 'Alkuperäinen',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Linkki videoon',\n        insert: 'Lisää video',\n        url: 'Videon URL-osoite',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion tai Youku)',\n      },\n      link: {\n        link: 'Linkki',\n        insert: 'Lisää linkki',\n        unlink: 'Poista linkki',\n        edit: 'Muokkaa',\n        textToDisplay: 'Näytettävä teksti',\n        url: 'Linkin URL-osoite',\n        openInNewWindow: 'Avaa uudessa ikkunassa',\n      },\n      table: {\n        table: 'Taulukko',\n        addRowAbove: 'Lisää rivi yläpuolelle',\n        addRowBelow: 'Lisää rivi alapuolelle',\n        addColLeft: 'Lisää sarake vasemmalle puolelle',\n        addColRight: 'Lisää sarake oikealle puolelle',\n        delRow: 'Poista rivi',\n        delCol: 'Poista sarake',\n        delTable: 'Poista taulukko',\n      },\n      hr: {\n        insert: 'Lisää vaakaviiva',\n      },\n      style: {\n        style: 'Tyyli',\n        p: 'Normaali',\n        blockquote: 'Lainaus',\n        pre: 'Koodi',\n        h1: 'Otsikko 1',\n        h2: 'Otsikko 2',\n        h3: 'Otsikko 3',\n        h4: 'Otsikko 4',\n        h5: 'Otsikko 5',\n        h6: 'Otsikko 6',\n      },\n      lists: {\n        unordered: 'Luettelomerkitty luettelo',\n        ordered: 'Numeroitu luettelo',\n      },\n      options: {\n        help: 'Ohje',\n        fullscreen: 'Koko näyttö',\n        codeview: 'HTML-näkymä',\n      },\n      paragraph: {\n        paragraph: 'Kappale',\n        outdent: 'Pienennä sisennystä',\n        indent: 'Suurenna sisennystä',\n        left: 'Tasaa vasemmalle',\n        center: 'Keskitä',\n        right: 'Tasaa oikealle',\n        justify: 'Tasaa',\n      },\n      color: {\n        recent: 'Viimeisin väri',\n        more: 'Lisää värejä',\n        background: 'Korostusväri',\n        foreground: 'Tekstin väri',\n        transparent: 'Läpinäkyvä',\n        setTransparent: 'Aseta läpinäkyväksi',\n        reset: 'Palauta',\n        resetToDefault: 'Palauta oletusarvoksi',\n      },\n      shortcut: {\n        shortcuts: 'Pikanäppäimet',\n        close: 'Sulje',\n        textFormatting: 'Tekstin muotoilu',\n        action: 'Toiminto',\n        paragraphFormatting: 'Kappaleen muotoilu',\n        documentStyle: 'Asiakirjan tyyli',\n      },\n      help: {\n        'insertParagraph': 'Lisää kappale',\n        'undo': 'Kumoa viimeisin komento',\n        'redo': 'Tee uudelleen kumottu komento',\n        'tab': 'Sarkain',\n        'untab': 'Sarkainmerkin poisto',\n        'bold': 'Lihavointi',\n        'italic': 'Kursiivi',\n        'underline': 'Alleviivaus',\n        'strikethrough': 'Yliviivaus',\n        'removeFormat': 'Poista asetetut tyylit',\n        'justifyLeft': 'Tasaa vasemmalle',\n        'justifyCenter': 'Keskitä',\n        'justifyRight': 'Tasaa oikealle',\n        'justifyFull': 'Tasaa',\n        'insertUnorderedList': 'Luettelomerkillä varustettu lista',\n        'insertOrderedList': 'Numeroitu lista',\n        'outdent': 'Pienennä sisennystä',\n        'indent': 'Suurenna sisennystä',\n        'formatPara': 'Muuta kappaleen formaatti p',\n        'formatH1': 'Muuta kappaleen formaatti H1',\n        'formatH2': 'Muuta kappaleen formaatti H2',\n        'formatH3': 'Muuta kappaleen formaatti H3',\n        'formatH4': 'Muuta kappaleen formaatti H4',\n        'formatH5': 'Muuta kappaleen formaatti H5',\n        'formatH6': 'Muuta kappaleen formaatti H6',\n        'insertHorizontalRule': 'Lisää vaakaviiva',\n        'linkDialog.show': 'Lisää linkki',\n      },\n      history: {\n        undo: 'Kumoa',\n        redo: 'Toista',\n      },\n      specialChar: {\n        specialChar: 'ERIKOISMERKIT',\n        select: 'Valitse erikoismerkit',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js
new file mode 100644
index 0000000..41f4692
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i();else if("function"==typeof define&&define.amd)define([],i);else{var a=i();for(var t in a)("object"==typeof exports?exports:e)[t]=a[t]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"fi-FI":{font:{bold:"Lihavointi",italic:"Kursivointi",underline:"Alleviivaus",clear:"Tyhjennä muotoilu",height:"Riviväli",name:"Kirjasintyyppi",strikethrough:"Yliviivaus",subscript:"Alaindeksi",superscript:"Yläindeksi",size:"Kirjasinkoko"},image:{image:"Kuva",insert:"Lisää kuva",resizeFull:"Koko leveys",resizeHalf:"Puolikas leveys",resizeQuarter:"Neljäsosa leveys",floatLeft:"Sijoita vasemmalle",floatRight:"Sijoita oikealle",floatNone:"Ei sijoitusta",shapeRounded:"Muoto: Pyöristetty",shapeCircle:"Muoto: Ympyrä",shapeThumbnail:"Muoto: Esikatselukuva",shapeNone:"Muoto: Ei muotoilua",dragImageHere:"Vedä kuva tähän",selectFromFiles:"Valitse tiedostoista",maximumFileSize:"Maksimi tiedosto koko",maximumFileSizeError:"Maksimi tiedosto koko ylitetty.",url:"URL-osoitteen mukaan",remove:"Poista kuva",original:"Alkuperäinen"},video:{video:"Video",videoLink:"Linkki videoon",insert:"Lisää video",url:"Videon URL-osoite",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion tai Youku)"},link:{link:"Linkki",insert:"Lisää linkki",unlink:"Poista linkki",edit:"Muokkaa",textToDisplay:"Näytettävä teksti",url:"Linkin URL-osoite",openInNewWindow:"Avaa uudessa ikkunassa"},table:{table:"Taulukko",addRowAbove:"Lisää rivi yläpuolelle",addRowBelow:"Lisää rivi alapuolelle",addColLeft:"Lisää sarake vasemmalle puolelle",addColRight:"Lisää sarake oikealle puolelle",delRow:"Poista rivi",delCol:"Poista sarake",delTable:"Poista taulukko"},hr:{insert:"Lisää vaakaviiva"},style:{style:"Tyyli",p:"Normaali",blockquote:"Lainaus",pre:"Koodi",h1:"Otsikko 1",h2:"Otsikko 2",h3:"Otsikko 3",h4:"Otsikko 4",h5:"Otsikko 5",h6:"Otsikko 6"},lists:{unordered:"Luettelomerkitty luettelo",ordered:"Numeroitu luettelo"},options:{help:"Ohje",fullscreen:"Koko näyttö",codeview:"HTML-näkymä"},paragraph:{paragraph:"Kappale",outdent:"Pienennä sisennystä",indent:"Suurenna sisennystä",left:"Tasaa vasemmalle",center:"Keskitä",right:"Tasaa oikealle",justify:"Tasaa"},color:{recent:"Viimeisin väri",more:"Lisää värejä",background:"Korostusväri",foreground:"Tekstin väri",transparent:"Läpinäkyvä",setTransparent:"Aseta läpinäkyväksi",reset:"Palauta",resetToDefault:"Palauta oletusarvoksi"},shortcut:{shortcuts:"Pikanäppäimet",close:"Sulje",textFormatting:"Tekstin muotoilu",action:"Toiminto",paragraphFormatting:"Kappaleen muotoilu",documentStyle:"Asiakirjan tyyli"},help:{insertParagraph:"Lisää kappale",undo:"Kumoa viimeisin komento",redo:"Tee uudelleen kumottu komento",tab:"Sarkain",untab:"Sarkainmerkin poisto",bold:"Lihavointi",italic:"Kursiivi",underline:"Alleviivaus",strikethrough:"Yliviivaus",removeFormat:"Poista asetetut tyylit",justifyLeft:"Tasaa vasemmalle",justifyCenter:"Keskitä",justifyRight:"Tasaa oikealle",justifyFull:"Tasaa",insertUnorderedList:"Luettelomerkillä varustettu lista",insertOrderedList:"Numeroitu lista",outdent:"Pienennä sisennystä",indent:"Suurenna sisennystä",formatPara:"Muuta kappaleen formaatti p",formatH1:"Muuta kappaleen formaatti H1",formatH2:"Muuta kappaleen formaatti H2",formatH3:"Muuta kappaleen formaatti H3",formatH4:"Muuta kappaleen formaatti H4",formatH5:"Muuta kappaleen formaatti H5",formatH6:"Muuta kappaleen formaatti H6",insertHorizontalRule:"Lisää vaakaviiva","linkDialog.show":"Lisää linkki"},history:{undo:"Kumoa",redo:"Toista"},specialChar:{specialChar:"ERIKOISMERKIT",select:"Valitse erikoismerkit"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fi-FI.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js
new file mode 100644
index 0000000..d190119
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'fr-FR': {
+      font: {
+        bold: 'Gras',
+        italic: 'Italique',
+        underline: 'Souligné',
+        clear: 'Effacer la mise en forme',
+        height: 'Interligne',
+        name: 'Famille de police',
+        strikethrough: 'Barré',
+        superscript: 'Exposant',
+        subscript: 'Indice',
+        size: 'Taille de police'
+      },
+      image: {
+        image: 'Image',
+        insert: 'Insérer une image',
+        resizeFull: 'Taille originale',
+        resizeHalf: 'Redimensionner à 50 %',
+        resizeQuarter: 'Redimensionner à 25 %',
+        floatLeft: 'Aligné à gauche',
+        floatRight: 'Aligné à droite',
+        floatNone: 'Pas d\'alignement',
+        shapeRounded: 'Forme: Rectangle arrondi',
+        shapeCircle: 'Forme: Cercle',
+        shapeThumbnail: 'Forme: Vignette',
+        shapeNone: 'Forme: Aucune',
+        dragImageHere: 'Faites glisser une image ou un texte dans ce cadre',
+        dropImage: 'Lachez l\'image ou le texte',
+        selectFromFiles: 'Choisir un fichier',
+        maximumFileSize: 'Taille de fichier maximale',
+        maximumFileSizeError: 'Taille maximale du fichier dépassée',
+        url: 'URL de l\'image',
+        remove: 'Supprimer l\'image',
+        original: 'Original'
+      },
+      video: {
+        video: 'Vidéo',
+        videoLink: 'Lien vidéo',
+        insert: 'Insérer une vidéo',
+        url: 'URL de la vidéo',
+        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'Lien',
+        insert: 'Insérer un lien',
+        unlink: 'Supprimer un lien',
+        edit: 'Modifier',
+        textToDisplay: 'Texte à afficher',
+        url: 'URL du lien',
+        openInNewWindow: 'Ouvrir dans une nouvelle fenêtre',
+        useProtocol: 'Utiliser le protocole par défaut'
+      },
+      table: {
+        table: 'Tableau',
+        addRowAbove: 'Ajouter une ligne au-dessus',
+        addRowBelow: 'Ajouter une ligne en dessous',
+        addColLeft: 'Ajouter une colonne à gauche',
+        addColRight: 'Ajouter une colonne à droite',
+        delRow: 'Supprimer la ligne',
+        delCol: 'Supprimer la colonne',
+        delTable: 'Supprimer le tableau'
+      },
+      hr: {
+        insert: 'Insérer une ligne horizontale'
+      },
+      style: {
+        style: 'Style',
+        p: 'Normal',
+        blockquote: 'Citation',
+        pre: 'Code source',
+        h1: 'Titre 1',
+        h2: 'Titre 2',
+        h3: 'Titre 3',
+        h4: 'Titre 4',
+        h5: 'Titre 5',
+        h6: 'Titre 6'
+      },
+      lists: {
+        unordered: 'Liste à puces',
+        ordered: 'Liste numérotée'
+      },
+      options: {
+        help: 'Aide',
+        fullscreen: 'Plein écran',
+        codeview: 'Afficher le code HTML'
+      },
+      paragraph: {
+        paragraph: 'Paragraphe',
+        outdent: 'Diminuer le retrait',
+        indent: 'Augmenter le retrait',
+        left: 'Aligner à gauche',
+        center: 'Centrer',
+        right: 'Aligner à droite',
+        justify: 'Justifier'
+      },
+      color: {
+        recent: 'Dernière couleur sélectionnée',
+        more: 'Plus de couleurs',
+        background: 'Couleur de fond',
+        foreground: 'Couleur de police',
+        transparent: 'Transparent',
+        setTransparent: 'Définir la transparence',
+        reset: 'Restaurer',
+        resetToDefault: 'Restaurer la couleur par défaut'
+      },
+      shortcut: {
+        shortcuts: 'Raccourcis',
+        close: 'Fermer',
+        textFormatting: 'Mise en forme du texte',
+        action: 'Action',
+        paragraphFormatting: 'Mise en forme des paragraphes',
+        documentStyle: 'Style du document',
+        extraKeys: 'Touches supplémentaires'
+      },
+      help: {
+        'insertParagraph': 'Insérer paragraphe',
+        'undo': 'Défaire la dernière commande',
+        'redo': 'Refaire la dernière commande',
+        'tab': 'Tabulation',
+        'untab': 'Tabulation arrière',
+        'bold': 'Mettre en caractère gras',
+        'italic': 'Mettre en italique',
+        'underline': 'Mettre en souligné',
+        'strikethrough': 'Mettre en texte barré',
+        'removeFormat': 'Nettoyer les styles',
+        'justifyLeft': 'Aligner à gauche',
+        'justifyCenter': 'Centrer',
+        'justifyRight': 'Aligner à droite',
+        'justifyFull': 'Justifier à gauche et à droite',
+        'insertUnorderedList': 'Basculer liste à puces',
+        'insertOrderedList': 'Basculer liste ordonnée',
+        'outdent': 'Diminuer le retrait du paragraphe',
+        'indent': 'Augmenter le retrait du paragraphe',
+        'formatPara': 'Changer le paragraphe en cours en normal (P)',
+        'formatH1': 'Changer le paragraphe en cours en entête H1',
+        'formatH2': 'Changer le paragraphe en cours en entête H2',
+        'formatH3': 'Changer le paragraphe en cours en entête H3',
+        'formatH4': 'Changer le paragraphe en cours en entête H4',
+        'formatH5': 'Changer le paragraphe en cours en entête H5',
+        'formatH6': 'Changer le paragraphe en cours en entête H6',
+        'insertHorizontalRule': 'Insérer séparation horizontale',
+        'linkDialog.show': 'Afficher fenêtre d\'hyperlien'
+      },
+      history: {
+        undo: 'Annuler la dernière action',
+        redo: 'Restaurer la dernière action annulée'
+      },
+      specialChar: {
+        specialChar: 'Caractères spéciaux',
+        select: 'Choisir des caractères spéciaux'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-fr-FR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js.map
new file mode 100644
index 0000000..e75441a
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-fr-FR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-fr-FR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'fr-FR': {\n      font: {\n        bold: 'Gras',\n        italic: 'Italique',\n        underline: 'Souligné',\n        clear: 'Effacer la mise en forme',\n        height: 'Interligne',\n        name: 'Famille de police',\n        strikethrough: 'Barré',\n        superscript: 'Exposant',\n        subscript: 'Indice',\n        size: 'Taille de police',\n      },\n      image: {\n        image: 'Image',\n        insert: 'Insérer une image',\n        resizeFull: 'Taille originale',\n        resizeHalf: 'Redimensionner à 50 %',\n        resizeQuarter: 'Redimensionner à 25 %',\n        floatLeft: 'Aligné à gauche',\n        floatRight: 'Aligné à droite',\n        floatNone: 'Pas d\\'alignement',\n        shapeRounded: 'Forme: Rectangle arrondi',\n        shapeCircle: 'Forme: Cercle',\n        shapeThumbnail: 'Forme: Vignette',\n        shapeNone: 'Forme: Aucune',\n        dragImageHere: 'Faites glisser une image ou un texte dans ce cadre',\n        dropImage: 'Lachez l\\'image ou le texte',\n        selectFromFiles: 'Choisir un fichier',\n        maximumFileSize: 'Taille de fichier maximale',\n        maximumFileSizeError: 'Taille maximale du fichier dépassée',\n        url: 'URL de l\\'image',\n        remove: 'Supprimer l\\'image',\n        original: 'Original',\n      },\n      video: {\n        video: 'Vidéo',\n        videoLink: 'Lien vidéo',\n        insert: 'Insérer une vidéo',\n        url: 'URL de la vidéo',\n        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'Lien',\n        insert: 'Insérer un lien',\n        unlink: 'Supprimer un lien',\n        edit: 'Modifier',\n        textToDisplay: 'Texte à afficher',\n        url: 'URL du lien',\n        openInNewWindow: 'Ouvrir dans une nouvelle fenêtre',\n        useProtocol: 'Utiliser le protocole par défaut',\n      },\n      table: {\n        table: 'Tableau',\n        addRowAbove: 'Ajouter une ligne au-dessus',\n        addRowBelow: 'Ajouter une ligne en dessous',\n        addColLeft: 'Ajouter une colonne à gauche',\n        addColRight: 'Ajouter une colonne à droite',\n        delRow: 'Supprimer la ligne',\n        delCol: 'Supprimer la colonne',\n        delTable: 'Supprimer le tableau',\n      },\n      hr: {\n        insert: 'Insérer une ligne horizontale',\n      },\n      style: {\n        style: 'Style',\n        p: 'Normal',\n        blockquote: 'Citation',\n        pre: 'Code source',\n        h1: 'Titre 1',\n        h2: 'Titre 2',\n        h3: 'Titre 3',\n        h4: 'Titre 4',\n        h5: 'Titre 5',\n        h6: 'Titre 6',\n      },\n      lists: {\n        unordered: 'Liste à puces',\n        ordered: 'Liste numérotée',\n      },\n      options: {\n        help: 'Aide',\n        fullscreen: 'Plein écran',\n        codeview: 'Afficher le code HTML',\n      },\n      paragraph: {\n        paragraph: 'Paragraphe',\n        outdent: 'Diminuer le retrait',\n        indent: 'Augmenter le retrait',\n        left: 'Aligner à gauche',\n        center: 'Centrer',\n        right: 'Aligner à droite',\n        justify: 'Justifier',\n      },\n      color: {\n        recent: 'Dernière couleur sélectionnée',\n        more: 'Plus de couleurs',\n        background: 'Couleur de fond',\n        foreground: 'Couleur de police',\n        transparent: 'Transparent',\n        setTransparent: 'Définir la transparence',\n        reset: 'Restaurer',\n        resetToDefault: 'Restaurer la couleur par défaut',\n      },\n      shortcut: {\n        shortcuts: 'Raccourcis',\n        close: 'Fermer',\n        textFormatting: 'Mise en forme du texte',\n        action: 'Action',\n        paragraphFormatting: 'Mise en forme des paragraphes',\n        documentStyle: 'Style du document',\n        extraKeys: 'Touches supplémentaires',\n      },\n      help: {\n        'insertParagraph': 'Insérer paragraphe',\n        'undo': 'Défaire la dernière commande',\n        'redo': 'Refaire la dernière commande',\n        'tab': 'Tabulation',\n        'untab': 'Tabulation arrière',\n        'bold': 'Mettre en caractère gras',\n        'italic': 'Mettre en italique',\n        'underline': 'Mettre en souligné',\n        'strikethrough': 'Mettre en texte barré',\n        'removeFormat': 'Nettoyer les styles',\n        'justifyLeft': 'Aligner à gauche',\n        'justifyCenter': 'Centrer',\n        'justifyRight': 'Aligner à droite',\n        'justifyFull': 'Justifier à gauche et à droite',\n        'insertUnorderedList': 'Basculer liste à puces',\n        'insertOrderedList': 'Basculer liste ordonnée',\n        'outdent': 'Diminuer le retrait du paragraphe',\n        'indent': 'Augmenter le retrait du paragraphe',\n        'formatPara': 'Changer le paragraphe en cours en normal (P)',\n        'formatH1': 'Changer le paragraphe en cours en entête H1',\n        'formatH2': 'Changer le paragraphe en cours en entête H2',\n        'formatH3': 'Changer le paragraphe en cours en entête H3',\n        'formatH4': 'Changer le paragraphe en cours en entête H4',\n        'formatH5': 'Changer le paragraphe en cours en entête H5',\n        'formatH6': 'Changer le paragraphe en cours en entête H6',\n        'insertHorizontalRule': 'Insérer séparation horizontale',\n        'linkDialog.show': 'Afficher fenêtre d\\'hyperlien',\n      },\n      history: {\n        undo: 'Annuler la dernière action',\n        redo: 'Restaurer la dernière action annulée',\n      },\n      specialChar: {\n        specialChar: 'Caractères spéciaux',\n        select: 'Choisir des caractères spéciaux',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","superscript","subscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js
new file mode 100644
index 0000000..08f082d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r();else if("function"==typeof define&&define.amd)define([],r);else{var a=r();for(var i in a)("object"==typeof exports?exports:e)[i]=a[i]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"fr-FR":{font:{bold:"Gras",italic:"Italique",underline:"Souligné",clear:"Effacer la mise en forme",height:"Interligne",name:"Famille de police",strikethrough:"Barré",superscript:"Exposant",subscript:"Indice",size:"Taille de police"},image:{image:"Image",insert:"Insérer une image",resizeFull:"Taille originale",resizeHalf:"Redimensionner à 50 %",resizeQuarter:"Redimensionner à 25 %",floatLeft:"Aligné à gauche",floatRight:"Aligné à droite",floatNone:"Pas d'alignement",shapeRounded:"Forme: Rectangle arrondi",shapeCircle:"Forme: Cercle",shapeThumbnail:"Forme: Vignette",shapeNone:"Forme: Aucune",dragImageHere:"Faites glisser une image ou un texte dans ce cadre",dropImage:"Lachez l'image ou le texte",selectFromFiles:"Choisir un fichier",maximumFileSize:"Taille de fichier maximale",maximumFileSizeError:"Taille maximale du fichier dépassée",url:"URL de l'image",remove:"Supprimer l'image",original:"Original"},video:{video:"Vidéo",videoLink:"Lien vidéo",insert:"Insérer une vidéo",url:"URL de la vidéo",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"Lien",insert:"Insérer un lien",unlink:"Supprimer un lien",edit:"Modifier",textToDisplay:"Texte à afficher",url:"URL du lien",openInNewWindow:"Ouvrir dans une nouvelle fenêtre",useProtocol:"Utiliser le protocole par défaut"},table:{table:"Tableau",addRowAbove:"Ajouter une ligne au-dessus",addRowBelow:"Ajouter une ligne en dessous",addColLeft:"Ajouter une colonne à gauche",addColRight:"Ajouter une colonne à droite",delRow:"Supprimer la ligne",delCol:"Supprimer la colonne",delTable:"Supprimer le tableau"},hr:{insert:"Insérer une ligne horizontale"},style:{style:"Style",p:"Normal",blockquote:"Citation",pre:"Code source",h1:"Titre 1",h2:"Titre 2",h3:"Titre 3",h4:"Titre 4",h5:"Titre 5",h6:"Titre 6"},lists:{unordered:"Liste à puces",ordered:"Liste numérotée"},options:{help:"Aide",fullscreen:"Plein écran",codeview:"Afficher le code HTML"},paragraph:{paragraph:"Paragraphe",outdent:"Diminuer le retrait",indent:"Augmenter le retrait",left:"Aligner à gauche",center:"Centrer",right:"Aligner à droite",justify:"Justifier"},color:{recent:"Dernière couleur sélectionnée",more:"Plus de couleurs",background:"Couleur de fond",foreground:"Couleur de police",transparent:"Transparent",setTransparent:"Définir la transparence",reset:"Restaurer",resetToDefault:"Restaurer la couleur par défaut"},shortcut:{shortcuts:"Raccourcis",close:"Fermer",textFormatting:"Mise en forme du texte",action:"Action",paragraphFormatting:"Mise en forme des paragraphes",documentStyle:"Style du document",extraKeys:"Touches supplémentaires"},help:{insertParagraph:"Insérer paragraphe",undo:"Défaire la dernière commande",redo:"Refaire la dernière commande",tab:"Tabulation",untab:"Tabulation arrière",bold:"Mettre en caractère gras",italic:"Mettre en italique",underline:"Mettre en souligné",strikethrough:"Mettre en texte barré",removeFormat:"Nettoyer les styles",justifyLeft:"Aligner à gauche",justifyCenter:"Centrer",justifyRight:"Aligner à droite",justifyFull:"Justifier à gauche et à droite",insertUnorderedList:"Basculer liste à puces",insertOrderedList:"Basculer liste ordonnée",outdent:"Diminuer le retrait du paragraphe",indent:"Augmenter le retrait du paragraphe",formatPara:"Changer le paragraphe en cours en normal (P)",formatH1:"Changer le paragraphe en cours en entête H1",formatH2:"Changer le paragraphe en cours en entête H2",formatH3:"Changer le paragraphe en cours en entête H3",formatH4:"Changer le paragraphe en cours en entête H4",formatH5:"Changer le paragraphe en cours en entête H5",formatH6:"Changer le paragraphe en cours en entête H6",insertHorizontalRule:"Insérer séparation horizontale","linkDialog.show":"Afficher fenêtre d'hyperlien"},history:{undo:"Annuler la dernière action",redo:"Restaurer la dernière action annulée"},specialChar:{specialChar:"Caractères spéciaux",select:"Choisir des caractères spéciaux"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-fr-FR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js
new file mode 100644
index 0000000..c249cae
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'gl-ES': {
+      font: {
+        bold: 'Negrita',
+        italic: 'Cursiva',
+        underline: 'Subliñado',
+        clear: 'Quitar estilo de fonte',
+        height: 'Altura de liña',
+        name: 'Fonte',
+        strikethrough: 'Riscado',
+        superscript: 'Superíndice',
+        subscript: 'Subíndice',
+        size: 'Tamaño da fonte'
+      },
+      image: {
+        image: 'Imaxe',
+        insert: 'Inserir imaxe',
+        resizeFull: 'Redimensionar a tamaño completo',
+        resizeHalf: 'Redimensionar á metade',
+        resizeQuarter: 'Redimensionar a un cuarto',
+        floatLeft: 'Flotar á esquerda',
+        floatRight: 'Flotar á dereita',
+        floatNone: 'Non flotar',
+        shapeRounded: 'Forma: Redondeado',
+        shapeCircle: 'Forma: Círculo',
+        shapeThumbnail: 'Forma: Marco',
+        shapeNone: 'Forma: Ningunha',
+        dragImageHere: 'Arrastrar unha imaxe ou texto aquí',
+        dropImage: 'Solta a imaxe ou texto',
+        selectFromFiles: 'Seleccionar desde os arquivos',
+        maximumFileSize: 'Tamaño máximo do arquivo',
+        maximumFileSizeError: 'Superaches o tamaño máximo do arquivo.',
+        url: 'URL da imaxe',
+        remove: 'Eliminar imaxe',
+        original: 'Original'
+      },
+      video: {
+        video: 'Vídeo',
+        videoLink: 'Ligazón do vídeo',
+        insert: 'Insertar vídeo',
+        url: 'URL do vídeo?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, o Youku)'
+      },
+      link: {
+        link: 'Ligazón',
+        insert: 'Inserir Ligazón',
+        unlink: 'Quitar Ligazón',
+        edit: 'Editar',
+        textToDisplay: 'Texto para amosar',
+        url: 'Cara a que URL leva a ligazón?',
+        openInNewWindow: 'Abrir nunha nova xanela'
+      },
+      table: {
+        table: 'Táboa',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Inserir liña horizontal'
+      },
+      style: {
+        style: 'Estilo',
+        p: 'Normal',
+        blockquote: 'Cita',
+        pre: 'Código',
+        h1: 'Título 1',
+        h2: 'Título 2',
+        h3: 'Título 3',
+        h4: 'Título 4',
+        h5: 'Título 5',
+        h6: 'Título 6'
+      },
+      lists: {
+        unordered: 'Lista desordenada',
+        ordered: 'Lista ordenada'
+      },
+      options: {
+        help: 'Axuda',
+        fullscreen: 'Pantalla completa',
+        codeview: 'Ver código fonte'
+      },
+      paragraph: {
+        paragraph: 'Parágrafo',
+        outdent: 'Menos tabulación',
+        indent: 'Máis tabulación',
+        left: 'Aliñar á esquerda',
+        center: 'Aliñar ao centro',
+        right: 'Aliñar á dereita',
+        justify: 'Xustificar'
+      },
+      color: {
+        recent: 'Última cor',
+        more: 'Máis cores',
+        background: 'Cor de fondo',
+        foreground: 'Cor de fuente',
+        transparent: 'Transparente',
+        setTransparent: 'Establecer transparente',
+        reset: 'Restaurar',
+        resetToDefault: 'Restaurar por defecto'
+      },
+      shortcut: {
+        shortcuts: 'Atallos de teclado',
+        close: 'Pechar',
+        textFormatting: 'Formato de texto',
+        action: 'Acción',
+        paragraphFormatting: 'Formato de parágrafo',
+        documentStyle: 'Estilo de documento',
+        extraKeys: 'Teclas adicionais'
+      },
+      help: {
+        'insertParagraph': 'Inserir parágrafo',
+        'undo': 'Desfacer última acción',
+        'redo': 'Refacer última acción',
+        'tab': 'Tabular',
+        'untab': 'Eliminar tabulación',
+        'bold': 'Establecer estilo negrita',
+        'italic': 'Establecer estilo cursiva',
+        'underline': 'Establecer estilo subliñado',
+        'strikethrough': 'Establecer estilo riscado',
+        'removeFormat': 'Limpar estilo',
+        'justifyLeft': 'Aliñar á esquerda',
+        'justifyCenter': 'Aliñar ao centro',
+        'justifyRight': 'Aliñar á dereita',
+        'justifyFull': 'Xustificar',
+        'insertUnorderedList': 'Inserir lista desordenada',
+        'insertOrderedList': 'Inserir lista ordenada',
+        'outdent': 'Reducir tabulación do parágrafo',
+        'indent': 'Aumentar tabulación do parágrafo',
+        'formatPara': 'Mudar estilo do bloque a parágrafo (etiqueta P)',
+        'formatH1': 'Mudar estilo do bloque a H1',
+        'formatH2': 'Mudar estilo do bloque a H2',
+        'formatH3': 'Mudar estilo do bloque a H3',
+        'formatH4': 'Mudar estilo do bloque a H4',
+        'formatH5': 'Mudar estilo do bloque a H5',
+        'formatH6': 'Mudar estilo do bloque a H6',
+        'insertHorizontalRule': 'Inserir liña horizontal',
+        'linkDialog.show': 'Amosar panel ligazóns'
+      },
+      history: {
+        undo: 'Desfacer',
+        redo: 'Refacer'
+      },
+      specialChar: {
+        specialChar: 'CARACTERES ESPECIAIS',
+        select: 'Selecciona Caracteres especiais'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-gl-ES.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js.map
new file mode 100644
index 0000000..79ba7c8
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-gl-ES.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-gl-ES.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'gl-ES': {\n      font: {\n        bold: 'Negrita',\n        italic: 'Cursiva',\n        underline: 'Subliñado',\n        clear: 'Quitar estilo de fonte',\n        height: 'Altura de liña',\n        name: 'Fonte',\n        strikethrough: 'Riscado',\n        superscript: 'Superíndice',\n        subscript: 'Subíndice',\n        size: 'Tamaño da fonte',\n      },\n      image: {\n        image: 'Imaxe',\n        insert: 'Inserir imaxe',\n        resizeFull: 'Redimensionar a tamaño completo',\n        resizeHalf: 'Redimensionar á metade',\n        resizeQuarter: 'Redimensionar a un cuarto',\n        floatLeft: 'Flotar á esquerda',\n        floatRight: 'Flotar á dereita',\n        floatNone: 'Non flotar',\n        shapeRounded: 'Forma: Redondeado',\n        shapeCircle: 'Forma: Círculo',\n        shapeThumbnail: 'Forma: Marco',\n        shapeNone: 'Forma: Ningunha',\n        dragImageHere: 'Arrastrar unha imaxe ou texto aquí',\n        dropImage: 'Solta a imaxe ou texto',\n        selectFromFiles: 'Seleccionar desde os arquivos',\n        maximumFileSize: 'Tamaño máximo do arquivo',\n        maximumFileSizeError: 'Superaches o tamaño máximo do arquivo.',\n        url: 'URL da imaxe',\n        remove: 'Eliminar imaxe',\n        original: 'Original',\n      },\n      video: {\n        video: 'Vídeo',\n        videoLink: 'Ligazón do vídeo',\n        insert: 'Insertar vídeo',\n        url: 'URL do vídeo?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, o Youku)',\n      },\n      link: {\n        link: 'Ligazón',\n        insert: 'Inserir Ligazón',\n        unlink: 'Quitar Ligazón',\n        edit: 'Editar',\n        textToDisplay: 'Texto para amosar',\n        url: 'Cara a que URL leva a ligazón?',\n        openInNewWindow: 'Abrir nunha nova xanela',\n      },\n      table: {\n        table: 'Táboa',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Inserir liña horizontal',\n      },\n      style: {\n        style: 'Estilo',\n        p: 'Normal',\n        blockquote: 'Cita',\n        pre: 'Código',\n        h1: 'Título 1',\n        h2: 'Título 2',\n        h3: 'Título 3',\n        h4: 'Título 4',\n        h5: 'Título 5',\n        h6: 'Título 6',\n      },\n      lists: {\n        unordered: 'Lista desordenada',\n        ordered: 'Lista ordenada',\n      },\n      options: {\n        help: 'Axuda',\n        fullscreen: 'Pantalla completa',\n        codeview: 'Ver código fonte',\n      },\n      paragraph: {\n        paragraph: 'Parágrafo',\n        outdent: 'Menos tabulación',\n        indent: 'Máis tabulación',\n        left: 'Aliñar á esquerda',\n        center: 'Aliñar ao centro',\n        right: 'Aliñar á dereita',\n        justify: 'Xustificar',\n      },\n      color: {\n        recent: 'Última cor',\n        more: 'Máis cores',\n        background: 'Cor de fondo',\n        foreground: 'Cor de fuente',\n        transparent: 'Transparente',\n        setTransparent: 'Establecer transparente',\n        reset: 'Restaurar',\n        resetToDefault: 'Restaurar por defecto',\n      },\n      shortcut: {\n        shortcuts: 'Atallos de teclado',\n        close: 'Pechar',\n        textFormatting: 'Formato de texto',\n        action: 'Acción',\n        paragraphFormatting: 'Formato de parágrafo',\n        documentStyle: 'Estilo de documento',\n        extraKeys: 'Teclas adicionais',\n      },\n      help: {\n        'insertParagraph': 'Inserir parágrafo',\n        'undo': 'Desfacer última acción',\n        'redo': 'Refacer última acción',\n        'tab': 'Tabular',\n        'untab': 'Eliminar tabulación',\n        'bold': 'Establecer estilo negrita',\n        'italic': 'Establecer estilo cursiva',\n        'underline': 'Establecer estilo subliñado',\n        'strikethrough': 'Establecer estilo riscado',\n        'removeFormat': 'Limpar estilo',\n        'justifyLeft': 'Aliñar á esquerda',\n        'justifyCenter': 'Aliñar ao centro',\n        'justifyRight': 'Aliñar á dereita',\n        'justifyFull': 'Xustificar',\n        'insertUnorderedList': 'Inserir lista desordenada',\n        'insertOrderedList': 'Inserir lista ordenada',\n        'outdent': 'Reducir tabulación do parágrafo',\n        'indent': 'Aumentar tabulación do parágrafo',\n        'formatPara': 'Mudar estilo do bloque a parágrafo (etiqueta P)',\n        'formatH1': 'Mudar estilo do bloque a H1',\n        'formatH2': 'Mudar estilo do bloque a H2',\n        'formatH3': 'Mudar estilo do bloque a H3',\n        'formatH4': 'Mudar estilo do bloque a H4',\n        'formatH5': 'Mudar estilo do bloque a H5',\n        'formatH6': 'Mudar estilo do bloque a H6',\n        'insertHorizontalRule': 'Inserir liña horizontal',\n        'linkDialog.show': 'Amosar panel ligazóns',\n      },\n      history: {\n        undo: 'Desfacer',\n        redo: 'Refacer',\n      },\n      specialChar: {\n        specialChar: 'CARACTERES ESPECIAIS',\n        select: 'Selecciona Caracteres especiais',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","superscript","subscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js
new file mode 100644
index 0000000..8d9a957
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var r=a();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"gl-ES":{font:{bold:"Negrita",italic:"Cursiva",underline:"Subliñado",clear:"Quitar estilo de fonte",height:"Altura de liña",name:"Fonte",strikethrough:"Riscado",superscript:"Superíndice",subscript:"Subíndice",size:"Tamaño da fonte"},image:{image:"Imaxe",insert:"Inserir imaxe",resizeFull:"Redimensionar a tamaño completo",resizeHalf:"Redimensionar á metade",resizeQuarter:"Redimensionar a un cuarto",floatLeft:"Flotar á esquerda",floatRight:"Flotar á dereita",floatNone:"Non flotar",shapeRounded:"Forma: Redondeado",shapeCircle:"Forma: Círculo",shapeThumbnail:"Forma: Marco",shapeNone:"Forma: Ningunha",dragImageHere:"Arrastrar unha imaxe ou texto aquí",dropImage:"Solta a imaxe ou texto",selectFromFiles:"Seleccionar desde os arquivos",maximumFileSize:"Tamaño máximo do arquivo",maximumFileSizeError:"Superaches o tamaño máximo do arquivo.",url:"URL da imaxe",remove:"Eliminar imaxe",original:"Original"},video:{video:"Vídeo",videoLink:"Ligazón do vídeo",insert:"Insertar vídeo",url:"URL do vídeo?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion, o Youku)"},link:{link:"Ligazón",insert:"Inserir Ligazón",unlink:"Quitar Ligazón",edit:"Editar",textToDisplay:"Texto para amosar",url:"Cara a que URL leva a ligazón?",openInNewWindow:"Abrir nunha nova xanela"},table:{table:"Táboa",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Inserir liña horizontal"},style:{style:"Estilo",p:"Normal",blockquote:"Cita",pre:"Código",h1:"Título 1",h2:"Título 2",h3:"Título 3",h4:"Título 4",h5:"Título 5",h6:"Título 6"},lists:{unordered:"Lista desordenada",ordered:"Lista ordenada"},options:{help:"Axuda",fullscreen:"Pantalla completa",codeview:"Ver código fonte"},paragraph:{paragraph:"Parágrafo",outdent:"Menos tabulación",indent:"Máis tabulación",left:"Aliñar á esquerda",center:"Aliñar ao centro",right:"Aliñar á dereita",justify:"Xustificar"},color:{recent:"Última cor",more:"Máis cores",background:"Cor de fondo",foreground:"Cor de fuente",transparent:"Transparente",setTransparent:"Establecer transparente",reset:"Restaurar",resetToDefault:"Restaurar por defecto"},shortcut:{shortcuts:"Atallos de teclado",close:"Pechar",textFormatting:"Formato de texto",action:"Acción",paragraphFormatting:"Formato de parágrafo",documentStyle:"Estilo de documento",extraKeys:"Teclas adicionais"},help:{insertParagraph:"Inserir parágrafo",undo:"Desfacer última acción",redo:"Refacer última acción",tab:"Tabular",untab:"Eliminar tabulación",bold:"Establecer estilo negrita",italic:"Establecer estilo cursiva",underline:"Establecer estilo subliñado",strikethrough:"Establecer estilo riscado",removeFormat:"Limpar estilo",justifyLeft:"Aliñar á esquerda",justifyCenter:"Aliñar ao centro",justifyRight:"Aliñar á dereita",justifyFull:"Xustificar",insertUnorderedList:"Inserir lista desordenada",insertOrderedList:"Inserir lista ordenada",outdent:"Reducir tabulación do parágrafo",indent:"Aumentar tabulación do parágrafo",formatPara:"Mudar estilo do bloque a parágrafo (etiqueta P)",formatH1:"Mudar estilo do bloque a H1",formatH2:"Mudar estilo do bloque a H2",formatH3:"Mudar estilo do bloque a H3",formatH4:"Mudar estilo do bloque a H4",formatH5:"Mudar estilo do bloque a H5",formatH6:"Mudar estilo do bloque a H6",insertHorizontalRule:"Inserir liña horizontal","linkDialog.show":"Amosar panel ligazóns"},history:{undo:"Desfacer",redo:"Refacer"},specialChar:{specialChar:"CARACTERES ESPECIAIS",select:"Selecciona Caracteres especiais"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-gl-ES.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js
new file mode 100644
index 0000000..9512a80
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'he-IL': {
+      font: {
+        bold: 'מודגש',
+        italic: 'נטוי',
+        underline: 'קו תחתון',
+        clear: 'נקה עיצוב',
+        height: 'גובה',
+        name: 'גופן',
+        strikethrough: 'קו חוצה',
+        subscript: 'כתב תחתי',
+        superscript: 'כתב עילי',
+        size: 'גודל גופן'
+      },
+      image: {
+        image: 'תמונה',
+        insert: 'הוסף תמונה',
+        resizeFull: 'גודל מלא',
+        resizeHalf: 'להקטין לחצי',
+        resizeQuarter: 'להקטין לרבע',
+        floatLeft: 'יישור לשמאל',
+        floatRight: 'יישור לימין',
+        floatNone: 'ישר',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'גרור תמונה לכאן',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'בחר מתוך קבצים',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'נתיב לתמונה',
+        remove: 'הסר תמונה',
+        original: 'Original'
+      },
+      video: {
+        video: 'סרטון',
+        videoLink: 'קישור לסרטון',
+        insert: 'הוסף סרטון',
+        url: 'קישור לסרטון',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion או Youku)'
+      },
+      link: {
+        link: 'קישור',
+        insert: 'הוסף קישור',
+        unlink: 'הסר קישור',
+        edit: 'ערוך',
+        textToDisplay: 'טקסט להציג',
+        url: 'קישור',
+        openInNewWindow: 'פתח בחלון חדש'
+      },
+      table: {
+        table: 'טבלה',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'הוסף קו'
+      },
+      style: {
+        style: 'עיצוב',
+        p: 'טקסט רגיל',
+        blockquote: 'ציטוט',
+        pre: 'קוד',
+        h1: 'כותרת 1',
+        h2: 'כותרת 2',
+        h3: 'כותרת 3',
+        h4: 'כותרת 4',
+        h5: 'כותרת 5',
+        h6: 'כותרת 6'
+      },
+      lists: {
+        unordered: 'רשימת תבליטים',
+        ordered: 'רשימה ממוספרת'
+      },
+      options: {
+        help: 'עזרה',
+        fullscreen: 'מסך מלא',
+        codeview: 'תצוגת קוד'
+      },
+      paragraph: {
+        paragraph: 'פסקה',
+        outdent: 'הקטן כניסה',
+        indent: 'הגדל כניסה',
+        left: 'יישור לשמאל',
+        center: 'יישור למרכז',
+        right: 'יישור לימין',
+        justify: 'מיושר'
+      },
+      color: {
+        recent: 'צבע טקסט אחרון',
+        more: 'עוד צבעים',
+        background: 'צבע רקע',
+        foreground: 'צבע טקסט',
+        transparent: 'שקוף',
+        setTransparent: 'קבע כשקוף',
+        reset: 'איפוס',
+        resetToDefault: 'אפס לברירת מחדל'
+      },
+      shortcut: {
+        shortcuts: 'קיצורי מקלדת',
+        close: 'סגור',
+        textFormatting: 'עיצוב הטקסט',
+        action: 'פעולה',
+        paragraphFormatting: 'סגנונות פסקה',
+        documentStyle: 'עיצוב המסמך',
+        extraKeys: 'קיצורים נוספים'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'בטל פעולה',
+        redo: 'בצע שוב'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-he-IL.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js.map
new file mode 100644
index 0000000..5d648a9
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-he-IL.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-he-IL.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'he-IL': {\n      font: {\n        bold: 'מודגש',\n        italic: 'נטוי',\n        underline: 'קו תחתון',\n        clear: 'נקה עיצוב',\n        height: 'גובה',\n        name: 'גופן',\n        strikethrough: 'קו חוצה',\n        subscript: 'כתב תחתי',\n        superscript: 'כתב עילי',\n        size: 'גודל גופן',\n      },\n      image: {\n        image: 'תמונה',\n        insert: 'הוסף תמונה',\n        resizeFull: 'גודל מלא',\n        resizeHalf: 'להקטין לחצי',\n        resizeQuarter: 'להקטין לרבע',\n        floatLeft: 'יישור לשמאל',\n        floatRight: 'יישור לימין',\n        floatNone: 'ישר',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'גרור תמונה לכאן',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'בחר מתוך קבצים',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'נתיב לתמונה',\n        remove: 'הסר תמונה',\n        original: 'Original',\n      },\n      video: {\n        video: 'סרטון',\n        videoLink: 'קישור לסרטון',\n        insert: 'הוסף סרטון',\n        url: 'קישור לסרטון',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion או Youku)',\n      },\n      link: {\n        link: 'קישור',\n        insert: 'הוסף קישור',\n        unlink: 'הסר קישור',\n        edit: 'ערוך',\n        textToDisplay: 'טקסט להציג',\n        url: 'קישור',\n        openInNewWindow: 'פתח בחלון חדש',\n      },\n      table: {\n        table: 'טבלה',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'הוסף קו',\n      },\n      style: {\n        style: 'עיצוב',\n        p: 'טקסט רגיל',\n        blockquote: 'ציטוט',\n        pre: 'קוד',\n        h1: 'כותרת 1',\n        h2: 'כותרת 2',\n        h3: 'כותרת 3',\n        h4: 'כותרת 4',\n        h5: 'כותרת 5',\n        h6: 'כותרת 6',\n      },\n      lists: {\n        unordered: 'רשימת תבליטים',\n        ordered: 'רשימה ממוספרת',\n      },\n      options: {\n        help: 'עזרה',\n        fullscreen: 'מסך מלא',\n        codeview: 'תצוגת קוד',\n      },\n      paragraph: {\n        paragraph: 'פסקה',\n        outdent: 'הקטן כניסה',\n        indent: 'הגדל כניסה',\n        left: 'יישור לשמאל',\n        center: 'יישור למרכז',\n        right: 'יישור לימין',\n        justify: 'מיושר',\n      },\n      color: {\n        recent: 'צבע טקסט אחרון',\n        more: 'עוד צבעים',\n        background: 'צבע רקע',\n        foreground: 'צבע טקסט',\n        transparent: 'שקוף',\n        setTransparent: 'קבע כשקוף',\n        reset: 'איפוס',\n        resetToDefault: 'אפס לברירת מחדל',\n      },\n      shortcut: {\n        shortcuts: 'קיצורי מקלדת',\n        close: 'סגור',\n        textFormatting: 'עיצוב הטקסט',\n        action: 'פעולה',\n        paragraphFormatting: 'סגנונות פסקה',\n        documentStyle: 'עיצוב המסמך',\n        extraKeys: 'קיצורים נוספים',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'בטל פעולה',\n        redo: 'בצע שוב',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js
new file mode 100644
index 0000000..5b6e1b8
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"he-IL":{font:{bold:"מודגש",italic:"נטוי",underline:"קו תחתון",clear:"נקה עיצוב",height:"גובה",name:"גופן",strikethrough:"קו חוצה",subscript:"כתב תחתי",superscript:"כתב עילי",size:"גודל גופן"},image:{image:"תמונה",insert:"הוסף תמונה",resizeFull:"גודל מלא",resizeHalf:"להקטין לחצי",resizeQuarter:"להקטין לרבע",floatLeft:"יישור לשמאל",floatRight:"יישור לימין",floatNone:"ישר",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"גרור תמונה לכאן",dropImage:"Drop image or Text",selectFromFiles:"בחר מתוך קבצים",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"נתיב לתמונה",remove:"הסר תמונה",original:"Original"},video:{video:"סרטון",videoLink:"קישור לסרטון",insert:"הוסף סרטון",url:"קישור לסרטון",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion או Youku)"},link:{link:"קישור",insert:"הוסף קישור",unlink:"הסר קישור",edit:"ערוך",textToDisplay:"טקסט להציג",url:"קישור",openInNewWindow:"פתח בחלון חדש"},table:{table:"טבלה",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"הוסף קו"},style:{style:"עיצוב",p:"טקסט רגיל",blockquote:"ציטוט",pre:"קוד",h1:"כותרת 1",h2:"כותרת 2",h3:"כותרת 3",h4:"כותרת 4",h5:"כותרת 5",h6:"כותרת 6"},lists:{unordered:"רשימת תבליטים",ordered:"רשימה ממוספרת"},options:{help:"עזרה",fullscreen:"מסך מלא",codeview:"תצוגת קוד"},paragraph:{paragraph:"פסקה",outdent:"הקטן כניסה",indent:"הגדל כניסה",left:"יישור לשמאל",center:"יישור למרכז",right:"יישור לימין",justify:"מיושר"},color:{recent:"צבע טקסט אחרון",more:"עוד צבעים",background:"צבע רקע",foreground:"צבע טקסט",transparent:"שקוף",setTransparent:"קבע כשקוף",reset:"איפוס",resetToDefault:"אפס לברירת מחדל"},shortcut:{shortcuts:"קיצורי מקלדת",close:"סגור",textFormatting:"עיצוב הטקסט",action:"פעולה",paragraphFormatting:"סגנונות פסקה",documentStyle:"עיצוב המסמך",extraKeys:"קיצורים נוספים"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"בטל פעולה",redo:"בצע שוב"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-he-IL.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js
new file mode 100644
index 0000000..fefd990
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'hr-HR': {
+      font: {
+        bold: 'Podebljano',
+        italic: 'Kurziv',
+        underline: 'Podvučeno',
+        clear: 'Ukloni stilove fonta',
+        height: 'Visina linije',
+        name: 'Font Family',
+        strikethrough: 'Precrtano',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Veličina fonta'
+      },
+      image: {
+        image: 'Slika',
+        insert: 'Ubaci sliku',
+        resizeFull: 'Puna veličina',
+        resizeHalf: 'Umanji na 50%',
+        resizeQuarter: 'Umanji na 25%',
+        floatLeft: 'Poravnaj lijevo',
+        floatRight: 'Poravnaj desno',
+        floatNone: 'Bez poravnanja',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Povuci sliku ovdje',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Izaberi iz datoteke',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'Adresa slike',
+        remove: 'Ukloni sliku',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Veza na video',
+        insert: 'Ubaci video',
+        url: 'URL video',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ili Youku)'
+      },
+      link: {
+        link: 'Veza',
+        insert: 'Ubaci vezu',
+        unlink: 'Ukloni vezu',
+        edit: 'Uredi',
+        textToDisplay: 'Tekst za prikaz',
+        url: 'Internet adresa',
+        openInNewWindow: 'Otvori u novom prozoru'
+      },
+      table: {
+        table: 'Tablica',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Ubaci horizontalnu liniju'
+      },
+      style: {
+        style: 'Stil',
+        p: 'pni',
+        blockquote: 'Citat',
+        pre: 'Kôd',
+        h1: 'Naslov 1',
+        h2: 'Naslov 2',
+        h3: 'Naslov 3',
+        h4: 'Naslov 4',
+        h5: 'Naslov 5',
+        h6: 'Naslov 6'
+      },
+      lists: {
+        unordered: 'Obična lista',
+        ordered: 'Numerirana lista'
+      },
+      options: {
+        help: 'Pomoć',
+        fullscreen: 'Preko cijelog ekrana',
+        codeview: 'Izvorni kôd'
+      },
+      paragraph: {
+        paragraph: 'Paragraf',
+        outdent: 'Smanji uvlačenje',
+        indent: 'Povećaj uvlačenje',
+        left: 'Poravnaj lijevo',
+        center: 'Centrirano',
+        right: 'Poravnaj desno',
+        justify: 'Poravnaj obostrano'
+      },
+      color: {
+        recent: 'Posljednja boja',
+        more: 'Više boja',
+        background: 'Boja pozadine',
+        foreground: 'Boja teksta',
+        transparent: 'Prozirna',
+        setTransparent: 'Prozirna',
+        reset: 'Poništi',
+        resetToDefault: 'Podrazumijevana'
+      },
+      shortcut: {
+        shortcuts: 'Prečice s tipkovnice',
+        close: 'Zatvori',
+        textFormatting: 'Formatiranje teksta',
+        action: 'Akcija',
+        paragraphFormatting: 'Formatiranje paragrafa',
+        documentStyle: 'Stil dokumenta',
+        extraKeys: 'Dodatne kombinacije'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Poništi',
+        redo: 'Ponovi'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-hr-HR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js.map
new file mode 100644
index 0000000..4de4aed
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-hr-HR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-hr-HR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'hr-HR': {\n      font: {\n        bold: 'Podebljano',\n        italic: 'Kurziv',\n        underline: 'Podvučeno',\n        clear: 'Ukloni stilove fonta',\n        height: 'Visina linije',\n        name: 'Font Family',\n        strikethrough: 'Precrtano',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Veličina fonta',\n      },\n      image: {\n        image: 'Slika',\n        insert: 'Ubaci sliku',\n        resizeFull: 'Puna veličina',\n        resizeHalf: 'Umanji na 50%',\n        resizeQuarter: 'Umanji na 25%',\n        floatLeft: 'Poravnaj lijevo',\n        floatRight: 'Poravnaj desno',\n        floatNone: 'Bez poravnanja',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Povuci sliku ovdje',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Izaberi iz datoteke',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'Adresa slike',\n        remove: 'Ukloni sliku',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Veza na video',\n        insert: 'Ubaci video',\n        url: 'URL video',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ili Youku)',\n      },\n      link: {\n        link: 'Veza',\n        insert: 'Ubaci vezu',\n        unlink: 'Ukloni vezu',\n        edit: 'Uredi',\n        textToDisplay: 'Tekst za prikaz',\n        url: 'Internet adresa',\n        openInNewWindow: 'Otvori u novom prozoru',\n      },\n      table: {\n        table: 'Tablica',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Ubaci horizontalnu liniju',\n      },\n      style: {\n        style: 'Stil',\n        p: 'pni',\n        blockquote: 'Citat',\n        pre: 'Kôd',\n        h1: 'Naslov 1',\n        h2: 'Naslov 2',\n        h3: 'Naslov 3',\n        h4: 'Naslov 4',\n        h5: 'Naslov 5',\n        h6: 'Naslov 6',\n      },\n      lists: {\n        unordered: 'Obična lista',\n        ordered: 'Numerirana lista',\n      },\n      options: {\n        help: 'Pomoć',\n        fullscreen: 'Preko cijelog ekrana',\n        codeview: 'Izvorni kôd',\n      },\n      paragraph: {\n        paragraph: 'Paragraf',\n        outdent: 'Smanji uvlačenje',\n        indent: 'Povećaj uvlačenje',\n        left: 'Poravnaj lijevo',\n        center: 'Centrirano',\n        right: 'Poravnaj desno',\n        justify: 'Poravnaj obostrano',\n      },\n      color: {\n        recent: 'Posljednja boja',\n        more: 'Više boja',\n        background: 'Boja pozadine',\n        foreground: 'Boja teksta',\n        transparent: 'Prozirna',\n        setTransparent: 'Prozirna',\n        reset: 'Poništi',\n        resetToDefault: 'Podrazumijevana',\n      },\n      shortcut: {\n        shortcuts: 'Prečice s tipkovnice',\n        close: 'Zatvori',\n        textFormatting: 'Formatiranje teksta',\n        action: 'Akcija',\n        paragraphFormatting: 'Formatiranje paragrafa',\n        documentStyle: 'Stil dokumenta',\n        extraKeys: 'Dodatne kombinacije',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Poništi',\n        redo: 'Ponovi',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js
new file mode 100644
index 0000000..38172fc
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var o=a();for(var r in o)("object"==typeof exports?exports:e)[r]=o[r]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"hr-HR":{font:{bold:"Podebljano",italic:"Kurziv",underline:"Podvučeno",clear:"Ukloni stilove fonta",height:"Visina linije",name:"Font Family",strikethrough:"Precrtano",subscript:"Subscript",superscript:"Superscript",size:"Veličina fonta"},image:{image:"Slika",insert:"Ubaci sliku",resizeFull:"Puna veličina",resizeHalf:"Umanji na 50%",resizeQuarter:"Umanji na 25%",floatLeft:"Poravnaj lijevo",floatRight:"Poravnaj desno",floatNone:"Bez poravnanja",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Povuci sliku ovdje",dropImage:"Drop image or Text",selectFromFiles:"Izaberi iz datoteke",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Adresa slike",remove:"Ukloni sliku",original:"Original"},video:{video:"Video",videoLink:"Veza na video",insert:"Ubaci video",url:"URL video",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion ili Youku)"},link:{link:"Veza",insert:"Ubaci vezu",unlink:"Ukloni vezu",edit:"Uredi",textToDisplay:"Tekst za prikaz",url:"Internet adresa",openInNewWindow:"Otvori u novom prozoru"},table:{table:"Tablica",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Ubaci horizontalnu liniju"},style:{style:"Stil",p:"pni",blockquote:"Citat",pre:"Kôd",h1:"Naslov 1",h2:"Naslov 2",h3:"Naslov 3",h4:"Naslov 4",h5:"Naslov 5",h6:"Naslov 6"},lists:{unordered:"Obična lista",ordered:"Numerirana lista"},options:{help:"Pomoć",fullscreen:"Preko cijelog ekrana",codeview:"Izvorni kôd"},paragraph:{paragraph:"Paragraf",outdent:"Smanji uvlačenje",indent:"Povećaj uvlačenje",left:"Poravnaj lijevo",center:"Centrirano",right:"Poravnaj desno",justify:"Poravnaj obostrano"},color:{recent:"Posljednja boja",more:"Više boja",background:"Boja pozadine",foreground:"Boja teksta",transparent:"Prozirna",setTransparent:"Prozirna",reset:"Poništi",resetToDefault:"Podrazumijevana"},shortcut:{shortcuts:"Prečice s tipkovnice",close:"Zatvori",textFormatting:"Formatiranje teksta",action:"Akcija",paragraphFormatting:"Formatiranje paragrafa",documentStyle:"Stil dokumenta",extraKeys:"Dodatne kombinacije"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Poništi",redo:"Ponovi"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hr-HR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js
new file mode 100644
index 0000000..744c4b2
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'hu-HU': {
+      font: {
+        bold: 'Félkövér',
+        italic: 'Dőlt',
+        underline: 'Aláhúzott',
+        clear: 'Formázás törlése',
+        height: 'Sorköz',
+        name: 'Betűtípus',
+        strikethrough: 'Áthúzott',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Betűméret'
+      },
+      image: {
+        image: 'Kép',
+        insert: 'Kép beszúrása',
+        resizeFull: 'Átméretezés teljes méretre',
+        resizeHalf: 'Átméretezés felére',
+        resizeQuarter: 'Átméretezés negyedére',
+        floatLeft: 'Igazítás balra',
+        floatRight: 'Igazítás jobbra',
+        floatNone: 'Igazítás törlése',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Ide húzhat képet vagy szöveget',
+        dropImage: 'Engedje el a képet vagy szöveget',
+        selectFromFiles: 'Fájlok kiválasztása',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'Kép URL címe',
+        remove: 'Kép törlése',
+        original: 'Original'
+      },
+      video: {
+        video: 'Videó',
+        videoLink: 'Videó hivatkozás',
+        insert: 'Videó beszúrása',
+        url: 'Videó URL címe',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion vagy Youku)'
+      },
+      link: {
+        link: 'Hivatkozás',
+        insert: 'Hivatkozás beszúrása',
+        unlink: 'Hivatkozás megszüntetése',
+        edit: 'Szerkesztés',
+        textToDisplay: 'Megjelenítendő szöveg',
+        url: 'Milyen URL címre hivatkozzon?',
+        openInNewWindow: 'Megnyitás új ablakban'
+      },
+      table: {
+        table: 'Táblázat',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Elválasztó vonal beszúrása'
+      },
+      style: {
+        style: 'Stílus',
+        p: 'Normál',
+        blockquote: 'Idézet',
+        pre: 'Kód',
+        h1: 'Fejléc 1',
+        h2: 'Fejléc 2',
+        h3: 'Fejléc 3',
+        h4: 'Fejléc 4',
+        h5: 'Fejléc 5',
+        h6: 'Fejléc 6'
+      },
+      lists: {
+        unordered: 'Listajeles lista',
+        ordered: 'Számozott lista'
+      },
+      options: {
+        help: 'Súgó',
+        fullscreen: 'Teljes képernyő',
+        codeview: 'Kód nézet'
+      },
+      paragraph: {
+        paragraph: 'Bekezdés',
+        outdent: 'Behúzás csökkentése',
+        indent: 'Behúzás növelése',
+        left: 'Igazítás balra',
+        center: 'Igazítás középre',
+        right: 'Igazítás jobbra',
+        justify: 'Sorkizárt'
+      },
+      color: {
+        recent: 'Jelenlegi szín',
+        more: 'További színek',
+        background: 'Háttérszín',
+        foreground: 'Betűszín',
+        transparent: 'Átlátszó',
+        setTransparent: 'Átlászóság beállítása',
+        reset: 'Visszaállítás',
+        resetToDefault: 'Alaphelyzetbe állítás'
+      },
+      shortcut: {
+        shortcuts: 'Gyorsbillentyű',
+        close: 'Bezárás',
+        textFormatting: 'Szöveg formázása',
+        action: 'Művelet',
+        paragraphFormatting: 'Bekezdés formázása',
+        documentStyle: 'Dokumentumstílus',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Új bekezdés',
+        'undo': 'Visszavonás',
+        'redo': 'Újra',
+        'tab': 'Behúzás növelése',
+        'untab': 'Behúzás csökkentése',
+        'bold': 'Félkövérre állítás',
+        'italic': 'Dőltre állítás',
+        'underline': 'Aláhúzás',
+        'strikethrough': 'Áthúzás',
+        'removeFormat': 'Formázás törlése',
+        'justifyLeft': 'Balra igazítás',
+        'justifyCenter': 'Középre igazítás',
+        'justifyRight': 'Jobbra igazítás',
+        'justifyFull': 'Sorkizárt',
+        'insertUnorderedList': 'Számozatlan lista be/ki',
+        'insertOrderedList': 'Számozott lista be/ki',
+        'outdent': 'Jelenlegi bekezdés behúzásának megszüntetése',
+        'indent': 'Jelenlegi bekezdés behúzása',
+        'formatPara': 'Blokk formázása bekezdésként (P tag)',
+        'formatH1': 'Blokk formázása, mint Fejléc 1',
+        'formatH2': 'Blokk formázása, mint Fejléc 2',
+        'formatH3': 'Blokk formázása, mint Fejléc 3',
+        'formatH4': 'Blokk formázása, mint Fejléc 4',
+        'formatH5': 'Blokk formázása, mint Fejléc 5',
+        'formatH6': 'Blokk formázása, mint Fejléc 6',
+        'insertHorizontalRule': 'Vízszintes vonal beszúrása',
+        'linkDialog.show': 'Link párbeszédablak megjelenítése'
+      },
+      history: {
+        undo: 'Visszavonás',
+        redo: 'Újra'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-hu-HU.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js.map
new file mode 100644
index 0000000..7cb153e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-hu-HU.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-hu-HU.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'hu-HU': {\n      font: {\n        bold: 'Félkövér',\n        italic: 'Dőlt',\n        underline: 'Aláhúzott',\n        clear: 'Formázás törlése',\n        height: 'Sorköz',\n        name: 'Betűtípus',\n        strikethrough: 'Áthúzott',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Betűméret',\n      },\n      image: {\n        image: 'Kép',\n        insert: 'Kép beszúrása',\n        resizeFull: 'Átméretezés teljes méretre',\n        resizeHalf: 'Átméretezés felére',\n        resizeQuarter: 'Átméretezés negyedére',\n        floatLeft: 'Igazítás balra',\n        floatRight: 'Igazítás jobbra',\n        floatNone: 'Igazítás törlése',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Ide húzhat képet vagy szöveget',\n        dropImage: 'Engedje el a képet vagy szöveget',\n        selectFromFiles: 'Fájlok kiválasztása',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'Kép URL címe',\n        remove: 'Kép törlése',\n        original: 'Original',\n      },\n      video: {\n        video: 'Videó',\n        videoLink: 'Videó hivatkozás',\n        insert: 'Videó beszúrása',\n        url: 'Videó URL címe',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion vagy Youku)',\n      },\n      link: {\n        link: 'Hivatkozás',\n        insert: 'Hivatkozás beszúrása',\n        unlink: 'Hivatkozás megszüntetése',\n        edit: 'Szerkesztés',\n        textToDisplay: 'Megjelenítendő szöveg',\n        url: 'Milyen URL címre hivatkozzon?',\n        openInNewWindow: 'Megnyitás új ablakban',\n      },\n      table: {\n        table: 'Táblázat',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Elválasztó vonal beszúrása',\n      },\n      style: {\n        style: 'Stílus',\n        p: 'Normál',\n        blockquote: 'Idézet',\n        pre: 'Kód',\n        h1: 'Fejléc 1',\n        h2: 'Fejléc 2',\n        h3: 'Fejléc 3',\n        h4: 'Fejléc 4',\n        h5: 'Fejléc 5',\n        h6: 'Fejléc 6',\n      },\n      lists: {\n        unordered: 'Listajeles lista',\n        ordered: 'Számozott lista',\n      },\n      options: {\n        help: 'Súgó',\n        fullscreen: 'Teljes képernyő',\n        codeview: 'Kód nézet',\n      },\n      paragraph: {\n        paragraph: 'Bekezdés',\n        outdent: 'Behúzás csökkentése',\n        indent: 'Behúzás növelése',\n        left: 'Igazítás balra',\n        center: 'Igazítás középre',\n        right: 'Igazítás jobbra',\n        justify: 'Sorkizárt',\n      },\n      color: {\n        recent: 'Jelenlegi szín',\n        more: 'További színek',\n        background: 'Háttérszín',\n        foreground: 'Betűszín',\n        transparent: 'Átlátszó',\n        setTransparent: 'Átlászóság beállítása',\n        reset: 'Visszaállítás',\n        resetToDefault: 'Alaphelyzetbe állítás',\n      },\n      shortcut: {\n        shortcuts: 'Gyorsbillentyű',\n        close: 'Bezárás',\n        textFormatting: 'Szöveg formázása',\n        action: 'Művelet',\n        paragraphFormatting: 'Bekezdés formázása',\n        documentStyle: 'Dokumentumstílus',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Új bekezdés',\n        'undo': 'Visszavonás',\n        'redo': 'Újra',\n        'tab': 'Behúzás növelése',\n        'untab': 'Behúzás csökkentése',\n        'bold': 'Félkövérre állítás',\n        'italic': 'Dőltre állítás',\n        'underline': 'Aláhúzás',\n        'strikethrough': 'Áthúzás',\n        'removeFormat': 'Formázás törlése',\n        'justifyLeft': 'Balra igazítás',\n        'justifyCenter': 'Középre igazítás',\n        'justifyRight': 'Jobbra igazítás',\n        'justifyFull': 'Sorkizárt',\n        'insertUnorderedList': 'Számozatlan lista be/ki',\n        'insertOrderedList': 'Számozott lista be/ki',\n        'outdent': 'Jelenlegi bekezdés behúzásának megszüntetése',\n        'indent': 'Jelenlegi bekezdés behúzása',\n        'formatPara': 'Blokk formázása bekezdésként (P tag)',\n        'formatH1': 'Blokk formázása, mint Fejléc 1',\n        'formatH2': 'Blokk formázása, mint Fejléc 2',\n        'formatH3': 'Blokk formázása, mint Fejléc 3',\n        'formatH4': 'Blokk formázása, mint Fejléc 4',\n        'formatH5': 'Blokk formázása, mint Fejléc 5',\n        'formatH6': 'Blokk formázása, mint Fejléc 6',\n        'insertHorizontalRule': 'Vízszintes vonal beszúrása',\n        'linkDialog.show': 'Link párbeszédablak megjelenítése',\n      },\n      history: {\n        undo: 'Visszavonás',\n        redo: 'Újra',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js
new file mode 100644
index 0000000..35dad09
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var s=t();for(var r in s)("object"==typeof exports?exports:e)[r]=s[r]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"hu-HU":{font:{bold:"Félkövér",italic:"Dőlt",underline:"Aláhúzott",clear:"Formázás törlése",height:"Sorköz",name:"Betűtípus",strikethrough:"Áthúzott",subscript:"Subscript",superscript:"Superscript",size:"Betűméret"},image:{image:"Kép",insert:"Kép beszúrása",resizeFull:"Átméretezés teljes méretre",resizeHalf:"Átméretezés felére",resizeQuarter:"Átméretezés negyedére",floatLeft:"Igazítás balra",floatRight:"Igazítás jobbra",floatNone:"Igazítás törlése",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Ide húzhat képet vagy szöveget",dropImage:"Engedje el a képet vagy szöveget",selectFromFiles:"Fájlok kiválasztása",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Kép URL címe",remove:"Kép törlése",original:"Original"},video:{video:"Videó",videoLink:"Videó hivatkozás",insert:"Videó beszúrása",url:"Videó URL címe",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion vagy Youku)"},link:{link:"Hivatkozás",insert:"Hivatkozás beszúrása",unlink:"Hivatkozás megszüntetése",edit:"Szerkesztés",textToDisplay:"Megjelenítendő szöveg",url:"Milyen URL címre hivatkozzon?",openInNewWindow:"Megnyitás új ablakban"},table:{table:"Táblázat",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Elválasztó vonal beszúrása"},style:{style:"Stílus",p:"Normál",blockquote:"Idézet",pre:"Kód",h1:"Fejléc 1",h2:"Fejléc 2",h3:"Fejléc 3",h4:"Fejléc 4",h5:"Fejléc 5",h6:"Fejléc 6"},lists:{unordered:"Listajeles lista",ordered:"Számozott lista"},options:{help:"Súgó",fullscreen:"Teljes képernyő",codeview:"Kód nézet"},paragraph:{paragraph:"Bekezdés",outdent:"Behúzás csökkentése",indent:"Behúzás növelése",left:"Igazítás balra",center:"Igazítás középre",right:"Igazítás jobbra",justify:"Sorkizárt"},color:{recent:"Jelenlegi szín",more:"További színek",background:"Háttérszín",foreground:"Betűszín",transparent:"Átlátszó",setTransparent:"Átlászóság beállítása",reset:"Visszaállítás",resetToDefault:"Alaphelyzetbe állítás"},shortcut:{shortcuts:"Gyorsbillentyű",close:"Bezárás",textFormatting:"Szöveg formázása",action:"Művelet",paragraphFormatting:"Bekezdés formázása",documentStyle:"Dokumentumstílus",extraKeys:"Extra keys"},help:{insertParagraph:"Új bekezdés",undo:"Visszavonás",redo:"Újra",tab:"Behúzás növelése",untab:"Behúzás csökkentése",bold:"Félkövérre állítás",italic:"Dőltre állítás",underline:"Aláhúzás",strikethrough:"Áthúzás",removeFormat:"Formázás törlése",justifyLeft:"Balra igazítás",justifyCenter:"Középre igazítás",justifyRight:"Jobbra igazítás",justifyFull:"Sorkizárt",insertUnorderedList:"Számozatlan lista be/ki",insertOrderedList:"Számozott lista be/ki",outdent:"Jelenlegi bekezdés behúzásának megszüntetése",indent:"Jelenlegi bekezdés behúzása",formatPara:"Blokk formázása bekezdésként (P tag)",formatH1:"Blokk formázása, mint Fejléc 1",formatH2:"Blokk formázása, mint Fejléc 2",formatH3:"Blokk formázása, mint Fejléc 3",formatH4:"Blokk formázása, mint Fejléc 4",formatH5:"Blokk formázása, mint Fejléc 5",formatH6:"Blokk formázása, mint Fejléc 6",insertHorizontalRule:"Vízszintes vonal beszúrása","linkDialog.show":"Link párbeszédablak megjelenítése"},history:{undo:"Visszavonás",redo:"Újra"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-hu-HU.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js
new file mode 100644
index 0000000..7d45c2a
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'id-ID': {
+      font: {
+        bold: 'Tebal',
+        italic: 'Miring',
+        underline: 'Garis bawah',
+        clear: 'Bersihkan gaya',
+        height: 'Jarak baris',
+        name: 'Jenis Tulisan',
+        strikethrough: 'Coret',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Ukuran font'
+      },
+      image: {
+        image: 'Gambar',
+        insert: 'Sisipkan gambar',
+        resizeFull: 'Ukuran penuh',
+        resizeHalf: 'Ukuran 50%',
+        resizeQuarter: 'Ukuran 25%',
+        floatLeft: 'Rata kiri',
+        floatRight: 'Rata kanan',
+        floatNone: 'Tanpa perataan',
+        shapeRounded: 'Bentuk: Membundar',
+        shapeCircle: 'Bentuk: Bundar',
+        shapeThumbnail: 'Bentuk: Thumbnail',
+        shapeNone: 'Bentuk: Tidak ada',
+        dragImageHere: 'Tarik gambar ke area ini',
+        dropImage: 'Letakkan gambar atau teks',
+        selectFromFiles: 'Pilih gambar dari berkas',
+        maximumFileSize: 'Ukuran maksimal berkas',
+        maximumFileSizeError: 'Ukuran maksimal berkas terlampaui.',
+        url: 'URL gambar',
+        remove: 'Hapus Gambar',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Link video',
+        insert: 'Sisipkan video',
+        url: 'Tautan video',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion atau Youku)'
+      },
+      link: {
+        link: 'Tautan',
+        insert: 'Tambah tautan',
+        unlink: 'Hapus tautan',
+        edit: 'Edit',
+        textToDisplay: 'Tampilan teks',
+        url: 'Tautan tujuan',
+        openInNewWindow: 'Buka di jendela baru'
+      },
+      table: {
+        table: 'Tabel',
+        addRowAbove: 'Tambahkan baris ke atas',
+        addRowBelow: 'Tambahkan baris ke bawah',
+        addColLeft: 'Tambahkan kolom ke kiri',
+        addColRight: 'Tambahkan kolom ke kanan',
+        delRow: 'Hapus baris',
+        delCol: 'Hapus kolom',
+        delTable: 'Hapus tabel'
+      },
+      hr: {
+        insert: 'Masukkan garis horizontal'
+      },
+      style: {
+        style: 'Gaya',
+        p: 'p',
+        blockquote: 'Kutipan',
+        pre: 'Kode',
+        h1: 'Heading 1',
+        h2: 'Heading 2',
+        h3: 'Heading 3',
+        h4: 'Heading 4',
+        h5: 'Heading 5',
+        h6: 'Heading 6'
+      },
+      lists: {
+        unordered: 'Pencacahan',
+        ordered: 'Penomoran'
+      },
+      options: {
+        help: 'Bantuan',
+        fullscreen: 'Layar penuh',
+        codeview: 'Kode HTML'
+      },
+      paragraph: {
+        paragraph: 'Paragraf',
+        outdent: 'Outdent',
+        indent: 'Indent',
+        left: 'Rata kiri',
+        center: 'Rata tengah',
+        right: 'Rata kanan',
+        justify: 'Rata kanan kiri'
+      },
+      color: {
+        recent: 'Warna sekarang',
+        more: 'Selengkapnya',
+        background: 'Warna latar',
+        foreground: 'Warna font',
+        transparent: 'Transparan',
+        setTransparent: 'Atur transparansi',
+        reset: 'Atur ulang',
+        resetToDefault: 'Kembalikan kesemula'
+      },
+      shortcut: {
+        shortcuts: 'Jalan pintas',
+        close: 'Tutup',
+        textFormatting: 'Format teks',
+        action: 'Aksi',
+        paragraphFormatting: 'Format paragraf',
+        documentStyle: 'Gaya dokumen',
+        extraKeys: 'Shortcut tambahan'
+      },
+      help: {
+        'insertParagraph': 'Tambahkan paragraf',
+        'undo': 'Urungkan perintah terakhir',
+        'redo': 'Kembalikan perintah terakhir',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Mengaktifkan gaya tebal',
+        'italic': 'Mengaktifkan gaya italic',
+        'underline': 'Mengaktifkan gaya underline',
+        'strikethrough': 'Mengaktifkan gaya strikethrough',
+        'removeFormat': 'Hapus semua gaya',
+        'justifyLeft': 'Atur rata kiri',
+        'justifyCenter': 'Atur rata tengah',
+        'justifyRight': 'Atur rata kanan',
+        'justifyFull': 'Atur rata kiri-kanan',
+        'insertUnorderedList': 'Nyalakan urutan tanpa nomor',
+        'insertOrderedList': 'Nyalakan urutan bernomor',
+        'outdent': 'Outdent di paragraf terpilih',
+        'indent': 'Indent di paragraf terpilih',
+        'formatPara': 'Ubah format gaya tulisan terpilih menjadi paragraf',
+        'formatH1': 'Ubah format gaya tulisan terpilih menjadi Heading 1',
+        'formatH2': 'Ubah format gaya tulisan terpilih menjadi Heading 2',
+        'formatH3': 'Ubah format gaya tulisan terpilih menjadi Heading 3',
+        'formatH4': 'Ubah format gaya tulisan terpilih menjadi Heading 4',
+        'formatH5': 'Ubah format gaya tulisan terpilih menjadi Heading 5',
+        'formatH6': 'Ubah format gaya tulisan terpilih menjadi Heading 6',
+        'insertHorizontalRule': 'Masukkan garis horizontal',
+        'linkDialog.show': 'Tampilkan Link Dialog'
+      },
+      history: {
+        undo: 'Kembali',
+        redo: 'Ulang'
+      },
+      specialChar: {
+        specialChar: 'KARAKTER KHUSUS',
+        select: 'Pilih karakter khusus'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-id-ID.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js.map
new file mode 100644
index 0000000..b963962
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-id-ID.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-id-ID.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'id-ID': {\n      font: {\n        bold: 'Tebal',\n        italic: 'Miring',\n        underline: 'Garis bawah',\n        clear: 'Bersihkan gaya',\n        height: 'Jarak baris',\n        name: 'Jenis Tulisan',\n        strikethrough: 'Coret',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Ukuran font',\n      },\n      image: {\n        image: 'Gambar',\n        insert: 'Sisipkan gambar',\n        resizeFull: 'Ukuran penuh',\n        resizeHalf: 'Ukuran 50%',\n        resizeQuarter: 'Ukuran 25%',\n        floatLeft: 'Rata kiri',\n        floatRight: 'Rata kanan',\n        floatNone: 'Tanpa perataan',\n        shapeRounded: 'Bentuk: Membundar',\n        shapeCircle: 'Bentuk: Bundar',\n        shapeThumbnail: 'Bentuk: Thumbnail',\n        shapeNone: 'Bentuk: Tidak ada',\n        dragImageHere: 'Tarik gambar ke area ini',\n        dropImage: 'Letakkan gambar atau teks',\n        selectFromFiles: 'Pilih gambar dari berkas',\n        maximumFileSize: 'Ukuran maksimal berkas',\n        maximumFileSizeError: 'Ukuran maksimal berkas terlampaui.',\n        url: 'URL gambar',\n        remove: 'Hapus Gambar',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Link video',\n        insert: 'Sisipkan video',\n        url: 'Tautan video',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion atau Youku)',\n      },\n      link: {\n        link: 'Tautan',\n        insert: 'Tambah tautan',\n        unlink: 'Hapus tautan',\n        edit: 'Edit',\n        textToDisplay: 'Tampilan teks',\n        url: 'Tautan tujuan',\n        openInNewWindow: 'Buka di jendela baru',\n      },\n      table: {\n        table: 'Tabel',\n        addRowAbove: 'Tambahkan baris ke atas',\n        addRowBelow: 'Tambahkan baris ke bawah',\n        addColLeft: 'Tambahkan kolom ke kiri',\n        addColRight: 'Tambahkan kolom ke kanan',\n        delRow: 'Hapus baris',\n        delCol: 'Hapus kolom',\n        delTable: 'Hapus tabel',\n      },\n      hr: {\n        insert: 'Masukkan garis horizontal',\n      },\n      style: {\n        style: 'Gaya',\n        p: 'p',\n        blockquote: 'Kutipan',\n        pre: 'Kode',\n        h1: 'Heading 1',\n        h2: 'Heading 2',\n        h3: 'Heading 3',\n        h4: 'Heading 4',\n        h5: 'Heading 5',\n        h6: 'Heading 6',\n      },\n      lists: {\n        unordered: 'Pencacahan',\n        ordered: 'Penomoran',\n      },\n      options: {\n        help: 'Bantuan',\n        fullscreen: 'Layar penuh',\n        codeview: 'Kode HTML',\n      },\n      paragraph: {\n        paragraph: 'Paragraf',\n        outdent: 'Outdent',\n        indent: 'Indent',\n        left: 'Rata kiri',\n        center: 'Rata tengah',\n        right: 'Rata kanan',\n        justify: 'Rata kanan kiri',\n      },\n      color: {\n        recent: 'Warna sekarang',\n        more: 'Selengkapnya',\n        background: 'Warna latar',\n        foreground: 'Warna font',\n        transparent: 'Transparan',\n        setTransparent: 'Atur transparansi',\n        reset: 'Atur ulang',\n        resetToDefault: 'Kembalikan kesemula',\n      },\n      shortcut: {\n        shortcuts: 'Jalan pintas',\n        close: 'Tutup',\n        textFormatting: 'Format teks',\n        action: 'Aksi',\n        paragraphFormatting: 'Format paragraf',\n        documentStyle: 'Gaya dokumen',\n        extraKeys: 'Shortcut tambahan',\n      },\n      help: {\n        'insertParagraph': 'Tambahkan paragraf',\n        'undo': 'Urungkan perintah terakhir',\n        'redo': 'Kembalikan perintah terakhir',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Mengaktifkan gaya tebal',\n        'italic': 'Mengaktifkan gaya italic',\n        'underline': 'Mengaktifkan gaya underline',\n        'strikethrough': 'Mengaktifkan gaya strikethrough',\n        'removeFormat': 'Hapus semua gaya',\n        'justifyLeft': 'Atur rata kiri',\n        'justifyCenter': 'Atur rata tengah',\n        'justifyRight': 'Atur rata kanan',\n        'justifyFull': 'Atur rata kiri-kanan',\n        'insertUnorderedList': 'Nyalakan urutan tanpa nomor',\n        'insertOrderedList': 'Nyalakan urutan bernomor',\n        'outdent': 'Outdent di paragraf terpilih',\n        'indent': 'Indent di paragraf terpilih',\n        'formatPara': 'Ubah format gaya tulisan terpilih menjadi paragraf',\n        'formatH1': 'Ubah format gaya tulisan terpilih menjadi Heading 1',\n        'formatH2': 'Ubah format gaya tulisan terpilih menjadi Heading 2',\n        'formatH3': 'Ubah format gaya tulisan terpilih menjadi Heading 3',\n        'formatH4': 'Ubah format gaya tulisan terpilih menjadi Heading 4',\n        'formatH5': 'Ubah format gaya tulisan terpilih menjadi Heading 5',\n        'formatH6': 'Ubah format gaya tulisan terpilih menjadi Heading 6',\n        'insertHorizontalRule': 'Masukkan garis horizontal',\n        'linkDialog.show': 'Tampilkan Link Dialog',\n      },\n      history: {\n        undo: 'Kembali',\n        redo: 'Ulang',\n      },\n      specialChar: {\n        specialChar: 'KARAKTER KHUSUS',\n        select: 'Pilih karakter khusus',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js
new file mode 100644
index 0000000..cf96eff
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(a,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var r=e();for(var t in r)("object"==typeof exports?exports:a)[t]=r[t]}}(self,(function(){return(a=jQuery).extend(a.summernote.lang,{"id-ID":{font:{bold:"Tebal",italic:"Miring",underline:"Garis bawah",clear:"Bersihkan gaya",height:"Jarak baris",name:"Jenis Tulisan",strikethrough:"Coret",subscript:"Subscript",superscript:"Superscript",size:"Ukuran font"},image:{image:"Gambar",insert:"Sisipkan gambar",resizeFull:"Ukuran penuh",resizeHalf:"Ukuran 50%",resizeQuarter:"Ukuran 25%",floatLeft:"Rata kiri",floatRight:"Rata kanan",floatNone:"Tanpa perataan",shapeRounded:"Bentuk: Membundar",shapeCircle:"Bentuk: Bundar",shapeThumbnail:"Bentuk: Thumbnail",shapeNone:"Bentuk: Tidak ada",dragImageHere:"Tarik gambar ke area ini",dropImage:"Letakkan gambar atau teks",selectFromFiles:"Pilih gambar dari berkas",maximumFileSize:"Ukuran maksimal berkas",maximumFileSizeError:"Ukuran maksimal berkas terlampaui.",url:"URL gambar",remove:"Hapus Gambar",original:"Original"},video:{video:"Video",videoLink:"Link video",insert:"Sisipkan video",url:"Tautan video",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion atau Youku)"},link:{link:"Tautan",insert:"Tambah tautan",unlink:"Hapus tautan",edit:"Edit",textToDisplay:"Tampilan teks",url:"Tautan tujuan",openInNewWindow:"Buka di jendela baru"},table:{table:"Tabel",addRowAbove:"Tambahkan baris ke atas",addRowBelow:"Tambahkan baris ke bawah",addColLeft:"Tambahkan kolom ke kiri",addColRight:"Tambahkan kolom ke kanan",delRow:"Hapus baris",delCol:"Hapus kolom",delTable:"Hapus tabel"},hr:{insert:"Masukkan garis horizontal"},style:{style:"Gaya",p:"p",blockquote:"Kutipan",pre:"Kode",h1:"Heading 1",h2:"Heading 2",h3:"Heading 3",h4:"Heading 4",h5:"Heading 5",h6:"Heading 6"},lists:{unordered:"Pencacahan",ordered:"Penomoran"},options:{help:"Bantuan",fullscreen:"Layar penuh",codeview:"Kode HTML"},paragraph:{paragraph:"Paragraf",outdent:"Outdent",indent:"Indent",left:"Rata kiri",center:"Rata tengah",right:"Rata kanan",justify:"Rata kanan kiri"},color:{recent:"Warna sekarang",more:"Selengkapnya",background:"Warna latar",foreground:"Warna font",transparent:"Transparan",setTransparent:"Atur transparansi",reset:"Atur ulang",resetToDefault:"Kembalikan kesemula"},shortcut:{shortcuts:"Jalan pintas",close:"Tutup",textFormatting:"Format teks",action:"Aksi",paragraphFormatting:"Format paragraf",documentStyle:"Gaya dokumen",extraKeys:"Shortcut tambahan"},help:{insertParagraph:"Tambahkan paragraf",undo:"Urungkan perintah terakhir",redo:"Kembalikan perintah terakhir",tab:"Tab",untab:"Untab",bold:"Mengaktifkan gaya tebal",italic:"Mengaktifkan gaya italic",underline:"Mengaktifkan gaya underline",strikethrough:"Mengaktifkan gaya strikethrough",removeFormat:"Hapus semua gaya",justifyLeft:"Atur rata kiri",justifyCenter:"Atur rata tengah",justifyRight:"Atur rata kanan",justifyFull:"Atur rata kiri-kanan",insertUnorderedList:"Nyalakan urutan tanpa nomor",insertOrderedList:"Nyalakan urutan bernomor",outdent:"Outdent di paragraf terpilih",indent:"Indent di paragraf terpilih",formatPara:"Ubah format gaya tulisan terpilih menjadi paragraf",formatH1:"Ubah format gaya tulisan terpilih menjadi Heading 1",formatH2:"Ubah format gaya tulisan terpilih menjadi Heading 2",formatH3:"Ubah format gaya tulisan terpilih menjadi Heading 3",formatH4:"Ubah format gaya tulisan terpilih menjadi Heading 4",formatH5:"Ubah format gaya tulisan terpilih menjadi Heading 5",formatH6:"Ubah format gaya tulisan terpilih menjadi Heading 6",insertHorizontalRule:"Masukkan garis horizontal","linkDialog.show":"Tampilkan Link Dialog"},history:{undo:"Kembali",redo:"Ulang"},specialChar:{specialChar:"KARAKTER KHUSUS",select:"Pilih karakter khusus"}}}),{};var a}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-id-ID.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js
new file mode 100644
index 0000000..80ed2b7
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'it-IT': {
+      font: {
+        bold: 'Testo in grassetto',
+        italic: 'Testo in corsivo',
+        underline: 'Testo sottolineato',
+        clear: 'Elimina la formattazione del testo',
+        height: 'Altezza della linea di testo',
+        name: 'Famiglia Font',
+        strikethrough: 'Testo barrato',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Dimensione del carattere'
+      },
+      image: {
+        image: 'Immagine',
+        insert: 'Inserisci Immagine',
+        resizeFull: 'Dimensioni originali',
+        resizeHalf: 'Ridimensiona al 50%',
+        resizeQuarter: 'Ridimensiona al 25%',
+        floatLeft: 'Posiziona a sinistra',
+        floatRight: 'Posiziona a destra',
+        floatNone: 'Nessun posizionamento',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Trascina qui un\'immagine',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Scegli dai Documenti',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'URL dell\'immagine',
+        remove: 'Rimuovi immagine',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Collegamento ad un Video',
+        insert: 'Inserisci Video',
+        url: 'URL del Video',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)'
+      },
+      link: {
+        link: 'Collegamento',
+        insert: 'Inserisci Collegamento',
+        unlink: 'Elimina collegamento',
+        edit: 'Modifica collegamento',
+        textToDisplay: 'Testo del collegamento',
+        url: 'URL del collegamento',
+        openInNewWindow: 'Apri in una nuova finestra'
+      },
+      table: {
+        table: 'Tabella',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Inserisce una linea di separazione'
+      },
+      style: {
+        style: 'Stili',
+        p: 'pe',
+        blockquote: 'Citazione',
+        pre: 'Codice',
+        h1: 'Titolo 1',
+        h2: 'Titolo 2',
+        h3: 'Titolo 3',
+        h4: 'Titolo 4',
+        h5: 'Titolo 5',
+        h6: 'Titolo 6'
+      },
+      lists: {
+        unordered: 'Elenco non ordinato',
+        ordered: 'Elenco ordinato'
+      },
+      options: {
+        help: 'Aiuto',
+        fullscreen: 'Modalità a tutto schermo',
+        codeview: 'Visualizza codice'
+      },
+      paragraph: {
+        paragraph: 'Paragrafo',
+        outdent: 'Diminuisce il livello di rientro',
+        indent: 'Aumenta il livello di rientro',
+        left: 'Allinea a sinistra',
+        center: 'Centra',
+        right: 'Allinea a destra',
+        justify: 'Giustifica (allinea a destra e sinistra)'
+      },
+      color: {
+        recent: 'Ultimo colore utilizzato',
+        more: 'Altri colori',
+        background: 'Colore di sfondo',
+        foreground: 'Colore',
+        transparent: 'Trasparente',
+        setTransparent: 'Trasparente',
+        reset: 'Reimposta',
+        resetToDefault: 'Reimposta i colori'
+      },
+      shortcut: {
+        shortcuts: 'Scorciatoie da tastiera',
+        close: 'Chiudi',
+        textFormatting: 'Formattazione testo',
+        action: 'Azioni',
+        paragraphFormatting: 'Formattazione paragrafo',
+        documentStyle: 'Stili',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Annulla',
+        redo: 'Ripristina'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-it-IT.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js.map
new file mode 100644
index 0000000..76a8026
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-it-IT.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-it-IT.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'it-IT': {\n      font: {\n        bold: 'Testo in grassetto',\n        italic: 'Testo in corsivo',\n        underline: 'Testo sottolineato',\n        clear: 'Elimina la formattazione del testo',\n        height: 'Altezza della linea di testo',\n        name: 'Famiglia Font',\n        strikethrough: 'Testo barrato',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Dimensione del carattere',\n      },\n      image: {\n        image: 'Immagine',\n        insert: 'Inserisci Immagine',\n        resizeFull: 'Dimensioni originali',\n        resizeHalf: 'Ridimensiona al 50%',\n        resizeQuarter: 'Ridimensiona al 25%',\n        floatLeft: 'Posiziona a sinistra',\n        floatRight: 'Posiziona a destra',\n        floatNone: 'Nessun posizionamento',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Trascina qui un\\'immagine',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Scegli dai Documenti',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'URL dell\\'immagine',\n        remove: 'Rimuovi immagine',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Collegamento ad un Video',\n        insert: 'Inserisci Video',\n        url: 'URL del Video',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)',\n      },\n      link: {\n        link: 'Collegamento',\n        insert: 'Inserisci Collegamento',\n        unlink: 'Elimina collegamento',\n        edit: 'Modifica collegamento',\n        textToDisplay: 'Testo del collegamento',\n        url: 'URL del collegamento',\n        openInNewWindow: 'Apri in una nuova finestra',\n      },\n      table: {\n        table: 'Tabella',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Inserisce una linea di separazione',\n      },\n      style: {\n        style: 'Stili',\n        p: 'pe',\n        blockquote: 'Citazione',\n        pre: 'Codice',\n        h1: 'Titolo 1',\n        h2: 'Titolo 2',\n        h3: 'Titolo 3',\n        h4: 'Titolo 4',\n        h5: 'Titolo 5',\n        h6: 'Titolo 6',\n      },\n      lists: {\n        unordered: 'Elenco non ordinato',\n        ordered: 'Elenco ordinato',\n      },\n      options: {\n        help: 'Aiuto',\n        fullscreen: 'Modalità a tutto schermo',\n        codeview: 'Visualizza codice',\n      },\n      paragraph: {\n        paragraph: 'Paragrafo',\n        outdent: 'Diminuisce il livello di rientro',\n        indent: 'Aumenta il livello di rientro',\n        left: 'Allinea a sinistra',\n        center: 'Centra',\n        right: 'Allinea a destra',\n        justify: 'Giustifica (allinea a destra e sinistra)',\n      },\n      color: {\n        recent: 'Ultimo colore utilizzato',\n        more: 'Altri colori',\n        background: 'Colore di sfondo',\n        foreground: 'Colore',\n        transparent: 'Trasparente',\n        setTransparent: 'Trasparente',\n        reset: 'Reimposta',\n        resetToDefault: 'Reimposta i colori',\n      },\n      shortcut: {\n        shortcuts: 'Scorciatoie da tastiera',\n        close: 'Chiudi',\n        textFormatting: 'Formattazione testo',\n        action: 'Azioni',\n        paragraphFormatting: 'Formattazione paragrafo',\n        documentStyle: 'Stili',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Annulla',\n        redo: 'Ripristina',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js
new file mode 100644
index 0000000..c6bee77
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var i=t();for(var o in i)("object"==typeof exports?exports:e)[o]=i[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"it-IT":{font:{bold:"Testo in grassetto",italic:"Testo in corsivo",underline:"Testo sottolineato",clear:"Elimina la formattazione del testo",height:"Altezza della linea di testo",name:"Famiglia Font",strikethrough:"Testo barrato",subscript:"Subscript",superscript:"Superscript",size:"Dimensione del carattere"},image:{image:"Immagine",insert:"Inserisci Immagine",resizeFull:"Dimensioni originali",resizeHalf:"Ridimensiona al 50%",resizeQuarter:"Ridimensiona al 25%",floatLeft:"Posiziona a sinistra",floatRight:"Posiziona a destra",floatNone:"Nessun posizionamento",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Trascina qui un'immagine",dropImage:"Drop image or Text",selectFromFiles:"Scegli dai Documenti",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"URL dell'immagine",remove:"Rimuovi immagine",original:"Original"},video:{video:"Video",videoLink:"Collegamento ad un Video",insert:"Inserisci Video",url:"URL del Video",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion o Youku)"},link:{link:"Collegamento",insert:"Inserisci Collegamento",unlink:"Elimina collegamento",edit:"Modifica collegamento",textToDisplay:"Testo del collegamento",url:"URL del collegamento",openInNewWindow:"Apri in una nuova finestra"},table:{table:"Tabella",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Inserisce una linea di separazione"},style:{style:"Stili",p:"pe",blockquote:"Citazione",pre:"Codice",h1:"Titolo 1",h2:"Titolo 2",h3:"Titolo 3",h4:"Titolo 4",h5:"Titolo 5",h6:"Titolo 6"},lists:{unordered:"Elenco non ordinato",ordered:"Elenco ordinato"},options:{help:"Aiuto",fullscreen:"Modalità a tutto schermo",codeview:"Visualizza codice"},paragraph:{paragraph:"Paragrafo",outdent:"Diminuisce il livello di rientro",indent:"Aumenta il livello di rientro",left:"Allinea a sinistra",center:"Centra",right:"Allinea a destra",justify:"Giustifica (allinea a destra e sinistra)"},color:{recent:"Ultimo colore utilizzato",more:"Altri colori",background:"Colore di sfondo",foreground:"Colore",transparent:"Trasparente",setTransparent:"Trasparente",reset:"Reimposta",resetToDefault:"Reimposta i colori"},shortcut:{shortcuts:"Scorciatoie da tastiera",close:"Chiudi",textFormatting:"Formattazione testo",action:"Azioni",paragraphFormatting:"Formattazione paragrafo",documentStyle:"Stili",extraKeys:"Extra keys"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Annulla",redo:"Ripristina"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-it-IT.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js
new file mode 100644
index 0000000..9635846
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'ja-JP': {
+      font: {
+        bold: '太字',
+        italic: '斜体',
+        underline: '下線',
+        clear: 'クリア',
+        height: '文字高',
+        name: 'フォント',
+        strikethrough: '取り消し線',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: '大きさ'
+      },
+      image: {
+        image: '画像',
+        insert: '画像挿入',
+        resizeFull: '最大化',
+        resizeHalf: '1/2',
+        resizeQuarter: '1/4',
+        floatLeft: '左寄せ',
+        floatRight: '右寄せ',
+        floatNone: '寄せ解除',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'ここに画像をドラッグしてください',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: '画像ファイルを選ぶ',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'URLから画像を挿入する',
+        remove: '画像を削除する',
+        original: 'Original'
+      },
+      video: {
+        video: '動画',
+        videoLink: '動画リンク',
+        insert: '動画挿入',
+        url: '動画のURL',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku)'
+      },
+      link: {
+        link: 'リンク',
+        insert: 'リンク挿入',
+        unlink: 'リンク解除',
+        edit: '編集',
+        textToDisplay: 'リンク文字列',
+        url: 'URLを入力してください',
+        openInNewWindow: '新しいウィンドウで開く'
+      },
+      table: {
+        table: 'テーブル',
+        addRowAbove: '行を上に追加',
+        addRowBelow: '行を下に追加',
+        addColLeft: '列を左に追加',
+        addColRight: '列を右に追加',
+        delRow: '行を削除',
+        delCol: '列を削除',
+        delTable: 'テーブルを削除'
+      },
+      hr: {
+        insert: '水平線の挿入'
+      },
+      style: {
+        style: 'スタイル',
+        p: '標準',
+        blockquote: '引用',
+        pre: 'コード',
+        h1: '見出し1',
+        h2: '見出し2',
+        h3: '見出し3',
+        h4: '見出し4',
+        h5: '見出し5',
+        h6: '見出し6'
+      },
+      lists: {
+        unordered: '通常リスト',
+        ordered: '番号リスト'
+      },
+      options: {
+        help: 'ヘルプ',
+        fullscreen: 'フルスクリーン',
+        codeview: 'コード表示'
+      },
+      paragraph: {
+        paragraph: '文章',
+        outdent: '字上げ',
+        indent: '字下げ',
+        left: '左寄せ',
+        center: '中央寄せ',
+        right: '右寄せ',
+        justify: '均等割付'
+      },
+      color: {
+        recent: '現在の色',
+        more: 'もっと見る',
+        background: '背景色',
+        foreground: '文字色',
+        transparent: '透明',
+        setTransparent: '透明にする',
+        reset: '標準',
+        resetToDefault: '標準に戻す'
+      },
+      shortcut: {
+        shortcuts: 'ショートカット',
+        close: '閉じる',
+        textFormatting: '文字フォーマット',
+        action: 'アクション',
+        paragraphFormatting: '文章フォーマット',
+        documentStyle: 'ドキュメント形式',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': '改行挿入',
+        'undo': '一旦、行った操作を戻す',
+        'redo': '最後のコマンドをやり直す',
+        'tab': 'Tab',
+        'untab': 'タブ戻し',
+        'bold': '太文字',
+        'italic': '斜体',
+        'underline': '下線',
+        'strikethrough': '取り消し線',
+        'removeFormat': '装飾を戻す',
+        'justifyLeft': '左寄せ',
+        'justifyCenter': '真ん中寄せ',
+        'justifyRight': '右寄せ',
+        'justifyFull': 'すべてを整列',
+        'insertUnorderedList': '行頭に●を挿入',
+        'insertOrderedList': '行頭に番号を挿入',
+        'outdent': '字下げを戻す(アウトデント)',
+        'indent': '字下げする(インデント)',
+        'formatPara': '段落(P tag)指定',
+        'formatH1': 'H1指定',
+        'formatH2': 'H2指定',
+        'formatH3': 'H3指定',
+        'formatH4': 'H4指定',
+        'formatH5': 'H5指定',
+        'formatH6': 'H6指定',
+        'insertHorizontalRule': '&lt;hr /&gt;を挿入',
+        'linkDialog.show': 'リンク挿入'
+      },
+      history: {
+        undo: '元に戻す',
+        redo: 'やり直す'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-ja-JP.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js.map
new file mode 100644
index 0000000..04444c2
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-ja-JP.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-ja-JP.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'ja-JP': {\n      font: {\n        bold: '太字',\n        italic: '斜体',\n        underline: '下線',\n        clear: 'クリア',\n        height: '文字高',\n        name: 'フォント',\n        strikethrough: '取り消し線',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: '大きさ',\n      },\n      image: {\n        image: '画像',\n        insert: '画像挿入',\n        resizeFull: '最大化',\n        resizeHalf: '1/2',\n        resizeQuarter: '1/4',\n        floatLeft: '左寄せ',\n        floatRight: '右寄せ',\n        floatNone: '寄せ解除',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'ここに画像をドラッグしてください',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: '画像ファイルを選ぶ',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'URLから画像を挿入する',\n        remove: '画像を削除する',\n        original: 'Original',\n      },\n      video: {\n        video: '動画',\n        videoLink: '動画リンク',\n        insert: '動画挿入',\n        url: '動画のURL',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku)',\n      },\n      link: {\n        link: 'リンク',\n        insert: 'リンク挿入',\n        unlink: 'リンク解除',\n        edit: '編集',\n        textToDisplay: 'リンク文字列',\n        url: 'URLを入力してください',\n        openInNewWindow: '新しいウィンドウで開く',\n      },\n      table: {\n        table: 'テーブル',\n        addRowAbove: '行を上に追加',\n        addRowBelow: '行を下に追加',\n        addColLeft: '列を左に追加',\n        addColRight: '列を右に追加',\n        delRow: '行を削除',\n        delCol: '列を削除',\n        delTable: 'テーブルを削除',\n      },\n      hr: {\n        insert: '水平線の挿入',\n      },\n      style: {\n        style: 'スタイル',\n        p: '標準',\n        blockquote: '引用',\n        pre: 'コード',\n        h1: '見出し1',\n        h2: '見出し2',\n        h3: '見出し3',\n        h4: '見出し4',\n        h5: '見出し5',\n        h6: '見出し6',\n      },\n      lists: {\n        unordered: '通常リスト',\n        ordered: '番号リスト',\n      },\n      options: {\n        help: 'ヘルプ',\n        fullscreen: 'フルスクリーン',\n        codeview: 'コード表示',\n      },\n      paragraph: {\n        paragraph: '文章',\n        outdent: '字上げ',\n        indent: '字下げ',\n        left: '左寄せ',\n        center: '中央寄せ',\n        right: '右寄せ',\n        justify: '均等割付',\n      },\n      color: {\n        recent: '現在の色',\n        more: 'もっと見る',\n        background: '背景色',\n        foreground: '文字色',\n        transparent: '透明',\n        setTransparent: '透明にする',\n        reset: '標準',\n        resetToDefault: '標準に戻す',\n      },\n      shortcut: {\n        shortcuts: 'ショートカット',\n        close: '閉じる',\n        textFormatting: '文字フォーマット',\n        action: 'アクション',\n        paragraphFormatting: '文章フォーマット',\n        documentStyle: 'ドキュメント形式',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': '改行挿入',\n        'undo': '一旦、行った操作を戻す',\n        'redo': '最後のコマンドをやり直す',\n        'tab': 'Tab',\n        'untab': 'タブ戻し',\n        'bold': '太文字',\n        'italic': '斜体',\n        'underline': '下線',\n        'strikethrough': '取り消し線',\n        'removeFormat': '装飾を戻す',\n        'justifyLeft': '左寄せ',\n        'justifyCenter': '真ん中寄せ',\n        'justifyRight': '右寄せ',\n        'justifyFull': 'すべてを整列',\n        'insertUnorderedList': '行頭に●を挿入',\n        'insertOrderedList': '行頭に番号を挿入',\n        'outdent': '字下げを戻す(アウトデント)',\n        'indent': '字下げする(インデント)',\n        'formatPara': '段落(P tag)指定',\n        'formatH1': 'H1指定',\n        'formatH2': 'H2指定',\n        'formatH3': 'H3指定',\n        'formatH4': 'H4指定',\n        'formatH5': 'H5指定',\n        'formatH6': 'H6指定',\n        'insertHorizontalRule': '&lt;hr /&gt;を挿入',\n        'linkDialog.show': 'リンク挿入',\n      },\n      history: {\n        undo: '元に戻す',\n        redo: 'やり直す',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js
new file mode 100644
index 0000000..5f4e49b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"ja-JP":{font:{bold:"太字",italic:"斜体",underline:"下線",clear:"クリア",height:"文字高",name:"フォント",strikethrough:"取り消し線",subscript:"Subscript",superscript:"Superscript",size:"大きさ"},image:{image:"画像",insert:"画像挿入",resizeFull:"最大化",resizeHalf:"1/2",resizeQuarter:"1/4",floatLeft:"左寄せ",floatRight:"右寄せ",floatNone:"寄せ解除",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"ここに画像をドラッグしてください",dropImage:"Drop image or Text",selectFromFiles:"画像ファイルを選ぶ",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"URLから画像を挿入する",remove:"画像を削除する",original:"Original"},video:{video:"動画",videoLink:"動画リンク",insert:"動画挿入",url:"動画のURL",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku)"},link:{link:"リンク",insert:"リンク挿入",unlink:"リンク解除",edit:"編集",textToDisplay:"リンク文字列",url:"URLを入力してください",openInNewWindow:"新しいウィンドウで開く"},table:{table:"テーブル",addRowAbove:"行を上に追加",addRowBelow:"行を下に追加",addColLeft:"列を左に追加",addColRight:"列を右に追加",delRow:"行を削除",delCol:"列を削除",delTable:"テーブルを削除"},hr:{insert:"水平線の挿入"},style:{style:"スタイル",p:"標準",blockquote:"引用",pre:"コード",h1:"見出し1",h2:"見出し2",h3:"見出し3",h4:"見出し4",h5:"見出し5",h6:"見出し6"},lists:{unordered:"通常リスト",ordered:"番号リスト"},options:{help:"ヘルプ",fullscreen:"フルスクリーン",codeview:"コード表示"},paragraph:{paragraph:"文章",outdent:"字上げ",indent:"字下げ",left:"左寄せ",center:"中央寄せ",right:"右寄せ",justify:"均等割付"},color:{recent:"現在の色",more:"もっと見る",background:"背景色",foreground:"文字色",transparent:"透明",setTransparent:"透明にする",reset:"標準",resetToDefault:"標準に戻す"},shortcut:{shortcuts:"ショートカット",close:"閉じる",textFormatting:"文字フォーマット",action:"アクション",paragraphFormatting:"文章フォーマット",documentStyle:"ドキュメント形式",extraKeys:"Extra keys"},help:{insertParagraph:"改行挿入",undo:"一旦、行った操作を戻す",redo:"最後のコマンドをやり直す",tab:"Tab",untab:"タブ戻し",bold:"太文字",italic:"斜体",underline:"下線",strikethrough:"取り消し線",removeFormat:"装飾を戻す",justifyLeft:"左寄せ",justifyCenter:"真ん中寄せ",justifyRight:"右寄せ",justifyFull:"すべてを整列",insertUnorderedList:"行頭に●を挿入",insertOrderedList:"行頭に番号を挿入",outdent:"字下げを戻す(アウトデント)",indent:"字下げする(インデント)",formatPara:"段落(P tag)指定",formatH1:"H1指定",formatH2:"H2指定",formatH3:"H3指定",formatH4:"H4指定",formatH5:"H5指定",formatH6:"H6指定",insertHorizontalRule:"&lt;hr /&gt;を挿入","linkDialog.show":"リンク挿入"},history:{undo:"元に戻す",redo:"やり直す"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ja-JP.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js
new file mode 100644
index 0000000..6d1d94e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js
@@ -0,0 +1,186 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'ko-KR': {
+      font: {
+        bold: '굵게',
+        italic: '기울임꼴',
+        underline: '밑줄',
+        clear: '서식 지우기',
+        height: '줄 간격',
+        name: '글꼴',
+        superscript: '위 첨자',
+        subscript: '아래 첨자',
+        strikethrough: '취소선',
+        size: '글자 크기'
+      },
+      image: {
+        image: '그림',
+        insert: '그림 삽입',
+        resizeFull: '100% 크기로 변경',
+        resizeHalf: '50% 크기로 변경',
+        resizeQuarter: '25% 크기로 변경',
+        resizeNone: '원본 크기',
+        floatLeft: '왼쪽 정렬',
+        floatRight: '오른쪽 정렬',
+        floatNone: '정렬하지 않음',
+        shapeRounded: '스타일: 둥근 모서리',
+        shapeCircle: '스타일: 원형',
+        shapeThumbnail: '스타일: 액자',
+        shapeNone: '스타일: 없음',
+        dragImageHere: '텍스트 혹은 사진을 이곳으로 끌어오세요',
+        dropImage: '텍스트 혹은 사진을 내려놓으세요',
+        selectFromFiles: '파일 선택',
+        maximumFileSize: '최대 파일 크기',
+        maximumFileSizeError: '최대 파일 크기를 초과했습니다.',
+        url: '사진 URL',
+        remove: '사진 삭제',
+        original: '원본'
+      },
+      video: {
+        video: '동영상',
+        videoLink: '동영상 링크',
+        insert: '동영상 삽입',
+        url: '동영상 URL',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku 사용 가능)'
+      },
+      link: {
+        link: '링크',
+        insert: '링크 삽입',
+        unlink: '링크 삭제',
+        edit: '수정',
+        textToDisplay: '링크에 표시할 내용',
+        url: '이동할 URL',
+        openInNewWindow: '새창으로 열기'
+      },
+      table: {
+        table: '표',
+        addRowAbove: '위에 행 삽입',
+        addRowBelow: '아래에 행 삽입',
+        addColLeft: '왼쪽에 열 삽입',
+        addColRight: '오른쪽에 열 삽입',
+        delRow: '행 지우기',
+        delCol: '열 지우기',
+        delTable: '표 삭제'
+      },
+      hr: {
+        insert: '구분선 삽입'
+      },
+      style: {
+        style: '스타일',
+        p: '본문',
+        blockquote: '인용구',
+        pre: '코드',
+        h1: '제목 1',
+        h2: '제목 2',
+        h3: '제목 3',
+        h4: '제목 4',
+        h5: '제목 5',
+        h6: '제목 6'
+      },
+      lists: {
+        unordered: '글머리 기호',
+        ordered: '번호 매기기'
+      },
+      options: {
+        help: '도움말',
+        fullscreen: '전체 화면',
+        codeview: '코드 보기'
+      },
+      paragraph: {
+        paragraph: '문단 정렬',
+        outdent: '내어쓰기',
+        indent: '들여쓰기',
+        left: '왼쪽 정렬',
+        center: '가운데 정렬',
+        right: '오른쪽 정렬',
+        justify: '양쪽 정렬'
+      },
+      color: {
+        recent: '마지막으로 사용한 색',
+        more: '다른 색 선택',
+        background: '배경색',
+        foreground: '글자색',
+        transparent: '투명',
+        setTransparent: '투명으로 설정',
+        reset: '취소',
+        resetToDefault: '기본값으로 설정',
+        cpSelect: '선택'
+      },
+      shortcut: {
+        shortcuts: '키보드 단축키',
+        close: '닫기',
+        textFormatting: '글자 스타일 적용',
+        action: '기능',
+        paragraphFormatting: '문단 스타일 적용',
+        documentStyle: '문서 스타일 적용',
+        extraKeys: '추가 키'
+      },
+      help: {
+        'insertParagraph': '문단 삽입',
+        'undo': '마지막 명령 취소',
+        'redo': '마지막 명령 재실행',
+        'tab': '탭',
+        'untab': '탭 제거',
+        'bold': '굵은 글자로 설정',
+        'italic': '기울임꼴 글자로 설정',
+        'underline': '밑줄 글자로 설정',
+        'strikethrough': '취소선 글자로 설정',
+        'removeFormat': '서식 삭제',
+        'justifyLeft': '왼쪽 정렬하기',
+        'justifyCenter': '가운데 정렬하기',
+        'justifyRight': '오른쪽 정렬하기',
+        'justifyFull': '좌우채움 정렬하기',
+        'insertUnorderedList': '글머리 기호 켜고 끄기',
+        'insertOrderedList': '번호 매기기 켜고 끄기',
+        'outdent': '현재 문단 내어쓰기',
+        'indent': '현재 문단 들여쓰기',
+        'formatPara': '현재 블록의 포맷을 문단(P)으로 변경',
+        'formatH1': '현재 블록의 포맷을 제목1(H1)로 변경',
+        'formatH2': '현재 블록의 포맷을 제목2(H2)로 변경',
+        'formatH3': '현재 블록의 포맷을 제목3(H3)로 변경',
+        'formatH4': '현재 블록의 포맷을 제목4(H4)로 변경',
+        'formatH5': '현재 블록의 포맷을 제목5(H5)로 변경',
+        'formatH6': '현재 블록의 포맷을 제목6(H6)로 변경',
+        'insertHorizontalRule': '구분선 삽입',
+        'linkDialog.show': '링크 대화상자 열기'
+      },
+      history: {
+        undo: '실행 취소',
+        redo: '재실행'
+      },
+      specialChar: {
+        specialChar: '특수문자',
+        select: '특수문자를 선택하세요'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-ko-KR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js.map
new file mode 100644
index 0000000..5c548e2
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-ko-KR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-ko-KR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'ko-KR': {\n      font: {\n        bold: '굵게',\n        italic: '기울임꼴',\n        underline: '밑줄',\n        clear: '서식 지우기',\n        height: '줄 간격',\n        name: '글꼴',\n        superscript: '위 첨자',\n        subscript: '아래 첨자',\n        strikethrough: '취소선',\n        size: '글자 크기',\n      },\n      image: {\n        image: '그림',\n        insert: '그림 삽입',\n        resizeFull: '100% 크기로 변경',\n        resizeHalf: '50% 크기로 변경',\n        resizeQuarter: '25% 크기로 변경',\n        resizeNone: '원본 크기',\n        floatLeft: '왼쪽 정렬',\n        floatRight: '오른쪽 정렬',\n        floatNone: '정렬하지 않음',\n        shapeRounded: '스타일: 둥근 모서리',\n        shapeCircle: '스타일: 원형',\n        shapeThumbnail: '스타일: 액자',\n        shapeNone: '스타일: 없음',\n        dragImageHere: '텍스트 혹은 사진을 이곳으로 끌어오세요',\n        dropImage: '텍스트 혹은 사진을 내려놓으세요',\n        selectFromFiles: '파일 선택',\n        maximumFileSize: '최대 파일 크기',\n        maximumFileSizeError: '최대 파일 크기를 초과했습니다.',\n        url: '사진 URL',\n        remove: '사진 삭제',\n        original: '원본',\n      },\n      video: {\n        video: '동영상',\n        videoLink: '동영상 링크',\n        insert: '동영상 삽입',\n        url: '동영상 URL',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku 사용 가능)',\n      },\n      link: {\n        link: '링크',\n        insert: '링크 삽입',\n        unlink: '링크 삭제',\n        edit: '수정',\n        textToDisplay: '링크에 표시할 내용',\n        url: '이동할 URL',\n        openInNewWindow: '새창으로 열기',\n      },\n      table: {\n        table: '표',\n        addRowAbove: '위에 행 삽입',\n        addRowBelow: '아래에 행 삽입',\n        addColLeft: '왼쪽에 열 삽입',\n        addColRight: '오른쪽에 열 삽입',\n        delRow: '행 지우기',\n        delCol: '열 지우기',\n        delTable: '표 삭제',\n      },\n      hr: {\n        insert: '구분선 삽입',\n      },\n      style: {\n        style: '스타일',\n        p: '본문',\n        blockquote: '인용구',\n        pre: '코드',\n        h1: '제목 1',\n        h2: '제목 2',\n        h3: '제목 3',\n        h4: '제목 4',\n        h5: '제목 5',\n        h6: '제목 6',\n      },\n      lists: {\n        unordered: '글머리 기호',\n        ordered: '번호 매기기',\n      },\n      options: {\n        help: '도움말',\n        fullscreen: '전체 화면',\n        codeview: '코드 보기',\n      },\n      paragraph: {\n        paragraph: '문단 정렬',\n        outdent: '내어쓰기',\n        indent: '들여쓰기',\n        left: '왼쪽 정렬',\n        center: '가운데 정렬',\n        right: '오른쪽 정렬',\n        justify: '양쪽 정렬',\n      },\n      color: {\n        recent: '마지막으로 사용한 색',\n        more: '다른 색 선택',\n        background: '배경색',\n        foreground: '글자색',\n        transparent: '투명',\n        setTransparent: '투명으로 설정',\n        reset: '취소',\n        resetToDefault: '기본값으로 설정',\n        cpSelect: '선택',\n      },\n      shortcut: {\n        shortcuts: '키보드 단축키',\n        close: '닫기',\n        textFormatting: '글자 스타일 적용',\n        action: '기능',\n        paragraphFormatting: '문단 스타일 적용',\n        documentStyle: '문서 스타일 적용',\n        extraKeys: '추가 키',\n      },\n      help: {\n        'insertParagraph': '문단 삽입',\n        'undo': '마지막 명령 취소',\n        'redo': '마지막 명령 재실행',\n        'tab': '탭',\n        'untab': '탭 제거',\n        'bold': '굵은 글자로 설정',\n        'italic': '기울임꼴 글자로 설정',\n        'underline': '밑줄 글자로 설정',\n        'strikethrough': '취소선 글자로 설정',\n        'removeFormat': '서식 삭제',\n        'justifyLeft': '왼쪽 정렬하기',\n        'justifyCenter': '가운데 정렬하기',\n        'justifyRight': '오른쪽 정렬하기',\n        'justifyFull': '좌우채움 정렬하기',\n        'insertUnorderedList': '글머리 기호 켜고 끄기',\n        'insertOrderedList': '번호 매기기 켜고 끄기',\n        'outdent': '현재 문단 내어쓰기',\n        'indent': '현재 문단 들여쓰기',\n        'formatPara': '현재 블록의 포맷을 문단(P)으로 변경',\n        'formatH1': '현재 블록의 포맷을 제목1(H1)로 변경',\n        'formatH2': '현재 블록의 포맷을 제목2(H2)로 변경',\n        'formatH3': '현재 블록의 포맷을 제목3(H3)로 변경',\n        'formatH4': '현재 블록의 포맷을 제목4(H4)로 변경',\n        'formatH5': '현재 블록의 포맷을 제목5(H5)로 변경',\n        'formatH6': '현재 블록의 포맷을 제목6(H6)로 변경',\n        'insertHorizontalRule': '구분선 삽입',\n        'linkDialog.show': '링크 대화상자 열기',\n      },\n      history: {\n        undo: '실행 취소',\n        redo: '재실행',\n      },\n      specialChar: {\n        specialChar: '특수문자',\n        select: '특수문자를 선택하세요',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","superscript","subscript","strikethrough","size","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js
new file mode 100644
index 0000000..d8f3dd1
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"ko-KR":{font:{bold:"굵게",italic:"기울임꼴",underline:"밑줄",clear:"서식 지우기",height:"줄 간격",name:"글꼴",superscript:"위 첨자",subscript:"아래 첨자",strikethrough:"취소선",size:"글자 크기"},image:{image:"그림",insert:"그림 삽입",resizeFull:"100% 크기로 변경",resizeHalf:"50% 크기로 변경",resizeQuarter:"25% 크기로 변경",resizeNone:"원본 크기",floatLeft:"왼쪽 정렬",floatRight:"오른쪽 정렬",floatNone:"정렬하지 않음",shapeRounded:"스타일: 둥근 모서리",shapeCircle:"스타일: 원형",shapeThumbnail:"스타일: 액자",shapeNone:"스타일: 없음",dragImageHere:"텍스트 혹은 사진을 이곳으로 끌어오세요",dropImage:"텍스트 혹은 사진을 내려놓으세요",selectFromFiles:"파일 선택",maximumFileSize:"최대 파일 크기",maximumFileSizeError:"최대 파일 크기를 초과했습니다.",url:"사진 URL",remove:"사진 삭제",original:"원본"},video:{video:"동영상",videoLink:"동영상 링크",insert:"동영상 삽입",url:"동영상 URL",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku 사용 가능)"},link:{link:"링크",insert:"링크 삽입",unlink:"링크 삭제",edit:"수정",textToDisplay:"링크에 표시할 내용",url:"이동할 URL",openInNewWindow:"새창으로 열기"},table:{table:"표",addRowAbove:"위에 행 삽입",addRowBelow:"아래에 행 삽입",addColLeft:"왼쪽에 열 삽입",addColRight:"오른쪽에 열 삽입",delRow:"행 지우기",delCol:"열 지우기",delTable:"표 삭제"},hr:{insert:"구분선 삽입"},style:{style:"스타일",p:"본문",blockquote:"인용구",pre:"코드",h1:"제목 1",h2:"제목 2",h3:"제목 3",h4:"제목 4",h5:"제목 5",h6:"제목 6"},lists:{unordered:"글머리 기호",ordered:"번호 매기기"},options:{help:"도움말",fullscreen:"전체 화면",codeview:"코드 보기"},paragraph:{paragraph:"문단 정렬",outdent:"내어쓰기",indent:"들여쓰기",left:"왼쪽 정렬",center:"가운데 정렬",right:"오른쪽 정렬",justify:"양쪽 정렬"},color:{recent:"마지막으로 사용한 색",more:"다른 색 선택",background:"배경색",foreground:"글자색",transparent:"투명",setTransparent:"투명으로 설정",reset:"취소",resetToDefault:"기본값으로 설정",cpSelect:"선택"},shortcut:{shortcuts:"키보드 단축키",close:"닫기",textFormatting:"글자 스타일 적용",action:"기능",paragraphFormatting:"문단 스타일 적용",documentStyle:"문서 스타일 적용",extraKeys:"추가 키"},help:{insertParagraph:"문단 삽입",undo:"마지막 명령 취소",redo:"마지막 명령 재실행",tab:"탭",untab:"탭 제거",bold:"굵은 글자로 설정",italic:"기울임꼴 글자로 설정",underline:"밑줄 글자로 설정",strikethrough:"취소선 글자로 설정",removeFormat:"서식 삭제",justifyLeft:"왼쪽 정렬하기",justifyCenter:"가운데 정렬하기",justifyRight:"오른쪽 정렬하기",justifyFull:"좌우채움 정렬하기",insertUnorderedList:"글머리 기호 켜고 끄기",insertOrderedList:"번호 매기기 켜고 끄기",outdent:"현재 문단 내어쓰기",indent:"현재 문단 들여쓰기",formatPara:"현재 블록의 포맷을 문단(P)으로 변경",formatH1:"현재 블록의 포맷을 제목1(H1)로 변경",formatH2:"현재 블록의 포맷을 제목2(H2)로 변경",formatH3:"현재 블록의 포맷을 제목3(H3)로 변경",formatH4:"현재 블록의 포맷을 제목4(H4)로 변경",formatH5:"현재 블록의 포맷을 제목5(H5)로 변경",formatH6:"현재 블록의 포맷을 제목6(H6)로 변경",insertHorizontalRule:"구분선 삽입","linkDialog.show":"링크 대화상자 열기"},history:{undo:"실행 취소",redo:"재실행"},specialChar:{specialChar:"특수문자",select:"특수문자를 선택하세요"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ko-KR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js
new file mode 100644
index 0000000..21ffa0a
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'lt-LT': {
+      font: {
+        bold: 'Paryškintas',
+        italic: 'Kursyvas',
+        underline: 'Pabrėžtas',
+        clear: 'Be formatavimo',
+        height: 'Eilutės aukštis',
+        name: 'Šrifto pavadinimas',
+        strikethrough: 'Perbrauktas',
+        superscript: 'Viršutinis',
+        subscript: 'Indeksas',
+        size: 'Šrifto dydis'
+      },
+      image: {
+        image: 'Paveikslėlis',
+        insert: 'Įterpti paveikslėlį',
+        resizeFull: 'Pilnas dydis',
+        resizeHalf: 'Sumažinti dydį 50%',
+        resizeQuarter: 'Sumažinti dydį 25%',
+        floatLeft: 'Kairinis lygiavimas',
+        floatRight: 'Dešininis lygiavimas',
+        floatNone: 'Jokio lygiavimo',
+        shapeRounded: 'Forma: apvalūs kraštai',
+        shapeCircle: 'Forma: apskritimas',
+        shapeThumbnail: 'Forma: miniatiūra',
+        shapeNone: 'Forma: jokia',
+        dragImageHere: 'Vilkite paveikslėlį čia',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Pasirinkite failą',
+        maximumFileSize: 'Maskimalus failo dydis',
+        maximumFileSizeError: 'Maskimalus failo dydis viršytas!',
+        url: 'Paveikslėlio URL adresas',
+        remove: 'Ištrinti paveikslėlį',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Video Link',
+        insert: 'Insert Video',
+        url: 'Video URL?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'Nuoroda',
+        insert: 'Įterpti nuorodą',
+        unlink: 'Pašalinti nuorodą',
+        edit: 'Redaguoti',
+        textToDisplay: 'Rodomas tekstas',
+        url: 'Koks URL adresas yra susietas?',
+        openInNewWindow: 'Atidaryti naujame lange'
+      },
+      table: {
+        table: 'Lentelė',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Įterpti horizontalią liniją'
+      },
+      style: {
+        style: 'Stilius',
+        p: 'pus',
+        blockquote: 'Citata',
+        pre: 'Kodas',
+        h1: 'Antraštė 1',
+        h2: 'Antraštė 2',
+        h3: 'Antraštė 3',
+        h4: 'Antraštė 4',
+        h5: 'Antraštė 5',
+        h6: 'Antraštė 6'
+      },
+      lists: {
+        unordered: 'Suženklintasis sąrašas',
+        ordered: 'Sunumeruotas sąrašas'
+      },
+      options: {
+        help: 'Pagalba',
+        fullscreen: 'Viso ekrano režimas',
+        codeview: 'HTML kodo peržiūra'
+      },
+      paragraph: {
+        paragraph: 'Pastraipa',
+        outdent: 'Sumažinti įtrauką',
+        indent: 'Padidinti įtrauką',
+        left: 'Kairinė lygiuotė',
+        center: 'Centrinė lygiuotė',
+        right: 'Dešininė lygiuotė',
+        justify: 'Abipusis išlyginimas'
+      },
+      color: {
+        recent: 'Paskutinė naudota spalva',
+        more: 'Daugiau spalvų',
+        background: 'Fono spalva',
+        foreground: 'Šrifto spalva',
+        transparent: 'Permatoma',
+        setTransparent: 'Nustatyti skaidrumo intensyvumą',
+        reset: 'Atkurti',
+        resetToDefault: 'Atstatyti numatytąją spalvą'
+      },
+      shortcut: {
+        shortcuts: 'Spartieji klavišai',
+        close: 'Uždaryti',
+        textFormatting: 'Teksto formatavimas',
+        action: 'Veiksmas',
+        paragraphFormatting: 'Pastraipos formatavimas',
+        documentStyle: 'Dokumento stilius',
+        extraKeys: 'Papildomi klavišų deriniai'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Anuliuoti veiksmą',
+        redo: 'Perdaryti veiksmą'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-lt-LT.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js.map
new file mode 100644
index 0000000..f68f126
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-lt-LT.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-lt-LT.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'lt-LT': {\n      font: {\n        bold: 'Paryškintas',\n        italic: 'Kursyvas',\n        underline: 'Pabrėžtas',\n        clear: 'Be formatavimo',\n        height: 'Eilutės aukštis',\n        name: 'Šrifto pavadinimas',\n        strikethrough: 'Perbrauktas',\n        superscript: 'Viršutinis',\n        subscript: 'Indeksas',\n        size: 'Šrifto dydis',\n      },\n      image: {\n        image: 'Paveikslėlis',\n        insert: 'Įterpti paveikslėlį',\n        resizeFull: 'Pilnas dydis',\n        resizeHalf: 'Sumažinti dydį 50%',\n        resizeQuarter: 'Sumažinti dydį 25%',\n        floatLeft: 'Kairinis lygiavimas',\n        floatRight: 'Dešininis lygiavimas',\n        floatNone: 'Jokio lygiavimo',\n        shapeRounded: 'Forma: apvalūs kraštai',\n        shapeCircle: 'Forma: apskritimas',\n        shapeThumbnail: 'Forma: miniatiūra',\n        shapeNone: 'Forma: jokia',\n        dragImageHere: 'Vilkite paveikslėlį čia',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Pasirinkite failą',\n        maximumFileSize: 'Maskimalus failo dydis',\n        maximumFileSizeError: 'Maskimalus failo dydis viršytas!',\n        url: 'Paveikslėlio URL adresas',\n        remove: 'Ištrinti paveikslėlį',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Video Link',\n        insert: 'Insert Video',\n        url: 'Video URL?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'Nuoroda',\n        insert: 'Įterpti nuorodą',\n        unlink: 'Pašalinti nuorodą',\n        edit: 'Redaguoti',\n        textToDisplay: 'Rodomas tekstas',\n        url: 'Koks URL adresas yra susietas?',\n        openInNewWindow: 'Atidaryti naujame lange',\n      },\n      table: {\n        table: 'Lentelė',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Įterpti horizontalią liniją',\n      },\n      style: {\n        style: 'Stilius',\n        p: 'pus',\n        blockquote: 'Citata',\n        pre: 'Kodas',\n        h1: 'Antraštė 1',\n        h2: 'Antraštė 2',\n        h3: 'Antraštė 3',\n        h4: 'Antraštė 4',\n        h5: 'Antraštė 5',\n        h6: 'Antraštė 6',\n      },\n      lists: {\n        unordered: 'Suženklintasis sąrašas',\n        ordered: 'Sunumeruotas sąrašas',\n      },\n      options: {\n        help: 'Pagalba',\n        fullscreen: 'Viso ekrano režimas',\n        codeview: 'HTML kodo peržiūra',\n      },\n      paragraph: {\n        paragraph: 'Pastraipa',\n        outdent: 'Sumažinti įtrauką',\n        indent: 'Padidinti įtrauką',\n        left: 'Kairinė lygiuotė',\n        center: 'Centrinė lygiuotė',\n        right: 'Dešininė lygiuotė',\n        justify: 'Abipusis išlyginimas',\n      },\n      color: {\n        recent: 'Paskutinė naudota spalva',\n        more: 'Daugiau spalvų',\n        background: 'Fono spalva',\n        foreground: 'Šrifto spalva',\n        transparent: 'Permatoma',\n        setTransparent: 'Nustatyti skaidrumo intensyvumą',\n        reset: 'Atkurti',\n        resetToDefault: 'Atstatyti numatytąją spalvą',\n      },\n      shortcut: {\n        shortcuts: 'Spartieji klavišai',\n        close: 'Uždaryti',\n        textFormatting: 'Teksto formatavimas',\n        action: 'Veiksmas',\n        paragraphFormatting: 'Pastraipos formatavimas',\n        documentStyle: 'Dokumento stilius',\n        extraKeys: 'Papildomi klavišų deriniai',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Anuliuoti veiksmą',\n        redo: 'Perdaryti veiksmą',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","superscript","subscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js
new file mode 100644
index 0000000..344c675
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(a,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t=e();for(var i in t)("object"==typeof exports?exports:a)[i]=t[i]}}(self,(function(){return(a=jQuery).extend(a.summernote.lang,{"lt-LT":{font:{bold:"Paryškintas",italic:"Kursyvas",underline:"Pabrėžtas",clear:"Be formatavimo",height:"Eilutės aukštis",name:"Šrifto pavadinimas",strikethrough:"Perbrauktas",superscript:"Viršutinis",subscript:"Indeksas",size:"Šrifto dydis"},image:{image:"Paveikslėlis",insert:"Įterpti paveikslėlį",resizeFull:"Pilnas dydis",resizeHalf:"Sumažinti dydį 50%",resizeQuarter:"Sumažinti dydį 25%",floatLeft:"Kairinis lygiavimas",floatRight:"Dešininis lygiavimas",floatNone:"Jokio lygiavimo",shapeRounded:"Forma: apvalūs kraštai",shapeCircle:"Forma: apskritimas",shapeThumbnail:"Forma: miniatiūra",shapeNone:"Forma: jokia",dragImageHere:"Vilkite paveikslėlį čia",dropImage:"Drop image or Text",selectFromFiles:"Pasirinkite failą",maximumFileSize:"Maskimalus failo dydis",maximumFileSizeError:"Maskimalus failo dydis viršytas!",url:"Paveikslėlio URL adresas",remove:"Ištrinti paveikslėlį",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Insert Video",url:"Video URL?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"Nuoroda",insert:"Įterpti nuorodą",unlink:"Pašalinti nuorodą",edit:"Redaguoti",textToDisplay:"Rodomas tekstas",url:"Koks URL adresas yra susietas?",openInNewWindow:"Atidaryti naujame lange"},table:{table:"Lentelė",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Įterpti horizontalią liniją"},style:{style:"Stilius",p:"pus",blockquote:"Citata",pre:"Kodas",h1:"Antraštė 1",h2:"Antraštė 2",h3:"Antraštė 3",h4:"Antraštė 4",h5:"Antraštė 5",h6:"Antraštė 6"},lists:{unordered:"Suženklintasis sąrašas",ordered:"Sunumeruotas sąrašas"},options:{help:"Pagalba",fullscreen:"Viso ekrano režimas",codeview:"HTML kodo peržiūra"},paragraph:{paragraph:"Pastraipa",outdent:"Sumažinti įtrauką",indent:"Padidinti įtrauką",left:"Kairinė lygiuotė",center:"Centrinė lygiuotė",right:"Dešininė lygiuotė",justify:"Abipusis išlyginimas"},color:{recent:"Paskutinė naudota spalva",more:"Daugiau spalvų",background:"Fono spalva",foreground:"Šrifto spalva",transparent:"Permatoma",setTransparent:"Nustatyti skaidrumo intensyvumą",reset:"Atkurti",resetToDefault:"Atstatyti numatytąją spalvą"},shortcut:{shortcuts:"Spartieji klavišai",close:"Uždaryti",textFormatting:"Teksto formatavimas",action:"Veiksmas",paragraphFormatting:"Pastraipos formatavimas",documentStyle:"Dokumento stilius",extraKeys:"Papildomi klavišų deriniai"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Anuliuoti veiksmą",redo:"Perdaryti veiksmą"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var a}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LT.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js
new file mode 100644
index 0000000..50eafa3
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'lv-LV': {
+      font: {
+        bold: 'Treknraksts',
+        italic: 'Kursīvs',
+        underline: 'Pasvītrots',
+        clear: 'Noņemt formatējumu',
+        height: 'Līnijas augstums',
+        name: 'Fonts',
+        strikethrough: 'Nosvītrots',
+        superscript: 'Augšraksts',
+        subscript: 'Apakšraksts',
+        size: 'Fonta lielums'
+      },
+      image: {
+        image: 'Attēls',
+        insert: 'Ievietot attēlu',
+        resizeFull: 'Pilns izmērts',
+        resizeHalf: 'Samazināt 50%',
+        resizeQuarter: 'Samazināt 25%',
+        floatLeft: 'Līdzināt pa kreisi',
+        floatRight: 'Līdzināt pa labi',
+        floatNone: 'Nelīdzināt',
+        shapeRounded: 'Forma: apaļām malām',
+        shapeCircle: 'Forma: aplis',
+        shapeThumbnail: 'Forma: rāmītis',
+        shapeNone: 'Forma: orģināla',
+        dragImageHere: 'Ievēlciet attēlu šeit',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Izvēlēties failu',
+        maximumFileSize: 'Maksimālais faila izmērs',
+        maximumFileSizeError: 'Faila izmērs pārāk liels!',
+        url: 'Attēla URL',
+        remove: 'Dzēst attēlu',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Video Link',
+        insert: 'Insert Video',
+        url: 'Video URL?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'Saite',
+        insert: 'Ievietot saiti',
+        unlink: 'Noņemt saiti',
+        edit: 'Rediģēt',
+        textToDisplay: 'Saites saturs',
+        url: 'Koks URL adresas yra susietas?',
+        openInNewWindow: 'Atvērt jaunā logā'
+      },
+      table: {
+        table: 'Tabula',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Ievietot līniju'
+      },
+      style: {
+        style: 'Stils',
+        p: 'Parasts',
+        blockquote: 'Citāts',
+        pre: 'Kods',
+        h1: 'Virsraksts h1',
+        h2: 'Virsraksts h2',
+        h3: 'Virsraksts h3',
+        h4: 'Virsraksts h4',
+        h5: 'Virsraksts h5',
+        h6: 'Virsraksts h6'
+      },
+      lists: {
+        unordered: 'Nenumurēts saraksts',
+        ordered: 'Numurēts saraksts'
+      },
+      options: {
+        help: 'Palīdzība',
+        fullscreen: 'Pa visu ekrānu',
+        codeview: 'HTML kods'
+      },
+      paragraph: {
+        paragraph: 'Paragrāfs',
+        outdent: 'Samazināt atkāpi',
+        indent: 'Palielināt atkāpi',
+        left: 'Līdzināt pa kreisi',
+        center: 'Centrēt',
+        right: 'Līdzināt pa labi',
+        justify: 'Līdzināt gar abām malām'
+      },
+      color: {
+        recent: 'Nesen izmantotās',
+        more: 'Citas krāsas',
+        background: 'Fona krāsa',
+        foreground: 'Fonta krāsa',
+        transparent: 'Caurspīdīgs',
+        setTransparent: 'Iestatīt caurspīdīgumu',
+        reset: 'Atjaunot',
+        resetToDefault: 'Atjaunot noklusējumu'
+      },
+      shortcut: {
+        shortcuts: 'Saīsnes',
+        close: 'Aizvērt',
+        textFormatting: 'Teksta formatēšana',
+        action: 'Darbība',
+        paragraphFormatting: 'Paragrāfa formatēšana',
+        documentStyle: 'Dokumenta stils',
+        extraKeys: 'Citas taustiņu kombinācijas'
+      },
+      help: {
+        insertParagraph: 'Ievietot Paragrāfu',
+        undo: 'Atcelt iepriekšējo darbību',
+        redo: 'Atkārtot atcelto darbību',
+        tab: 'Atkāpe',
+        untab: 'Samazināt atkāpi',
+        bold: 'Pārvērst tekstu treknrakstā',
+        italic: 'Pārvērst tekstu slīprakstā (kursīvā)',
+        underline: 'Pasvītrot tekstu',
+        strikethrough: 'Nosvītrot tekstu',
+        removeFormat: 'Notīrīt stilu no teksta',
+        justifyLeft: 'Līdzīnāt saturu pa kreisi',
+        justifyCenter: 'Centrēt saturu',
+        justifyRight: 'Līdzīnāt saturu pa labi',
+        justifyFull: 'Izlīdzināt saturu gar abām malām',
+        insertUnorderedList: 'Ievietot nenumurētu sarakstu',
+        insertOrderedList: 'Ievietot numurētu sarakstu',
+        outdent: 'Samazināt/noņemt atkāpi paragrāfam',
+        indent: 'Uzlikt atkāpi paragrāfam',
+        formatPara: 'Mainīt bloka tipu uz (p) Paragrāfu',
+        formatH1: 'Mainīt bloka tipu uz virsrakstu H1',
+        formatH2: 'Mainīt bloka tipu uz virsrakstu H2',
+        formatH3: 'Mainīt bloka tipu uz virsrakstu H3',
+        formatH4: 'Mainīt bloka tipu uz virsrakstu H4',
+        formatH5: 'Mainīt bloka tipu uz virsrakstu H5',
+        formatH6: 'Mainīt bloka tipu uz virsrakstu H6',
+        insertHorizontalRule: 'Ievietot horizontālu līniju',
+        'linkDialog.show': 'Parādīt saites logu'
+      },
+      history: {
+        undo: 'Atsauks (undo)',
+        redo: 'Atkārtot (redo)'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-lt-LV.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js.map
new file mode 100644
index 0000000..a39d04d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-lt-LV.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-lt-LV.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'lv-LV': {\n      font: {\n        bold: 'Treknraksts',\n        italic: 'Kursīvs',\n        underline: 'Pasvītrots',\n        clear: 'Noņemt formatējumu',\n        height: 'Līnijas augstums',\n        name: 'Fonts',\n        strikethrough: 'Nosvītrots',\n        superscript: 'Augšraksts',\n        subscript: 'Apakšraksts',\n        size: 'Fonta lielums',\n      },\n      image: {\n        image: 'Attēls',\n        insert: 'Ievietot attēlu',\n        resizeFull: 'Pilns izmērts',\n        resizeHalf: 'Samazināt 50%',\n        resizeQuarter: 'Samazināt 25%',\n        floatLeft: 'Līdzināt pa kreisi',\n        floatRight: 'Līdzināt pa labi',\n        floatNone: 'Nelīdzināt',\n        shapeRounded: 'Forma: apaļām malām',\n        shapeCircle: 'Forma: aplis',\n        shapeThumbnail: 'Forma: rāmītis',\n        shapeNone: 'Forma: orģināla',\n        dragImageHere: 'Ievēlciet attēlu šeit',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Izvēlēties failu',\n        maximumFileSize: 'Maksimālais faila izmērs',\n        maximumFileSizeError: 'Faila izmērs pārāk liels!',\n        url: 'Attēla URL',\n        remove: 'Dzēst attēlu',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Video Link',\n        insert: 'Insert Video',\n        url: 'Video URL?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'Saite',\n        insert: 'Ievietot saiti',\n        unlink: 'Noņemt saiti',\n        edit: 'Rediģēt',\n        textToDisplay: 'Saites saturs',\n        url: 'Koks URL adresas yra susietas?',\n        openInNewWindow: 'Atvērt jaunā logā',\n      },\n      table: {\n        table: 'Tabula',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Ievietot līniju',\n      },\n      style: {\n        style: 'Stils',\n        p: 'Parasts',\n        blockquote: 'Citāts',\n        pre: 'Kods',\n        h1: 'Virsraksts h1',\n        h2: 'Virsraksts h2',\n        h3: 'Virsraksts h3',\n        h4: 'Virsraksts h4',\n        h5: 'Virsraksts h5',\n        h6: 'Virsraksts h6',\n      },\n      lists: {\n        unordered: 'Nenumurēts saraksts',\n        ordered: 'Numurēts saraksts',\n      },\n      options: {\n        help: 'Palīdzība',\n        fullscreen: 'Pa visu ekrānu',\n        codeview: 'HTML kods',\n      },\n      paragraph: {\n        paragraph: 'Paragrāfs',\n        outdent: 'Samazināt atkāpi',\n        indent: 'Palielināt atkāpi',\n        left: 'Līdzināt pa kreisi',\n        center: 'Centrēt',\n        right: 'Līdzināt pa labi',\n        justify: 'Līdzināt gar abām malām',\n      },\n      color: {\n        recent: 'Nesen izmantotās',\n        more: 'Citas krāsas',\n        background: 'Fona krāsa',\n        foreground: 'Fonta krāsa',\n        transparent: 'Caurspīdīgs',\n        setTransparent: 'Iestatīt caurspīdīgumu',\n        reset: 'Atjaunot',\n        resetToDefault: 'Atjaunot noklusējumu',\n      },\n      shortcut: {\n        shortcuts: 'Saīsnes',\n        close: 'Aizvērt',\n        textFormatting: 'Teksta formatēšana',\n        action: 'Darbība',\n        paragraphFormatting: 'Paragrāfa formatēšana',\n        documentStyle: 'Dokumenta stils',\n        extraKeys: 'Citas taustiņu kombinācijas',\n      },\n      help: {\n        insertParagraph: 'Ievietot Paragrāfu',\n        undo: 'Atcelt iepriekšējo darbību',\n        redo: 'Atkārtot atcelto darbību',\n        tab: 'Atkāpe',\n        untab: 'Samazināt atkāpi',\n        bold: 'Pārvērst tekstu treknrakstā',\n        italic: 'Pārvērst tekstu slīprakstā (kursīvā)',\n        underline: 'Pasvītrot tekstu',\n        strikethrough: 'Nosvītrot tekstu',\n        removeFormat: 'Notīrīt stilu no teksta',\n        justifyLeft: 'Līdzīnāt saturu pa kreisi',\n        justifyCenter: 'Centrēt saturu',\n        justifyRight: 'Līdzīnāt saturu pa labi',\n        justifyFull: 'Izlīdzināt saturu gar abām malām',\n        insertUnorderedList: 'Ievietot nenumurētu sarakstu',\n        insertOrderedList: 'Ievietot numurētu sarakstu',\n        outdent: 'Samazināt/noņemt atkāpi paragrāfam',\n        indent: 'Uzlikt atkāpi paragrāfam',\n        formatPara: 'Mainīt bloka tipu uz (p) Paragrāfu',\n        formatH1: 'Mainīt bloka tipu uz virsrakstu H1',\n        formatH2: 'Mainīt bloka tipu uz virsrakstu H2',\n        formatH3: 'Mainīt bloka tipu uz virsrakstu H3',\n        formatH4: 'Mainīt bloka tipu uz virsrakstu H4',\n        formatH5: 'Mainīt bloka tipu uz virsrakstu H5',\n        formatH6: 'Mainīt bloka tipu uz virsrakstu H6',\n        insertHorizontalRule: 'Ievietot horizontālu līniju',\n        'linkDialog.show': 'Parādīt saites logu',\n      },\n      history: {\n        undo: 'Atsauks (undo)',\n        redo: 'Atkārtot (redo)',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","superscript","subscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","insertParagraph","undo","redo","tab","untab","removeFormat","justifyLeft","justifyCenter","justifyRight","justifyFull","insertUnorderedList","insertOrderedList","formatPara","formatH1","formatH2","formatH3","formatH4","formatH5","formatH6","insertHorizontalRule","history","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js
new file mode 100644
index 0000000..018367f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(t,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var e=a();for(var r in e)("object"==typeof exports?exports:t)[r]=e[r]}}(self,(function(){return(t=jQuery).extend(t.summernote.lang,{"lv-LV":{font:{bold:"Treknraksts",italic:"Kursīvs",underline:"Pasvītrots",clear:"Noņemt formatējumu",height:"Līnijas augstums",name:"Fonts",strikethrough:"Nosvītrots",superscript:"Augšraksts",subscript:"Apakšraksts",size:"Fonta lielums"},image:{image:"Attēls",insert:"Ievietot attēlu",resizeFull:"Pilns izmērts",resizeHalf:"Samazināt 50%",resizeQuarter:"Samazināt 25%",floatLeft:"Līdzināt pa kreisi",floatRight:"Līdzināt pa labi",floatNone:"Nelīdzināt",shapeRounded:"Forma: apaļām malām",shapeCircle:"Forma: aplis",shapeThumbnail:"Forma: rāmītis",shapeNone:"Forma: orģināla",dragImageHere:"Ievēlciet attēlu šeit",dropImage:"Drop image or Text",selectFromFiles:"Izvēlēties failu",maximumFileSize:"Maksimālais faila izmērs",maximumFileSizeError:"Faila izmērs pārāk liels!",url:"Attēla URL",remove:"Dzēst attēlu",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Insert Video",url:"Video URL?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"Saite",insert:"Ievietot saiti",unlink:"Noņemt saiti",edit:"Rediģēt",textToDisplay:"Saites saturs",url:"Koks URL adresas yra susietas?",openInNewWindow:"Atvērt jaunā logā"},table:{table:"Tabula",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Ievietot līniju"},style:{style:"Stils",p:"Parasts",blockquote:"Citāts",pre:"Kods",h1:"Virsraksts h1",h2:"Virsraksts h2",h3:"Virsraksts h3",h4:"Virsraksts h4",h5:"Virsraksts h5",h6:"Virsraksts h6"},lists:{unordered:"Nenumurēts saraksts",ordered:"Numurēts saraksts"},options:{help:"Palīdzība",fullscreen:"Pa visu ekrānu",codeview:"HTML kods"},paragraph:{paragraph:"Paragrāfs",outdent:"Samazināt atkāpi",indent:"Palielināt atkāpi",left:"Līdzināt pa kreisi",center:"Centrēt",right:"Līdzināt pa labi",justify:"Līdzināt gar abām malām"},color:{recent:"Nesen izmantotās",more:"Citas krāsas",background:"Fona krāsa",foreground:"Fonta krāsa",transparent:"Caurspīdīgs",setTransparent:"Iestatīt caurspīdīgumu",reset:"Atjaunot",resetToDefault:"Atjaunot noklusējumu"},shortcut:{shortcuts:"Saīsnes",close:"Aizvērt",textFormatting:"Teksta formatēšana",action:"Darbība",paragraphFormatting:"Paragrāfa formatēšana",documentStyle:"Dokumenta stils",extraKeys:"Citas taustiņu kombinācijas"},help:{insertParagraph:"Ievietot Paragrāfu",undo:"Atcelt iepriekšējo darbību",redo:"Atkārtot atcelto darbību",tab:"Atkāpe",untab:"Samazināt atkāpi",bold:"Pārvērst tekstu treknrakstā",italic:"Pārvērst tekstu slīprakstā (kursīvā)",underline:"Pasvītrot tekstu",strikethrough:"Nosvītrot tekstu",removeFormat:"Notīrīt stilu no teksta",justifyLeft:"Līdzīnāt saturu pa kreisi",justifyCenter:"Centrēt saturu",justifyRight:"Līdzīnāt saturu pa labi",justifyFull:"Izlīdzināt saturu gar abām malām",insertUnorderedList:"Ievietot nenumurētu sarakstu",insertOrderedList:"Ievietot numurētu sarakstu",outdent:"Samazināt/noņemt atkāpi paragrāfam",indent:"Uzlikt atkāpi paragrāfam",formatPara:"Mainīt bloka tipu uz (p) Paragrāfu",formatH1:"Mainīt bloka tipu uz virsrakstu H1",formatH2:"Mainīt bloka tipu uz virsrakstu H2",formatH3:"Mainīt bloka tipu uz virsrakstu H3",formatH4:"Mainīt bloka tipu uz virsrakstu H4",formatH5:"Mainīt bloka tipu uz virsrakstu H5",formatH6:"Mainīt bloka tipu uz virsrakstu H6",insertHorizontalRule:"Ievietot horizontālu līniju","linkDialog.show":"Parādīt saites logu"},history:{undo:"Atsauks (undo)",redo:"Atkārtot (redo)"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var t}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-lt-LV.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js
new file mode 100644
index 0000000..80e5ccd
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+// Starsoft Mongolia LLC Temuujin Ariunbold
+(function ($) {
+  $.extend($.summernote.lang, {
+    'mn-MN': {
+      font: {
+        bold: 'Тод',
+        italic: 'Налуу',
+        underline: 'Доогуур зураас',
+        clear: 'Цэвэрлэх',
+        height: 'Өндөр',
+        name: 'Фонт',
+        superscript: 'Дээд илтгэгч',
+        subscript: 'Доод илтгэгч',
+        strikethrough: 'Дарах',
+        size: 'Хэмжээ'
+      },
+      image: {
+        image: 'Зураг',
+        insert: 'Оруулах',
+        resizeFull: 'Хэмжээ бүтэн',
+        resizeHalf: 'Хэмжээ 1/2',
+        resizeQuarter: 'Хэмжээ 1/4',
+        floatLeft: 'Зүүн талд байрлуулах',
+        floatRight: 'Баруун талд байрлуулах',
+        floatNone: 'Анхдагч байрлалд аваачих',
+        shapeRounded: 'Хүрээ: Дугуй',
+        shapeCircle: 'Хүрээ: Тойрог',
+        shapeThumbnail: 'Хүрээ: Хураангуй',
+        shapeNone: 'Хүрээгүй',
+        dragImageHere: 'Зургийг энд чирч авчирна уу',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Файлуудаас сонгоно уу',
+        maximumFileSize: 'Файлын дээд хэмжээ',
+        maximumFileSizeError: 'Файлын дээд хэмжээ хэтэрсэн',
+        url: 'Зургийн URL',
+        remove: 'Зургийг устгах',
+        original: 'Original'
+      },
+      video: {
+        video: 'Видео',
+        videoLink: 'Видео холбоос',
+        insert: 'Видео оруулах',
+        url: 'Видео URL?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion болон Youku)'
+      },
+      link: {
+        link: 'Холбоос',
+        insert: 'Холбоос оруулах',
+        unlink: 'Холбоос арилгах',
+        edit: 'Засварлах',
+        textToDisplay: 'Харуулах бичвэр',
+        url: 'Энэ холбоос хаашаа очих вэ?',
+        openInNewWindow: 'Шинэ цонхонд нээх'
+      },
+      table: {
+        table: 'Хүснэгт',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Хэвтээ шугам оруулах'
+      },
+      style: {
+        style: 'Хэв маяг',
+        p: 'p',
+        blockquote: 'Иш татах',
+        pre: 'Эх сурвалж',
+        h1: 'Гарчиг 1',
+        h2: 'Гарчиг 2',
+        h3: 'Гарчиг 3',
+        h4: 'Гарчиг 4',
+        h5: 'Гарчиг 5',
+        h6: 'Гарчиг 6'
+      },
+      lists: {
+        unordered: 'Эрэмбэлэгдээгүй',
+        ordered: 'Эрэмбэлэгдсэн'
+      },
+      options: {
+        help: 'Тусламж',
+        fullscreen: 'Дэлгэцийг дүүргэх',
+        codeview: 'HTML-Code харуулах'
+      },
+      paragraph: {
+        paragraph: 'Хэсэг',
+        outdent: 'Догол мөр хасах',
+        indent: 'Догол мөр нэмэх',
+        left: 'Зүүн тийш эгнүүлэх',
+        center: 'Төвд эгнүүлэх',
+        right: 'Баруун тийш эгнүүлэх',
+        justify: 'Мөрийг тэгшлэх'
+      },
+      color: {
+        recent: 'Сүүлд хэрэглэсэн өнгө',
+        more: 'Өөр өнгөнүүд',
+        background: 'Дэвсгэр өнгө',
+        foreground: 'Үсгийн өнгө',
+        transparent: 'Тунгалаг',
+        setTransparent: 'Тунгалаг болгох',
+        reset: 'Анхдагч өнгөөр тохируулах',
+        resetToDefault: 'Хэвд нь оруулах'
+      },
+      shortcut: {
+        shortcuts: 'Богино холбоос',
+        close: 'Хаалт',
+        textFormatting: 'Бичвэрийг хэлбэржүүлэх',
+        action: 'Үйлдэл',
+        paragraphFormatting: 'Догол мөрийг хэлбэржүүлэх',
+        documentStyle: 'Бичиг баримтын хэв загвар',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Буцаах',
+        redo: 'Дахин хийх'
+      },
+      specialChar: {
+        specialChar: 'Тусгай тэмдэгт',
+        select: 'Тусгай тэмдэгт сонгох'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-mn-MN.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js.map
new file mode 100644
index 0000000..9ab13a6
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-mn-MN.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-mn-MN.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","// Starsoft Mongolia LLC Temuujin Ariunbold\n\n(function($) {\n  $.extend($.summernote.lang, {\n    'mn-MN': {\n      font: {\n        bold: 'Тод',\n        italic: 'Налуу',\n        underline: 'Доогуур зураас',\n        clear: 'Цэвэрлэх',\n        height: 'Өндөр',\n        name: 'Фонт',\n        superscript: 'Дээд илтгэгч',\n        subscript: 'Доод илтгэгч',\n        strikethrough: 'Дарах',\n        size: 'Хэмжээ',\n      },\n      image: {\n        image: 'Зураг',\n        insert: 'Оруулах',\n        resizeFull: 'Хэмжээ бүтэн',\n        resizeHalf: 'Хэмжээ 1/2',\n        resizeQuarter: 'Хэмжээ 1/4',\n        floatLeft: 'Зүүн талд байрлуулах',\n        floatRight: 'Баруун талд байрлуулах',\n        floatNone: 'Анхдагч байрлалд аваачих',\n        shapeRounded: 'Хүрээ: Дугуй',\n        shapeCircle: 'Хүрээ: Тойрог',\n        shapeThumbnail: 'Хүрээ: Хураангуй',\n        shapeNone: 'Хүрээгүй',\n        dragImageHere: 'Зургийг энд чирч авчирна уу',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Файлуудаас сонгоно уу',\n        maximumFileSize: 'Файлын дээд хэмжээ',\n        maximumFileSizeError: 'Файлын дээд хэмжээ хэтэрсэн',\n        url: 'Зургийн URL',\n        remove: 'Зургийг устгах',\n        original: 'Original',\n      },\n      video: {\n        video: 'Видео',\n        videoLink: 'Видео холбоос',\n        insert: 'Видео оруулах',\n        url: 'Видео URL?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion болон Youku)',\n      },\n      link: {\n        link: 'Холбоос',\n        insert: 'Холбоос оруулах',\n        unlink: 'Холбоос арилгах',\n        edit: 'Засварлах',\n        textToDisplay: 'Харуулах бичвэр',\n        url: 'Энэ холбоос хаашаа очих вэ?',\n        openInNewWindow: 'Шинэ цонхонд нээх',\n      },\n      table: {\n        table: 'Хүснэгт',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Хэвтээ шугам оруулах',\n      },\n      style: {\n        style: 'Хэв маяг',\n        p: 'p',\n        blockquote: 'Иш татах',\n        pre: 'Эх сурвалж',\n        h1: 'Гарчиг 1',\n        h2: 'Гарчиг 2',\n        h3: 'Гарчиг 3',\n        h4: 'Гарчиг 4',\n        h5: 'Гарчиг 5',\n        h6: 'Гарчиг 6',\n      },\n      lists: {\n        unordered: 'Эрэмбэлэгдээгүй',\n        ordered: 'Эрэмбэлэгдсэн',\n      },\n      options: {\n        help: 'Тусламж',\n        fullscreen: 'Дэлгэцийг дүүргэх',\n        codeview: 'HTML-Code харуулах',\n      },\n      paragraph: {\n        paragraph: 'Хэсэг',\n        outdent: 'Догол мөр хасах',\n        indent: 'Догол мөр нэмэх',\n        left: 'Зүүн тийш эгнүүлэх',\n        center: 'Төвд эгнүүлэх',\n        right: 'Баруун тийш эгнүүлэх',\n        justify: 'Мөрийг тэгшлэх',\n      },\n      color: {\n        recent: 'Сүүлд хэрэглэсэн өнгө',\n        more: 'Өөр өнгөнүүд',\n        background: 'Дэвсгэр өнгө',\n        foreground: 'Үсгийн өнгө',\n        transparent: 'Тунгалаг',\n        setTransparent: 'Тунгалаг болгох',\n        reset: 'Анхдагч өнгөөр тохируулах',\n        resetToDefault: 'Хэвд нь оруулах',\n      },\n      shortcut: {\n        shortcuts: 'Богино холбоос',\n        close: 'Хаалт',\n        textFormatting: 'Бичвэрийг хэлбэржүүлэх',\n        action: 'Үйлдэл',\n        paragraphFormatting: 'Догол мөрийг хэлбэржүүлэх',\n        documentStyle: 'Бичиг баримтын хэв загвар',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Буцаах',\n        redo: 'Дахин хийх',\n      },\n      specialChar: {\n        specialChar: 'Тусгай тэмдэгт',\n        select: 'Тусгай тэмдэгт сонгох',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","superscript","subscript","strikethrough","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js
new file mode 100644
index 0000000..96362db
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"mn-MN":{font:{bold:"Тод",italic:"Налуу",underline:"Доогуур зураас",clear:"Цэвэрлэх",height:"Өндөр",name:"Фонт",superscript:"Дээд илтгэгч",subscript:"Доод илтгэгч",strikethrough:"Дарах",size:"Хэмжээ"},image:{image:"Зураг",insert:"Оруулах",resizeFull:"Хэмжээ бүтэн",resizeHalf:"Хэмжээ 1/2",resizeQuarter:"Хэмжээ 1/4",floatLeft:"Зүүн талд байрлуулах",floatRight:"Баруун талд байрлуулах",floatNone:"Анхдагч байрлалд аваачих",shapeRounded:"Хүрээ: Дугуй",shapeCircle:"Хүрээ: Тойрог",shapeThumbnail:"Хүрээ: Хураангуй",shapeNone:"Хүрээгүй",dragImageHere:"Зургийг энд чирч авчирна уу",dropImage:"Drop image or Text",selectFromFiles:"Файлуудаас сонгоно уу",maximumFileSize:"Файлын дээд хэмжээ",maximumFileSizeError:"Файлын дээд хэмжээ хэтэрсэн",url:"Зургийн URL",remove:"Зургийг устгах",original:"Original"},video:{video:"Видео",videoLink:"Видео холбоос",insert:"Видео оруулах",url:"Видео URL?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion болон Youku)"},link:{link:"Холбоос",insert:"Холбоос оруулах",unlink:"Холбоос арилгах",edit:"Засварлах",textToDisplay:"Харуулах бичвэр",url:"Энэ холбоос хаашаа очих вэ?",openInNewWindow:"Шинэ цонхонд нээх"},table:{table:"Хүснэгт",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Хэвтээ шугам оруулах"},style:{style:"Хэв маяг",p:"p",blockquote:"Иш татах",pre:"Эх сурвалж",h1:"Гарчиг 1",h2:"Гарчиг 2",h3:"Гарчиг 3",h4:"Гарчиг 4",h5:"Гарчиг 5",h6:"Гарчиг 6"},lists:{unordered:"Эрэмбэлэгдээгүй",ordered:"Эрэмбэлэгдсэн"},options:{help:"Тусламж",fullscreen:"Дэлгэцийг дүүргэх",codeview:"HTML-Code харуулах"},paragraph:{paragraph:"Хэсэг",outdent:"Догол мөр хасах",indent:"Догол мөр нэмэх",left:"Зүүн тийш эгнүүлэх",center:"Төвд эгнүүлэх",right:"Баруун тийш эгнүүлэх",justify:"Мөрийг тэгшлэх"},color:{recent:"Сүүлд хэрэглэсэн өнгө",more:"Өөр өнгөнүүд",background:"Дэвсгэр өнгө",foreground:"Үсгийн өнгө",transparent:"Тунгалаг",setTransparent:"Тунгалаг болгох",reset:"Анхдагч өнгөөр тохируулах",resetToDefault:"Хэвд нь оруулах"},shortcut:{shortcuts:"Богино холбоос",close:"Хаалт",textFormatting:"Бичвэрийг хэлбэржүүлэх",action:"Үйлдэл",paragraphFormatting:"Догол мөрийг хэлбэржүүлэх",documentStyle:"Бичиг баримтын хэв загвар",extraKeys:"Extra keys"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Буцаах",redo:"Дахин хийх"},specialChar:{specialChar:"Тусгай тэмдэгт",select:"Тусгай тэмдэгт сонгох"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-mn-MN.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js
new file mode 100644
index 0000000..e98fb76
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js
@@ -0,0 +1,183 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'nb-NO': {
+      font: {
+        bold: 'Fet',
+        italic: 'Kursiv',
+        underline: 'Understrek',
+        clear: 'Fjern formatering',
+        height: 'Linjehøyde',
+        name: 'Skrifttype',
+        strikethrough: 'Gjennomstrek',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Skriftstørrelse'
+      },
+      image: {
+        image: 'Bilde',
+        insert: 'Sett inn bilde',
+        resizeFull: 'Sett full størrelse',
+        resizeHalf: 'Sett halv størrelse',
+        resizeQuarter: 'Sett kvart størrelse',
+        floatLeft: 'Flyt til venstre',
+        floatRight: 'Flyt til høyre',
+        floatNone: 'Fjern flyt',
+        shapeRounded: 'Form: Rundet',
+        shapeCircle: 'Form: Sirkel',
+        shapeThumbnail: 'Form: Miniatyr',
+        shapeNone: 'Form: Ingen',
+        dragImageHere: 'Dra et bilde hit',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Velg fra filer',
+        maximumFileSize: 'Max filstørrelse',
+        maximumFileSizeError: 'Maks filstørrelse overskredet.',
+        url: 'Bilde-URL',
+        remove: 'Fjern bilde',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Videolenke',
+        insert: 'Sett inn video',
+        url: 'Video-URL',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)'
+      },
+      link: {
+        link: 'Lenke',
+        insert: 'Sett inn lenke',
+        unlink: 'Fjern lenke',
+        edit: 'Rediger',
+        textToDisplay: 'Visningstekst',
+        url: 'Til hvilken URL skal denne lenken peke?',
+        openInNewWindow: 'Åpne i nytt vindu'
+      },
+      table: {
+        table: 'Tabell',
+        addRowAbove: 'Legg til rad over',
+        addRowBelow: 'Legg til rad under',
+        addColLeft: 'Legg til kolonne på venstre side',
+        addColRight: 'Legg til kolonne på høyre side',
+        delRow: 'Slett rad',
+        delCol: 'Slett kolonne',
+        delTable: 'Slett tabell'
+      },
+      hr: {
+        insert: 'Sett inn horisontal linje'
+      },
+      style: {
+        style: 'Stil',
+        p: 'Paragraf',
+        blockquote: 'Sitat',
+        pre: 'Kode',
+        h1: 'Overskrift 1',
+        h2: 'Overskrift 2',
+        h3: 'Overskrift 3',
+        h4: 'Overskrift 4',
+        h5: 'Overskrift 5',
+        h6: 'Overskrift 6'
+      },
+      lists: {
+        unordered: 'Punktliste',
+        ordered: 'Nummerert liste'
+      },
+      options: {
+        help: 'Hjelp',
+        fullscreen: 'Fullskjerm',
+        codeview: 'HTML-visning'
+      },
+      paragraph: {
+        paragraph: 'Avsnitt',
+        outdent: 'Tilbakerykk',
+        indent: 'Innrykk',
+        left: 'Venstrejustert',
+        center: 'Midtstilt',
+        right: 'Høyrejustert',
+        justify: 'Blokkjustert'
+      },
+      color: {
+        recent: 'Nylig valgt farge',
+        more: 'Flere farger',
+        background: 'Bakgrunnsfarge',
+        foreground: 'Skriftfarge',
+        transparent: 'Gjennomsiktig',
+        setTransparent: 'Sett gjennomsiktig',
+        reset: 'Nullstill',
+        resetToDefault: 'Nullstill til standard'
+      },
+      shortcut: {
+        shortcuts: 'Hurtigtaster',
+        close: 'Lukk',
+        textFormatting: 'Tekstformatering',
+        action: 'Handling',
+        paragraphFormatting: 'Avsnittsformatering',
+        documentStyle: 'Dokumentstil'
+      },
+      help: {
+        'insertParagraph': 'Sett inn avsnitt',
+        'undo': 'Angre siste handling',
+        'redo': 'Gjør om siste handling',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Angi en fet stil',
+        'italic': 'Angi en kursiv stil',
+        'underline': 'Sett en understreket stil',
+        'strikethrough': 'Sett en gjennomgående sti',
+        'removeFormat': 'Tøm formattering',
+        'justifyLeft': 'Angi venstrejustering',
+        'justifyCenter': 'Angi sentrert justering',
+        'justifyRight': 'Angi høyre justering',
+        'justifyFull': 'Angi full justering',
+        'insertUnorderedList': 'Bytt uordnet liste',
+        'insertOrderedList': 'Bytt sortert liste',
+        'outdent': 'Utrykk på valgt avsnitt',
+        'indent': 'Innrykk på valgt avsnitt',
+        'formatPara': 'Endre gjeldende blokkformat til et avsnitt (P-kode)',
+        'formatH1': 'Endre gjeldende blokkformat til H1',
+        'formatH2': 'Endre gjeldende blokkformat til H2',
+        'formatH3': 'Endre gjeldende blokkformat til H3',
+        'formatH4': 'Endre gjeldende blokkformat til H4',
+        'formatH5': 'Endre gjeldende blokkformat til H5',
+        'formatH6': 'Endre gjeldende blokkformat til H6',
+        'insertHorizontalRule': 'Sett inn horisontal deler',
+        'linkDialog.show': 'Vis koblingsdialog'
+      },
+      history: {
+        undo: 'Angre',
+        redo: 'Gjør om'
+      },
+      specialChar: {
+        specialChar: 'SPESIELLE TEGN',
+        select: 'Velg spesielle tegn'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-nb-NO.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js.map
new file mode 100644
index 0000000..53c8252
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-nb-NO.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-nb-NO.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'nb-NO': {\n      font: {\n        bold: 'Fet',\n        italic: 'Kursiv',\n        underline: 'Understrek',\n        clear: 'Fjern formatering',\n        height: 'Linjehøyde',\n        name: 'Skrifttype',\n        strikethrough: 'Gjennomstrek',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Skriftstørrelse',\n      },\n      image: {\n        image: 'Bilde',\n        insert: 'Sett inn bilde',\n        resizeFull: 'Sett full størrelse',\n        resizeHalf: 'Sett halv størrelse',\n        resizeQuarter: 'Sett kvart størrelse',\n        floatLeft: 'Flyt til venstre',\n        floatRight: 'Flyt til høyre',\n        floatNone: 'Fjern flyt',\n        shapeRounded: 'Form: Rundet',\n        shapeCircle: 'Form: Sirkel',\n        shapeThumbnail: 'Form: Miniatyr',\n        shapeNone: 'Form: Ingen',\n        dragImageHere: 'Dra et bilde hit',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Velg fra filer',\n        maximumFileSize: 'Max filstørrelse',\n        maximumFileSizeError: 'Maks filstørrelse overskredet.',\n        url: 'Bilde-URL',\n        remove: 'Fjern bilde',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Videolenke',\n        insert: 'Sett inn video',\n        url: 'Video-URL',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)',\n      },\n      link: {\n        link: 'Lenke',\n        insert: 'Sett inn lenke',\n        unlink: 'Fjern lenke',\n        edit: 'Rediger',\n        textToDisplay: 'Visningstekst',\n        url: 'Til hvilken URL skal denne lenken peke?',\n        openInNewWindow: 'Åpne i nytt vindu',\n      },\n      table: {\n        table: 'Tabell',\n        addRowAbove: 'Legg til rad over',\n        addRowBelow: 'Legg til rad under',\n        addColLeft: 'Legg til kolonne på venstre side',\n        addColRight: 'Legg til kolonne på høyre side',\n        delRow: 'Slett rad',\n        delCol: 'Slett kolonne',\n        delTable: 'Slett tabell',\n      },\n      hr: {\n        insert: 'Sett inn horisontal linje',\n      },\n      style: {\n        style: 'Stil',\n        p: 'Paragraf',\n        blockquote: 'Sitat',\n        pre: 'Kode',\n        h1: 'Overskrift 1',\n        h2: 'Overskrift 2',\n        h3: 'Overskrift 3',\n        h4: 'Overskrift 4',\n        h5: 'Overskrift 5',\n        h6: 'Overskrift 6',\n      },\n      lists: {\n        unordered: 'Punktliste',\n        ordered: 'Nummerert liste',\n      },\n      options: {\n        help: 'Hjelp',\n        fullscreen: 'Fullskjerm',\n        codeview: 'HTML-visning',\n      },\n      paragraph: {\n        paragraph: 'Avsnitt',\n        outdent: 'Tilbakerykk',\n        indent: 'Innrykk',\n        left: 'Venstrejustert',\n        center: 'Midtstilt',\n        right: 'Høyrejustert',\n        justify: 'Blokkjustert',\n      },\n      color: {\n        recent: 'Nylig valgt farge',\n        more: 'Flere farger',\n        background: 'Bakgrunnsfarge',\n        foreground: 'Skriftfarge',\n        transparent: 'Gjennomsiktig',\n        setTransparent: 'Sett gjennomsiktig',\n        reset: 'Nullstill',\n        resetToDefault: 'Nullstill til standard',\n      },\n      shortcut: {\n        shortcuts: 'Hurtigtaster',\n        close: 'Lukk',\n        textFormatting: 'Tekstformatering',\n        action: 'Handling',\n        paragraphFormatting: 'Avsnittsformatering',\n        documentStyle: 'Dokumentstil',\n      },\n      help: {\n        'insertParagraph': 'Sett inn avsnitt',\n        'undo': 'Angre siste handling',\n        'redo': 'Gjør om siste handling',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Angi en fet stil',\n        'italic': 'Angi en kursiv stil',\n        'underline': 'Sett en understreket stil',\n        'strikethrough': 'Sett en gjennomgående sti',\n        'removeFormat': 'Tøm formattering',\n        'justifyLeft': 'Angi venstrejustering',\n        'justifyCenter': 'Angi sentrert justering',\n        'justifyRight': 'Angi høyre justering',\n        'justifyFull': 'Angi full justering',\n        'insertUnorderedList': 'Bytt uordnet liste',\n        'insertOrderedList': 'Bytt sortert liste',\n        'outdent': 'Utrykk på valgt avsnitt',\n        'indent': 'Innrykk på valgt avsnitt',\n        'formatPara': 'Endre gjeldende blokkformat til et avsnitt (P-kode)',\n        'formatH1': 'Endre gjeldende blokkformat til H1',\n        'formatH2': 'Endre gjeldende blokkformat til H2',\n        'formatH3': 'Endre gjeldende blokkformat til H3',\n        'formatH4': 'Endre gjeldende blokkformat til H4',\n        'formatH5': 'Endre gjeldende blokkformat til H5',\n        'formatH6': 'Endre gjeldende blokkformat til H6',\n        'insertHorizontalRule': 'Sett inn horisontal deler',\n        'linkDialog.show': 'Vis koblingsdialog',\n      },\n      history: {\n        undo: 'Angre',\n        redo: 'Gjør om',\n      },\n      specialChar: {\n        specialChar: 'SPESIELLE TEGN',\n        select: 'Velg spesielle tegn',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js
new file mode 100644
index 0000000..48e3a93
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var i in r)("object"==typeof exports?exports:e)[i]=r[i]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"nb-NO":{font:{bold:"Fet",italic:"Kursiv",underline:"Understrek",clear:"Fjern formatering",height:"Linjehøyde",name:"Skrifttype",strikethrough:"Gjennomstrek",subscript:"Subscript",superscript:"Superscript",size:"Skriftstørrelse"},image:{image:"Bilde",insert:"Sett inn bilde",resizeFull:"Sett full størrelse",resizeHalf:"Sett halv størrelse",resizeQuarter:"Sett kvart størrelse",floatLeft:"Flyt til venstre",floatRight:"Flyt til høyre",floatNone:"Fjern flyt",shapeRounded:"Form: Rundet",shapeCircle:"Form: Sirkel",shapeThumbnail:"Form: Miniatyr",shapeNone:"Form: Ingen",dragImageHere:"Dra et bilde hit",dropImage:"Drop image or Text",selectFromFiles:"Velg fra filer",maximumFileSize:"Max filstørrelse",maximumFileSizeError:"Maks filstørrelse overskredet.",url:"Bilde-URL",remove:"Fjern bilde",original:"Original"},video:{video:"Video",videoLink:"Videolenke",insert:"Sett inn video",url:"Video-URL",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)"},link:{link:"Lenke",insert:"Sett inn lenke",unlink:"Fjern lenke",edit:"Rediger",textToDisplay:"Visningstekst",url:"Til hvilken URL skal denne lenken peke?",openInNewWindow:"Åpne i nytt vindu"},table:{table:"Tabell",addRowAbove:"Legg til rad over",addRowBelow:"Legg til rad under",addColLeft:"Legg til kolonne på venstre side",addColRight:"Legg til kolonne på høyre side",delRow:"Slett rad",delCol:"Slett kolonne",delTable:"Slett tabell"},hr:{insert:"Sett inn horisontal linje"},style:{style:"Stil",p:"Paragraf",blockquote:"Sitat",pre:"Kode",h1:"Overskrift 1",h2:"Overskrift 2",h3:"Overskrift 3",h4:"Overskrift 4",h5:"Overskrift 5",h6:"Overskrift 6"},lists:{unordered:"Punktliste",ordered:"Nummerert liste"},options:{help:"Hjelp",fullscreen:"Fullskjerm",codeview:"HTML-visning"},paragraph:{paragraph:"Avsnitt",outdent:"Tilbakerykk",indent:"Innrykk",left:"Venstrejustert",center:"Midtstilt",right:"Høyrejustert",justify:"Blokkjustert"},color:{recent:"Nylig valgt farge",more:"Flere farger",background:"Bakgrunnsfarge",foreground:"Skriftfarge",transparent:"Gjennomsiktig",setTransparent:"Sett gjennomsiktig",reset:"Nullstill",resetToDefault:"Nullstill til standard"},shortcut:{shortcuts:"Hurtigtaster",close:"Lukk",textFormatting:"Tekstformatering",action:"Handling",paragraphFormatting:"Avsnittsformatering",documentStyle:"Dokumentstil"},help:{insertParagraph:"Sett inn avsnitt",undo:"Angre siste handling",redo:"Gjør om siste handling",tab:"Tab",untab:"Untab",bold:"Angi en fet stil",italic:"Angi en kursiv stil",underline:"Sett en understreket stil",strikethrough:"Sett en gjennomgående sti",removeFormat:"Tøm formattering",justifyLeft:"Angi venstrejustering",justifyCenter:"Angi sentrert justering",justifyRight:"Angi høyre justering",justifyFull:"Angi full justering",insertUnorderedList:"Bytt uordnet liste",insertOrderedList:"Bytt sortert liste",outdent:"Utrykk på valgt avsnitt",indent:"Innrykk på valgt avsnitt",formatPara:"Endre gjeldende blokkformat til et avsnitt (P-kode)",formatH1:"Endre gjeldende blokkformat til H1",formatH2:"Endre gjeldende blokkformat til H2",formatH3:"Endre gjeldende blokkformat til H3",formatH4:"Endre gjeldende blokkformat til H4",formatH5:"Endre gjeldende blokkformat til H5",formatH6:"Endre gjeldende blokkformat til H6",insertHorizontalRule:"Sett inn horisontal deler","linkDialog.show":"Vis koblingsdialog"},history:{undo:"Angre",redo:"Gjør om"},specialChar:{specialChar:"SPESIELLE TEGN",select:"Velg spesielle tegn"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nb-NO.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js
new file mode 100644
index 0000000..ee088bf
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'nl-NL': {
+      font: {
+        bold: 'Vet',
+        italic: 'Cursief',
+        underline: 'Onderstrepen',
+        clear: 'Stijl verwijderen',
+        height: 'Regelhoogte',
+        name: 'Lettertype',
+        strikethrough: 'Doorhalen',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Tekstgrootte'
+      },
+      image: {
+        image: 'Afbeelding',
+        insert: 'Afbeelding invoegen',
+        resizeFull: 'Volledige breedte',
+        resizeHalf: 'Halve breedte',
+        resizeQuarter: 'Kwart breedte',
+        floatLeft: 'Links uitlijnen',
+        floatRight: 'Rechts uitlijnen',
+        floatNone: 'Geen uitlijning',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Sleep hier een afbeelding naar toe',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Selecteer een bestand',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'URL van de afbeelding',
+        remove: 'Verwijder afbeelding',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Video link',
+        insert: 'Video invoegen',
+        url: 'URL van de video',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion of Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Link invoegen',
+        unlink: 'Link verwijderen',
+        edit: 'Wijzigen',
+        textToDisplay: 'Tekst van link',
+        url: 'Naar welke URL moet deze link verwijzen?',
+        openInNewWindow: 'Open in nieuw venster'
+      },
+      table: {
+        table: 'Tabel',
+        addRowAbove: 'Rij hierboven invoegen',
+        addRowBelow: 'Rij hieronder invoegen',
+        addColLeft: 'Kolom links toevoegen',
+        addColRight: 'Kolom rechts toevoegen',
+        delRow: 'Verwijder rij',
+        delCol: 'Verwijder kolom',
+        delTable: 'Verwijder tabel'
+      },
+      hr: {
+        insert: 'Horizontale lijn invoegen'
+      },
+      style: {
+        style: 'Stijl',
+        p: 'Normaal',
+        blockquote: 'Quote',
+        pre: 'Code',
+        h1: 'Kop 1',
+        h2: 'Kop 2',
+        h3: 'Kop 3',
+        h4: 'Kop 4',
+        h5: 'Kop 5',
+        h6: 'Kop 6'
+      },
+      lists: {
+        unordered: 'Ongeordende lijst',
+        ordered: 'Geordende lijst'
+      },
+      options: {
+        help: 'Help',
+        fullscreen: 'Volledig scherm',
+        codeview: 'Bekijk Code'
+      },
+      paragraph: {
+        paragraph: 'Paragraaf',
+        outdent: 'Inspringen verkleinen',
+        indent: 'Inspringen vergroten',
+        left: 'Links uitlijnen',
+        center: 'Centreren',
+        right: 'Rechts uitlijnen',
+        justify: 'Uitvullen'
+      },
+      color: {
+        recent: 'Recente kleur',
+        more: 'Meer kleuren',
+        background: 'Achtergrond kleur',
+        foreground: 'Tekst kleur',
+        transparent: 'Transparant',
+        setTransparent: 'Transparant',
+        reset: 'Standaard',
+        resetToDefault: 'Standaard kleur'
+      },
+      shortcut: {
+        shortcuts: 'Toetsencombinaties',
+        close: 'sluiten',
+        textFormatting: 'Tekststijlen',
+        action: 'Acties',
+        paragraphFormatting: 'Paragraafstijlen',
+        documentStyle: 'Documentstijlen',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Alinea invoegen',
+        'undo': 'Laatste handeling ongedaan maken',
+        'redo': 'Laatste handeling opnieuw uitvoeren',
+        'tab': 'Tab',
+        'untab': 'Herstel tab',
+        'bold': 'Stel stijl in als vet',
+        'italic': 'Stel stijl in als cursief',
+        'underline': 'Stel stijl in als onderstreept',
+        'strikethrough': 'Stel stijl in als doorgestreept',
+        'removeFormat': 'Verwijder stijl',
+        'justifyLeft': 'Lijn links uit',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Lijn rechts uit',
+        'justifyFull': 'Lijn uit op volledige breedte',
+        'insertUnorderedList': 'Zet ongeordende lijstweergave aan',
+        'insertOrderedList': 'Zet geordende lijstweergave aan',
+        'outdent': 'Verwijder inspringing huidige alinea',
+        'indent': 'Inspringen op huidige alinea',
+        'formatPara': 'Wijzig formattering huidig blok in alinea(P tag)',
+        'formatH1': 'Formatteer huidig blok als H1',
+        'formatH2': 'Formatteer huidig blok als H2',
+        'formatH3': 'Formatteer huidig blok als H3',
+        'formatH4': 'Formatteer huidig blok als H4',
+        'formatH5': 'Formatteer huidig blok als H5',
+        'formatH6': 'Formatteer huidig blok als H6',
+        'insertHorizontalRule': 'Invoegen horizontale lijn',
+        'linkDialog.show': 'Toon Link Dialoogvenster'
+      },
+      history: {
+        undo: 'Ongedaan maken',
+        redo: 'Opnieuw doorvoeren'
+      },
+      specialChar: {
+        specialChar: 'SPECIALE TEKENS',
+        select: 'Selecteer Speciale Tekens'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-nl-NL.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js.map
new file mode 100644
index 0000000..c0745c8
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-nl-NL.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-nl-NL.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'nl-NL': {\n      font: {\n        bold: 'Vet',\n        italic: 'Cursief',\n        underline: 'Onderstrepen',\n        clear: 'Stijl verwijderen',\n        height: 'Regelhoogte',\n        name: 'Lettertype',\n        strikethrough: 'Doorhalen',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Tekstgrootte',\n      },\n      image: {\n        image: 'Afbeelding',\n        insert: 'Afbeelding invoegen',\n        resizeFull: 'Volledige breedte',\n        resizeHalf: 'Halve breedte',\n        resizeQuarter: 'Kwart breedte',\n        floatLeft: 'Links uitlijnen',\n        floatRight: 'Rechts uitlijnen',\n        floatNone: 'Geen uitlijning',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Sleep hier een afbeelding naar toe',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Selecteer een bestand',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'URL van de afbeelding',\n        remove: 'Verwijder afbeelding',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Video link',\n        insert: 'Video invoegen',\n        url: 'URL van de video',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion of Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Link invoegen',\n        unlink: 'Link verwijderen',\n        edit: 'Wijzigen',\n        textToDisplay: 'Tekst van link',\n        url: 'Naar welke URL moet deze link verwijzen?',\n        openInNewWindow: 'Open in nieuw venster',\n      },\n      table: {\n        table: 'Tabel',\n        addRowAbove: 'Rij hierboven invoegen',\n        addRowBelow: 'Rij hieronder invoegen',\n        addColLeft: 'Kolom links toevoegen',\n        addColRight: 'Kolom rechts toevoegen',\n        delRow: 'Verwijder rij',\n        delCol: 'Verwijder kolom',\n        delTable: 'Verwijder tabel',\n      },\n      hr: {\n        insert: 'Horizontale lijn invoegen',\n      },\n      style: {\n        style: 'Stijl',\n        p: 'Normaal',\n        blockquote: 'Quote',\n        pre: 'Code',\n        h1: 'Kop 1',\n        h2: 'Kop 2',\n        h3: 'Kop 3',\n        h4: 'Kop 4',\n        h5: 'Kop 5',\n        h6: 'Kop 6',\n      },\n      lists: {\n        unordered: 'Ongeordende lijst',\n        ordered: 'Geordende lijst',\n      },\n      options: {\n        help: 'Help',\n        fullscreen: 'Volledig scherm',\n        codeview: 'Bekijk Code',\n      },\n      paragraph: {\n        paragraph: 'Paragraaf',\n        outdent: 'Inspringen verkleinen',\n        indent: 'Inspringen vergroten',\n        left: 'Links uitlijnen',\n        center: 'Centreren',\n        right: 'Rechts uitlijnen',\n        justify: 'Uitvullen',\n      },\n      color: {\n        recent: 'Recente kleur',\n        more: 'Meer kleuren',\n        background: 'Achtergrond kleur',\n        foreground: 'Tekst kleur',\n        transparent: 'Transparant',\n        setTransparent: 'Transparant',\n        reset: 'Standaard',\n        resetToDefault: 'Standaard kleur',\n      },\n      shortcut: {\n        shortcuts: 'Toetsencombinaties',\n        close: 'sluiten',\n        textFormatting: 'Tekststijlen',\n        action: 'Acties',\n        paragraphFormatting: 'Paragraafstijlen',\n        documentStyle: 'Documentstijlen',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Alinea invoegen',\n        'undo': 'Laatste handeling ongedaan maken',\n        'redo': 'Laatste handeling opnieuw uitvoeren',\n        'tab': 'Tab',\n        'untab': 'Herstel tab',\n        'bold': 'Stel stijl in als vet',\n        'italic': 'Stel stijl in als cursief',\n        'underline': 'Stel stijl in als onderstreept',\n        'strikethrough': 'Stel stijl in als doorgestreept',\n        'removeFormat': 'Verwijder stijl',\n        'justifyLeft': 'Lijn links uit',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Lijn rechts uit',\n        'justifyFull': 'Lijn uit op volledige breedte',\n        'insertUnorderedList': 'Zet ongeordende lijstweergave aan',\n        'insertOrderedList': 'Zet geordende lijstweergave aan',\n        'outdent': 'Verwijder inspringing huidige alinea',\n        'indent': 'Inspringen op huidige alinea',\n        'formatPara': 'Wijzig formattering huidig blok in alinea(P tag)',\n        'formatH1': 'Formatteer huidig blok als H1',\n        'formatH2': 'Formatteer huidig blok als H2',\n        'formatH3': 'Formatteer huidig blok als H3',\n        'formatH4': 'Formatteer huidig blok als H4',\n        'formatH5': 'Formatteer huidig blok als H5',\n        'formatH6': 'Formatteer huidig blok als H6',\n        'insertHorizontalRule': 'Invoegen horizontale lijn',\n        'linkDialog.show': 'Toon Link Dialoogvenster',\n      },\n      history: {\n        undo: 'Ongedaan maken',\n        redo: 'Opnieuw doorvoeren',\n      },\n      specialChar: {\n        specialChar: 'SPECIALE TEKENS',\n        select: 'Selecteer Speciale Tekens',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js
new file mode 100644
index 0000000..dfc5948
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i();else if("function"==typeof define&&define.amd)define([],i);else{var n=i();for(var t in n)("object"==typeof exports?exports:e)[t]=n[t]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"nl-NL":{font:{bold:"Vet",italic:"Cursief",underline:"Onderstrepen",clear:"Stijl verwijderen",height:"Regelhoogte",name:"Lettertype",strikethrough:"Doorhalen",subscript:"Subscript",superscript:"Superscript",size:"Tekstgrootte"},image:{image:"Afbeelding",insert:"Afbeelding invoegen",resizeFull:"Volledige breedte",resizeHalf:"Halve breedte",resizeQuarter:"Kwart breedte",floatLeft:"Links uitlijnen",floatRight:"Rechts uitlijnen",floatNone:"Geen uitlijning",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Sleep hier een afbeelding naar toe",dropImage:"Drop image or Text",selectFromFiles:"Selecteer een bestand",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"URL van de afbeelding",remove:"Verwijder afbeelding",original:"Original"},video:{video:"Video",videoLink:"Video link",insert:"Video invoegen",url:"URL van de video",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion of Youku)"},link:{link:"Link",insert:"Link invoegen",unlink:"Link verwijderen",edit:"Wijzigen",textToDisplay:"Tekst van link",url:"Naar welke URL moet deze link verwijzen?",openInNewWindow:"Open in nieuw venster"},table:{table:"Tabel",addRowAbove:"Rij hierboven invoegen",addRowBelow:"Rij hieronder invoegen",addColLeft:"Kolom links toevoegen",addColRight:"Kolom rechts toevoegen",delRow:"Verwijder rij",delCol:"Verwijder kolom",delTable:"Verwijder tabel"},hr:{insert:"Horizontale lijn invoegen"},style:{style:"Stijl",p:"Normaal",blockquote:"Quote",pre:"Code",h1:"Kop 1",h2:"Kop 2",h3:"Kop 3",h4:"Kop 4",h5:"Kop 5",h6:"Kop 6"},lists:{unordered:"Ongeordende lijst",ordered:"Geordende lijst"},options:{help:"Help",fullscreen:"Volledig scherm",codeview:"Bekijk Code"},paragraph:{paragraph:"Paragraaf",outdent:"Inspringen verkleinen",indent:"Inspringen vergroten",left:"Links uitlijnen",center:"Centreren",right:"Rechts uitlijnen",justify:"Uitvullen"},color:{recent:"Recente kleur",more:"Meer kleuren",background:"Achtergrond kleur",foreground:"Tekst kleur",transparent:"Transparant",setTransparent:"Transparant",reset:"Standaard",resetToDefault:"Standaard kleur"},shortcut:{shortcuts:"Toetsencombinaties",close:"sluiten",textFormatting:"Tekststijlen",action:"Acties",paragraphFormatting:"Paragraafstijlen",documentStyle:"Documentstijlen",extraKeys:"Extra keys"},help:{insertParagraph:"Alinea invoegen",undo:"Laatste handeling ongedaan maken",redo:"Laatste handeling opnieuw uitvoeren",tab:"Tab",untab:"Herstel tab",bold:"Stel stijl in als vet",italic:"Stel stijl in als cursief",underline:"Stel stijl in als onderstreept",strikethrough:"Stel stijl in als doorgestreept",removeFormat:"Verwijder stijl",justifyLeft:"Lijn links uit",justifyCenter:"Set center align",justifyRight:"Lijn rechts uit",justifyFull:"Lijn uit op volledige breedte",insertUnorderedList:"Zet ongeordende lijstweergave aan",insertOrderedList:"Zet geordende lijstweergave aan",outdent:"Verwijder inspringing huidige alinea",indent:"Inspringen op huidige alinea",formatPara:"Wijzig formattering huidig blok in alinea(P tag)",formatH1:"Formatteer huidig blok als H1",formatH2:"Formatteer huidig blok als H2",formatH3:"Formatteer huidig blok als H3",formatH4:"Formatteer huidig blok als H4",formatH5:"Formatteer huidig blok als H5",formatH6:"Formatteer huidig blok als H6",insertHorizontalRule:"Invoegen horizontale lijn","linkDialog.show":"Toon Link Dialoogvenster"},history:{undo:"Ongedaan maken",redo:"Opnieuw doorvoeren"},specialChar:{specialChar:"SPECIALE TEKENS",select:"Selecteer Speciale Tekens"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-nl-NL.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js
new file mode 100644
index 0000000..1d20420
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'pl-PL': {
+      font: {
+        bold: 'Pogrubienie',
+        italic: 'Pochylenie',
+        underline: 'Podkreślenie',
+        clear: 'Usuń formatowanie',
+        height: 'Interlinia',
+        name: 'Czcionka',
+        strikethrough: 'Przekreślenie',
+        subscript: 'Indeks dolny',
+        superscript: 'Indeks górny',
+        size: 'Rozmiar'
+      },
+      image: {
+        image: 'Grafika',
+        insert: 'Wstaw grafikę',
+        resizeFull: 'Zmień rozmiar na 100%',
+        resizeHalf: 'Zmień rozmiar na 50%',
+        resizeQuarter: 'Zmień rozmiar na 25%',
+        floatLeft: 'Po lewej',
+        floatRight: 'Po prawej',
+        floatNone: 'Równo z tekstem',
+        shapeRounded: 'Kształt: zaokrąglone',
+        shapeCircle: 'Kształt: okrąg',
+        shapeThumbnail: 'Kształt: miniatura',
+        shapeNone: 'Kształt: brak',
+        dragImageHere: 'Przeciągnij grafikę lub tekst tutaj',
+        dropImage: 'Przeciągnij grafikę lub tekst',
+        selectFromFiles: 'Wybierz z dysku',
+        maximumFileSize: 'Limit wielkości pliku',
+        maximumFileSizeError: 'Przekroczono limit wielkości pliku.',
+        url: 'Adres URL grafiki',
+        remove: 'Usuń grafikę',
+        original: 'Oryginał'
+      },
+      video: {
+        video: 'Wideo',
+        videoLink: 'Adres wideo',
+        insert: 'Wstaw wideo',
+        url: 'Adres wideo',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion lub Youku)'
+      },
+      link: {
+        link: 'Odnośnik',
+        insert: 'Wstaw odnośnik',
+        unlink: 'Usuń odnośnik',
+        edit: 'Edytuj',
+        textToDisplay: 'Tekst do wyświetlenia',
+        url: 'Na jaki adres URL powinien przenosić ten odnośnik?',
+        openInNewWindow: 'Otwórz w nowym oknie'
+      },
+      table: {
+        table: 'Tabela',
+        addRowAbove: 'Dodaj wiersz powyżej',
+        addRowBelow: 'Dodaj wiersz poniżej',
+        addColLeft: 'Dodaj kolumnę po lewej',
+        addColRight: 'Dodaj kolumnę po prawej',
+        delRow: 'Usuń wiersz',
+        delCol: 'Usuń kolumnę',
+        delTable: 'Usuń tabelę'
+      },
+      hr: {
+        insert: 'Wstaw poziomą linię'
+      },
+      style: {
+        style: 'Styl',
+        p: 'pny',
+        blockquote: 'Cytat',
+        pre: 'Kod',
+        h1: 'Nagłówek 1',
+        h2: 'Nagłówek 2',
+        h3: 'Nagłówek 3',
+        h4: 'Nagłówek 4',
+        h5: 'Nagłówek 5',
+        h6: 'Nagłówek 6'
+      },
+      lists: {
+        unordered: 'Lista wypunktowana',
+        ordered: 'Lista numerowana'
+      },
+      options: {
+        help: 'Pomoc',
+        fullscreen: 'Pełny ekran',
+        codeview: 'Źródło'
+      },
+      paragraph: {
+        paragraph: 'Akapit',
+        outdent: 'Zmniejsz wcięcie',
+        indent: 'Zwiększ wcięcie',
+        left: 'Wyrównaj do lewej',
+        center: 'Wyrównaj do środka',
+        right: 'Wyrównaj do prawej',
+        justify: 'Wyrównaj do lewej i prawej'
+      },
+      color: {
+        recent: 'Ostani kolor',
+        more: 'Więcej kolorów',
+        background: 'Tło',
+        foreground: 'Czcionka',
+        transparent: 'Przeźroczysty',
+        setTransparent: 'Przeźroczyste',
+        reset: 'Zresetuj',
+        resetToDefault: 'Domyślne'
+      },
+      shortcut: {
+        shortcuts: 'Skróty klawiaturowe',
+        close: 'Zamknij',
+        textFormatting: 'Formatowanie tekstu',
+        action: 'Akcja',
+        paragraphFormatting: 'Formatowanie akapitu',
+        documentStyle: 'Styl dokumentu',
+        extraKeys: 'Dodatkowe klawisze'
+      },
+      help: {
+        'insertParagraph': 'Wstaw paragraf',
+        'undo': 'Cofnij poprzednią operację',
+        'redo': 'Przywróć poprzednią operację',
+        'tab': 'Tabulacja',
+        'untab': 'Usuń tabulację',
+        'bold': 'Pogrubienie',
+        'italic': 'Kursywa',
+        'underline': 'Podkreślenie',
+        'strikethrough': 'Przekreślenie',
+        'removeFormat': 'Usuń formatowanie',
+        'justifyLeft': 'Wyrównaj do lewej',
+        'justifyCenter': 'Wyrównaj do środka',
+        'justifyRight': 'Wyrównaj do prawej',
+        'justifyFull': 'Justyfikacja',
+        'insertUnorderedList': 'Nienumerowana lista',
+        'insertOrderedList': 'Wypunktowana lista',
+        'outdent': 'Zmniejsz wcięcie paragrafu',
+        'indent': 'Zwiększ wcięcie paragrafu',
+        'formatPara': 'Zamień format bloku na paragraf (tag P)',
+        'formatH1': 'Zamień format bloku na H1',
+        'formatH2': 'Zamień format bloku na H2',
+        'formatH3': 'Zamień format bloku na H3',
+        'formatH4': 'Zamień format bloku na H4',
+        'formatH5': 'Zamień format bloku na H5',
+        'formatH6': 'Zamień format bloku na H6',
+        'insertHorizontalRule': 'Wstaw poziomą linię',
+        'linkDialog.show': 'Pokaż dialog linkowania'
+      },
+      history: {
+        undo: 'Cofnij',
+        redo: 'Ponów'
+      },
+      specialChar: {
+        specialChar: 'ZNAKI SPECJALNE',
+        select: 'Wybierz Znak specjalny'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-pl-PL.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js.map
new file mode 100644
index 0000000..348cfc6
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-pl-PL.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-pl-PL.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'pl-PL': {\n      font: {\n        bold: 'Pogrubienie',\n        italic: 'Pochylenie',\n        underline: 'Podkreślenie',\n        clear: 'Usuń formatowanie',\n        height: 'Interlinia',\n        name: 'Czcionka',\n        strikethrough: 'Przekreślenie',\n        subscript: 'Indeks dolny',\n        superscript: 'Indeks górny',\n        size: 'Rozmiar',\n      },\n      image: {\n        image: 'Grafika',\n        insert: 'Wstaw grafikę',\n        resizeFull: 'Zmień rozmiar na 100%',\n        resizeHalf: 'Zmień rozmiar na 50%',\n        resizeQuarter: 'Zmień rozmiar na 25%',\n        floatLeft: 'Po lewej',\n        floatRight: 'Po prawej',\n        floatNone: 'Równo z tekstem',\n        shapeRounded: 'Kształt: zaokrąglone',\n        shapeCircle: 'Kształt: okrąg',\n        shapeThumbnail: 'Kształt: miniatura',\n        shapeNone: 'Kształt: brak',\n        dragImageHere: 'Przeciągnij grafikę lub tekst tutaj',\n        dropImage: 'Przeciągnij grafikę lub tekst',\n        selectFromFiles: 'Wybierz z dysku',\n        maximumFileSize: 'Limit wielkości pliku',\n        maximumFileSizeError: 'Przekroczono limit wielkości pliku.',\n        url: 'Adres URL grafiki',\n        remove: 'Usuń grafikę',\n        original: 'Oryginał',\n      },\n      video: {\n        video: 'Wideo',\n        videoLink: 'Adres wideo',\n        insert: 'Wstaw wideo',\n        url: 'Adres wideo',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion lub Youku)',\n      },\n      link: {\n        link: 'Odnośnik',\n        insert: 'Wstaw odnośnik',\n        unlink: 'Usuń odnośnik',\n        edit: 'Edytuj',\n        textToDisplay: 'Tekst do wyświetlenia',\n        url: 'Na jaki adres URL powinien przenosić ten odnośnik?',\n        openInNewWindow: 'Otwórz w nowym oknie',\n      },\n      table: {\n        table: 'Tabela',\n        addRowAbove: 'Dodaj wiersz powyżej',\n        addRowBelow: 'Dodaj wiersz poniżej',\n        addColLeft: 'Dodaj kolumnę po lewej',\n        addColRight: 'Dodaj kolumnę po prawej',\n        delRow: 'Usuń wiersz',\n        delCol: 'Usuń kolumnę',\n        delTable: 'Usuń tabelę',\n      },\n      hr: {\n        insert: 'Wstaw poziomą linię',\n      },\n      style: {\n        style: 'Styl',\n        p: 'pny',\n        blockquote: 'Cytat',\n        pre: 'Kod',\n        h1: 'Nagłówek 1',\n        h2: 'Nagłówek 2',\n        h3: 'Nagłówek 3',\n        h4: 'Nagłówek 4',\n        h5: 'Nagłówek 5',\n        h6: 'Nagłówek 6',\n      },\n      lists: {\n        unordered: 'Lista wypunktowana',\n        ordered: 'Lista numerowana',\n      },\n      options: {\n        help: 'Pomoc',\n        fullscreen: 'Pełny ekran',\n        codeview: 'Źródło',\n      },\n      paragraph: {\n        paragraph: 'Akapit',\n        outdent: 'Zmniejsz wcięcie',\n        indent: 'Zwiększ wcięcie',\n        left: 'Wyrównaj do lewej',\n        center: 'Wyrównaj do środka',\n        right: 'Wyrównaj do prawej',\n        justify: 'Wyrównaj do lewej i prawej',\n      },\n      color: {\n        recent: 'Ostani kolor',\n        more: 'Więcej kolorów',\n        background: 'Tło',\n        foreground: 'Czcionka',\n        transparent: 'Przeźroczysty',\n        setTransparent: 'Przeźroczyste',\n        reset: 'Zresetuj',\n        resetToDefault: 'Domyślne',\n      },\n      shortcut: {\n        shortcuts: 'Skróty klawiaturowe',\n        close: 'Zamknij',\n        textFormatting: 'Formatowanie tekstu',\n        action: 'Akcja',\n        paragraphFormatting: 'Formatowanie akapitu',\n        documentStyle: 'Styl dokumentu',\n        extraKeys: 'Dodatkowe klawisze',\n      },\n      help: {\n        'insertParagraph': 'Wstaw paragraf',\n        'undo': 'Cofnij poprzednią operację',\n        'redo': 'Przywróć poprzednią operację',\n        'tab': 'Tabulacja',\n        'untab': 'Usuń tabulację',\n        'bold': 'Pogrubienie',\n        'italic': 'Kursywa',\n        'underline': 'Podkreślenie',\n        'strikethrough': 'Przekreślenie',\n        'removeFormat': 'Usuń formatowanie',\n        'justifyLeft': 'Wyrównaj do lewej',\n        'justifyCenter': 'Wyrównaj do środka',\n        'justifyRight': 'Wyrównaj do prawej',\n        'justifyFull': 'Justyfikacja',\n        'insertUnorderedList': 'Nienumerowana lista',\n        'insertOrderedList': 'Wypunktowana lista',\n        'outdent': 'Zmniejsz wcięcie paragrafu',\n        'indent': 'Zwiększ wcięcie paragrafu',\n        'formatPara': 'Zamień format bloku na paragraf (tag P)',\n        'formatH1': 'Zamień format bloku na H1',\n        'formatH2': 'Zamień format bloku na H2',\n        'formatH3': 'Zamień format bloku na H3',\n        'formatH4': 'Zamień format bloku na H4',\n        'formatH5': 'Zamień format bloku na H5',\n        'formatH6': 'Zamień format bloku na H6',\n        'insertHorizontalRule': 'Wstaw poziomą linię',\n        'linkDialog.show': 'Pokaż dialog linkowania',\n      },\n      history: {\n        undo: 'Cofnij',\n        redo: 'Ponów',\n      },\n      specialChar: {\n        specialChar: 'ZNAKI SPECJALNE',\n        select: 'Wybierz Znak specjalny',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js
new file mode 100644
index 0000000..f480f5b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var o=a();for(var r in o)("object"==typeof exports?exports:e)[r]=o[r]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"pl-PL":{font:{bold:"Pogrubienie",italic:"Pochylenie",underline:"Podkreślenie",clear:"Usuń formatowanie",height:"Interlinia",name:"Czcionka",strikethrough:"Przekreślenie",subscript:"Indeks dolny",superscript:"Indeks górny",size:"Rozmiar"},image:{image:"Grafika",insert:"Wstaw grafikę",resizeFull:"Zmień rozmiar na 100%",resizeHalf:"Zmień rozmiar na 50%",resizeQuarter:"Zmień rozmiar na 25%",floatLeft:"Po lewej",floatRight:"Po prawej",floatNone:"Równo z tekstem",shapeRounded:"Kształt: zaokrąglone",shapeCircle:"Kształt: okrąg",shapeThumbnail:"Kształt: miniatura",shapeNone:"Kształt: brak",dragImageHere:"Przeciągnij grafikę lub tekst tutaj",dropImage:"Przeciągnij grafikę lub tekst",selectFromFiles:"Wybierz z dysku",maximumFileSize:"Limit wielkości pliku",maximumFileSizeError:"Przekroczono limit wielkości pliku.",url:"Adres URL grafiki",remove:"Usuń grafikę",original:"Oryginał"},video:{video:"Wideo",videoLink:"Adres wideo",insert:"Wstaw wideo",url:"Adres wideo",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion lub Youku)"},link:{link:"Odnośnik",insert:"Wstaw odnośnik",unlink:"Usuń odnośnik",edit:"Edytuj",textToDisplay:"Tekst do wyświetlenia",url:"Na jaki adres URL powinien przenosić ten odnośnik?",openInNewWindow:"Otwórz w nowym oknie"},table:{table:"Tabela",addRowAbove:"Dodaj wiersz powyżej",addRowBelow:"Dodaj wiersz poniżej",addColLeft:"Dodaj kolumnę po lewej",addColRight:"Dodaj kolumnę po prawej",delRow:"Usuń wiersz",delCol:"Usuń kolumnę",delTable:"Usuń tabelę"},hr:{insert:"Wstaw poziomą linię"},style:{style:"Styl",p:"pny",blockquote:"Cytat",pre:"Kod",h1:"Nagłówek 1",h2:"Nagłówek 2",h3:"Nagłówek 3",h4:"Nagłówek 4",h5:"Nagłówek 5",h6:"Nagłówek 6"},lists:{unordered:"Lista wypunktowana",ordered:"Lista numerowana"},options:{help:"Pomoc",fullscreen:"Pełny ekran",codeview:"Źródło"},paragraph:{paragraph:"Akapit",outdent:"Zmniejsz wcięcie",indent:"Zwiększ wcięcie",left:"Wyrównaj do lewej",center:"Wyrównaj do środka",right:"Wyrównaj do prawej",justify:"Wyrównaj do lewej i prawej"},color:{recent:"Ostani kolor",more:"Więcej kolorów",background:"Tło",foreground:"Czcionka",transparent:"Przeźroczysty",setTransparent:"Przeźroczyste",reset:"Zresetuj",resetToDefault:"Domyślne"},shortcut:{shortcuts:"Skróty klawiaturowe",close:"Zamknij",textFormatting:"Formatowanie tekstu",action:"Akcja",paragraphFormatting:"Formatowanie akapitu",documentStyle:"Styl dokumentu",extraKeys:"Dodatkowe klawisze"},help:{insertParagraph:"Wstaw paragraf",undo:"Cofnij poprzednią operację",redo:"Przywróć poprzednią operację",tab:"Tabulacja",untab:"Usuń tabulację",bold:"Pogrubienie",italic:"Kursywa",underline:"Podkreślenie",strikethrough:"Przekreślenie",removeFormat:"Usuń formatowanie",justifyLeft:"Wyrównaj do lewej",justifyCenter:"Wyrównaj do środka",justifyRight:"Wyrównaj do prawej",justifyFull:"Justyfikacja",insertUnorderedList:"Nienumerowana lista",insertOrderedList:"Wypunktowana lista",outdent:"Zmniejsz wcięcie paragrafu",indent:"Zwiększ wcięcie paragrafu",formatPara:"Zamień format bloku na paragraf (tag P)",formatH1:"Zamień format bloku na H1",formatH2:"Zamień format bloku na H2",formatH3:"Zamień format bloku na H3",formatH4:"Zamień format bloku na H4",formatH5:"Zamień format bloku na H5",formatH6:"Zamień format bloku na H6",insertHorizontalRule:"Wstaw poziomą linię","linkDialog.show":"Pokaż dialog linkowania"},history:{undo:"Cofnij",redo:"Ponów"},specialChar:{specialChar:"ZNAKI SPECJALNE",select:"Wybierz Znak specjalny"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pl-PL.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js
new file mode 100644
index 0000000..6d38072
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'pt-BR': {
+      font: {
+        bold: 'Negrito',
+        italic: 'Itálico',
+        underline: 'Sublinhado',
+        clear: 'Remover estilo da fonte',
+        height: 'Altura da linha',
+        name: 'Fonte',
+        strikethrough: 'Riscado',
+        subscript: 'Subscrito',
+        superscript: 'Sobrescrito',
+        size: 'Tamanho da fonte'
+      },
+      image: {
+        image: 'Imagem',
+        insert: 'Inserir imagem',
+        resizeFull: 'Redimensionar Completamente',
+        resizeHalf: 'Redimensionar pela Metade',
+        resizeQuarter: 'Redimensionar a um Quarto',
+        floatLeft: 'Flutuar para Esquerda',
+        floatRight: 'Flutuar para Direita',
+        floatNone: 'Não Flutuar',
+        shapeRounded: 'Forma: Arredondado',
+        shapeCircle: 'Forma: Círculo',
+        shapeThumbnail: 'Forma: Miniatura',
+        shapeNone: 'Forma: Nenhum',
+        dragImageHere: 'Arraste Imagem ou Texto para cá',
+        dropImage: 'Solte Imagem ou Texto',
+        selectFromFiles: 'Selecione a partir dos arquivos',
+        maximumFileSize: 'Tamanho máximo do arquivo',
+        maximumFileSizeError: 'Tamanho máximo do arquivo excedido.',
+        url: 'URL da imagem',
+        remove: 'Remover Imagem',
+        original: 'Original'
+      },
+      video: {
+        video: 'Vídeo',
+        videoLink: 'Link para vídeo',
+        insert: 'Inserir vídeo',
+        url: 'URL do vídeo?',
+        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Inserir link',
+        unlink: 'Remover link',
+        edit: 'Editar',
+        textToDisplay: 'Texto para exibir',
+        url: 'Para qual URL este link leva?',
+        openInNewWindow: 'Abrir em uma nova janela'
+      },
+      table: {
+        table: 'Tabela',
+        addRowAbove: 'Adicionar linha acima',
+        addRowBelow: 'Adicionar linha abaixo',
+        addColLeft: 'Adicionar coluna à esquerda',
+        addColRight: 'Adicionar coluna à direita',
+        delRow: 'Excluir linha',
+        delCol: 'Excluir coluna',
+        delTable: 'Excluir tabela'
+      },
+      hr: {
+        insert: 'Linha horizontal'
+      },
+      style: {
+        style: 'Estilo',
+        p: 'Normal',
+        blockquote: 'Citação',
+        pre: 'Código',
+        h1: 'Título 1',
+        h2: 'Título 2',
+        h3: 'Título 3',
+        h4: 'Título 4',
+        h5: 'Título 5',
+        h6: 'Título 6'
+      },
+      lists: {
+        unordered: 'Lista com marcadores',
+        ordered: 'Lista numerada'
+      },
+      options: {
+        help: 'Ajuda',
+        fullscreen: 'Tela cheia',
+        codeview: 'Ver código-fonte'
+      },
+      paragraph: {
+        paragraph: 'Parágrafo',
+        outdent: 'Menor tabulação',
+        indent: 'Maior tabulação',
+        left: 'Alinhar à esquerda',
+        center: 'Alinhar ao centro',
+        right: 'Alinha à direita',
+        justify: 'Justificado'
+      },
+      color: {
+        recent: 'Cor recente',
+        more: 'Mais cores',
+        background: 'Fundo',
+        foreground: 'Fonte',
+        transparent: 'Transparente',
+        setTransparent: 'Fundo transparente',
+        reset: 'Restaurar',
+        resetToDefault: 'Restaurar padrão',
+        cpSelect: 'Selecionar'
+      },
+      shortcut: {
+        shortcuts: 'Atalhos do teclado',
+        close: 'Fechar',
+        textFormatting: 'Formatação de texto',
+        action: 'Ação',
+        paragraphFormatting: 'Formatação de parágrafo',
+        documentStyle: 'Estilo de documento',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Inserir Parágrafo',
+        'undo': 'Desfazer o último comando',
+        'redo': 'Refazer o último comando',
+        'tab': 'Tab',
+        'untab': 'Desfazer tab',
+        'bold': 'Colocar em negrito',
+        'italic': 'Colocar em itálico',
+        'underline': 'Sublinhado',
+        'strikethrough': 'Tachado',
+        'removeFormat': 'Remover estilo',
+        'justifyLeft': 'Alinhar à esquerda',
+        'justifyCenter': 'Centralizar',
+        'justifyRight': 'Alinhar à esquerda',
+        'justifyFull': 'Justificar',
+        'insertUnorderedList': 'Lista não ordenada',
+        'insertOrderedList': 'Lista ordenada',
+        'outdent': 'Recuar parágrafo atual',
+        'indent': 'Avançar parágrafo atual',
+        'formatPara': 'Alterar formato do bloco para parágrafo(tag P)',
+        'formatH1': 'Alterar formato do bloco para H1',
+        'formatH2': 'Alterar formato do bloco para H2',
+        'formatH3': 'Alterar formato do bloco para H3',
+        'formatH4': 'Alterar formato do bloco para H4',
+        'formatH5': 'Alterar formato do bloco para H5',
+        'formatH6': 'Alterar formato do bloco para H6',
+        'insertHorizontalRule': 'Inserir Régua horizontal',
+        'linkDialog.show': 'Inserir um Hiperlink'
+      },
+      history: {
+        undo: 'Desfazer',
+        redo: 'Refazer'
+      },
+      specialChar: {
+        specialChar: 'CARACTERES ESPECIAIS',
+        select: 'Selecionar Caracteres Especiais'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-pt-BR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js.map
new file mode 100644
index 0000000..9c5a63f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-pt-BR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-pt-BR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'pt-BR': {\n      font: {\n        bold: 'Negrito',\n        italic: 'Itálico',\n        underline: 'Sublinhado',\n        clear: 'Remover estilo da fonte',\n        height: 'Altura da linha',\n        name: 'Fonte',\n        strikethrough: 'Riscado',\n        subscript: 'Subscrito',\n        superscript: 'Sobrescrito',\n        size: 'Tamanho da fonte',\n      },\n      image: {\n        image: 'Imagem',\n        insert: 'Inserir imagem',\n        resizeFull: 'Redimensionar Completamente',\n        resizeHalf: 'Redimensionar pela Metade',\n        resizeQuarter: 'Redimensionar a um Quarto',\n        floatLeft: 'Flutuar para Esquerda',\n        floatRight: 'Flutuar para Direita',\n        floatNone: 'Não Flutuar',\n        shapeRounded: 'Forma: Arredondado',\n        shapeCircle: 'Forma: Círculo',\n        shapeThumbnail: 'Forma: Miniatura',\n        shapeNone: 'Forma: Nenhum',\n        dragImageHere: 'Arraste Imagem ou Texto para cá',\n        dropImage: 'Solte Imagem ou Texto',\n        selectFromFiles: 'Selecione a partir dos arquivos',\n        maximumFileSize: 'Tamanho máximo do arquivo',\n        maximumFileSizeError: 'Tamanho máximo do arquivo excedido.',\n        url: 'URL da imagem',\n        remove: 'Remover Imagem',\n        original: 'Original',\n      },\n      video: {\n        video: 'Vídeo',\n        videoLink: 'Link para vídeo',\n        insert: 'Inserir vídeo',\n        url: 'URL do vídeo?',\n        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Inserir link',\n        unlink: 'Remover link',\n        edit: 'Editar',\n        textToDisplay: 'Texto para exibir',\n        url: 'Para qual URL este link leva?',\n        openInNewWindow: 'Abrir em uma nova janela',\n      },\n      table: {\n        table: 'Tabela',\n        addRowAbove: 'Adicionar linha acima',\n        addRowBelow: 'Adicionar linha abaixo',\n        addColLeft: 'Adicionar coluna à esquerda',\n        addColRight: 'Adicionar coluna à direita',\n        delRow: 'Excluir linha',\n        delCol: 'Excluir coluna',\n        delTable: 'Excluir tabela',\n      },\n      hr: {\n        insert: 'Linha horizontal',\n      },\n      style: {\n        style: 'Estilo',\n        p: 'Normal',\n        blockquote: 'Citação',\n        pre: 'Código',\n        h1: 'Título 1',\n        h2: 'Título 2',\n        h3: 'Título 3',\n        h4: 'Título 4',\n        h5: 'Título 5',\n        h6: 'Título 6',\n      },\n      lists: {\n        unordered: 'Lista com marcadores',\n        ordered: 'Lista numerada',\n      },\n      options: {\n        help: 'Ajuda',\n        fullscreen: 'Tela cheia',\n        codeview: 'Ver código-fonte',\n      },\n      paragraph: {\n        paragraph: 'Parágrafo',\n        outdent: 'Menor tabulação',\n        indent: 'Maior tabulação',\n        left: 'Alinhar à esquerda',\n        center: 'Alinhar ao centro',\n        right: 'Alinha à direita',\n        justify: 'Justificado',\n      },\n      color: {\n        recent: 'Cor recente',\n        more: 'Mais cores',\n        background: 'Fundo',\n        foreground: 'Fonte',\n        transparent: 'Transparente',\n        setTransparent: 'Fundo transparente',\n        reset: 'Restaurar',\n        resetToDefault: 'Restaurar padrão',\n        cpSelect: 'Selecionar',\n      },\n      shortcut: {\n        shortcuts: 'Atalhos do teclado',\n        close: 'Fechar',\n        textFormatting: 'Formatação de texto',\n        action: 'Ação',\n        paragraphFormatting: 'Formatação de parágrafo',\n        documentStyle: 'Estilo de documento',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Inserir Parágrafo',\n        'undo': 'Desfazer o último comando',\n        'redo': 'Refazer o último comando',\n        'tab': 'Tab',\n        'untab': 'Desfazer tab',\n        'bold': 'Colocar em negrito',\n        'italic': 'Colocar em itálico',\n        'underline': 'Sublinhado',\n        'strikethrough': 'Tachado',\n        'removeFormat': 'Remover estilo',\n        'justifyLeft': 'Alinhar à esquerda',\n        'justifyCenter': 'Centralizar',\n        'justifyRight': 'Alinhar à esquerda',\n        'justifyFull': 'Justificar',\n        'insertUnorderedList': 'Lista não ordenada',\n        'insertOrderedList': 'Lista ordenada',\n        'outdent': 'Recuar parágrafo atual',\n        'indent': 'Avançar parágrafo atual',\n        'formatPara': 'Alterar formato do bloco para parágrafo(tag P)',\n        'formatH1': 'Alterar formato do bloco para H1',\n        'formatH2': 'Alterar formato do bloco para H2',\n        'formatH3': 'Alterar formato do bloco para H3',\n        'formatH4': 'Alterar formato do bloco para H4',\n        'formatH5': 'Alterar formato do bloco para H5',\n        'formatH6': 'Alterar formato do bloco para H6',\n        'insertHorizontalRule': 'Inserir Régua horizontal',\n        'linkDialog.show': 'Inserir um Hiperlink',\n      },\n      history: {\n        undo: 'Desfazer',\n        redo: 'Refazer',\n      },\n      specialChar: {\n        specialChar: 'CARACTERES ESPECIAIS',\n        select: 'Selecionar Caracteres Especiais',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js
new file mode 100644
index 0000000..9494a86
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var r=a();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"pt-BR":{font:{bold:"Negrito",italic:"Itálico",underline:"Sublinhado",clear:"Remover estilo da fonte",height:"Altura da linha",name:"Fonte",strikethrough:"Riscado",subscript:"Subscrito",superscript:"Sobrescrito",size:"Tamanho da fonte"},image:{image:"Imagem",insert:"Inserir imagem",resizeFull:"Redimensionar Completamente",resizeHalf:"Redimensionar pela Metade",resizeQuarter:"Redimensionar a um Quarto",floatLeft:"Flutuar para Esquerda",floatRight:"Flutuar para Direita",floatNone:"Não Flutuar",shapeRounded:"Forma: Arredondado",shapeCircle:"Forma: Círculo",shapeThumbnail:"Forma: Miniatura",shapeNone:"Forma: Nenhum",dragImageHere:"Arraste Imagem ou Texto para cá",dropImage:"Solte Imagem ou Texto",selectFromFiles:"Selecione a partir dos arquivos",maximumFileSize:"Tamanho máximo do arquivo",maximumFileSizeError:"Tamanho máximo do arquivo excedido.",url:"URL da imagem",remove:"Remover Imagem",original:"Original"},video:{video:"Vídeo",videoLink:"Link para vídeo",insert:"Inserir vídeo",url:"URL do vídeo?",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"Link",insert:"Inserir link",unlink:"Remover link",edit:"Editar",textToDisplay:"Texto para exibir",url:"Para qual URL este link leva?",openInNewWindow:"Abrir em uma nova janela"},table:{table:"Tabela",addRowAbove:"Adicionar linha acima",addRowBelow:"Adicionar linha abaixo",addColLeft:"Adicionar coluna à esquerda",addColRight:"Adicionar coluna à direita",delRow:"Excluir linha",delCol:"Excluir coluna",delTable:"Excluir tabela"},hr:{insert:"Linha horizontal"},style:{style:"Estilo",p:"Normal",blockquote:"Citação",pre:"Código",h1:"Título 1",h2:"Título 2",h3:"Título 3",h4:"Título 4",h5:"Título 5",h6:"Título 6"},lists:{unordered:"Lista com marcadores",ordered:"Lista numerada"},options:{help:"Ajuda",fullscreen:"Tela cheia",codeview:"Ver código-fonte"},paragraph:{paragraph:"Parágrafo",outdent:"Menor tabulação",indent:"Maior tabulação",left:"Alinhar à esquerda",center:"Alinhar ao centro",right:"Alinha à direita",justify:"Justificado"},color:{recent:"Cor recente",more:"Mais cores",background:"Fundo",foreground:"Fonte",transparent:"Transparente",setTransparent:"Fundo transparente",reset:"Restaurar",resetToDefault:"Restaurar padrão",cpSelect:"Selecionar"},shortcut:{shortcuts:"Atalhos do teclado",close:"Fechar",textFormatting:"Formatação de texto",action:"Ação",paragraphFormatting:"Formatação de parágrafo",documentStyle:"Estilo de documento",extraKeys:"Extra keys"},help:{insertParagraph:"Inserir Parágrafo",undo:"Desfazer o último comando",redo:"Refazer o último comando",tab:"Tab",untab:"Desfazer tab",bold:"Colocar em negrito",italic:"Colocar em itálico",underline:"Sublinhado",strikethrough:"Tachado",removeFormat:"Remover estilo",justifyLeft:"Alinhar à esquerda",justifyCenter:"Centralizar",justifyRight:"Alinhar à esquerda",justifyFull:"Justificar",insertUnorderedList:"Lista não ordenada",insertOrderedList:"Lista ordenada",outdent:"Recuar parágrafo atual",indent:"Avançar parágrafo atual",formatPara:"Alterar formato do bloco para parágrafo(tag P)",formatH1:"Alterar formato do bloco para H1",formatH2:"Alterar formato do bloco para H2",formatH3:"Alterar formato do bloco para H3",formatH4:"Alterar formato do bloco para H4",formatH5:"Alterar formato do bloco para H5",formatH6:"Alterar formato do bloco para H6",insertHorizontalRule:"Inserir Régua horizontal","linkDialog.show":"Inserir um Hiperlink"},history:{undo:"Desfazer",redo:"Refazer"},specialChar:{specialChar:"CARACTERES ESPECIAIS",select:"Selecionar Caracteres Especiais"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-BR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js
new file mode 100644
index 0000000..079c258
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'pt-PT': {
+      font: {
+        bold: 'Negrito',
+        italic: 'Itálico',
+        underline: 'Sublinhado',
+        clear: 'Remover estilo da fonte',
+        height: 'Altura da linha',
+        name: 'Fonte',
+        strikethrough: 'Riscado',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Tamanho da fonte'
+      },
+      image: {
+        image: 'Imagem',
+        insert: 'Inserir imagem',
+        resizeFull: 'Redimensionar Completo',
+        resizeHalf: 'Redimensionar Metade',
+        resizeQuarter: 'Redimensionar Um Quarto',
+        floatLeft: 'Float Esquerda',
+        floatRight: 'Float Direita',
+        floatNone: 'Sem Float',
+        shapeRounded: 'Forma: Arredondado',
+        shapeCircle: 'Forma: Círculo',
+        shapeThumbnail: 'Forma: Minhatura',
+        shapeNone: 'Forma: Nenhum',
+        dragImageHere: 'Arraste uma imagem para aqui',
+        dropImage: 'Arraste uma imagem ou texto',
+        selectFromFiles: 'Selecione a partir dos arquivos',
+        maximumFileSize: 'Tamanho máximo do fixeiro',
+        maximumFileSizeError: 'Tamanho máximo do fixeiro é maior que o permitido.',
+        url: 'Endereço da imagem',
+        remove: 'Remover Imagem',
+        original: 'Original'
+      },
+      video: {
+        video: 'Vídeo',
+        videoLink: 'Link para vídeo',
+        insert: 'Inserir vídeo',
+        url: 'URL do vídeo?',
+        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Inserir ligação',
+        unlink: 'Remover ligação',
+        edit: 'Editar',
+        textToDisplay: 'Texto para exibir',
+        url: 'Que endereço esta licação leva?',
+        openInNewWindow: 'Abrir numa nova janela'
+      },
+      table: {
+        table: 'Tabela',
+        addRowAbove: 'Adicionar linha acima',
+        addRowBelow: 'Adicionar linha abaixo',
+        addColLeft: 'Adicionar coluna à Esquerda',
+        addColRight: 'Adicionar coluna à Esquerda',
+        delRow: 'Excluir linha',
+        delCol: 'Excluir coluna',
+        delTable: 'Excluir tabela'
+      },
+      hr: {
+        insert: 'Inserir linha horizontal'
+      },
+      style: {
+        style: 'Estilo',
+        p: 'Parágrafo',
+        blockquote: 'Citação',
+        pre: 'Código',
+        h1: 'Título 1',
+        h2: 'Título 2',
+        h3: 'Título 3',
+        h4: 'Título 4',
+        h5: 'Título 5',
+        h6: 'Título 6'
+      },
+      lists: {
+        unordered: 'Lista com marcadores',
+        ordered: 'Lista numerada'
+      },
+      options: {
+        help: 'Ajuda',
+        fullscreen: 'Janela Completa',
+        codeview: 'Ver código-fonte'
+      },
+      paragraph: {
+        paragraph: 'Parágrafo',
+        outdent: 'Menor tabulação',
+        indent: 'Maior tabulação',
+        left: 'Alinhar à esquerda',
+        center: 'Alinhar ao centro',
+        right: 'Alinha à direita',
+        justify: 'Justificado'
+      },
+      color: {
+        recent: 'Cor recente',
+        more: 'Mais cores',
+        background: 'Fundo',
+        foreground: 'Fonte',
+        transparent: 'Transparente',
+        setTransparent: 'Fundo transparente',
+        reset: 'Restaurar',
+        resetToDefault: 'Restaurar padrão',
+        cpSelect: 'Selecionar'
+      },
+      shortcut: {
+        shortcuts: 'Atalhos do teclado',
+        close: 'Fechar',
+        textFormatting: 'Formatação de texto',
+        action: 'Ação',
+        paragraphFormatting: 'Formatação de parágrafo',
+        documentStyle: 'Estilo de documento'
+      },
+      help: {
+        'insertParagraph': 'Inserir Parágrafo',
+        'undo': 'Desfazer o último comando',
+        'redo': 'Refazer o último comando',
+        'tab': 'Maior tabulação',
+        'untab': 'Menor tabulação',
+        'bold': 'Colocar em negrito',
+        'italic': 'Colocar em itálico',
+        'underline': 'Colocar em sublinhado',
+        'strikethrough': 'Colocar em riscado',
+        'removeFormat': 'Limpar o estilo',
+        'justifyLeft': 'Definir alinhado à esquerda',
+        'justifyCenter': 'Definir alinhado ao centro',
+        'justifyRight': 'Definir alinhado à direita',
+        'justifyFull': 'Definir justificado',
+        'insertUnorderedList': 'Alternar lista não ordenada',
+        'insertOrderedList': 'Alternar lista ordenada',
+        'outdent': 'Recuar parágrafo atual',
+        'indent': 'Avançar parágrafo atual',
+        'formatPara': 'Alterar formato do bloco para parágrafo',
+        'formatH1': 'Alterar formato do bloco para Título 1',
+        'formatH2': 'Alterar formato do bloco para Título 2',
+        'formatH3': 'Alterar formato do bloco para Título 3',
+        'formatH4': 'Alterar formato do bloco para Título 4',
+        'formatH5': 'Alterar formato do bloco para Título 5',
+        'formatH6': 'Alterar formato do bloco para Título 6',
+        'insertHorizontalRule': 'Inserir linha horizontal',
+        'linkDialog.show': 'Inserir uma ligração'
+      },
+      history: {
+        undo: 'Desfazer',
+        redo: 'Refazer'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-pt-PT.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js.map
new file mode 100644
index 0000000..361d415
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-pt-PT.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-pt-PT.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'pt-PT': {\n      font: {\n        bold: 'Negrito',\n        italic: 'Itálico',\n        underline: 'Sublinhado',\n        clear: 'Remover estilo da fonte',\n        height: 'Altura da linha',\n        name: 'Fonte',\n        strikethrough: 'Riscado',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Tamanho da fonte',\n      },\n      image: {\n        image: 'Imagem',\n        insert: 'Inserir imagem',\n        resizeFull: 'Redimensionar Completo',\n        resizeHalf: 'Redimensionar Metade',\n        resizeQuarter: 'Redimensionar Um Quarto',\n        floatLeft: 'Float Esquerda',\n        floatRight: 'Float Direita',\n        floatNone: 'Sem Float',\n        shapeRounded: 'Forma: Arredondado',\n        shapeCircle: 'Forma: Círculo',\n        shapeThumbnail: 'Forma: Minhatura',\n        shapeNone: 'Forma: Nenhum',\n        dragImageHere: 'Arraste uma imagem para aqui',\n        dropImage: 'Arraste uma imagem ou texto',\n        selectFromFiles: 'Selecione a partir dos arquivos',\n        maximumFileSize: 'Tamanho máximo do fixeiro',\n        maximumFileSizeError: 'Tamanho máximo do fixeiro é maior que o permitido.',\n        url: 'Endereço da imagem',\n        remove: 'Remover Imagem',\n        original: 'Original',\n      },\n      video: {\n        video: 'Vídeo',\n        videoLink: 'Link para vídeo',\n        insert: 'Inserir vídeo',\n        url: 'URL do vídeo?',\n        providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Inserir ligação',\n        unlink: 'Remover ligação',\n        edit: 'Editar',\n        textToDisplay: 'Texto para exibir',\n        url: 'Que endereço esta licação leva?',\n        openInNewWindow: 'Abrir numa nova janela',\n      },\n      table: {\n        table: 'Tabela',\n        addRowAbove: 'Adicionar linha acima',\n        addRowBelow: 'Adicionar linha abaixo',\n        addColLeft: 'Adicionar coluna à Esquerda',\n        addColRight: 'Adicionar coluna à Esquerda',\n        delRow: 'Excluir linha',\n        delCol: 'Excluir coluna',\n        delTable: 'Excluir tabela',\n      },\n      hr: {\n        insert: 'Inserir linha horizontal',\n      },\n      style: {\n        style: 'Estilo',\n        p: 'Parágrafo',\n        blockquote: 'Citação',\n        pre: 'Código',\n        h1: 'Título 1',\n        h2: 'Título 2',\n        h3: 'Título 3',\n        h4: 'Título 4',\n        h5: 'Título 5',\n        h6: 'Título 6',\n      },\n      lists: {\n        unordered: 'Lista com marcadores',\n        ordered: 'Lista numerada',\n      },\n      options: {\n        help: 'Ajuda',\n        fullscreen: 'Janela Completa',\n        codeview: 'Ver código-fonte',\n      },\n      paragraph: {\n        paragraph: 'Parágrafo',\n        outdent: 'Menor tabulação',\n        indent: 'Maior tabulação',\n        left: 'Alinhar à esquerda',\n        center: 'Alinhar ao centro',\n        right: 'Alinha à direita',\n        justify: 'Justificado',\n      },\n      color: {\n        recent: 'Cor recente',\n        more: 'Mais cores',\n        background: 'Fundo',\n        foreground: 'Fonte',\n        transparent: 'Transparente',\n        setTransparent: 'Fundo transparente',\n        reset: 'Restaurar',\n        resetToDefault: 'Restaurar padrão',\n        cpSelect: 'Selecionar',\n      },\n      shortcut: {\n        shortcuts: 'Atalhos do teclado',\n        close: 'Fechar',\n        textFormatting: 'Formatação de texto',\n        action: 'Ação',\n        paragraphFormatting: 'Formatação de parágrafo',\n        documentStyle: 'Estilo de documento',\n      },\n      help: {\n        'insertParagraph': 'Inserir Parágrafo',\n        'undo': 'Desfazer o último comando',\n        'redo': 'Refazer o último comando',\n        'tab': 'Maior tabulação',\n        'untab': 'Menor tabulação',\n        'bold': 'Colocar em negrito',\n        'italic': 'Colocar em itálico',\n        'underline': 'Colocar em sublinhado',\n        'strikethrough': 'Colocar em riscado',\n        'removeFormat': 'Limpar o estilo',\n        'justifyLeft': 'Definir alinhado à esquerda',\n        'justifyCenter': 'Definir alinhado ao centro',\n        'justifyRight': 'Definir alinhado à direita',\n        'justifyFull': 'Definir justificado',\n        'insertUnorderedList': 'Alternar lista não ordenada',\n        'insertOrderedList': 'Alternar lista ordenada',\n        'outdent': 'Recuar parágrafo atual',\n        'indent': 'Avançar parágrafo atual',\n        'formatPara': 'Alterar formato do bloco para parágrafo',\n        'formatH1': 'Alterar formato do bloco para Título 1',\n        'formatH2': 'Alterar formato do bloco para Título 2',\n        'formatH3': 'Alterar formato do bloco para Título 3',\n        'formatH4': 'Alterar formato do bloco para Título 4',\n        'formatH5': 'Alterar formato do bloco para Título 5',\n        'formatH6': 'Alterar formato do bloco para Título 6',\n        'insertHorizontalRule': 'Inserir linha horizontal',\n        'linkDialog.show': 'Inserir uma ligração',\n      },\n      history: {\n        undo: 'Desfazer',\n        redo: 'Refazer',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js
new file mode 100644
index 0000000..1e94d2b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(a,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var o=e();for(var r in o)("object"==typeof exports?exports:a)[r]=o[r]}}(self,(function(){return(a=jQuery).extend(a.summernote.lang,{"pt-PT":{font:{bold:"Negrito",italic:"Itálico",underline:"Sublinhado",clear:"Remover estilo da fonte",height:"Altura da linha",name:"Fonte",strikethrough:"Riscado",subscript:"Subscript",superscript:"Superscript",size:"Tamanho da fonte"},image:{image:"Imagem",insert:"Inserir imagem",resizeFull:"Redimensionar Completo",resizeHalf:"Redimensionar Metade",resizeQuarter:"Redimensionar Um Quarto",floatLeft:"Float Esquerda",floatRight:"Float Direita",floatNone:"Sem Float",shapeRounded:"Forma: Arredondado",shapeCircle:"Forma: Círculo",shapeThumbnail:"Forma: Minhatura",shapeNone:"Forma: Nenhum",dragImageHere:"Arraste uma imagem para aqui",dropImage:"Arraste uma imagem ou texto",selectFromFiles:"Selecione a partir dos arquivos",maximumFileSize:"Tamanho máximo do fixeiro",maximumFileSizeError:"Tamanho máximo do fixeiro é maior que o permitido.",url:"Endereço da imagem",remove:"Remover Imagem",original:"Original"},video:{video:"Vídeo",videoLink:"Link para vídeo",insert:"Inserir vídeo",url:"URL do vídeo?",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"Link",insert:"Inserir ligação",unlink:"Remover ligação",edit:"Editar",textToDisplay:"Texto para exibir",url:"Que endereço esta licação leva?",openInNewWindow:"Abrir numa nova janela"},table:{table:"Tabela",addRowAbove:"Adicionar linha acima",addRowBelow:"Adicionar linha abaixo",addColLeft:"Adicionar coluna à Esquerda",addColRight:"Adicionar coluna à Esquerda",delRow:"Excluir linha",delCol:"Excluir coluna",delTable:"Excluir tabela"},hr:{insert:"Inserir linha horizontal"},style:{style:"Estilo",p:"Parágrafo",blockquote:"Citação",pre:"Código",h1:"Título 1",h2:"Título 2",h3:"Título 3",h4:"Título 4",h5:"Título 5",h6:"Título 6"},lists:{unordered:"Lista com marcadores",ordered:"Lista numerada"},options:{help:"Ajuda",fullscreen:"Janela Completa",codeview:"Ver código-fonte"},paragraph:{paragraph:"Parágrafo",outdent:"Menor tabulação",indent:"Maior tabulação",left:"Alinhar à esquerda",center:"Alinhar ao centro",right:"Alinha à direita",justify:"Justificado"},color:{recent:"Cor recente",more:"Mais cores",background:"Fundo",foreground:"Fonte",transparent:"Transparente",setTransparent:"Fundo transparente",reset:"Restaurar",resetToDefault:"Restaurar padrão",cpSelect:"Selecionar"},shortcut:{shortcuts:"Atalhos do teclado",close:"Fechar",textFormatting:"Formatação de texto",action:"Ação",paragraphFormatting:"Formatação de parágrafo",documentStyle:"Estilo de documento"},help:{insertParagraph:"Inserir Parágrafo",undo:"Desfazer o último comando",redo:"Refazer o último comando",tab:"Maior tabulação",untab:"Menor tabulação",bold:"Colocar em negrito",italic:"Colocar em itálico",underline:"Colocar em sublinhado",strikethrough:"Colocar em riscado",removeFormat:"Limpar o estilo",justifyLeft:"Definir alinhado à esquerda",justifyCenter:"Definir alinhado ao centro",justifyRight:"Definir alinhado à direita",justifyFull:"Definir justificado",insertUnorderedList:"Alternar lista não ordenada",insertOrderedList:"Alternar lista ordenada",outdent:"Recuar parágrafo atual",indent:"Avançar parágrafo atual",formatPara:"Alterar formato do bloco para parágrafo",formatH1:"Alterar formato do bloco para Título 1",formatH2:"Alterar formato do bloco para Título 2",formatH3:"Alterar formato do bloco para Título 3",formatH4:"Alterar formato do bloco para Título 4",formatH5:"Alterar formato do bloco para Título 5",formatH6:"Alterar formato do bloco para Título 6",insertHorizontalRule:"Inserir linha horizontal","linkDialog.show":"Inserir uma ligração"},history:{undo:"Desfazer",redo:"Refazer"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var a}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-pt-PT.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js
new file mode 100644
index 0000000..04eb116
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'ro-RO': {
+      font: {
+        bold: 'Îngroșat',
+        italic: 'Înclinat',
+        underline: 'Subliniat',
+        clear: 'Înlătură formatare font',
+        height: 'Înălțime rând',
+        name: 'Familie de fonturi',
+        strikethrough: 'Tăiat',
+        subscript: 'Indice',
+        superscript: 'Exponent',
+        size: 'Dimensiune font'
+      },
+      image: {
+        image: 'Imagine',
+        insert: 'Inserează imagine',
+        resizeFull: 'Redimensionează complet',
+        resizeHalf: 'Redimensionează 1/2',
+        resizeQuarter: 'Redimensionează 1/4',
+        floatLeft: 'Aliniere la stânga',
+        floatRight: 'Aliniere la dreapta',
+        floatNone: 'Fară aliniere',
+        shapeRounded: 'Formă: Rotund',
+        shapeCircle: 'Formă: Cerc',
+        shapeThumbnail: 'Formă: Pictogramă',
+        shapeNone: 'Formă: Nici una',
+        dragImageHere: 'Trage o imagine sau un text aici',
+        dropImage: 'Eliberează imaginea sau textul',
+        selectFromFiles: 'Alege din fişiere',
+        maximumFileSize: 'Dimensiune maximă fișier',
+        maximumFileSizeError: 'Dimensiune maximă fișier depășită.',
+        url: 'URL imagine',
+        remove: 'Șterge imagine',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Link video',
+        insert: 'Inserează video',
+        url: 'URL video?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion sau Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Inserează link',
+        unlink: 'Înlătură link',
+        edit: 'Editează',
+        textToDisplay: 'Text ce va fi afişat',
+        url: 'La ce adresă URL trebuie să conducă acest link?',
+        openInNewWindow: 'Deschidere în fereastră nouă'
+      },
+      table: {
+        table: 'Tabel',
+        addRowAbove: 'Adaugă rând deasupra',
+        addRowBelow: 'Adaugă rând dedesubt',
+        addColLeft: 'Adaugă coloană stânga',
+        addColRight: 'Adaugă coloană dreapta',
+        delRow: 'Șterge rând',
+        delCol: 'Șterge coloană',
+        delTable: 'Șterge tabel'
+      },
+      hr: {
+        insert: 'Inserează o linie orizontală'
+      },
+      style: {
+        style: 'Stil',
+        p: 'p',
+        blockquote: 'Citat',
+        pre: 'Preformatat',
+        h1: 'Titlu 1',
+        h2: 'Titlu 2',
+        h3: 'Titlu 3',
+        h4: 'Titlu 4',
+        h5: 'Titlu 5',
+        h6: 'Titlu 6'
+      },
+      lists: {
+        unordered: 'Listă neordonată',
+        ordered: 'Listă ordonată'
+      },
+      options: {
+        help: 'Ajutor',
+        fullscreen: 'Măreşte',
+        codeview: 'Sursă'
+      },
+      paragraph: {
+        paragraph: 'Paragraf',
+        outdent: 'Creşte identarea',
+        indent: 'Scade identarea',
+        left: 'Aliniere la stânga',
+        center: 'Aliniere centrală',
+        right: 'Aliniere la dreapta',
+        justify: 'Aliniere în bloc'
+      },
+      color: {
+        recent: 'Culoare recentă',
+        more: 'Mai multe  culori',
+        background: 'Culoarea fundalului',
+        foreground: 'Culoarea textului',
+        transparent: 'Transparent',
+        setTransparent: 'Setează transparent',
+        reset: 'Resetează',
+        resetToDefault: 'Revino la iniţial'
+      },
+      shortcut: {
+        shortcuts: 'Scurtături tastatură',
+        close: 'Închide',
+        textFormatting: 'Formatare text',
+        action: 'Acţiuni',
+        paragraphFormatting: 'Formatare paragraf',
+        documentStyle: 'Stil paragraf',
+        extraKeys: 'Taste extra'
+      },
+      help: {
+        'insertParagraph': 'Inserează paragraf',
+        'undo': 'Revine la starea anterioară',
+        'redo': 'Revine la starea ulterioară',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Setează stil îngroșat',
+        'italic': 'Setează stil înclinat',
+        'underline': 'Setează stil subliniat',
+        'strikethrough': 'Setează stil tăiat',
+        'removeFormat': 'Înlătură formatare',
+        'justifyLeft': 'Setează aliniere stânga',
+        'justifyCenter': 'Setează aliniere centru',
+        'justifyRight': 'Setează aliniere dreapta',
+        'justifyFull': 'Setează aliniere bloc',
+        'insertUnorderedList': 'Comutare listă neordinată',
+        'insertOrderedList': 'Comutare listă ordonată',
+        'outdent': 'Înlătură indentare paragraf curent',
+        'indent': 'Adaugă indentare paragraf curent',
+        'formatPara': 'Schimbă formatarea selecției în paragraf',
+        'formatH1': 'Schimbă formatarea selecției în H1',
+        'formatH2': 'Schimbă formatarea selecției în H2',
+        'formatH3': 'Schimbă formatarea selecției în H3',
+        'formatH4': 'Schimbă formatarea selecției în H4',
+        'formatH5': 'Schimbă formatarea selecției în H5',
+        'formatH6': 'Schimbă formatarea selecției în H6',
+        'insertHorizontalRule': 'Adaugă linie orizontală',
+        'linkDialog.show': 'Inserează link'
+      },
+      history: {
+        undo: 'Starea anterioară',
+        redo: 'Starea ulterioară'
+      },
+      specialChar: {
+        specialChar: 'CARACTERE SPECIALE',
+        select: 'Alege caractere speciale'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-ro-RO.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js.map
new file mode 100644
index 0000000..478a248
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-ro-RO.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-ro-RO.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'ro-RO': {\n      font: {\n        bold: 'Îngroșat',\n        italic: 'Înclinat',\n        underline: 'Subliniat',\n        clear: 'Înlătură formatare font',\n        height: 'Înălțime rând',\n        name: 'Familie de fonturi',\n        strikethrough: 'Tăiat',\n        subscript: 'Indice',\n        superscript: 'Exponent',\n        size: 'Dimensiune font',\n      },\n      image: {\n        image: 'Imagine',\n        insert: 'Inserează imagine',\n        resizeFull: 'Redimensionează complet',\n        resizeHalf: 'Redimensionează 1/2',\n        resizeQuarter: 'Redimensionează 1/4',\n        floatLeft: 'Aliniere la stânga',\n        floatRight: 'Aliniere la dreapta',\n        floatNone: 'Fară aliniere',\n        shapeRounded: 'Formă: Rotund',\n        shapeCircle: 'Formă: Cerc',\n        shapeThumbnail: 'Formă: Pictogramă',\n        shapeNone: 'Formă: Nici una',\n        dragImageHere: 'Trage o imagine sau un text aici',\n        dropImage: 'Eliberează imaginea sau textul',\n        selectFromFiles: 'Alege din fişiere',\n        maximumFileSize: 'Dimensiune maximă fișier',\n        maximumFileSizeError: 'Dimensiune maximă fișier depășită.',\n        url: 'URL imagine',\n        remove: 'Șterge imagine',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Link video',\n        insert: 'Inserează video',\n        url: 'URL video?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion sau Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Inserează link',\n        unlink: 'Înlătură link',\n        edit: 'Editează',\n        textToDisplay: 'Text ce va fi afişat',\n        url: 'La ce adresă URL trebuie să conducă acest link?',\n        openInNewWindow: 'Deschidere în fereastră nouă',\n      },\n      table: {\n        table: 'Tabel',\n        addRowAbove: 'Adaugă rând deasupra',\n        addRowBelow: 'Adaugă rând dedesubt',\n        addColLeft: 'Adaugă coloană stânga',\n        addColRight: 'Adaugă coloană dreapta',\n        delRow: 'Șterge rând',\n        delCol: 'Șterge coloană',\n        delTable: 'Șterge tabel',\n      },\n      hr: {\n        insert: 'Inserează o linie orizontală',\n      },\n      style: {\n        style: 'Stil',\n        p: 'p',\n        blockquote: 'Citat',\n        pre: 'Preformatat',\n        h1: 'Titlu 1',\n        h2: 'Titlu 2',\n        h3: 'Titlu 3',\n        h4: 'Titlu 4',\n        h5: 'Titlu 5',\n        h6: 'Titlu 6',\n      },\n      lists: {\n        unordered: 'Listă neordonată',\n        ordered: 'Listă ordonată',\n      },\n      options: {\n        help: 'Ajutor',\n        fullscreen: 'Măreşte',\n        codeview: 'Sursă',\n      },\n      paragraph: {\n        paragraph: 'Paragraf',\n        outdent: 'Creşte identarea',\n        indent: 'Scade identarea',\n        left: 'Aliniere la stânga',\n        center: 'Aliniere centrală',\n        right: 'Aliniere la dreapta',\n        justify: 'Aliniere în bloc',\n      },\n      color: {\n        recent: 'Culoare recentă',\n        more: 'Mai multe  culori',\n        background: 'Culoarea fundalului',\n        foreground: 'Culoarea textului',\n        transparent: 'Transparent',\n        setTransparent: 'Setează transparent',\n        reset: 'Resetează',\n        resetToDefault: 'Revino la iniţial',\n      },\n      shortcut: {\n        shortcuts: 'Scurtături tastatură',\n        close: 'Închide',\n        textFormatting: 'Formatare text',\n        action: 'Acţiuni',\n        paragraphFormatting: 'Formatare paragraf',\n        documentStyle: 'Stil paragraf',\n        extraKeys: 'Taste extra',\n      },\n      help: {\n        'insertParagraph': 'Inserează paragraf',\n        'undo': 'Revine la starea anterioară',\n        'redo': 'Revine la starea ulterioară',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Setează stil îngroșat',\n        'italic': 'Setează stil înclinat',\n        'underline': 'Setează stil subliniat',\n        'strikethrough': 'Setează stil tăiat',\n        'removeFormat': 'Înlătură formatare',\n        'justifyLeft': 'Setează aliniere stânga',\n        'justifyCenter': 'Setează aliniere centru',\n        'justifyRight': 'Setează aliniere dreapta',\n        'justifyFull': 'Setează aliniere bloc',\n        'insertUnorderedList': 'Comutare listă neordinată',\n        'insertOrderedList': 'Comutare listă ordonată',\n        'outdent': 'Înlătură indentare paragraf curent',\n        'indent': 'Adaugă indentare paragraf curent',\n        'formatPara': 'Schimbă formatarea selecției în paragraf',\n        'formatH1': 'Schimbă formatarea selecției în H1',\n        'formatH2': 'Schimbă formatarea selecției în H2',\n        'formatH3': 'Schimbă formatarea selecției în H3',\n        'formatH4': 'Schimbă formatarea selecției în H4',\n        'formatH5': 'Schimbă formatarea selecției în H5',\n        'formatH6': 'Schimbă formatarea selecției în H6',\n        'insertHorizontalRule': 'Adaugă linie orizontală',\n        'linkDialog.show': 'Inserează link',\n      },\n      history: {\n        undo: 'Starea anterioară',\n        redo: 'Starea ulterioară',\n      },\n      specialChar: {\n        specialChar: 'CARACTERE SPECIALE',\n        select: 'Alege caractere speciale',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js
new file mode 100644
index 0000000..cc8e41e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var r=a();for(var i in r)("object"==typeof exports?exports:e)[i]=r[i]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"ro-RO":{font:{bold:"Îngroșat",italic:"Înclinat",underline:"Subliniat",clear:"Înlătură formatare font",height:"Înălțime rând",name:"Familie de fonturi",strikethrough:"Tăiat",subscript:"Indice",superscript:"Exponent",size:"Dimensiune font"},image:{image:"Imagine",insert:"Inserează imagine",resizeFull:"Redimensionează complet",resizeHalf:"Redimensionează 1/2",resizeQuarter:"Redimensionează 1/4",floatLeft:"Aliniere la stânga",floatRight:"Aliniere la dreapta",floatNone:"Fară aliniere",shapeRounded:"Formă: Rotund",shapeCircle:"Formă: Cerc",shapeThumbnail:"Formă: Pictogramă",shapeNone:"Formă: Nici una",dragImageHere:"Trage o imagine sau un text aici",dropImage:"Eliberează imaginea sau textul",selectFromFiles:"Alege din fişiere",maximumFileSize:"Dimensiune maximă fișier",maximumFileSizeError:"Dimensiune maximă fișier depășită.",url:"URL imagine",remove:"Șterge imagine",original:"Original"},video:{video:"Video",videoLink:"Link video",insert:"Inserează video",url:"URL video?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion sau Youku)"},link:{link:"Link",insert:"Inserează link",unlink:"Înlătură link",edit:"Editează",textToDisplay:"Text ce va fi afişat",url:"La ce adresă URL trebuie să conducă acest link?",openInNewWindow:"Deschidere în fereastră nouă"},table:{table:"Tabel",addRowAbove:"Adaugă rând deasupra",addRowBelow:"Adaugă rând dedesubt",addColLeft:"Adaugă coloană stânga",addColRight:"Adaugă coloană dreapta",delRow:"Șterge rând",delCol:"Șterge coloană",delTable:"Șterge tabel"},hr:{insert:"Inserează o linie orizontală"},style:{style:"Stil",p:"p",blockquote:"Citat",pre:"Preformatat",h1:"Titlu 1",h2:"Titlu 2",h3:"Titlu 3",h4:"Titlu 4",h5:"Titlu 5",h6:"Titlu 6"},lists:{unordered:"Listă neordonată",ordered:"Listă ordonată"},options:{help:"Ajutor",fullscreen:"Măreşte",codeview:"Sursă"},paragraph:{paragraph:"Paragraf",outdent:"Creşte identarea",indent:"Scade identarea",left:"Aliniere la stânga",center:"Aliniere centrală",right:"Aliniere la dreapta",justify:"Aliniere în bloc"},color:{recent:"Culoare recentă",more:"Mai multe  culori",background:"Culoarea fundalului",foreground:"Culoarea textului",transparent:"Transparent",setTransparent:"Setează transparent",reset:"Resetează",resetToDefault:"Revino la iniţial"},shortcut:{shortcuts:"Scurtături tastatură",close:"Închide",textFormatting:"Formatare text",action:"Acţiuni",paragraphFormatting:"Formatare paragraf",documentStyle:"Stil paragraf",extraKeys:"Taste extra"},help:{insertParagraph:"Inserează paragraf",undo:"Revine la starea anterioară",redo:"Revine la starea ulterioară",tab:"Tab",untab:"Untab",bold:"Setează stil îngroșat",italic:"Setează stil înclinat",underline:"Setează stil subliniat",strikethrough:"Setează stil tăiat",removeFormat:"Înlătură formatare",justifyLeft:"Setează aliniere stânga",justifyCenter:"Setează aliniere centru",justifyRight:"Setează aliniere dreapta",justifyFull:"Setează aliniere bloc",insertUnorderedList:"Comutare listă neordinată",insertOrderedList:"Comutare listă ordonată",outdent:"Înlătură indentare paragraf curent",indent:"Adaugă indentare paragraf curent",formatPara:"Schimbă formatarea selecției în paragraf",formatH1:"Schimbă formatarea selecției în H1",formatH2:"Schimbă formatarea selecției în H2",formatH3:"Schimbă formatarea selecției în H3",formatH4:"Schimbă formatarea selecției în H4",formatH5:"Schimbă formatarea selecției în H5",formatH6:"Schimbă formatarea selecției în H6",insertHorizontalRule:"Adaugă linie orizontală","linkDialog.show":"Inserează link"},history:{undo:"Starea anterioară",redo:"Starea ulterioară"},specialChar:{specialChar:"CARACTERE SPECIALE",select:"Alege caractere speciale"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ro-RO.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js
new file mode 100644
index 0000000..c000bf2
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'ru-RU': {
+      font: {
+        bold: 'Полужирный',
+        italic: 'Курсив',
+        underline: 'Подчёркнутый',
+        clear: 'Убрать стили шрифта',
+        height: 'Высота линии',
+        name: 'Шрифт',
+        strikethrough: 'Зачёркнутый',
+        subscript: 'Нижний индекс',
+        superscript: 'Верхний индекс',
+        size: 'Размер шрифта'
+      },
+      image: {
+        image: 'Картинка',
+        insert: 'Вставить картинку',
+        resizeFull: 'Восстановить размер',
+        resizeHalf: 'Уменьшить до 50%',
+        resizeQuarter: 'Уменьшить до 25%',
+        floatLeft: 'Расположить слева',
+        floatRight: 'Расположить справа',
+        floatNone: 'Расположение по-умолчанию',
+        shapeRounded: 'Форма: Закругленная',
+        shapeCircle: 'Форма: Круг',
+        shapeThumbnail: 'Форма: Миниатюра',
+        shapeNone: 'Форма: Нет',
+        dragImageHere: 'Перетащите сюда картинку',
+        dropImage: 'Перетащите картинку',
+        selectFromFiles: 'Выбрать из файлов',
+        maximumFileSize: 'Максимальный размер файла',
+        maximumFileSizeError: 'Превышен максимальный размер файла',
+        url: 'URL картинки',
+        remove: 'Удалить картинку',
+        original: 'Оригинал'
+      },
+      video: {
+        video: 'Видео',
+        videoLink: 'Ссылка на видео',
+        insert: 'Вставить видео',
+        url: 'URL видео',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)'
+      },
+      link: {
+        link: 'Ссылка',
+        insert: 'Вставить ссылку',
+        unlink: 'Убрать ссылку',
+        edit: 'Редактировать',
+        textToDisplay: 'Отображаемый текст',
+        url: 'URL для перехода',
+        openInNewWindow: 'Открывать в новом окне',
+        useProtocol: 'Использовать протокол по умолчанию'
+      },
+      table: {
+        table: 'Таблица',
+        addRowAbove: 'Добавить строку выше',
+        addRowBelow: 'Добавить строку ниже',
+        addColLeft: 'Добавить столбец слева',
+        addColRight: 'Добавить столбец справа',
+        delRow: 'Удалить строку',
+        delCol: 'Удалить столбец',
+        delTable: 'Удалить таблицу'
+      },
+      hr: {
+        insert: 'Вставить горизонтальную линию'
+      },
+      style: {
+        style: 'Стиль',
+        p: 'Нормальный',
+        blockquote: 'Цитата',
+        pre: 'Код',
+        h1: 'Заголовок 1',
+        h2: 'Заголовок 2',
+        h3: 'Заголовок 3',
+        h4: 'Заголовок 4',
+        h5: 'Заголовок 5',
+        h6: 'Заголовок 6'
+      },
+      lists: {
+        unordered: 'Маркированный список',
+        ordered: 'Нумерованный список'
+      },
+      options: {
+        help: 'Помощь',
+        fullscreen: 'На весь экран',
+        codeview: 'Исходный код'
+      },
+      paragraph: {
+        paragraph: 'Параграф',
+        outdent: 'Уменьшить отступ',
+        indent: 'Увеличить отступ',
+        left: 'Выровнять по левому краю',
+        center: 'Выровнять по центру',
+        right: 'Выровнять по правому краю',
+        justify: 'Растянуть по ширине'
+      },
+      color: {
+        recent: 'Последний цвет',
+        more: 'Еще цвета',
+        background: 'Цвет фона',
+        foreground: 'Цвет шрифта',
+        transparent: 'Прозрачный',
+        setTransparent: 'Сделать прозрачным',
+        reset: 'Сброс',
+        resetToDefault: 'Восстановить умолчания'
+      },
+      shortcut: {
+        shortcuts: 'Сочетания клавиш',
+        close: 'Закрыть',
+        textFormatting: 'Форматирование текста',
+        action: 'Действие',
+        paragraphFormatting: 'Форматирование параграфа',
+        documentStyle: 'Стиль документа',
+        extraKeys: 'Дополнительные комбинации'
+      },
+      help: {
+        'insertParagraph': 'Новый параграф',
+        'undo': 'Отменить последнюю команду',
+        'redo': 'Повторить последнюю команду',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Установить стиль "Жирный"',
+        'italic': 'Установить стиль "Наклонный"',
+        'underline': 'Установить стиль "Подчеркнутый"',
+        'strikethrough': 'Установить стиль "Зачеркнутый"',
+        'removeFormat': 'Сборсить стили',
+        'justifyLeft': 'Выровнять по левому краю',
+        'justifyCenter': 'Выровнять по центру',
+        'justifyRight': 'Выровнять по правому краю',
+        'justifyFull': 'Растянуть на всю ширину',
+        'insertUnorderedList': 'Включить/отключить маркированный список',
+        'insertOrderedList': 'Включить/отключить нумерованный список',
+        'outdent': 'Убрать отступ в текущем параграфе',
+        'indent': 'Вставить отступ в текущем параграфе',
+        'formatPara': 'Форматировать текущий блок как параграф (тег P)',
+        'formatH1': 'Форматировать текущий блок как H1',
+        'formatH2': 'Форматировать текущий блок как H2',
+        'formatH3': 'Форматировать текущий блок как H3',
+        'formatH4': 'Форматировать текущий блок как H4',
+        'formatH5': 'Форматировать текущий блок как H5',
+        'formatH6': 'Форматировать текущий блок как H6',
+        'insertHorizontalRule': 'Вставить горизонтальную черту',
+        'linkDialog.show': 'Показать диалог "Ссылка"'
+      },
+      history: {
+        undo: 'Отменить',
+        redo: 'Повтор'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-ru-RU.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js.map
new file mode 100644
index 0000000..a15cace
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-ru-RU.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-ru-RU.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'ru-RU': {\n      font: {\n        bold: 'Полужирный',\n        italic: 'Курсив',\n        underline: 'Подчёркнутый',\n        clear: 'Убрать стили шрифта',\n        height: 'Высота линии',\n        name: 'Шрифт',\n        strikethrough: 'Зачёркнутый',\n        subscript: 'Нижний индекс',\n        superscript: 'Верхний индекс',\n        size: 'Размер шрифта',\n      },\n      image: {\n        image: 'Картинка',\n        insert: 'Вставить картинку',\n        resizeFull: 'Восстановить размер',\n        resizeHalf: 'Уменьшить до 50%',\n        resizeQuarter: 'Уменьшить до 25%',\n        floatLeft: 'Расположить слева',\n        floatRight: 'Расположить справа',\n        floatNone: 'Расположение по-умолчанию',\n        shapeRounded: 'Форма: Закругленная',\n        shapeCircle: 'Форма: Круг',\n        shapeThumbnail: 'Форма: Миниатюра',\n        shapeNone: 'Форма: Нет',\n        dragImageHere: 'Перетащите сюда картинку',\n        dropImage: 'Перетащите картинку',\n        selectFromFiles: 'Выбрать из файлов',\n        maximumFileSize: 'Максимальный размер файла',\n        maximumFileSizeError: 'Превышен максимальный размер файла',\n        url: 'URL картинки',\n        remove: 'Удалить картинку',\n        original: 'Оригинал',\n      },\n      video: {\n        video: 'Видео',\n        videoLink: 'Ссылка на видео',\n        insert: 'Вставить видео',\n        url: 'URL видео',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)',\n      },\n      link: {\n        link: 'Ссылка',\n        insert: 'Вставить ссылку',\n        unlink: 'Убрать ссылку',\n        edit: 'Редактировать',\n        textToDisplay: 'Отображаемый текст',\n        url: 'URL для перехода',\n        openInNewWindow: 'Открывать в новом окне',\n        useProtocol: 'Использовать протокол по умолчанию',\n      },\n      table: {\n        table: 'Таблица',\n        addRowAbove: 'Добавить строку выше',\n        addRowBelow: 'Добавить строку ниже',\n        addColLeft: 'Добавить столбец слева',\n        addColRight: 'Добавить столбец справа',\n        delRow: 'Удалить строку',\n        delCol: 'Удалить столбец',\n        delTable: 'Удалить таблицу',\n      },\n      hr: {\n        insert: 'Вставить горизонтальную линию',\n      },\n      style: {\n        style: 'Стиль',\n        p: 'Нормальный',\n        blockquote: 'Цитата',\n        pre: 'Код',\n        h1: 'Заголовок 1',\n        h2: 'Заголовок 2',\n        h3: 'Заголовок 3',\n        h4: 'Заголовок 4',\n        h5: 'Заголовок 5',\n        h6: 'Заголовок 6',\n      },\n      lists: {\n        unordered: 'Маркированный список',\n        ordered: 'Нумерованный список',\n      },\n      options: {\n        help: 'Помощь',\n        fullscreen: 'На весь экран',\n        codeview: 'Исходный код',\n      },\n      paragraph: {\n        paragraph: 'Параграф',\n        outdent: 'Уменьшить отступ',\n        indent: 'Увеличить отступ',\n        left: 'Выровнять по левому краю',\n        center: 'Выровнять по центру',\n        right: 'Выровнять по правому краю',\n        justify: 'Растянуть по ширине',\n      },\n      color: {\n        recent: 'Последний цвет',\n        more: 'Еще цвета',\n        background: 'Цвет фона',\n        foreground: 'Цвет шрифта',\n        transparent: 'Прозрачный',\n        setTransparent: 'Сделать прозрачным',\n        reset: 'Сброс',\n        resetToDefault: 'Восстановить умолчания',\n      },\n      shortcut: {\n        shortcuts: 'Сочетания клавиш',\n        close: 'Закрыть',\n        textFormatting: 'Форматирование текста',\n        action: 'Действие',\n        paragraphFormatting: 'Форматирование параграфа',\n        documentStyle: 'Стиль документа',\n        extraKeys: 'Дополнительные комбинации',\n      },\n      help: {\n        'insertParagraph': 'Новый параграф',\n        'undo': 'Отменить последнюю команду',\n        'redo': 'Повторить последнюю команду',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Установить стиль \"Жирный\"',\n        'italic': 'Установить стиль \"Наклонный\"',\n        'underline': 'Установить стиль \"Подчеркнутый\"',\n        'strikethrough': 'Установить стиль \"Зачеркнутый\"',\n        'removeFormat': 'Сборсить стили',\n        'justifyLeft': 'Выровнять по левому краю',\n        'justifyCenter': 'Выровнять по центру',\n        'justifyRight': 'Выровнять по правому краю',\n        'justifyFull': 'Растянуть на всю ширину',\n        'insertUnorderedList': 'Включить/отключить маркированный список',\n        'insertOrderedList': 'Включить/отключить нумерованный список',\n        'outdent': 'Убрать отступ в текущем параграфе',\n        'indent': 'Вставить отступ в текущем параграфе',\n        'formatPara': 'Форматировать текущий блок как параграф (тег P)',\n        'formatH1': 'Форматировать текущий блок как H1',\n        'formatH2': 'Форматировать текущий блок как H2',\n        'formatH3': 'Форматировать текущий блок как H3',\n        'formatH4': 'Форматировать текущий блок как H4',\n        'formatH5': 'Форматировать текущий блок как H5',\n        'formatH6': 'Форматировать текущий блок как H6',\n        'insertHorizontalRule': 'Вставить горизонтальную черту',\n        'linkDialog.show': 'Показать диалог \"Ссылка\"',\n      },\n      history: {\n        undo: 'Отменить',\n        redo: 'Повтор',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js
new file mode 100644
index 0000000..e5c2599
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"ru-RU":{font:{bold:"Полужирный",italic:"Курсив",underline:"Подчёркнутый",clear:"Убрать стили шрифта",height:"Высота линии",name:"Шрифт",strikethrough:"Зачёркнутый",subscript:"Нижний индекс",superscript:"Верхний индекс",size:"Размер шрифта"},image:{image:"Картинка",insert:"Вставить картинку",resizeFull:"Восстановить размер",resizeHalf:"Уменьшить до 50%",resizeQuarter:"Уменьшить до 25%",floatLeft:"Расположить слева",floatRight:"Расположить справа",floatNone:"Расположение по-умолчанию",shapeRounded:"Форма: Закругленная",shapeCircle:"Форма: Круг",shapeThumbnail:"Форма: Миниатюра",shapeNone:"Форма: Нет",dragImageHere:"Перетащите сюда картинку",dropImage:"Перетащите картинку",selectFromFiles:"Выбрать из файлов",maximumFileSize:"Максимальный размер файла",maximumFileSizeError:"Превышен максимальный размер файла",url:"URL картинки",remove:"Удалить картинку",original:"Оригинал"},video:{video:"Видео",videoLink:"Ссылка на видео",insert:"Вставить видео",url:"URL видео",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)"},link:{link:"Ссылка",insert:"Вставить ссылку",unlink:"Убрать ссылку",edit:"Редактировать",textToDisplay:"Отображаемый текст",url:"URL для перехода",openInNewWindow:"Открывать в новом окне",useProtocol:"Использовать протокол по умолчанию"},table:{table:"Таблица",addRowAbove:"Добавить строку выше",addRowBelow:"Добавить строку ниже",addColLeft:"Добавить столбец слева",addColRight:"Добавить столбец справа",delRow:"Удалить строку",delCol:"Удалить столбец",delTable:"Удалить таблицу"},hr:{insert:"Вставить горизонтальную линию"},style:{style:"Стиль",p:"Нормальный",blockquote:"Цитата",pre:"Код",h1:"Заголовок 1",h2:"Заголовок 2",h3:"Заголовок 3",h4:"Заголовок 4",h5:"Заголовок 5",h6:"Заголовок 6"},lists:{unordered:"Маркированный список",ordered:"Нумерованный список"},options:{help:"Помощь",fullscreen:"На весь экран",codeview:"Исходный код"},paragraph:{paragraph:"Параграф",outdent:"Уменьшить отступ",indent:"Увеличить отступ",left:"Выровнять по левому краю",center:"Выровнять по центру",right:"Выровнять по правому краю",justify:"Растянуть по ширине"},color:{recent:"Последний цвет",more:"Еще цвета",background:"Цвет фона",foreground:"Цвет шрифта",transparent:"Прозрачный",setTransparent:"Сделать прозрачным",reset:"Сброс",resetToDefault:"Восстановить умолчания"},shortcut:{shortcuts:"Сочетания клавиш",close:"Закрыть",textFormatting:"Форматирование текста",action:"Действие",paragraphFormatting:"Форматирование параграфа",documentStyle:"Стиль документа",extraKeys:"Дополнительные комбинации"},help:{insertParagraph:"Новый параграф",undo:"Отменить последнюю команду",redo:"Повторить последнюю команду",tab:"Tab",untab:"Untab",bold:'Установить стиль "Жирный"',italic:'Установить стиль "Наклонный"',underline:'Установить стиль "Подчеркнутый"',strikethrough:'Установить стиль "Зачеркнутый"',removeFormat:"Сборсить стили",justifyLeft:"Выровнять по левому краю",justifyCenter:"Выровнять по центру",justifyRight:"Выровнять по правому краю",justifyFull:"Растянуть на всю ширину",insertUnorderedList:"Включить/отключить маркированный список",insertOrderedList:"Включить/отключить нумерованный список",outdent:"Убрать отступ в текущем параграфе",indent:"Вставить отступ в текущем параграфе",formatPara:"Форматировать текущий блок как параграф (тег P)",formatH1:"Форматировать текущий блок как H1",formatH2:"Форматировать текущий блок как H2",formatH3:"Форматировать текущий блок как H3",formatH4:"Форматировать текущий блок как H4",formatH5:"Форматировать текущий блок как H5",formatH6:"Форматировать текущий блок как H6",insertHorizontalRule:"Вставить горизонтальную черту","linkDialog.show":'Показать диалог "Ссылка"'},history:{undo:"Отменить",redo:"Повтор"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ru-RU.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js
new file mode 100644
index 0000000..92a6b17
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'sk-SK': {
+      font: {
+        bold: 'Tučné',
+        italic: 'Kurzíva',
+        underline: 'Podčiarknutie',
+        clear: 'Odstrániť štýl písma',
+        height: 'Výška riadku',
+        name: 'Názov',
+        strikethrough: 'Prečiarknuté',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Veľkosť písma'
+      },
+      image: {
+        image: 'Obrázok',
+        insert: 'Vložiť obrázok',
+        resizeFull: 'Pôvodná veľkosť',
+        resizeHalf: 'Polovičná veľkosť',
+        resizeQuarter: 'Štvrtinová veľkosť',
+        floatLeft: 'Umiestniť doľava',
+        floatRight: 'Umiestniť doprava',
+        floatNone: 'Bez zarovnania',
+        shapeRounded: 'Tvar: Zaoblené',
+        shapeCircle: 'Tvar: Kruh',
+        shapeThumbnail: 'Tvar: Náhľad',
+        shapeNone: 'Tvar: Žiadne',
+        dragImageHere: 'Pretiahnuť sem obrázok',
+        dropImage: 'Pretiahnuť sem obrázok alebo text',
+        selectFromFiles: 'Vybrať súbor',
+        maximumFileSize: 'Maximálna veľkosť súboru',
+        maximumFileSizeError: 'Maximálna veľkosť súboru bola prekročená.',
+        url: 'URL obrázku',
+        removeMedia: 'Odstrániť obrázok',
+        original: 'Originál'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Odkaz videa',
+        insert: 'Vložiť video',
+        url: 'URL videa?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion alebo Youku)'
+      },
+      link: {
+        link: 'Odkaz',
+        insert: 'Vytvoriť odkaz',
+        unlink: 'Zrušiť odkaz',
+        edit: 'Upraviť',
+        textToDisplay: 'Zobrazovaný text',
+        url: 'Na akú URL adresu má tento odkaz viesť?',
+        openInNewWindow: 'Otvoriť v novom okne',
+        useProtocol: 'Použiť predvolený protokol'
+      },
+      table: {
+        table: 'Tabuľka',
+        addRowAbove: 'Pridať riadok nad',
+        addRowBelow: 'Pridať riadok pod',
+        addColLeft: 'Pridať stĺpec vľavo',
+        addColRight: 'Pridať stĺpec vpravo',
+        delRow: 'Odstrániť riadok',
+        delCol: 'Odstrániť stĺpec',
+        delTable: 'Odstrániť tabuľku'
+      },
+      hr: {
+        insert: 'Vložit vodorovnú čiaru'
+      },
+      style: {
+        style: 'Štýl',
+        p: 'Normálny',
+        blockquote: 'Citácia',
+        pre: 'Kód',
+        h1: 'Nadpis 1',
+        h2: 'Nadpis 2',
+        h3: 'Nadpis 3',
+        h4: 'Nadpis 4',
+        h5: 'Nadpis 5',
+        h6: 'Nadpis 6'
+      },
+      lists: {
+        unordered: 'Odrážkový zoznam',
+        ordered: 'Číselný zoznam'
+      },
+      options: {
+        help: 'Pomoc',
+        fullscreen: 'Celá obrazovka',
+        codeview: 'HTML kód'
+      },
+      paragraph: {
+        paragraph: 'Odsek',
+        outdent: 'Zväčšiť odsadenie',
+        indent: 'Zmenšiť odsadenie',
+        left: 'Zarovnať doľava',
+        center: 'Zarovnať na stred',
+        right: 'Zarovnať doprava',
+        justify: 'Zarovnať obojstranne'
+      },
+      color: {
+        recent: 'Aktuálna farba',
+        more: 'Dalšie farby',
+        background: 'Farba pozadia',
+        foreground: 'Farba písma',
+        transparent: 'Priehľadnosť',
+        setTransparent: 'Nastaviť priehľadnosť',
+        reset: 'Obnoviť',
+        resetToDefault: 'Obnoviť prednastavené'
+      },
+      shortcut: {
+        shortcuts: 'Klávesové skratky',
+        close: 'Zavrieť',
+        textFormatting: 'Formátovanie textu',
+        action: 'Akcia',
+        paragraphFormatting: 'Formátovanie odseku',
+        documentStyle: 'Štýl dokumentu',
+        extraKeys: 'Ďalšie kombinácie'
+      },
+      help: {
+        'insertParagraph': 'Vložiť odsek',
+        'undo': 'Vrátiť posledný krok',
+        'redo': 'Obnoviť posledný krok',
+        'tab': 'Odsadiť',
+        'untab': 'Zmenšiť odsadenie',
+        'bold': 'Tučné',
+        'italic': 'Kurzívu',
+        'underline': 'Podčiarknutie',
+        'strikethrough': 'Preškrknutý text',
+        'removeFormat': 'Odstrániť formátovanie',
+        'justifyLeft': 'Odsadenie zľava',
+        'justifyCenter': 'Vycentrovať',
+        'justifyRight': 'Odsadenie zprava',
+        'justifyFull': 'Zarovnať do bloku',
+        'insertUnorderedList': 'Odrážkový zoznam',
+        'insertOrderedList': 'Číselný zoznam',
+        'outdent': 'Zrušiť odsadenie aktuálneho odseku',
+        'indent': 'Odsadiť aktuálny odsek',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Vložiť horizontálne pravidlo',
+        'linkDialog.show': 'Dialóg na zadanie odkazu'
+      },
+      history: {
+        undo: 'Krok vzad',
+        redo: 'Krok dopredu'
+      },
+      specialChar: {
+        specialChar: 'ŠPECIÁLNE ZNAKY',
+        select: 'Vybrať špeciálne znaky'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-sk-SK.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js.map
new file mode 100644
index 0000000..efed532
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-sk-SK.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-sk-SK.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'sk-SK': {\n      font: {\n        bold: 'Tučné',\n        italic: 'Kurzíva',\n        underline: 'Podčiarknutie',\n        clear: 'Odstrániť štýl písma',\n        height: 'Výška riadku',\n        name: 'Názov',\n        strikethrough: 'Prečiarknuté',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Veľkosť písma',\n      },\n      image: {\n        image: 'Obrázok',\n        insert: 'Vložiť obrázok',\n        resizeFull: 'Pôvodná veľkosť',\n        resizeHalf: 'Polovičná veľkosť',\n        resizeQuarter: 'Štvrtinová veľkosť',\n        floatLeft: 'Umiestniť doľava',\n        floatRight: 'Umiestniť doprava',\n        floatNone: 'Bez zarovnania',\n        shapeRounded: 'Tvar: Zaoblené',\n        shapeCircle: 'Tvar: Kruh',\n        shapeThumbnail: 'Tvar: Náhľad',\n        shapeNone: 'Tvar: Žiadne',\n        dragImageHere: 'Pretiahnuť sem obrázok',\n        dropImage: 'Pretiahnuť sem obrázok alebo text',\n        selectFromFiles: 'Vybrať súbor',\n        maximumFileSize: 'Maximálna veľkosť súboru',\n        maximumFileSizeError: 'Maximálna veľkosť súboru bola prekročená.',\n        url: 'URL obrázku',\n        removeMedia: 'Odstrániť obrázok',\n        original: 'Originál',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Odkaz videa',\n        insert: 'Vložiť video',\n        url: 'URL videa?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion alebo Youku)',\n      },\n      link: {\n        link: 'Odkaz',\n        insert: 'Vytvoriť odkaz',\n        unlink: 'Zrušiť odkaz',\n        edit: 'Upraviť',\n        textToDisplay: 'Zobrazovaný text',\n        url: 'Na akú URL adresu má tento odkaz viesť?',\n        openInNewWindow: 'Otvoriť v novom okne',\n        useProtocol: 'Použiť predvolený protokol',\n      },\n      table: {\n        table: 'Tabuľka',\n        addRowAbove: 'Pridať riadok nad',\n        addRowBelow: 'Pridať riadok pod',\n        addColLeft: 'Pridať stĺpec vľavo',\n        addColRight: 'Pridať stĺpec vpravo',\n        delRow: 'Odstrániť riadok',\n        delCol: 'Odstrániť stĺpec',\n        delTable: 'Odstrániť tabuľku',\n      },\n      hr: {\n        insert: 'Vložit vodorovnú čiaru',\n      },\n      style: {\n        style: 'Štýl',\n        p: 'Normálny',\n        blockquote: 'Citácia',\n        pre: 'Kód',\n        h1: 'Nadpis 1',\n        h2: 'Nadpis 2',\n        h3: 'Nadpis 3',\n        h4: 'Nadpis 4',\n        h5: 'Nadpis 5',\n        h6: 'Nadpis 6',\n      },\n      lists: {\n        unordered: 'Odrážkový zoznam',\n        ordered: 'Číselný zoznam',\n      },\n      options: {\n        help: 'Pomoc',\n        fullscreen: 'Celá obrazovka',\n        codeview: 'HTML kód',\n      },\n      paragraph: {\n        paragraph: 'Odsek',\n        outdent: 'Zväčšiť odsadenie',\n        indent: 'Zmenšiť odsadenie',\n        left: 'Zarovnať doľava',\n        center: 'Zarovnať na stred',\n        right: 'Zarovnať doprava',\n        justify: 'Zarovnať obojstranne',\n      },\n      color: {\n        recent: 'Aktuálna farba',\n        more: 'Dalšie farby',\n        background: 'Farba pozadia',\n        foreground: 'Farba písma',\n        transparent: 'Priehľadnosť',\n        setTransparent: 'Nastaviť priehľadnosť',\n        reset: 'Obnoviť',\n        resetToDefault: 'Obnoviť prednastavené',\n      },\n      shortcut: {\n        shortcuts: 'Klávesové skratky',\n        close: 'Zavrieť',\n        textFormatting: 'Formátovanie textu',\n        action: 'Akcia',\n        paragraphFormatting: 'Formátovanie odseku',\n        documentStyle: 'Štýl dokumentu',\n        extraKeys: 'Ďalšie kombinácie',\n      },\n      help: {\n        'insertParagraph': 'Vložiť odsek',\n        'undo': 'Vrátiť posledný krok',\n        'redo': 'Obnoviť posledný krok',\n        'tab': 'Odsadiť',\n        'untab': 'Zmenšiť odsadenie',\n        'bold': 'Tučné',\n        'italic': 'Kurzívu',\n        'underline': 'Podčiarknutie',\n        'strikethrough': 'Preškrknutý text',\n        'removeFormat': 'Odstrániť formátovanie',\n        'justifyLeft': 'Odsadenie zľava',\n        'justifyCenter': 'Vycentrovať',\n        'justifyRight': 'Odsadenie zprava',\n        'justifyFull': 'Zarovnať do bloku',\n        'insertUnorderedList': 'Odrážkový zoznam',\n        'insertOrderedList': 'Číselný zoznam',\n        'outdent': 'Zrušiť odsadenie aktuálneho odseku',\n        'indent': 'Odsadiť aktuálny odsek',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Vložiť horizontálne pravidlo',\n        'linkDialog.show': 'Dialóg na zadanie odkazu',\n      },\n      history: {\n        undo: 'Krok vzad',\n        redo: 'Krok dopredu',\n      },\n      specialChar: {\n        specialChar: 'ŠPECIÁLNE ZNAKY',\n        select: 'Vybrať špeciálne znaky',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","removeMedia","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js
new file mode 100644
index 0000000..52cf679
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var o=a();for(var r in o)("object"==typeof exports?exports:e)[r]=o[r]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"sk-SK":{font:{bold:"Tučné",italic:"Kurzíva",underline:"Podčiarknutie",clear:"Odstrániť štýl písma",height:"Výška riadku",name:"Názov",strikethrough:"Prečiarknuté",subscript:"Subscript",superscript:"Superscript",size:"Veľkosť písma"},image:{image:"Obrázok",insert:"Vložiť obrázok",resizeFull:"Pôvodná veľkosť",resizeHalf:"Polovičná veľkosť",resizeQuarter:"Štvrtinová veľkosť",floatLeft:"Umiestniť doľava",floatRight:"Umiestniť doprava",floatNone:"Bez zarovnania",shapeRounded:"Tvar: Zaoblené",shapeCircle:"Tvar: Kruh",shapeThumbnail:"Tvar: Náhľad",shapeNone:"Tvar: Žiadne",dragImageHere:"Pretiahnuť sem obrázok",dropImage:"Pretiahnuť sem obrázok alebo text",selectFromFiles:"Vybrať súbor",maximumFileSize:"Maximálna veľkosť súboru",maximumFileSizeError:"Maximálna veľkosť súboru bola prekročená.",url:"URL obrázku",removeMedia:"Odstrániť obrázok",original:"Originál"},video:{video:"Video",videoLink:"Odkaz videa",insert:"Vložiť video",url:"URL videa?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion alebo Youku)"},link:{link:"Odkaz",insert:"Vytvoriť odkaz",unlink:"Zrušiť odkaz",edit:"Upraviť",textToDisplay:"Zobrazovaný text",url:"Na akú URL adresu má tento odkaz viesť?",openInNewWindow:"Otvoriť v novom okne",useProtocol:"Použiť predvolený protokol"},table:{table:"Tabuľka",addRowAbove:"Pridať riadok nad",addRowBelow:"Pridať riadok pod",addColLeft:"Pridať stĺpec vľavo",addColRight:"Pridať stĺpec vpravo",delRow:"Odstrániť riadok",delCol:"Odstrániť stĺpec",delTable:"Odstrániť tabuľku"},hr:{insert:"Vložit vodorovnú čiaru"},style:{style:"Štýl",p:"Normálny",blockquote:"Citácia",pre:"Kód",h1:"Nadpis 1",h2:"Nadpis 2",h3:"Nadpis 3",h4:"Nadpis 4",h5:"Nadpis 5",h6:"Nadpis 6"},lists:{unordered:"Odrážkový zoznam",ordered:"Číselný zoznam"},options:{help:"Pomoc",fullscreen:"Celá obrazovka",codeview:"HTML kód"},paragraph:{paragraph:"Odsek",outdent:"Zväčšiť odsadenie",indent:"Zmenšiť odsadenie",left:"Zarovnať doľava",center:"Zarovnať na stred",right:"Zarovnať doprava",justify:"Zarovnať obojstranne"},color:{recent:"Aktuálna farba",more:"Dalšie farby",background:"Farba pozadia",foreground:"Farba písma",transparent:"Priehľadnosť",setTransparent:"Nastaviť priehľadnosť",reset:"Obnoviť",resetToDefault:"Obnoviť prednastavené"},shortcut:{shortcuts:"Klávesové skratky",close:"Zavrieť",textFormatting:"Formátovanie textu",action:"Akcia",paragraphFormatting:"Formátovanie odseku",documentStyle:"Štýl dokumentu",extraKeys:"Ďalšie kombinácie"},help:{insertParagraph:"Vložiť odsek",undo:"Vrátiť posledný krok",redo:"Obnoviť posledný krok",tab:"Odsadiť",untab:"Zmenšiť odsadenie",bold:"Tučné",italic:"Kurzívu",underline:"Podčiarknutie",strikethrough:"Preškrknutý text",removeFormat:"Odstrániť formátovanie",justifyLeft:"Odsadenie zľava",justifyCenter:"Vycentrovať",justifyRight:"Odsadenie zprava",justifyFull:"Zarovnať do bloku",insertUnorderedList:"Odrážkový zoznam",insertOrderedList:"Číselný zoznam",outdent:"Zrušiť odsadenie aktuálneho odseku",indent:"Odsadiť aktuálny odsek",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Vložiť horizontálne pravidlo","linkDialog.show":"Dialóg na zadanie odkazu"},history:{undo:"Krok vzad",redo:"Krok dopredu"},specialChar:{specialChar:"ŠPECIÁLNE ZNAKY",select:"Vybrať špeciálne znaky"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sk-SK.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js
new file mode 100644
index 0000000..f5f61a7
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'sl-SI': {
+      font: {
+        bold: 'Krepko',
+        italic: 'Ležeče',
+        underline: 'Podčrtano',
+        clear: 'Počisti oblikovanje izbire',
+        height: 'Razmik med vrsticami',
+        name: 'Pisava',
+        strikethrough: 'Prečrtano',
+        subscript: 'Podpisano',
+        superscript: 'Nadpisano',
+        size: 'Velikost pisave'
+      },
+      image: {
+        image: 'Slika',
+        insert: 'Vstavi sliko',
+        resizeFull: 'Razširi na polno velikost',
+        resizeHalf: 'Razširi na polovico velikosti',
+        resizeQuarter: 'Razširi na četrtino velikosti',
+        floatLeft: 'Leva poravnava',
+        floatRight: 'Desna poravnava',
+        floatNone: 'Brez poravnave',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Sem povlecite sliko',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Izberi sliko za nalaganje',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'URL naslov slike',
+        remove: 'Odstrani sliko',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Video povezava',
+        insert: 'Vstavi video',
+        url: 'Povezava do videa',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ali Youku)'
+      },
+      link: {
+        link: 'Povezava',
+        insert: 'Vstavi povezavo',
+        unlink: 'Odstrani povezavo',
+        edit: 'Uredi',
+        textToDisplay: 'Prikazano besedilo',
+        url: 'Povezava',
+        openInNewWindow: 'Odpri v novem oknu'
+      },
+      table: {
+        table: 'Tabela',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Vstavi horizontalno črto'
+      },
+      style: {
+        style: 'Slogi',
+        p: 'Navadno besedilo',
+        blockquote: 'Citat',
+        pre: 'Koda',
+        h1: 'Naslov 1',
+        h2: 'Naslov 2',
+        h3: 'Naslov 3',
+        h4: 'Naslov 4',
+        h5: 'Naslov 5',
+        h6: 'Naslov 6'
+      },
+      lists: {
+        unordered: 'Označen seznam',
+        ordered: 'Oštevilčen seznam'
+      },
+      options: {
+        help: 'Pomoč',
+        fullscreen: 'Celozaslonski način',
+        codeview: 'Pregled HTML kode'
+      },
+      paragraph: {
+        paragraph: 'Slogi odstavka',
+        outdent: 'Zmanjšaj odmik',
+        indent: 'Povečaj odmik',
+        left: 'Leva poravnava',
+        center: 'Desna poravnava',
+        right: 'Sredinska poravnava',
+        justify: 'Obojestranska poravnava'
+      },
+      color: {
+        recent: 'Uporabi zadnjo barvo',
+        more: 'Več barv',
+        background: 'Barva ozadja',
+        foreground: 'Barva besedila',
+        transparent: 'Brez barve',
+        setTransparent: 'Brez barve',
+        reset: 'Ponastavi',
+        resetToDefault: 'Ponastavi na privzeto'
+      },
+      shortcut: {
+        shortcuts: 'Bljižnice',
+        close: 'Zapri',
+        textFormatting: 'Oblikovanje besedila',
+        action: 'Dejanja',
+        paragraphFormatting: 'Oblikovanje odstavka',
+        documentStyle: 'Oblikovanje naslova',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Razveljavi',
+        redo: 'Uveljavi'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-sl-SI.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js.map
new file mode 100644
index 0000000..c1dc6aa
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-sl-SI.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-sl-SI.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'sl-SI': {\n      font: {\n        bold: 'Krepko',\n        italic: 'Ležeče',\n        underline: 'Podčrtano',\n        clear: 'Počisti oblikovanje izbire',\n        height: 'Razmik med vrsticami',\n        name: 'Pisava',\n        strikethrough: 'Prečrtano',\n        subscript: 'Podpisano',\n        superscript: 'Nadpisano',\n        size: 'Velikost pisave',\n      },\n      image: {\n        image: 'Slika',\n        insert: 'Vstavi sliko',\n        resizeFull: 'Razširi na polno velikost',\n        resizeHalf: 'Razširi na polovico velikosti',\n        resizeQuarter: 'Razširi na četrtino velikosti',\n        floatLeft: 'Leva poravnava',\n        floatRight: 'Desna poravnava',\n        floatNone: 'Brez poravnave',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Sem povlecite sliko',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Izberi sliko za nalaganje',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'URL naslov slike',\n        remove: 'Odstrani sliko',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Video povezava',\n        insert: 'Vstavi video',\n        url: 'Povezava do videa',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ali Youku)',\n      },\n      link: {\n        link: 'Povezava',\n        insert: 'Vstavi povezavo',\n        unlink: 'Odstrani povezavo',\n        edit: 'Uredi',\n        textToDisplay: 'Prikazano besedilo',\n        url: 'Povezava',\n        openInNewWindow: 'Odpri v novem oknu',\n      },\n      table: {\n        table: 'Tabela',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Vstavi horizontalno črto',\n      },\n      style: {\n        style: 'Slogi',\n        p: 'Navadno besedilo',\n        blockquote: 'Citat',\n        pre: 'Koda',\n        h1: 'Naslov 1',\n        h2: 'Naslov 2',\n        h3: 'Naslov 3',\n        h4: 'Naslov 4',\n        h5: 'Naslov 5',\n        h6: 'Naslov 6',\n      },\n      lists: {\n        unordered: 'Označen seznam',\n        ordered: 'Oštevilčen seznam',\n      },\n      options: {\n        help: 'Pomoč',\n        fullscreen: 'Celozaslonski način',\n        codeview: 'Pregled HTML kode',\n      },\n      paragraph: {\n        paragraph: 'Slogi odstavka',\n        outdent: 'Zmanjšaj odmik',\n        indent: 'Povečaj odmik',\n        left: 'Leva poravnava',\n        center: 'Desna poravnava',\n        right: 'Sredinska poravnava',\n        justify: 'Obojestranska poravnava',\n      },\n      color: {\n        recent: 'Uporabi zadnjo barvo',\n        more: 'Več barv',\n        background: 'Barva ozadja',\n        foreground: 'Barva besedila',\n        transparent: 'Brez barve',\n        setTransparent: 'Brez barve',\n        reset: 'Ponastavi',\n        resetToDefault: 'Ponastavi na privzeto',\n      },\n      shortcut: {\n        shortcuts: 'Bljižnice',\n        close: 'Zapri',\n        textFormatting: 'Oblikovanje besedila',\n        action: 'Dejanja',\n        paragraphFormatting: 'Oblikovanje odstavka',\n        documentStyle: 'Oblikovanje naslova',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Razveljavi',\n        redo: 'Uveljavi',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js
new file mode 100644
index 0000000..663bc6f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var o=a();for(var r in o)("object"==typeof exports?exports:e)[r]=o[r]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"sl-SI":{font:{bold:"Krepko",italic:"Ležeče",underline:"Podčrtano",clear:"Počisti oblikovanje izbire",height:"Razmik med vrsticami",name:"Pisava",strikethrough:"Prečrtano",subscript:"Podpisano",superscript:"Nadpisano",size:"Velikost pisave"},image:{image:"Slika",insert:"Vstavi sliko",resizeFull:"Razširi na polno velikost",resizeHalf:"Razširi na polovico velikosti",resizeQuarter:"Razširi na četrtino velikosti",floatLeft:"Leva poravnava",floatRight:"Desna poravnava",floatNone:"Brez poravnave",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Sem povlecite sliko",dropImage:"Drop image or Text",selectFromFiles:"Izberi sliko za nalaganje",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"URL naslov slike",remove:"Odstrani sliko",original:"Original"},video:{video:"Video",videoLink:"Video povezava",insert:"Vstavi video",url:"Povezava do videa",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion ali Youku)"},link:{link:"Povezava",insert:"Vstavi povezavo",unlink:"Odstrani povezavo",edit:"Uredi",textToDisplay:"Prikazano besedilo",url:"Povezava",openInNewWindow:"Odpri v novem oknu"},table:{table:"Tabela",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Vstavi horizontalno črto"},style:{style:"Slogi",p:"Navadno besedilo",blockquote:"Citat",pre:"Koda",h1:"Naslov 1",h2:"Naslov 2",h3:"Naslov 3",h4:"Naslov 4",h5:"Naslov 5",h6:"Naslov 6"},lists:{unordered:"Označen seznam",ordered:"Oštevilčen seznam"},options:{help:"Pomoč",fullscreen:"Celozaslonski način",codeview:"Pregled HTML kode"},paragraph:{paragraph:"Slogi odstavka",outdent:"Zmanjšaj odmik",indent:"Povečaj odmik",left:"Leva poravnava",center:"Desna poravnava",right:"Sredinska poravnava",justify:"Obojestranska poravnava"},color:{recent:"Uporabi zadnjo barvo",more:"Več barv",background:"Barva ozadja",foreground:"Barva besedila",transparent:"Brez barve",setTransparent:"Brez barve",reset:"Ponastavi",resetToDefault:"Ponastavi na privzeto"},shortcut:{shortcuts:"Bljižnice",close:"Zapri",textFormatting:"Oblikovanje besedila",action:"Dejanja",paragraphFormatting:"Oblikovanje odstavka",documentStyle:"Oblikovanje naslova",extraKeys:"Extra keys"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Razveljavi",redo:"Uveljavi"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sl-SI.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js
new file mode 100644
index 0000000..4f81556
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'sr-RS': {
+      font: {
+        bold: 'Podebljano',
+        italic: 'Kurziv',
+        underline: 'Podvučeno',
+        clear: 'Ukloni stilove fonta',
+        height: 'Visina linije',
+        name: 'Font Family',
+        strikethrough: 'Precrtano',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Veličina fonta'
+      },
+      image: {
+        image: 'Slika',
+        insert: 'Umetni sliku',
+        resizeFull: 'Puna veličina',
+        resizeHalf: 'Umanji na 50%',
+        resizeQuarter: 'Umanji na 25%',
+        floatLeft: 'Uz levu ivicu',
+        floatRight: 'Uz desnu ivicu',
+        floatNone: 'Bez ravnanja',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Prevuci sliku ovde',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Izaberi iz datoteke',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'Adresa slike',
+        remove: 'Ukloni sliku',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Veza ka videu',
+        insert: 'Umetni video',
+        url: 'URL video',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ili Youku)'
+      },
+      link: {
+        link: 'Veza',
+        insert: 'Umetni vezu',
+        unlink: 'Ukloni vezu',
+        edit: 'Uredi',
+        textToDisplay: 'Tekst za prikaz',
+        url: 'Internet adresa',
+        openInNewWindow: 'Otvori u novom prozoru'
+      },
+      table: {
+        table: 'Tabela',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Umetni horizontalnu liniju'
+      },
+      style: {
+        style: 'Stil',
+        p: 'pni',
+        blockquote: 'Citat',
+        pre: 'Kod',
+        h1: 'Zaglavlje 1',
+        h2: 'Zaglavlje 2',
+        h3: 'Zaglavlje 3',
+        h4: 'Zaglavlje 4',
+        h5: 'Zaglavlje 5',
+        h6: 'Zaglavlje 6'
+      },
+      lists: {
+        unordered: 'Obična lista',
+        ordered: 'Numerisana lista'
+      },
+      options: {
+        help: 'Pomoć',
+        fullscreen: 'Preko celog ekrana',
+        codeview: 'Izvorni kod'
+      },
+      paragraph: {
+        paragraph: 'Paragraf',
+        outdent: 'Smanji uvlačenje',
+        indent: 'Povečaj uvlačenje',
+        left: 'Poravnaj u levo',
+        center: 'Centrirano',
+        right: 'Poravnaj u desno',
+        justify: 'Poravnaj obostrano'
+      },
+      color: {
+        recent: 'Poslednja boja',
+        more: 'Više boja',
+        background: 'Boja pozadine',
+        foreground: 'Boja teksta',
+        transparent: 'Providna',
+        setTransparent: 'Providna',
+        reset: 'Opoziv',
+        resetToDefault: 'Podrazumevana'
+      },
+      shortcut: {
+        shortcuts: 'Prečice sa tastature',
+        close: 'Zatvori',
+        textFormatting: 'Formatiranje teksta',
+        action: 'Akcija',
+        paragraphFormatting: 'Formatiranje paragrafa',
+        documentStyle: 'Stil dokumenta',
+        extraKeys: 'Dodatne kombinacije'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Poništi',
+        redo: 'Ponovi'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-sr-RS-Latin.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js.map
new file mode 100644
index 0000000..8291bc9
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-sr-RS-Latin.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-sr-RS-Latin.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'sr-RS': {\n      font: {\n        bold: 'Podebljano',\n        italic: 'Kurziv',\n        underline: 'Podvučeno',\n        clear: 'Ukloni stilove fonta',\n        height: 'Visina linije',\n        name: 'Font Family',\n        strikethrough: 'Precrtano',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Veličina fonta',\n      },\n      image: {\n        image: 'Slika',\n        insert: 'Umetni sliku',\n        resizeFull: 'Puna veličina',\n        resizeHalf: 'Umanji na 50%',\n        resizeQuarter: 'Umanji na 25%',\n        floatLeft: 'Uz levu ivicu',\n        floatRight: 'Uz desnu ivicu',\n        floatNone: 'Bez ravnanja',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Prevuci sliku ovde',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Izaberi iz datoteke',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'Adresa slike',\n        remove: 'Ukloni sliku',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Veza ka videu',\n        insert: 'Umetni video',\n        url: 'URL video',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion ili Youku)',\n      },\n      link: {\n        link: 'Veza',\n        insert: 'Umetni vezu',\n        unlink: 'Ukloni vezu',\n        edit: 'Uredi',\n        textToDisplay: 'Tekst za prikaz',\n        url: 'Internet adresa',\n        openInNewWindow: 'Otvori u novom prozoru',\n      },\n      table: {\n        table: 'Tabela',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Umetni horizontalnu liniju',\n      },\n      style: {\n        style: 'Stil',\n        p: 'pni',\n        blockquote: 'Citat',\n        pre: 'Kod',\n        h1: 'Zaglavlje 1',\n        h2: 'Zaglavlje 2',\n        h3: 'Zaglavlje 3',\n        h4: 'Zaglavlje 4',\n        h5: 'Zaglavlje 5',\n        h6: 'Zaglavlje 6',\n      },\n      lists: {\n        unordered: 'Obična lista',\n        ordered: 'Numerisana lista',\n      },\n      options: {\n        help: 'Pomoć',\n        fullscreen: 'Preko celog ekrana',\n        codeview: 'Izvorni kod',\n      },\n      paragraph: {\n        paragraph: 'Paragraf',\n        outdent: 'Smanji uvlačenje',\n        indent: 'Povečaj uvlačenje',\n        left: 'Poravnaj u levo',\n        center: 'Centrirano',\n        right: 'Poravnaj u desno',\n        justify: 'Poravnaj obostrano',\n      },\n      color: {\n        recent: 'Poslednja boja',\n        more: 'Više boja',\n        background: 'Boja pozadine',\n        foreground: 'Boja teksta',\n        transparent: 'Providna',\n        setTransparent: 'Providna',\n        reset: 'Opoziv',\n        resetToDefault: 'Podrazumevana',\n      },\n      shortcut: {\n        shortcuts: 'Prečice sa tastature',\n        close: 'Zatvori',\n        textFormatting: 'Formatiranje teksta',\n        action: 'Akcija',\n        paragraphFormatting: 'Formatiranje paragrafa',\n        documentStyle: 'Stil dokumenta',\n        extraKeys: 'Dodatne kombinacije',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Poništi',\n        redo: 'Ponovi',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js
new file mode 100644
index 0000000..cccba9a
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var t=a();for(var r in t)("object"==typeof exports?exports:e)[r]=t[r]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"sr-RS":{font:{bold:"Podebljano",italic:"Kurziv",underline:"Podvučeno",clear:"Ukloni stilove fonta",height:"Visina linije",name:"Font Family",strikethrough:"Precrtano",subscript:"Subscript",superscript:"Superscript",size:"Veličina fonta"},image:{image:"Slika",insert:"Umetni sliku",resizeFull:"Puna veličina",resizeHalf:"Umanji na 50%",resizeQuarter:"Umanji na 25%",floatLeft:"Uz levu ivicu",floatRight:"Uz desnu ivicu",floatNone:"Bez ravnanja",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Prevuci sliku ovde",dropImage:"Drop image or Text",selectFromFiles:"Izaberi iz datoteke",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Adresa slike",remove:"Ukloni sliku",original:"Original"},video:{video:"Video",videoLink:"Veza ka videu",insert:"Umetni video",url:"URL video",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion ili Youku)"},link:{link:"Veza",insert:"Umetni vezu",unlink:"Ukloni vezu",edit:"Uredi",textToDisplay:"Tekst za prikaz",url:"Internet adresa",openInNewWindow:"Otvori u novom prozoru"},table:{table:"Tabela",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Umetni horizontalnu liniju"},style:{style:"Stil",p:"pni",blockquote:"Citat",pre:"Kod",h1:"Zaglavlje 1",h2:"Zaglavlje 2",h3:"Zaglavlje 3",h4:"Zaglavlje 4",h5:"Zaglavlje 5",h6:"Zaglavlje 6"},lists:{unordered:"Obična lista",ordered:"Numerisana lista"},options:{help:"Pomoć",fullscreen:"Preko celog ekrana",codeview:"Izvorni kod"},paragraph:{paragraph:"Paragraf",outdent:"Smanji uvlačenje",indent:"Povečaj uvlačenje",left:"Poravnaj u levo",center:"Centrirano",right:"Poravnaj u desno",justify:"Poravnaj obostrano"},color:{recent:"Poslednja boja",more:"Više boja",background:"Boja pozadine",foreground:"Boja teksta",transparent:"Providna",setTransparent:"Providna",reset:"Opoziv",resetToDefault:"Podrazumevana"},shortcut:{shortcuts:"Prečice sa tastature",close:"Zatvori",textFormatting:"Formatiranje teksta",action:"Akcija",paragraphFormatting:"Formatiranje paragrafa",documentStyle:"Stil dokumenta",extraKeys:"Dodatne kombinacije"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Poništi",redo:"Ponovi"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS-Latin.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js
new file mode 100644
index 0000000..5ca3307
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'sr-RS': {
+      font: {
+        bold: 'Подебљано',
+        italic: 'Курзив',
+        underline: 'Подвучено',
+        clear: 'Уклони стилове фонта',
+        height: 'Висина линије',
+        name: 'Font Family',
+        strikethrough: 'Прецртано',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Величина фонта'
+      },
+      image: {
+        image: 'Слика',
+        insert: 'Уметни слику',
+        resizeFull: 'Пуна величина',
+        resizeHalf: 'Умањи на 50%',
+        resizeQuarter: 'Умањи на 25%',
+        floatLeft: 'Уз леву ивицу',
+        floatRight: 'Уз десну ивицу',
+        floatNone: 'Без равнања',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Превуци слику овде',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Изабери из датотеке',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'Адреса слике',
+        remove: 'Уклони слику',
+        original: 'Original'
+      },
+      video: {
+        video: 'Видео',
+        videoLink: 'Веза ка видеу',
+        insert: 'Уметни видео',
+        url: 'URL видео',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)'
+      },
+      link: {
+        link: 'Веза',
+        insert: 'Уметни везу',
+        unlink: 'Уклони везу',
+        edit: 'Уреди',
+        textToDisplay: 'Текст за приказ',
+        url: 'Интернет адреса',
+        openInNewWindow: 'Отвори у новом прозору'
+      },
+      table: {
+        table: 'Табела',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Уметни хоризонталну линију'
+      },
+      style: {
+        style: 'Стил',
+        p: 'Нормални',
+        blockquote: 'Цитат',
+        pre: 'Код',
+        h1: 'Заглавље 1',
+        h2: 'Заглавље 2',
+        h3: 'Заглавље 3',
+        h4: 'Заглавље 4',
+        h5: 'Заглавље 5',
+        h6: 'Заглавље 6'
+      },
+      lists: {
+        unordered: 'Обична листа',
+        ordered: 'Нумерисана листа'
+      },
+      options: {
+        help: 'Помоћ',
+        fullscreen: 'Преко целог екрана',
+        codeview: 'Изворни код'
+      },
+      paragraph: {
+        paragraph: 'Параграф',
+        outdent: 'Смањи увлачење',
+        indent: 'Повечај увлачење',
+        left: 'Поравнај у лево',
+        center: 'Центрирано',
+        right: 'Поравнај у десно',
+        justify: 'Поравнај обострано'
+      },
+      color: {
+        recent: 'Последња боја',
+        more: 'Више боја',
+        background: 'Боја позадине',
+        foreground: 'Боја текста',
+        transparent: 'Провидна',
+        setTransparent: 'Провидна',
+        reset: 'Опозив',
+        resetToDefault: 'Подразумевана'
+      },
+      shortcut: {
+        shortcuts: 'Пречице са тастатуре',
+        close: 'Затвори',
+        textFormatting: 'Форматирање текста',
+        action: 'Акција',
+        paragraphFormatting: 'Форматирање параграфа',
+        documentStyle: 'Стил документа',
+        extraKeys: 'Додатне комбинације'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Поништи',
+        redo: 'Понови'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-sr-RS.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js.map
new file mode 100644
index 0000000..d99e324
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-sr-RS.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-sr-RS.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'sr-RS': {\n      font: {\n        bold: 'Подебљано',\n        italic: 'Курзив',\n        underline: 'Подвучено',\n        clear: 'Уклони стилове фонта',\n        height: 'Висина линије',\n        name: 'Font Family',\n        strikethrough: 'Прецртано',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Величина фонта',\n      },\n      image: {\n        image: 'Слика',\n        insert: 'Уметни слику',\n        resizeFull: 'Пуна величина',\n        resizeHalf: 'Умањи на 50%',\n        resizeQuarter: 'Умањи на 25%',\n        floatLeft: 'Уз леву ивицу',\n        floatRight: 'Уз десну ивицу',\n        floatNone: 'Без равнања',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Превуци слику овде',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Изабери из датотеке',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'Адреса слике',\n        remove: 'Уклони слику',\n        original: 'Original',\n      },\n      video: {\n        video: 'Видео',\n        videoLink: 'Веза ка видеу',\n        insert: 'Уметни видео',\n        url: 'URL видео',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)',\n      },\n      link: {\n        link: 'Веза',\n        insert: 'Уметни везу',\n        unlink: 'Уклони везу',\n        edit: 'Уреди',\n        textToDisplay: 'Текст за приказ',\n        url: 'Интернет адреса',\n        openInNewWindow: 'Отвори у новом прозору',\n      },\n      table: {\n        table: 'Табела',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Уметни хоризонталну линију',\n      },\n      style: {\n        style: 'Стил',\n        p: 'Нормални',\n        blockquote: 'Цитат',\n        pre: 'Код',\n        h1: 'Заглавље 1',\n        h2: 'Заглавље 2',\n        h3: 'Заглавље 3',\n        h4: 'Заглавље 4',\n        h5: 'Заглавље 5',\n        h6: 'Заглавље 6',\n      },\n      lists: {\n        unordered: 'Обична листа',\n        ordered: 'Нумерисана листа',\n      },\n      options: {\n        help: 'Помоћ',\n        fullscreen: 'Преко целог екрана',\n        codeview: 'Изворни код',\n      },\n      paragraph: {\n        paragraph: 'Параграф',\n        outdent: 'Смањи увлачење',\n        indent: 'Повечај увлачење',\n        left: 'Поравнај у лево',\n        center: 'Центрирано',\n        right: 'Поравнај у десно',\n        justify: 'Поравнај обострано',\n      },\n      color: {\n        recent: 'Последња боја',\n        more: 'Више боја',\n        background: 'Боја позадине',\n        foreground: 'Боја текста',\n        transparent: 'Провидна',\n        setTransparent: 'Провидна',\n        reset: 'Опозив',\n        resetToDefault: 'Подразумевана',\n      },\n      shortcut: {\n        shortcuts: 'Пречице са тастатуре',\n        close: 'Затвори',\n        textFormatting: 'Форматирање текста',\n        action: 'Акција',\n        paragraphFormatting: 'Форматирање параграфа',\n        documentStyle: 'Стил документа',\n        extraKeys: 'Додатне комбинације',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Поништи',\n        redo: 'Понови',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js
new file mode 100644
index 0000000..5cac73b
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"sr-RS":{font:{bold:"Подебљано",italic:"Курзив",underline:"Подвучено",clear:"Уклони стилове фонта",height:"Висина линије",name:"Font Family",strikethrough:"Прецртано",subscript:"Subscript",superscript:"Superscript",size:"Величина фонта"},image:{image:"Слика",insert:"Уметни слику",resizeFull:"Пуна величина",resizeHalf:"Умањи на 50%",resizeQuarter:"Умањи на 25%",floatLeft:"Уз леву ивицу",floatRight:"Уз десну ивицу",floatNone:"Без равнања",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Превуци слику овде",dropImage:"Drop image or Text",selectFromFiles:"Изабери из датотеке",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Адреса слике",remove:"Уклони слику",original:"Original"},video:{video:"Видео",videoLink:"Веза ка видеу",insert:"Уметни видео",url:"URL видео",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)"},link:{link:"Веза",insert:"Уметни везу",unlink:"Уклони везу",edit:"Уреди",textToDisplay:"Текст за приказ",url:"Интернет адреса",openInNewWindow:"Отвори у новом прозору"},table:{table:"Табела",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Уметни хоризонталну линију"},style:{style:"Стил",p:"Нормални",blockquote:"Цитат",pre:"Код",h1:"Заглавље 1",h2:"Заглавље 2",h3:"Заглавље 3",h4:"Заглавље 4",h5:"Заглавље 5",h6:"Заглавље 6"},lists:{unordered:"Обична листа",ordered:"Нумерисана листа"},options:{help:"Помоћ",fullscreen:"Преко целог екрана",codeview:"Изворни код"},paragraph:{paragraph:"Параграф",outdent:"Смањи увлачење",indent:"Повечај увлачење",left:"Поравнај у лево",center:"Центрирано",right:"Поравнај у десно",justify:"Поравнај обострано"},color:{recent:"Последња боја",more:"Више боја",background:"Боја позадине",foreground:"Боја текста",transparent:"Провидна",setTransparent:"Провидна",reset:"Опозив",resetToDefault:"Подразумевана"},shortcut:{shortcuts:"Пречице са тастатуре",close:"Затвори",textFormatting:"Форматирање текста",action:"Акција",paragraphFormatting:"Форматирање параграфа",documentStyle:"Стил документа",extraKeys:"Додатне комбинације"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Поништи",redo:"Понови"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sr-RS.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js
new file mode 100644
index 0000000..458240d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'sv-SE': {
+      font: {
+        bold: 'Fet',
+        italic: 'Kursiv',
+        underline: 'Understruken',
+        clear: 'Radera formatering',
+        height: 'Radavstånd',
+        name: 'Teckensnitt',
+        strikethrough: 'Genomstruken',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Teckenstorlek'
+      },
+      image: {
+        image: 'Bild',
+        insert: 'Infoga bild',
+        resizeFull: 'Full storlek',
+        resizeHalf: 'Halv storlek',
+        resizeQuarter: 'En fjärdedel i storlek',
+        floatLeft: 'Vänsterjusterad',
+        floatRight: 'Högerjusterad',
+        floatNone: 'Ingen justering',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Dra en bild hit',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Välj från filer',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'Länk till bild',
+        remove: 'Ta bort bild',
+        original: 'Original'
+      },
+      video: {
+        video: 'Filmklipp',
+        videoLink: 'Länk till filmklipp',
+        insert: 'Infoga filmklipp',
+        url: 'Länk till filmklipp',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)'
+      },
+      link: {
+        link: 'Länk',
+        insert: 'Infoga länk',
+        unlink: 'Ta bort länk',
+        edit: 'Redigera',
+        textToDisplay: 'Visningstext',
+        url: 'Till vilken URL ska denna länk peka?',
+        openInNewWindow: 'Öppna i ett nytt fönster',
+        useProtocol: 'Använd standardprotokoll'
+      },
+      table: {
+        table: 'Tabell',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Infoga horisontell linje'
+      },
+      style: {
+        style: 'Stil',
+        p: 'p',
+        blockquote: 'Citat',
+        pre: 'Kod',
+        h1: 'Rubrik 1',
+        h2: 'Rubrik 2',
+        h3: 'Rubrik 3',
+        h4: 'Rubrik 4',
+        h5: 'Rubrik 5',
+        h6: 'Rubrik 6'
+      },
+      lists: {
+        unordered: 'Punktlista',
+        ordered: 'Numrerad lista'
+      },
+      options: {
+        help: 'Hjälp',
+        fullscreen: 'Fullskärm',
+        codeview: 'HTML-visning'
+      },
+      paragraph: {
+        paragraph: 'Justera text',
+        outdent: 'Minska indrag',
+        indent: 'Öka indrag',
+        left: 'Vänsterjusterad',
+        center: 'Centrerad',
+        right: 'Högerjusterad',
+        justify: 'Justera text'
+      },
+      color: {
+        recent: 'Senast använda färg',
+        more: 'Fler färger',
+        background: 'Bakgrundsfärg',
+        foreground: 'Teckenfärg',
+        transparent: 'Genomskinlig',
+        setTransparent: 'Gör genomskinlig',
+        reset: 'Nollställ',
+        resetToDefault: 'Återställ till standard'
+      },
+      shortcut: {
+        shortcuts: 'Kortkommandon',
+        close: 'Stäng',
+        textFormatting: 'Textformatering',
+        action: 'Funktion',
+        paragraphFormatting: 'Avsnittsformatering',
+        documentStyle: 'Dokumentstil',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Ångra',
+        redo: 'Gör om'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-sv-SE.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js.map
new file mode 100644
index 0000000..7fa3674
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-sv-SE.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-sv-SE.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'sv-SE': {\n      font: {\n        bold: 'Fet',\n        italic: 'Kursiv',\n        underline: 'Understruken',\n        clear: 'Radera formatering',\n        height: 'Radavstånd',\n        name: 'Teckensnitt',\n        strikethrough: 'Genomstruken',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Teckenstorlek',\n      },\n      image: {\n        image: 'Bild',\n        insert: 'Infoga bild',\n        resizeFull: 'Full storlek',\n        resizeHalf: 'Halv storlek',\n        resizeQuarter: 'En fjärdedel i storlek',\n        floatLeft: 'Vänsterjusterad',\n        floatRight: 'Högerjusterad',\n        floatNone: 'Ingen justering',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Dra en bild hit',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Välj från filer',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'Länk till bild',\n        remove: 'Ta bort bild',\n        original: 'Original',\n      },\n      video: {\n        video: 'Filmklipp',\n        videoLink: 'Länk till filmklipp',\n        insert: 'Infoga filmklipp',\n        url: 'Länk till filmklipp',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)',\n      },\n      link: {\n        link: 'Länk',\n        insert: 'Infoga länk',\n        unlink: 'Ta bort länk',\n        edit: 'Redigera',\n        textToDisplay: 'Visningstext',\n        url: 'Till vilken URL ska denna länk peka?',\n        openInNewWindow: 'Öppna i ett nytt fönster',\n        useProtocol: 'Använd standardprotokoll',\n      },\n      table: {\n        table: 'Tabell',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Infoga horisontell linje',\n      },\n      style: {\n        style: 'Stil',\n        p: 'p',\n        blockquote: 'Citat',\n        pre: 'Kod',\n        h1: 'Rubrik 1',\n        h2: 'Rubrik 2',\n        h3: 'Rubrik 3',\n        h4: 'Rubrik 4',\n        h5: 'Rubrik 5',\n        h6: 'Rubrik 6',\n      },\n      lists: {\n        unordered: 'Punktlista',\n        ordered: 'Numrerad lista',\n      },\n      options: {\n        help: 'Hjälp',\n        fullscreen: 'Fullskärm',\n        codeview: 'HTML-visning',\n      },\n      paragraph: {\n        paragraph: 'Justera text',\n        outdent: 'Minska indrag',\n        indent: 'Öka indrag',\n        left: 'Vänsterjusterad',\n        center: 'Centrerad',\n        right: 'Högerjusterad',\n        justify: 'Justera text',\n      },\n      color: {\n        recent: 'Senast använda färg',\n        more: 'Fler färger',\n        background: 'Bakgrundsfärg',\n        foreground: 'Teckenfärg',\n        transparent: 'Genomskinlig',\n        setTransparent: 'Gör genomskinlig',\n        reset: 'Nollställ',\n        resetToDefault: 'Återställ till standard',\n      },\n      shortcut: {\n        shortcuts: 'Kortkommandon',\n        close: 'Stäng',\n        textFormatting: 'Textformatering',\n        action: 'Funktion',\n        paragraphFormatting: 'Avsnittsformatering',\n        documentStyle: 'Dokumentstil',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Ångra',\n        redo: 'Gör om',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js
new file mode 100644
index 0000000..6fea5f7
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"sv-SE":{font:{bold:"Fet",italic:"Kursiv",underline:"Understruken",clear:"Radera formatering",height:"Radavstånd",name:"Teckensnitt",strikethrough:"Genomstruken",subscript:"Subscript",superscript:"Superscript",size:"Teckenstorlek"},image:{image:"Bild",insert:"Infoga bild",resizeFull:"Full storlek",resizeHalf:"Halv storlek",resizeQuarter:"En fjärdedel i storlek",floatLeft:"Vänsterjusterad",floatRight:"Högerjusterad",floatNone:"Ingen justering",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Dra en bild hit",dropImage:"Drop image or Text",selectFromFiles:"Välj från filer",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Länk till bild",remove:"Ta bort bild",original:"Original"},video:{video:"Filmklipp",videoLink:"Länk till filmklipp",insert:"Infoga filmklipp",url:"Länk till filmklipp",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion eller Youku)"},link:{link:"Länk",insert:"Infoga länk",unlink:"Ta bort länk",edit:"Redigera",textToDisplay:"Visningstext",url:"Till vilken URL ska denna länk peka?",openInNewWindow:"Öppna i ett nytt fönster",useProtocol:"Använd standardprotokoll"},table:{table:"Tabell",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Infoga horisontell linje"},style:{style:"Stil",p:"p",blockquote:"Citat",pre:"Kod",h1:"Rubrik 1",h2:"Rubrik 2",h3:"Rubrik 3",h4:"Rubrik 4",h5:"Rubrik 5",h6:"Rubrik 6"},lists:{unordered:"Punktlista",ordered:"Numrerad lista"},options:{help:"Hjälp",fullscreen:"Fullskärm",codeview:"HTML-visning"},paragraph:{paragraph:"Justera text",outdent:"Minska indrag",indent:"Öka indrag",left:"Vänsterjusterad",center:"Centrerad",right:"Högerjusterad",justify:"Justera text"},color:{recent:"Senast använda färg",more:"Fler färger",background:"Bakgrundsfärg",foreground:"Teckenfärg",transparent:"Genomskinlig",setTransparent:"Gör genomskinlig",reset:"Nollställ",resetToDefault:"Återställ till standard"},shortcut:{shortcuts:"Kortkommandon",close:"Stäng",textFormatting:"Textformatering",action:"Funktion",paragraphFormatting:"Avsnittsformatering",documentStyle:"Dokumentstil",extraKeys:"Extra keys"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Ångra",redo:"Gör om"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-sv-SE.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js
new file mode 100644
index 0000000..285516f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'ta-IN': {
+      font: {
+        bold: 'தடித்த',
+        italic: 'சாய்வு',
+        underline: 'அடிக்கோடு',
+        clear: 'நீக்கு',
+        height: 'வரி  உயரம்',
+        name: 'எழுத்துரு பெயர்',
+        strikethrough: 'குறுக்குக் கோடு',
+        size: 'எழுத்துரு அளவு',
+        superscript: 'மேல் ஒட்டு',
+        subscript: 'கீழ் ஒட்டு'
+      },
+      image: {
+        image: 'படம்',
+        insert: 'படத்தை செருகு',
+        resizeFull: 'முழு அளவை',
+        resizeHalf: 'அரை அளவை',
+        resizeQuarter: 'கால் அளவை',
+        floatLeft: 'இடப்பக்கமாக வை',
+        floatRight: 'வலப்பக்கமாக வை',
+        floatNone: 'இயல்புநிலையில் வை',
+        shapeRounded: 'வட்டமான வடிவம்',
+        shapeCircle: 'வட்ட வடிவம்',
+        shapeThumbnail: 'சிறு வடிவம்',
+        shapeNone: 'வடிவத்தை நீக்கு',
+        dragImageHere: 'படத்தை இங்கே இழுத்துவை',
+        dropImage: 'படத்தை விடு',
+        selectFromFiles: 'கோப்புகளை தேர்வு செய்',
+        maximumFileSize: 'அதிகபட்ச கோப்பு அளவு',
+        maximumFileSizeError: 'கோப்பு அதிகபட்ச அளவை மீறிவிட்டது',
+        url: 'இணையதள முகவரி',
+        remove: 'படத்தை நீக்கு',
+        original: 'Original'
+      },
+      video: {
+        video: 'காணொளி',
+        videoLink: 'காணொளி இணைப்பு',
+        insert: 'காணொளியை செருகு',
+        url: 'இணையதள முகவரி',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)'
+      },
+      link: {
+        link: 'இணைப்பு',
+        insert: 'இணைப்பை செருகு',
+        unlink: 'இணைப்பை நீக்கு',
+        edit: 'இணைப்பை தொகு',
+        textToDisplay: 'காட்சி வாசகம்',
+        url: 'இணையதள முகவரி',
+        openInNewWindow: 'புதிய சாளரத்தில் திறக்க'
+      },
+      table: {
+        table: 'அட்டவணை',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'கிடைமட்ட கோடு'
+      },
+      style: {
+        style: 'தொகுப்பு',
+        p: 'பத்தி',
+        blockquote: 'மேற்கோள்',
+        pre: 'குறியீடு',
+        h1: 'தலைப்பு 1',
+        h2: 'தலைப்பு 2',
+        h3: 'தலைப்பு 3',
+        h4: 'தலைப்பு 4',
+        h5: 'தலைப்பு 5',
+        h6: 'தலைப்பு 6'
+      },
+      lists: {
+        unordered: 'வரிசையிடாத',
+        ordered: 'வரிசையிட்ட'
+      },
+      options: {
+        help: 'உதவி',
+        fullscreen: 'முழுத்திரை',
+        codeview: 'நிரலாக்க காட்சி'
+      },
+      paragraph: {
+        paragraph: 'பத்தி',
+        outdent: 'வெளித்தள்ளு',
+        indent: 'உள்ளே தள்ளு',
+        left: 'இடது சீரமைப்பு',
+        center: 'நடு சீரமைப்பு',
+        right: 'வலது சீரமைப்பு',
+        justify: 'இருபுற சீரமைப்பு'
+      },
+      color: {
+        recent: 'அண்மை நிறம்',
+        more: 'மேலும்',
+        background: 'பின்புல நிறம்',
+        foreground: 'முன்புற நிறம்',
+        transparent: 'தெளிமையான',
+        setTransparent: 'தெளிமையாக்கு',
+        reset: 'மீட்டமைக்க',
+        resetToDefault: 'இயல்புநிலைக்கு மீட்டமை'
+      },
+      shortcut: {
+        shortcuts: 'குறுக்குவழி',
+        close: 'மூடு',
+        textFormatting: 'எழுத்து வடிவமைப்பு',
+        action: 'செயல்படுத்து',
+        paragraphFormatting: 'பத்தி வடிவமைப்பு',
+        documentStyle: 'ஆவண பாணி',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'மீளமை',
+        redo: 'மீண்டும்'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-ta-IN.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js.map
new file mode 100644
index 0000000..f9b90ce
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-ta-IN.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-ta-IN.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'ta-IN': {\n      font: {\n        bold: 'தடித்த',\n        italic: 'சாய்வு',\n        underline: 'அடிக்கோடு',\n        clear: 'நீக்கு',\n        height: 'வரி  உயரம்',\n        name: 'எழுத்துரு பெயர்',\n        strikethrough: 'குறுக்குக் கோடு',\n        size: 'எழுத்துரு அளவு',\n        superscript: 'மேல் ஒட்டு',\n        subscript: 'கீழ் ஒட்டு',\n      },\n      image: {\n        image: 'படம்',\n        insert: 'படத்தை செருகு',\n        resizeFull: 'முழு அளவை',\n        resizeHalf: 'அரை அளவை',\n        resizeQuarter: 'கால் அளவை',\n        floatLeft: 'இடப்பக்கமாக வை',\n        floatRight: 'வலப்பக்கமாக வை',\n        floatNone: 'இயல்புநிலையில் வை',\n        shapeRounded: 'வட்டமான வடிவம்',\n        shapeCircle: 'வட்ட வடிவம்',\n        shapeThumbnail: 'சிறு வடிவம்',\n        shapeNone: 'வடிவத்தை நீக்கு',\n        dragImageHere: 'படத்தை இங்கே இழுத்துவை',\n        dropImage: 'படத்தை விடு',\n        selectFromFiles: 'கோப்புகளை தேர்வு செய்',\n        maximumFileSize: 'அதிகபட்ச கோப்பு அளவு',\n        maximumFileSizeError: 'கோப்பு அதிகபட்ச அளவை மீறிவிட்டது',\n        url: 'இணையதள முகவரி',\n        remove: 'படத்தை நீக்கு',\n        original: 'Original',\n      },\n      video: {\n        video: 'காணொளி',\n        videoLink: 'காணொளி இணைப்பு',\n        insert: 'காணொளியை செருகு',\n        url: 'இணையதள முகவரி',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n      },\n      link: {\n        link: 'இணைப்பு',\n        insert: 'இணைப்பை செருகு',\n        unlink: 'இணைப்பை நீக்கு',\n        edit: 'இணைப்பை தொகு',\n        textToDisplay: 'காட்சி வாசகம்',\n        url: 'இணையதள முகவரி',\n        openInNewWindow: 'புதிய சாளரத்தில் திறக்க',\n      },\n      table: {\n        table: 'அட்டவணை',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'கிடைமட்ட கோடு',\n      },\n      style: {\n        style: 'தொகுப்பு',\n        p: 'பத்தி',\n        blockquote: 'மேற்கோள்',\n        pre: 'குறியீடு',\n        h1: 'தலைப்பு 1',\n        h2: 'தலைப்பு 2',\n        h3: 'தலைப்பு 3',\n        h4: 'தலைப்பு 4',\n        h5: 'தலைப்பு 5',\n        h6: 'தலைப்பு 6',\n      },\n      lists: {\n        unordered: 'வரிசையிடாத',\n        ordered: 'வரிசையிட்ட',\n      },\n      options: {\n        help: 'உதவி',\n        fullscreen: 'முழுத்திரை',\n        codeview: 'நிரலாக்க காட்சி',\n      },\n      paragraph: {\n        paragraph: 'பத்தி',\n        outdent: 'வெளித்தள்ளு',\n        indent: 'உள்ளே தள்ளு',\n        left: 'இடது சீரமைப்பு',\n        center: 'நடு சீரமைப்பு',\n        right: 'வலது சீரமைப்பு',\n        justify: 'இருபுற சீரமைப்பு',\n      },\n      color: {\n        recent: 'அண்மை நிறம்',\n        more: 'மேலும்',\n        background: 'பின்புல நிறம்',\n        foreground: 'முன்புற நிறம்',\n        transparent: 'தெளிமையான',\n        setTransparent: 'தெளிமையாக்கு',\n        reset: 'மீட்டமைக்க',\n        resetToDefault: 'இயல்புநிலைக்கு மீட்டமை',\n      },\n      shortcut: {\n        shortcuts: 'குறுக்குவழி',\n        close: 'மூடு',\n        textFormatting: 'எழுத்து வடிவமைப்பு',\n        action: 'செயல்படுத்து',\n        paragraphFormatting: 'பத்தி வடிவமைப்பு',\n        documentStyle: 'ஆவண பாணி',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'மீளமை',\n        redo: 'மீண்டும்',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","size","superscript","subscript","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js
new file mode 100644
index 0000000..f3a8996
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"ta-IN":{font:{bold:"தடித்த",italic:"சாய்வு",underline:"அடிக்கோடு",clear:"நீக்கு",height:"வரி  உயரம்",name:"எழுத்துரு பெயர்",strikethrough:"குறுக்குக் கோடு",size:"எழுத்துரு அளவு",superscript:"மேல் ஒட்டு",subscript:"கீழ் ஒட்டு"},image:{image:"படம்",insert:"படத்தை செருகு",resizeFull:"முழு அளவை",resizeHalf:"அரை அளவை",resizeQuarter:"கால் அளவை",floatLeft:"இடப்பக்கமாக வை",floatRight:"வலப்பக்கமாக வை",floatNone:"இயல்புநிலையில் வை",shapeRounded:"வட்டமான வடிவம்",shapeCircle:"வட்ட வடிவம்",shapeThumbnail:"சிறு வடிவம்",shapeNone:"வடிவத்தை நீக்கு",dragImageHere:"படத்தை இங்கே இழுத்துவை",dropImage:"படத்தை விடு",selectFromFiles:"கோப்புகளை தேர்வு செய்",maximumFileSize:"அதிகபட்ச கோப்பு அளவு",maximumFileSizeError:"கோப்பு அதிகபட்ச அளவை மீறிவிட்டது",url:"இணையதள முகவரி",remove:"படத்தை நீக்கு",original:"Original"},video:{video:"காணொளி",videoLink:"காணொளி இணைப்பு",insert:"காணொளியை செருகு",url:"இணையதள முகவரி",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)"},link:{link:"இணைப்பு",insert:"இணைப்பை செருகு",unlink:"இணைப்பை நீக்கு",edit:"இணைப்பை தொகு",textToDisplay:"காட்சி வாசகம்",url:"இணையதள முகவரி",openInNewWindow:"புதிய சாளரத்தில் திறக்க"},table:{table:"அட்டவணை",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"கிடைமட்ட கோடு"},style:{style:"தொகுப்பு",p:"பத்தி",blockquote:"மேற்கோள்",pre:"குறியீடு",h1:"தலைப்பு 1",h2:"தலைப்பு 2",h3:"தலைப்பு 3",h4:"தலைப்பு 4",h5:"தலைப்பு 5",h6:"தலைப்பு 6"},lists:{unordered:"வரிசையிடாத",ordered:"வரிசையிட்ட"},options:{help:"உதவி",fullscreen:"முழுத்திரை",codeview:"நிரலாக்க காட்சி"},paragraph:{paragraph:"பத்தி",outdent:"வெளித்தள்ளு",indent:"உள்ளே தள்ளு",left:"இடது சீரமைப்பு",center:"நடு சீரமைப்பு",right:"வலது சீரமைப்பு",justify:"இருபுற சீரமைப்பு"},color:{recent:"அண்மை நிறம்",more:"மேலும்",background:"பின்புல நிறம்",foreground:"முன்புற நிறம்",transparent:"தெளிமையான",setTransparent:"தெளிமையாக்கு",reset:"மீட்டமைக்க",resetToDefault:"இயல்புநிலைக்கு மீட்டமை"},shortcut:{shortcuts:"குறுக்குவழி",close:"மூடு",textFormatting:"எழுத்து வடிவமைப்பு",action:"செயல்படுத்து",paragraphFormatting:"பத்தி வடிவமைப்பு",documentStyle:"ஆவண பாணி",extraKeys:"Extra keys"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"மீளமை",redo:"மீண்டும்"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-ta-IN.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js
new file mode 100644
index 0000000..c52f579
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'th-TH': {
+      font: {
+        bold: 'ตัวหนา',
+        italic: 'ตัวเอียง',
+        underline: 'ขีดเส้นใต้',
+        clear: 'ล้างรูปแบบตัวอักษร',
+        height: 'ความสูงบรรทัด',
+        name: 'แบบตัวอักษร',
+        strikethrough: 'ขีดฆ่า',
+        subscript: 'ตัวห้อย',
+        superscript: 'ตัวยก',
+        size: 'ขนาดตัวอักษร'
+      },
+      image: {
+        image: 'รูปภาพ',
+        insert: 'แทรกรูปภาพ',
+        resizeFull: 'ปรับขนาดเท่าจริง',
+        resizeHalf: 'ปรับขนาดลง 50%',
+        resizeQuarter: 'ปรับขนาดลง 25%',
+        floatLeft: 'ชิดซ้าย',
+        floatRight: 'ชิดขวา',
+        floatNone: 'ไม่จัดตำแหน่ง',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'ลากรูปภาพที่ต้องการไว้ที่นี่',
+        dropImage: 'วางรูปภาพหรือข้อความ',
+        selectFromFiles: 'เลือกไฟล์รูปภาพ',
+        maximumFileSize: 'ขนาดไฟล์ใหญ่สุด',
+        maximumFileSizeError: 'ไฟล์เกินขนาดที่กำหนด',
+        url: 'ที่อยู่ URL ของรูปภาพ',
+        remove: 'ลบรูปภาพ',
+        original: 'Original'
+      },
+      video: {
+        video: 'วีดีโอ',
+        videoLink: 'ลิงก์ของวีดีโอ',
+        insert: 'แทรกวีดีโอ',
+        url: 'ที่อยู่ URL ของวีดีโอ',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion หรือ Youku)'
+      },
+      link: {
+        link: 'ตัวเชื่อมโยง',
+        insert: 'แทรกตัวเชื่อมโยง',
+        unlink: 'ยกเลิกตัวเชื่อมโยง',
+        edit: 'แก้ไข',
+        textToDisplay: 'ข้อความที่ให้แสดง',
+        url: 'ที่อยู่เว็บไซต์ที่ต้องการให้เชื่อมโยงไปถึง?',
+        openInNewWindow: 'เปิดในหน้าต่างใหม่'
+      },
+      table: {
+        table: 'ตาราง',
+        addRowAbove: 'เพิ่มแถวด้านบน',
+        addRowBelow: 'เพิ่มแถวด้านล่าง',
+        addColLeft: 'เพิ่มคอลัมน์ด้านซ้าย',
+        addColRight: 'เพิ่มคอลัมน์ด้านขวา',
+        delRow: 'ลบแถว',
+        delCol: 'ลบคอลัมน์',
+        delTable: 'ลบตาราง'
+      },
+      hr: {
+        insert: 'แทรกเส้นคั่น'
+      },
+      style: {
+        style: 'รูปแบบ',
+        p: 'ปกติ',
+        blockquote: 'ข้อความ',
+        pre: 'โค้ด',
+        h1: 'หัวข้อ 1',
+        h2: 'หัวข้อ 2',
+        h3: 'หัวข้อ 3',
+        h4: 'หัวข้อ 4',
+        h5: 'หัวข้อ 5',
+        h6: 'หัวข้อ 6'
+      },
+      lists: {
+        unordered: 'รายการแบบไม่มีลำดับ',
+        ordered: 'รายการแบบมีลำดับ'
+      },
+      options: {
+        help: 'ช่วยเหลือ',
+        fullscreen: 'ขยายเต็มหน้าจอ',
+        codeview: 'ซอร์สโค้ด'
+      },
+      paragraph: {
+        paragraph: 'ย่อหน้า',
+        outdent: 'เยื้องซ้าย',
+        indent: 'เยื้องขวา',
+        left: 'จัดหน้าชิดซ้าย',
+        center: 'จัดหน้ากึ่งกลาง',
+        right: 'จัดหน้าชิดขวา',
+        justify: 'จัดบรรทัดเสมอกัน'
+      },
+      color: {
+        recent: 'สีที่ใช้ล่าสุด',
+        more: 'สีอื่นๆ',
+        background: 'สีพื้นหลัง',
+        foreground: 'สีพื้นหน้า',
+        transparent: 'โปร่งแสง',
+        setTransparent: 'ตั้งค่าความโปร่งแสง',
+        reset: 'คืนค่า',
+        resetToDefault: 'คืนค่ามาตรฐาน'
+      },
+      shortcut: {
+        shortcuts: 'แป้นลัด',
+        close: 'ปิด',
+        textFormatting: 'การจัดรูปแบบข้อความ',
+        action: 'การกระทำ',
+        paragraphFormatting: 'การจัดรูปแบบย่อหน้า',
+        documentStyle: 'รูปแบบของเอกสาร',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'ทำตัวหนา',
+        'italic': 'ทำตัวเอียง',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H1',
+        'formatH2': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H2',
+        'formatH3': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H3',
+        'formatH4': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H4',
+        'formatH5': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H5',
+        'formatH6': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'เปิดหน้าแก้ไข Link'
+      },
+      history: {
+        undo: 'ยกเลิกการกระทำ',
+        redo: 'ทำซ้ำการกระทำ'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-th-TH.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js.map
new file mode 100644
index 0000000..6661710
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-th-TH.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-th-TH.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'th-TH': {\n      font: {\n        bold: 'ตัวหนา',\n        italic: 'ตัวเอียง',\n        underline: 'ขีดเส้นใต้',\n        clear: 'ล้างรูปแบบตัวอักษร',\n        height: 'ความสูงบรรทัด',\n        name: 'แบบตัวอักษร',\n        strikethrough: 'ขีดฆ่า',\n        subscript: 'ตัวห้อย',\n        superscript: 'ตัวยก',\n        size: 'ขนาดตัวอักษร',\n      },\n      image: {\n        image: 'รูปภาพ',\n        insert: 'แทรกรูปภาพ',\n        resizeFull: 'ปรับขนาดเท่าจริง',\n        resizeHalf: 'ปรับขนาดลง 50%',\n        resizeQuarter: 'ปรับขนาดลง 25%',\n        floatLeft: 'ชิดซ้าย',\n        floatRight: 'ชิดขวา',\n        floatNone: 'ไม่จัดตำแหน่ง',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'ลากรูปภาพที่ต้องการไว้ที่นี่',\n        dropImage: 'วางรูปภาพหรือข้อความ',\n        selectFromFiles: 'เลือกไฟล์รูปภาพ',\n        maximumFileSize: 'ขนาดไฟล์ใหญ่สุด',\n        maximumFileSizeError: 'ไฟล์เกินขนาดที่กำหนด',\n        url: 'ที่อยู่ URL ของรูปภาพ',\n        remove: 'ลบรูปภาพ',\n        original: 'Original',\n      },\n      video: {\n        video: 'วีดีโอ',\n        videoLink: 'ลิงก์ของวีดีโอ',\n        insert: 'แทรกวีดีโอ',\n        url: 'ที่อยู่ URL ของวีดีโอ',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion หรือ Youku)',\n      },\n      link: {\n        link: 'ตัวเชื่อมโยง',\n        insert: 'แทรกตัวเชื่อมโยง',\n        unlink: 'ยกเลิกตัวเชื่อมโยง',\n        edit: 'แก้ไข',\n        textToDisplay: 'ข้อความที่ให้แสดง',\n        url: 'ที่อยู่เว็บไซต์ที่ต้องการให้เชื่อมโยงไปถึง?',\n        openInNewWindow: 'เปิดในหน้าต่างใหม่',\n      },\n      table: {\n        table: 'ตาราง',\n        addRowAbove: 'เพิ่มแถวด้านบน',\n        addRowBelow: 'เพิ่มแถวด้านล่าง',\n        addColLeft: 'เพิ่มคอลัมน์ด้านซ้าย',\n        addColRight: 'เพิ่มคอลัมน์ด้านขวา',\n        delRow: 'ลบแถว',\n        delCol: 'ลบคอลัมน์',\n        delTable: 'ลบตาราง',\n      },\n      hr: {\n        insert: 'แทรกเส้นคั่น',\n      },\n      style: {\n        style: 'รูปแบบ',\n        p: 'ปกติ',\n        blockquote: 'ข้อความ',\n        pre: 'โค้ด',\n        h1: 'หัวข้อ 1',\n        h2: 'หัวข้อ 2',\n        h3: 'หัวข้อ 3',\n        h4: 'หัวข้อ 4',\n        h5: 'หัวข้อ 5',\n        h6: 'หัวข้อ 6',\n      },\n      lists: {\n        unordered: 'รายการแบบไม่มีลำดับ',\n        ordered: 'รายการแบบมีลำดับ',\n      },\n      options: {\n        help: 'ช่วยเหลือ',\n        fullscreen: 'ขยายเต็มหน้าจอ',\n        codeview: 'ซอร์สโค้ด',\n      },\n      paragraph: {\n        paragraph: 'ย่อหน้า',\n        outdent: 'เยื้องซ้าย',\n        indent: 'เยื้องขวา',\n        left: 'จัดหน้าชิดซ้าย',\n        center: 'จัดหน้ากึ่งกลาง',\n        right: 'จัดหน้าชิดขวา',\n        justify: 'จัดบรรทัดเสมอกัน',\n      },\n      color: {\n        recent: 'สีที่ใช้ล่าสุด',\n        more: 'สีอื่นๆ',\n        background: 'สีพื้นหลัง',\n        foreground: 'สีพื้นหน้า',\n        transparent: 'โปร่งแสง',\n        setTransparent: 'ตั้งค่าความโปร่งแสง',\n        reset: 'คืนค่า',\n        resetToDefault: 'คืนค่ามาตรฐาน',\n      },\n      shortcut: {\n        shortcuts: 'แป้นลัด',\n        close: 'ปิด',\n        textFormatting: 'การจัดรูปแบบข้อความ',\n        action: 'การกระทำ',\n        paragraphFormatting: 'การจัดรูปแบบย่อหน้า',\n        documentStyle: 'รูปแบบของเอกสาร',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'ทำตัวหนา',\n        'italic': 'ทำตัวเอียง',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H1',\n        'formatH2': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H2',\n        'formatH3': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H3',\n        'formatH4': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H4',\n        'formatH5': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H5',\n        'formatH6': 'เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'เปิดหน้าแก้ไข Link',\n      },\n      history: {\n        undo: 'ยกเลิกการกระทำ',\n        redo: 'ทำซ้ำการกระทำ',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js
new file mode 100644
index 0000000..57dcb8e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"th-TH":{font:{bold:"ตัวหนา",italic:"ตัวเอียง",underline:"ขีดเส้นใต้",clear:"ล้างรูปแบบตัวอักษร",height:"ความสูงบรรทัด",name:"แบบตัวอักษร",strikethrough:"ขีดฆ่า",subscript:"ตัวห้อย",superscript:"ตัวยก",size:"ขนาดตัวอักษร"},image:{image:"รูปภาพ",insert:"แทรกรูปภาพ",resizeFull:"ปรับขนาดเท่าจริง",resizeHalf:"ปรับขนาดลง 50%",resizeQuarter:"ปรับขนาดลง 25%",floatLeft:"ชิดซ้าย",floatRight:"ชิดขวา",floatNone:"ไม่จัดตำแหน่ง",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"ลากรูปภาพที่ต้องการไว้ที่นี่",dropImage:"วางรูปภาพหรือข้อความ",selectFromFiles:"เลือกไฟล์รูปภาพ",maximumFileSize:"ขนาดไฟล์ใหญ่สุด",maximumFileSizeError:"ไฟล์เกินขนาดที่กำหนด",url:"ที่อยู่ URL ของรูปภาพ",remove:"ลบรูปภาพ",original:"Original"},video:{video:"วีดีโอ",videoLink:"ลิงก์ของวีดีโอ",insert:"แทรกวีดีโอ",url:"ที่อยู่ URL ของวีดีโอ",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion หรือ Youku)"},link:{link:"ตัวเชื่อมโยง",insert:"แทรกตัวเชื่อมโยง",unlink:"ยกเลิกตัวเชื่อมโยง",edit:"แก้ไข",textToDisplay:"ข้อความที่ให้แสดง",url:"ที่อยู่เว็บไซต์ที่ต้องการให้เชื่อมโยงไปถึง?",openInNewWindow:"เปิดในหน้าต่างใหม่"},table:{table:"ตาราง",addRowAbove:"เพิ่มแถวด้านบน",addRowBelow:"เพิ่มแถวด้านล่าง",addColLeft:"เพิ่มคอลัมน์ด้านซ้าย",addColRight:"เพิ่มคอลัมน์ด้านขวา",delRow:"ลบแถว",delCol:"ลบคอลัมน์",delTable:"ลบตาราง"},hr:{insert:"แทรกเส้นคั่น"},style:{style:"รูปแบบ",p:"ปกติ",blockquote:"ข้อความ",pre:"โค้ด",h1:"หัวข้อ 1",h2:"หัวข้อ 2",h3:"หัวข้อ 3",h4:"หัวข้อ 4",h5:"หัวข้อ 5",h6:"หัวข้อ 6"},lists:{unordered:"รายการแบบไม่มีลำดับ",ordered:"รายการแบบมีลำดับ"},options:{help:"ช่วยเหลือ",fullscreen:"ขยายเต็มหน้าจอ",codeview:"ซอร์สโค้ด"},paragraph:{paragraph:"ย่อหน้า",outdent:"เยื้องซ้าย",indent:"เยื้องขวา",left:"จัดหน้าชิดซ้าย",center:"จัดหน้ากึ่งกลาง",right:"จัดหน้าชิดขวา",justify:"จัดบรรทัดเสมอกัน"},color:{recent:"สีที่ใช้ล่าสุด",more:"สีอื่นๆ",background:"สีพื้นหลัง",foreground:"สีพื้นหน้า",transparent:"โปร่งแสง",setTransparent:"ตั้งค่าความโปร่งแสง",reset:"คืนค่า",resetToDefault:"คืนค่ามาตรฐาน"},shortcut:{shortcuts:"แป้นลัด",close:"ปิด",textFormatting:"การจัดรูปแบบข้อความ",action:"การกระทำ",paragraphFormatting:"การจัดรูปแบบย่อหน้า",documentStyle:"รูปแบบของเอกสาร",extraKeys:"Extra keys"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"ทำตัวหนา",italic:"ทำตัวเอียง",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H1",formatH2:"เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H2",formatH3:"เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H3",formatH4:"เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H4",formatH5:"เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H5",formatH6:"เปลี่ยนรูปแบบบล็อคปัจจุบันเป็น H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"เปิดหน้าแก้ไข Link"},history:{undo:"ยกเลิกการกระทำ",redo:"ทำซ้ำการกระทำ"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-th-TH.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js
new file mode 100644
index 0000000..ddc92fa
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js
@@ -0,0 +1,186 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'tr-TR': {
+      font: {
+        bold: 'Kalın',
+        italic: 'İtalik',
+        underline: 'Altı çizili',
+        clear: 'Temizle',
+        height: 'Satır yüksekliği',
+        name: 'Yazı Tipi',
+        strikethrough: 'Üstü çizili',
+        subscript: 'Alt Simge',
+        superscript: 'Üst Simge',
+        size: 'Yazı tipi boyutu'
+      },
+      image: {
+        image: 'Resim',
+        insert: 'Resim ekle',
+        resizeFull: 'Orjinal boyut',
+        resizeHalf: '1/2 boyut',
+        resizeQuarter: '1/4 boyut',
+        floatLeft: 'Sola hizala',
+        floatRight: 'Sağa hizala',
+        floatNone: 'Hizalamayı kaldır',
+        shapeRounded: 'Şekil: Yuvarlatılmış Köşe',
+        shapeCircle: 'Şekil: Daire',
+        shapeThumbnail: 'Şekil: K.Resim',
+        shapeNone: 'Şekil: Yok',
+        dragImageHere: 'Buraya sürükleyin',
+        dropImage: 'Resim veya metni bırakın',
+        selectFromFiles: 'Dosya seçin',
+        maximumFileSize: 'Maksimum dosya boyutu',
+        maximumFileSizeError: 'Maksimum dosya boyutu aşıldı.',
+        url: 'Resim bağlantısı',
+        remove: 'Resimi Kaldır',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Video bağlantısı',
+        insert: 'Video ekle',
+        url: 'Video bağlantısı?',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion veya Youku)'
+      },
+      link: {
+        link: 'Bağlantı',
+        insert: 'Bağlantı ekle',
+        unlink: 'Bağlantıyı kaldır',
+        edit: 'Bağlantıyı düzenle',
+        textToDisplay: 'Görüntülemek için',
+        url: 'Bağlantı adresi?',
+        openInNewWindow: 'Yeni pencerede aç',
+        useProtocol: "Varsayılan protokolü kullan"
+      },
+      table: {
+        table: 'Tablo',
+        addRowAbove: 'Yukarı satır ekle',
+        addRowBelow: 'Aşağı satır ekle',
+        addColLeft: 'Sola sütun ekle',
+        addColRight: 'Sağa sütun ekle',
+        delRow: 'Satırı sil',
+        delCol: 'Sütunu sil',
+        delTable: 'Tabloyu sil'
+      },
+      hr: {
+        insert: 'Yatay çizgi ekle'
+      },
+      style: {
+        style: 'Biçim',
+        p: 'p',
+        blockquote: 'Alıntı',
+        pre: 'Önbiçimli',
+        h1: 'Başlık 1',
+        h2: 'Başlık 2',
+        h3: 'Başlık 3',
+        h4: 'Başlık 4',
+        h5: 'Başlık 5',
+        h6: 'Başlık 6'
+      },
+      lists: {
+        unordered: 'Madde işaretli liste',
+        ordered: 'Numaralı liste'
+      },
+      options: {
+        help: 'Yardım',
+        fullscreen: 'Tam ekran',
+        codeview: 'HTML Kodu'
+      },
+      paragraph: {
+        paragraph: 'Paragraf',
+        outdent: 'Girintiyi artır',
+        indent: 'Girintiyi azalt',
+        left: 'Sola hizala',
+        center: 'Ortaya hizala',
+        right: 'Sağa hizala',
+        justify: 'Yasla'
+      },
+      color: {
+        recent: 'Son renk',
+        more: 'Daha fazla renk',
+        background: 'Arka plan rengi',
+        foreground: 'Yazı rengi',
+        transparent: 'Seffaflık',
+        setTransparent: 'Şeffaflığı ayarla',
+        reset: 'Sıfırla',
+        resetToDefault: 'Varsayılanlara sıfırla',
+        cpSelect: 'Seç'
+      },
+      shortcut: {
+        shortcuts: 'Kısayollar',
+        close: 'Kapat',
+        textFormatting: 'Yazı biçimlendirme',
+        action: 'Eylem',
+        paragraphFormatting: 'Paragraf biçimlendirme',
+        documentStyle: 'Biçim',
+        extraKeys: 'İlave anahtarlar'
+      },
+      help: {
+        'insertParagraph': 'Paragraf ekler',
+        'undo': 'Son komudu geri alır',
+        'redo': 'Son komudu yineler',
+        'tab': 'Girintiyi artırır',
+        'untab': 'Girintiyi azaltır',
+        'bold': 'Kalın yazma stilini ayarlar',
+        'italic': 'İtalik yazma stilini ayarlar',
+        'underline': 'Altı çizgili yazma stilini ayarlar',
+        'strikethrough': 'Üstü çizgili yazma stilini ayarlar',
+        'removeFormat': 'Biçimlendirmeyi temizler',
+        'justifyLeft': 'Yazıyı sola hizalar',
+        'justifyCenter': 'Yazıyı ortalar',
+        'justifyRight': 'Yazıyı sağa hizalar',
+        'justifyFull': 'Yazıyı her iki tarafa yazlar',
+        'insertUnorderedList': 'Madde işaretli liste ekler',
+        'insertOrderedList': 'Numaralı liste ekler',
+        'outdent': 'Aktif paragrafın girintisini azaltır',
+        'indent': 'Aktif paragrafın girintisini artırır',
+        'formatPara': 'Aktif bloğun biçimini paragraf (p) olarak değiştirir',
+        'formatH1': 'Aktif bloğun biçimini başlık 1 (h1) olarak değiştirir',
+        'formatH2': 'Aktif bloğun biçimini başlık 2 (h2) olarak değiştirir',
+        'formatH3': 'Aktif bloğun biçimini başlık 3 (h3) olarak değiştirir',
+        'formatH4': 'Aktif bloğun biçimini başlık 4 (h4) olarak değiştirir',
+        'formatH5': 'Aktif bloğun biçimini başlık 5 (h5) olarak değiştirir',
+        'formatH6': 'Aktif bloğun biçimini başlık 6 (h6) olarak değiştirir',
+        'insertHorizontalRule': 'Yatay çizgi ekler',
+        'linkDialog.show': 'Bağlantı ayar kutusunu gösterir'
+      },
+      history: {
+        undo: 'Geri al',
+        redo: 'Yinele'
+      },
+      specialChar: {
+        specialChar: 'ÖZEL KARAKTERLER',
+        select: 'Özel Karakterleri seçin'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-tr-TR.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js.map
new file mode 100644
index 0000000..44dc604
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-tr-TR.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-tr-TR.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'tr-TR': {\n      font: {\n        bold: 'Kalın',\n        italic: 'İtalik',\n        underline: 'Altı çizili',\n        clear: 'Temizle',\n        height: 'Satır yüksekliği',\n        name: 'Yazı Tipi',\n        strikethrough: 'Üstü çizili',\n        subscript: 'Alt Simge',\n        superscript: 'Üst Simge',\n        size: 'Yazı tipi boyutu',\n      },\n      image: {\n        image: 'Resim',\n        insert: 'Resim ekle',\n        resizeFull: 'Orjinal boyut',\n        resizeHalf: '1/2 boyut',\n        resizeQuarter: '1/4 boyut',\n        floatLeft: 'Sola hizala',\n        floatRight: 'Sağa hizala',\n        floatNone: 'Hizalamayı kaldır',\n        shapeRounded: 'Şekil: Yuvarlatılmış Köşe',\n        shapeCircle: 'Şekil: Daire',\n        shapeThumbnail: 'Şekil: K.Resim',\n        shapeNone: 'Şekil: Yok',\n        dragImageHere: 'Buraya sürükleyin',\n        dropImage: 'Resim veya metni bırakın',\n        selectFromFiles: 'Dosya seçin',\n        maximumFileSize: 'Maksimum dosya boyutu',\n        maximumFileSizeError: 'Maksimum dosya boyutu aşıldı.',\n        url: 'Resim bağlantısı',\n        remove: 'Resimi Kaldır',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Video bağlantısı',\n        insert: 'Video ekle',\n        url: 'Video bağlantısı?',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion veya Youku)',\n      },\n      link: {\n        link: 'Bağlantı',\n        insert: 'Bağlantı ekle',\n        unlink: 'Bağlantıyı kaldır',\n        edit: 'Bağlantıyı düzenle',\n        textToDisplay: 'Görüntülemek için',\n        url: 'Bağlantı adresi?',\n        openInNewWindow: 'Yeni pencerede aç',\n        useProtocol: \"Varsayılan protokolü kullan\",\n      },\n      table: {\n        table: 'Tablo',\n        addRowAbove: 'Yukarı satır ekle',\n        addRowBelow: 'Aşağı satır ekle',\n        addColLeft: 'Sola sütun ekle',\n        addColRight: 'Sağa sütun ekle',\n        delRow: 'Satırı sil',\n        delCol: 'Sütunu sil',\n        delTable: 'Tabloyu sil',\n      },\n      hr: {\n        insert: 'Yatay çizgi ekle',\n      },\n      style: {\n        style: 'Biçim',\n        p: 'p',\n        blockquote: 'Alıntı',\n        pre: 'Önbiçimli',\n        h1: 'Başlık 1',\n        h2: 'Başlık 2',\n        h3: 'Başlık 3',\n        h4: 'Başlık 4',\n        h5: 'Başlık 5',\n        h6: 'Başlık 6',\n      },\n      lists: {\n        unordered: 'Madde işaretli liste',\n        ordered: 'Numaralı liste',\n      },\n      options: {\n        help: 'Yardım',\n        fullscreen: 'Tam ekran',\n        codeview: 'HTML Kodu',\n      },\n      paragraph: {\n        paragraph: 'Paragraf',\n        outdent: 'Girintiyi artır',\n        indent: 'Girintiyi azalt',\n        left: 'Sola hizala',\n        center: 'Ortaya hizala',\n        right: 'Sağa hizala',\n        justify: 'Yasla',\n      },\n      color: {\n        recent: 'Son renk',\n        more: 'Daha fazla renk',\n        background: 'Arka plan rengi',\n        foreground: 'Yazı rengi',\n        transparent: 'Seffaflık',\n        setTransparent: 'Şeffaflığı ayarla',\n        reset: 'Sıfırla',\n        resetToDefault: 'Varsayılanlara sıfırla',\n        cpSelect: 'Seç',\n      },\n      shortcut: {\n        shortcuts: 'Kısayollar',\n        close: 'Kapat',\n        textFormatting: 'Yazı biçimlendirme',\n        action: 'Eylem',\n        paragraphFormatting: 'Paragraf biçimlendirme',\n        documentStyle: 'Biçim',\n        extraKeys: 'İlave anahtarlar',\n      },\n      help: {\n        'insertParagraph': 'Paragraf ekler',\n        'undo': 'Son komudu geri alır',\n        'redo': 'Son komudu yineler',\n        'tab': 'Girintiyi artırır',\n        'untab': 'Girintiyi azaltır',\n        'bold': 'Kalın yazma stilini ayarlar',\n        'italic': 'İtalik yazma stilini ayarlar',\n        'underline': 'Altı çizgili yazma stilini ayarlar',\n        'strikethrough': 'Üstü çizgili yazma stilini ayarlar',\n        'removeFormat': 'Biçimlendirmeyi temizler',\n        'justifyLeft': 'Yazıyı sola hizalar',\n        'justifyCenter': 'Yazıyı ortalar',\n        'justifyRight': 'Yazıyı sağa hizalar',\n        'justifyFull': 'Yazıyı her iki tarafa yazlar',\n        'insertUnorderedList': 'Madde işaretli liste ekler',\n        'insertOrderedList': 'Numaralı liste ekler',\n        'outdent': 'Aktif paragrafın girintisini azaltır',\n        'indent': 'Aktif paragrafın girintisini artırır',\n        'formatPara': 'Aktif bloğun biçimini paragraf (p) olarak değiştirir',\n        'formatH1': 'Aktif bloğun biçimini başlık 1 (h1) olarak değiştirir',\n        'formatH2': 'Aktif bloğun biçimini başlık 2 (h2) olarak değiştirir',\n        'formatH3': 'Aktif bloğun biçimini başlık 3 (h3) olarak değiştirir',\n        'formatH4': 'Aktif bloğun biçimini başlık 4 (h4) olarak değiştirir',\n        'formatH5': 'Aktif bloğun biçimini başlık 5 (h5) olarak değiştirir',\n        'formatH6': 'Aktif bloğun biçimini başlık 6 (h6) olarak değiştirir',\n        'insertHorizontalRule': 'Yatay çizgi ekler',\n        'linkDialog.show': 'Bağlantı ayar kutusunu gösterir',\n      },\n      history: {\n        undo: 'Geri al',\n        redo: 'Yinele',\n      },\n      specialChar: {\n        specialChar: 'ÖZEL KARAKTERLER',\n        select: 'Özel Karakterleri seçin',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js
new file mode 100644
index 0000000..959a2ba
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(a,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i();else if("function"==typeof define&&define.amd)define([],i);else{var e=i();for(var r in e)("object"==typeof exports?exports:a)[r]=e[r]}}(self,(function(){return(a=jQuery).extend(a.summernote.lang,{"tr-TR":{font:{bold:"Kalın",italic:"İtalik",underline:"Altı çizili",clear:"Temizle",height:"Satır yüksekliği",name:"Yazı Tipi",strikethrough:"Üstü çizili",subscript:"Alt Simge",superscript:"Üst Simge",size:"Yazı tipi boyutu"},image:{image:"Resim",insert:"Resim ekle",resizeFull:"Orjinal boyut",resizeHalf:"1/2 boyut",resizeQuarter:"1/4 boyut",floatLeft:"Sola hizala",floatRight:"Sağa hizala",floatNone:"Hizalamayı kaldır",shapeRounded:"Şekil: Yuvarlatılmış Köşe",shapeCircle:"Şekil: Daire",shapeThumbnail:"Şekil: K.Resim",shapeNone:"Şekil: Yok",dragImageHere:"Buraya sürükleyin",dropImage:"Resim veya metni bırakın",selectFromFiles:"Dosya seçin",maximumFileSize:"Maksimum dosya boyutu",maximumFileSizeError:"Maksimum dosya boyutu aşıldı.",url:"Resim bağlantısı",remove:"Resimi Kaldır",original:"Original"},video:{video:"Video",videoLink:"Video bağlantısı",insert:"Video ekle",url:"Video bağlantısı?",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion veya Youku)"},link:{link:"Bağlantı",insert:"Bağlantı ekle",unlink:"Bağlantıyı kaldır",edit:"Bağlantıyı düzenle",textToDisplay:"Görüntülemek için",url:"Bağlantı adresi?",openInNewWindow:"Yeni pencerede aç",useProtocol:"Varsayılan protokolü kullan"},table:{table:"Tablo",addRowAbove:"Yukarı satır ekle",addRowBelow:"Aşağı satır ekle",addColLeft:"Sola sütun ekle",addColRight:"Sağa sütun ekle",delRow:"Satırı sil",delCol:"Sütunu sil",delTable:"Tabloyu sil"},hr:{insert:"Yatay çizgi ekle"},style:{style:"Biçim",p:"p",blockquote:"Alıntı",pre:"Önbiçimli",h1:"Başlık 1",h2:"Başlık 2",h3:"Başlık 3",h4:"Başlık 4",h5:"Başlık 5",h6:"Başlık 6"},lists:{unordered:"Madde işaretli liste",ordered:"Numaralı liste"},options:{help:"Yardım",fullscreen:"Tam ekran",codeview:"HTML Kodu"},paragraph:{paragraph:"Paragraf",outdent:"Girintiyi artır",indent:"Girintiyi azalt",left:"Sola hizala",center:"Ortaya hizala",right:"Sağa hizala",justify:"Yasla"},color:{recent:"Son renk",more:"Daha fazla renk",background:"Arka plan rengi",foreground:"Yazı rengi",transparent:"Seffaflık",setTransparent:"Şeffaflığı ayarla",reset:"Sıfırla",resetToDefault:"Varsayılanlara sıfırla",cpSelect:"Seç"},shortcut:{shortcuts:"Kısayollar",close:"Kapat",textFormatting:"Yazı biçimlendirme",action:"Eylem",paragraphFormatting:"Paragraf biçimlendirme",documentStyle:"Biçim",extraKeys:"İlave anahtarlar"},help:{insertParagraph:"Paragraf ekler",undo:"Son komudu geri alır",redo:"Son komudu yineler",tab:"Girintiyi artırır",untab:"Girintiyi azaltır",bold:"Kalın yazma stilini ayarlar",italic:"İtalik yazma stilini ayarlar",underline:"Altı çizgili yazma stilini ayarlar",strikethrough:"Üstü çizgili yazma stilini ayarlar",removeFormat:"Biçimlendirmeyi temizler",justifyLeft:"Yazıyı sola hizalar",justifyCenter:"Yazıyı ortalar",justifyRight:"Yazıyı sağa hizalar",justifyFull:"Yazıyı her iki tarafa yazlar",insertUnorderedList:"Madde işaretli liste ekler",insertOrderedList:"Numaralı liste ekler",outdent:"Aktif paragrafın girintisini azaltır",indent:"Aktif paragrafın girintisini artırır",formatPara:"Aktif bloğun biçimini paragraf (p) olarak değiştirir",formatH1:"Aktif bloğun biçimini başlık 1 (h1) olarak değiştirir",formatH2:"Aktif bloğun biçimini başlık 2 (h2) olarak değiştirir",formatH3:"Aktif bloğun biçimini başlık 3 (h3) olarak değiştirir",formatH4:"Aktif bloğun biçimini başlık 4 (h4) olarak değiştirir",formatH5:"Aktif bloğun biçimini başlık 5 (h5) olarak değiştirir",formatH6:"Aktif bloğun biçimini başlık 6 (h6) olarak değiştirir",insertHorizontalRule:"Yatay çizgi ekler","linkDialog.show":"Bağlantı ayar kutusunu gösterir"},history:{undo:"Geri al",redo:"Yinele"},specialChar:{specialChar:"ÖZEL KARAKTERLER",select:"Özel Karakterleri seçin"}}}),{};var a}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-tr-TR.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js
new file mode 100644
index 0000000..60e9bec
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js
@@ -0,0 +1,185 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'uk-UA': {
+      font: {
+        bold: 'Напівжирний',
+        italic: 'Курсив',
+        underline: 'Підкреслений',
+        clear: 'Прибрати стилі шрифту',
+        height: 'Висота лінії',
+        name: 'Шрифт',
+        strikethrough: 'Закреслений',
+        subscript: 'Нижній індекс',
+        superscript: 'Верхній індекс',
+        size: 'Розмір шрифту'
+      },
+      image: {
+        image: 'Картинка',
+        insert: 'Вставити картинку',
+        resizeFull: 'Відновити розмір',
+        resizeHalf: 'Зменшити до 50%',
+        resizeQuarter: 'Зменшити до 25%',
+        floatLeft: 'Розташувати ліворуч',
+        floatRight: 'Розташувати праворуч',
+        floatNone: 'Початкове розташування',
+        shapeRounded: 'Форма: Заокруглена',
+        shapeCircle: 'Форма: Коло',
+        shapeThumbnail: 'Форма: Мініатюра',
+        shapeNone: 'Форма: Немає',
+        dragImageHere: 'Перетягніть сюди картинку',
+        dropImage: 'Перетягніть картинку',
+        selectFromFiles: 'Вибрати з файлів',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'URL картинки',
+        remove: 'Видалити картинку',
+        original: 'Original'
+      },
+      video: {
+        video: 'Відео',
+        videoLink: 'Посилання на відео',
+        insert: 'Вставити відео',
+        url: 'URL відео',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion чи Youku)'
+      },
+      link: {
+        link: 'Посилання',
+        insert: 'Вставити посилання',
+        unlink: 'Прибрати посилання',
+        edit: 'Редагувати',
+        textToDisplay: 'Текст, що відображається',
+        url: 'URL для переходу',
+        openInNewWindow: 'Відкривати у новому вікні',
+        useProtocol: 'Використовувати протокол за замовчуванням'
+      },
+      table: {
+        table: 'Таблиця',
+        addRowAbove: 'Add row above',
+        addRowBelow: 'Add row below',
+        addColLeft: 'Add column left',
+        addColRight: 'Add column right',
+        delRow: 'Delete row',
+        delCol: 'Delete column',
+        delTable: 'Delete table'
+      },
+      hr: {
+        insert: 'Вставити горизонтальну лінію'
+      },
+      style: {
+        style: 'Стиль',
+        p: 'Нормальний',
+        blockquote: 'Цитата',
+        pre: 'Код',
+        h1: 'Заголовок 1',
+        h2: 'Заголовок 2',
+        h3: 'Заголовок 3',
+        h4: 'Заголовок 4',
+        h5: 'Заголовок 5',
+        h6: 'Заголовок 6'
+      },
+      lists: {
+        unordered: 'Маркований список',
+        ordered: 'Нумерований список'
+      },
+      options: {
+        help: 'Допомога',
+        fullscreen: 'На весь екран',
+        codeview: 'Початковий код'
+      },
+      paragraph: {
+        paragraph: 'Параграф',
+        outdent: 'Зменшити відступ',
+        indent: 'Збільшити відступ',
+        left: 'Вирівняти по лівому краю',
+        center: 'Вирівняти по центру',
+        right: 'Вирівняти по правому краю',
+        justify: 'Розтягнути по ширині'
+      },
+      color: {
+        recent: 'Останній колір',
+        more: 'Ще кольори',
+        background: 'Колір фону',
+        foreground: 'Колір шрифту',
+        transparent: 'Прозорий',
+        setTransparent: 'Зробити прозорим',
+        reset: 'Відновити',
+        resetToDefault: 'Відновити початкові'
+      },
+      shortcut: {
+        shortcuts: 'Комбінації клавіш',
+        close: 'Закрити',
+        textFormatting: 'Форматування тексту',
+        action: 'Дія',
+        paragraphFormatting: 'Форматування параграфу',
+        documentStyle: 'Стиль документу',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Відмінити',
+        redo: 'Повторити'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-uk-UA.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js.map
new file mode 100644
index 0000000..cd53019
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-uk-UA.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-uk-UA.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'uk-UA': {\n      font: {\n        bold: 'Напівжирний',\n        italic: 'Курсив',\n        underline: 'Підкреслений',\n        clear: 'Прибрати стилі шрифту',\n        height: 'Висота лінії',\n        name: 'Шрифт',\n        strikethrough: 'Закреслений',\n        subscript: 'Нижній індекс',\n        superscript: 'Верхній індекс',\n        size: 'Розмір шрифту',\n      },\n      image: {\n        image: 'Картинка',\n        insert: 'Вставити картинку',\n        resizeFull: 'Відновити розмір',\n        resizeHalf: 'Зменшити до 50%',\n        resizeQuarter: 'Зменшити до 25%',\n        floatLeft: 'Розташувати ліворуч',\n        floatRight: 'Розташувати праворуч',\n        floatNone: 'Початкове розташування',\n        shapeRounded: 'Форма: Заокруглена',\n        shapeCircle: 'Форма: Коло',\n        shapeThumbnail: 'Форма: Мініатюра',\n        shapeNone: 'Форма: Немає',\n        dragImageHere: 'Перетягніть сюди картинку',\n        dropImage: 'Перетягніть картинку',\n        selectFromFiles: 'Вибрати з файлів',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'URL картинки',\n        remove: 'Видалити картинку',\n        original: 'Original',\n      },\n      video: {\n        video: 'Відео',\n        videoLink: 'Посилання на відео',\n        insert: 'Вставити відео',\n        url: 'URL відео',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion чи Youku)',\n      },\n      link: {\n        link: 'Посилання',\n        insert: 'Вставити посилання',\n        unlink: 'Прибрати посилання',\n        edit: 'Редагувати',\n        textToDisplay: 'Текст, що відображається',\n        url: 'URL для переходу',\n        openInNewWindow: 'Відкривати у новому вікні',\n        useProtocol: 'Використовувати протокол за замовчуванням',\n      },\n      table: {\n        table: 'Таблиця',\n        addRowAbove: 'Add row above',\n        addRowBelow: 'Add row below',\n        addColLeft: 'Add column left',\n        addColRight: 'Add column right',\n        delRow: 'Delete row',\n        delCol: 'Delete column',\n        delTable: 'Delete table',\n      },\n      hr: {\n        insert: 'Вставити горизонтальну лінію',\n      },\n      style: {\n        style: 'Стиль',\n        p: 'Нормальний',\n        blockquote: 'Цитата',\n        pre: 'Код',\n        h1: 'Заголовок 1',\n        h2: 'Заголовок 2',\n        h3: 'Заголовок 3',\n        h4: 'Заголовок 4',\n        h5: 'Заголовок 5',\n        h6: 'Заголовок 6',\n      },\n      lists: {\n        unordered: 'Маркований список',\n        ordered: 'Нумерований список',\n      },\n      options: {\n        help: 'Допомога',\n        fullscreen: 'На весь екран',\n        codeview: 'Початковий код',\n      },\n      paragraph: {\n        paragraph: 'Параграф',\n        outdent: 'Зменшити відступ',\n        indent: 'Збільшити відступ',\n        left: 'Вирівняти по лівому краю',\n        center: 'Вирівняти по центру',\n        right: 'Вирівняти по правому краю',\n        justify: 'Розтягнути по ширині',\n      },\n      color: {\n        recent: 'Останній колір',\n        more: 'Ще кольори',\n        background: 'Колір фону',\n        foreground: 'Колір шрифту',\n        transparent: 'Прозорий',\n        setTransparent: 'Зробити прозорим',\n        reset: 'Відновити',\n        resetToDefault: 'Відновити початкові',\n      },\n      shortcut: {\n        shortcuts: 'Комбінації клавіш',\n        close: 'Закрити',\n        textFormatting: 'Форматування тексту',\n        action: 'Дія',\n        paragraphFormatting: 'Форматування параграфу',\n        documentStyle: 'Стиль документу',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Відмінити',\n        redo: 'Повторити',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js
new file mode 100644
index 0000000..6ab1dc5
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"uk-UA":{font:{bold:"Напівжирний",italic:"Курсив",underline:"Підкреслений",clear:"Прибрати стилі шрифту",height:"Висота лінії",name:"Шрифт",strikethrough:"Закреслений",subscript:"Нижній індекс",superscript:"Верхній індекс",size:"Розмір шрифту"},image:{image:"Картинка",insert:"Вставити картинку",resizeFull:"Відновити розмір",resizeHalf:"Зменшити до 50%",resizeQuarter:"Зменшити до 25%",floatLeft:"Розташувати ліворуч",floatRight:"Розташувати праворуч",floatNone:"Початкове розташування",shapeRounded:"Форма: Заокруглена",shapeCircle:"Форма: Коло",shapeThumbnail:"Форма: Мініатюра",shapeNone:"Форма: Немає",dragImageHere:"Перетягніть сюди картинку",dropImage:"Перетягніть картинку",selectFromFiles:"Вибрати з файлів",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"URL картинки",remove:"Видалити картинку",original:"Original"},video:{video:"Відео",videoLink:"Посилання на відео",insert:"Вставити відео",url:"URL відео",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion чи Youku)"},link:{link:"Посилання",insert:"Вставити посилання",unlink:"Прибрати посилання",edit:"Редагувати",textToDisplay:"Текст, що відображається",url:"URL для переходу",openInNewWindow:"Відкривати у новому вікні",useProtocol:"Використовувати протокол за замовчуванням"},table:{table:"Таблиця",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Вставити горизонтальну лінію"},style:{style:"Стиль",p:"Нормальний",blockquote:"Цитата",pre:"Код",h1:"Заголовок 1",h2:"Заголовок 2",h3:"Заголовок 3",h4:"Заголовок 4",h5:"Заголовок 5",h6:"Заголовок 6"},lists:{unordered:"Маркований список",ordered:"Нумерований список"},options:{help:"Допомога",fullscreen:"На весь екран",codeview:"Початковий код"},paragraph:{paragraph:"Параграф",outdent:"Зменшити відступ",indent:"Збільшити відступ",left:"Вирівняти по лівому краю",center:"Вирівняти по центру",right:"Вирівняти по правому краю",justify:"Розтягнути по ширині"},color:{recent:"Останній колір",more:"Ще кольори",background:"Колір фону",foreground:"Колір шрифту",transparent:"Прозорий",setTransparent:"Зробити прозорим",reset:"Відновити",resetToDefault:"Відновити початкові"},shortcut:{shortcuts:"Комбінації клавіш",close:"Закрити",textFormatting:"Форматування тексту",action:"Дія",paragraphFormatting:"Форматування параграфу",documentStyle:"Стиль документу",extraKeys:"Extra keys"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Відмінити",redo:"Повторити"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uk-UA.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js
new file mode 100644
index 0000000..7ebf911
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js
@@ -0,0 +1,141 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'uz-UZ': {
+      font: {
+        bold: 'қалин',
+        italic: 'Курсив',
+        underline: 'Белгиланган',
+        clear: 'Ҳарф турларини олиб ташлаш',
+        height: 'Чизиқ баландлиги',
+        name: 'Ҳарф',
+        strikethrough: 'Ўчирилган',
+        subscript: 'Пастки индекс',
+        superscript: 'Юқори индекс',
+        size: 'ҳарф ҳажми'
+      },
+      image: {
+        image: 'Расм',
+        insert: 'расмни қўйиш',
+        resizeFull: 'Ҳажмни тиклаш',
+        resizeHalf: '50% гача кичрайтириш',
+        resizeQuarter: '25% гача кичрайтириш',
+        floatLeft: 'Чапда жойлаштириш',
+        floatRight: 'Ўнгда жойлаштириш',
+        floatNone: 'Стандарт бўйича жойлашув',
+        shapeRounded: 'Шакли: Юмалоқ',
+        shapeCircle: 'Шакли: Доира',
+        shapeThumbnail: 'Шакли: Миниатюра',
+        shapeNone: 'Шакли: Йўқ',
+        dragImageHere: 'Суратни кўчириб ўтинг',
+        dropImage: 'Суратни кўчириб ўтинг',
+        selectFromFiles: 'Файллардан бирини танлаш',
+        url: 'суратлар URL и',
+        remove: 'Суратни ўчириш'
+      },
+      video: {
+        video: 'Видео',
+        videoLink: 'Видеога ҳавола',
+        insert: 'Видео',
+        url: 'URL видео',
+        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)'
+      },
+      link: {
+        link: 'Ҳавола',
+        insert: 'Ҳаволани қўйиш',
+        unlink: 'Ҳаволани олиб ташлаш',
+        edit: 'Таҳрир қилиш',
+        textToDisplay: 'Кўринадиган матн',
+        url: 'URL ўтиш учун',
+        openInNewWindow: 'Янги дарчада очиш'
+      },
+      table: {
+        table: 'Жадвал'
+      },
+      hr: {
+        insert: 'Горизонтал чизиқни қўйиш'
+      },
+      style: {
+        style: 'Услуб',
+        p: 'Яхши',
+        blockquote: 'Жумла',
+        pre: 'Код',
+        h1: 'Сарлавҳа 1',
+        h2: 'Сарлавҳа  2',
+        h3: 'Сарлавҳа  3',
+        h4: 'Сарлавҳа  4',
+        h5: 'Сарлавҳа  5',
+        h6: 'Сарлавҳа  6'
+      },
+      lists: {
+        unordered: 'Белгиланган рўйҳат',
+        ordered: 'Рақамланган рўйҳат'
+      },
+      options: {
+        help: 'Ёрдам',
+        fullscreen: 'Бутун экран бўйича',
+        codeview: 'Бошланғич код'
+      },
+      paragraph: {
+        paragraph: 'Параграф',
+        outdent: 'Орқага қайтишни камайтириш',
+        indent: 'Орқага қайтишни кўпайтириш',
+        left: 'Чап қирғоққа тўғрилаш',
+        center: 'Марказга тўғрилаш',
+        right: 'Ўнг қирғоққа тўғрилаш',
+        justify: 'Эни бўйлаб чўзиш'
+      },
+      color: {
+        recent: 'Охирги ранг',
+        more: 'Яна ранглар',
+        background: 'Фон  ранги',
+        foreground: 'Ҳарф ранги',
+        transparent: 'Шаффоф',
+        setTransparent: 'Шаффофдай қилиш',
+        reset: 'Бекор қилиш',
+        resetToDefault: 'Стандартга оид тиклаш'
+      },
+      shortcut: {
+        shortcuts: 'Клавишларнинг ҳамохҳанглиги',
+        close: 'Ёпиқ',
+        textFormatting: 'Матнни ',
+        action: 'Ҳаркат',
+        paragraphFormatting: 'Параграфни форматлаш',
+        documentStyle: 'Ҳужжатнинг тури',
+        extraKeys: 'Қўшимча имкониятлар'
+      },
+      history: {
+        undo: 'Бекор қилиш',
+        redo: 'Қайтариш'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-uz-UZ.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js.map
new file mode 100644
index 0000000..19361dd
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-uz-UZ.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-uz-UZ.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'uz-UZ': {\n      font: {\n        bold: 'қалин',\n        italic: 'Курсив',\n        underline: 'Белгиланган',\n        clear: 'Ҳарф турларини олиб ташлаш',\n        height: 'Чизиқ баландлиги',\n        name: 'Ҳарф',\n        strikethrough: 'Ўчирилган',\n        subscript: 'Пастки индекс',\n        superscript: 'Юқори индекс',\n        size: 'ҳарф ҳажми',\n      },\n      image: {\n        image: 'Расм',\n        insert: 'расмни қўйиш',\n        resizeFull: 'Ҳажмни тиклаш',\n        resizeHalf: '50% гача кичрайтириш',\n        resizeQuarter: '25% гача кичрайтириш',\n        floatLeft: 'Чапда жойлаштириш',\n        floatRight: 'Ўнгда жойлаштириш',\n        floatNone: 'Стандарт бўйича жойлашув',\n        shapeRounded: 'Шакли: Юмалоқ',\n        shapeCircle: 'Шакли: Доира',\n        shapeThumbnail: 'Шакли: Миниатюра',\n        shapeNone: 'Шакли: Йўқ',\n        dragImageHere: 'Суратни кўчириб ўтинг',\n        dropImage: 'Суратни кўчириб ўтинг',\n        selectFromFiles: 'Файллардан бирини танлаш',\n        url: 'суратлар URL и',\n        remove: 'Суратни ўчириш',\n      },\n      video: {\n        video: 'Видео',\n        videoLink: 'Видеога ҳавола',\n        insert: 'Видео',\n        url: 'URL видео',\n        providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)',\n      },\n      link: {\n        link: 'Ҳавола',\n        insert: 'Ҳаволани қўйиш',\n        unlink: 'Ҳаволани олиб ташлаш',\n        edit: 'Таҳрир қилиш',\n        textToDisplay: 'Кўринадиган матн',\n        url: 'URL ўтиш учун',\n        openInNewWindow: 'Янги дарчада очиш',\n      },\n      table: {\n        table: 'Жадвал',\n      },\n      hr: {\n        insert: 'Горизонтал чизиқни қўйиш',\n      },\n      style: {\n        style: 'Услуб',\n        p: 'Яхши',\n        blockquote: 'Жумла',\n        pre: 'Код',\n        h1: 'Сарлавҳа 1',\n        h2: 'Сарлавҳа  2',\n        h3: 'Сарлавҳа  3',\n        h4: 'Сарлавҳа  4',\n        h5: 'Сарлавҳа  5',\n        h6: 'Сарлавҳа  6',\n      },\n      lists: {\n        unordered: 'Белгиланган рўйҳат',\n        ordered: 'Рақамланган рўйҳат',\n      },\n      options: {\n        help: 'Ёрдам',\n        fullscreen: 'Бутун экран бўйича',\n        codeview: 'Бошланғич код',\n      },\n      paragraph: {\n        paragraph: 'Параграф',\n        outdent: 'Орқага қайтишни камайтириш',\n        indent: 'Орқага қайтишни кўпайтириш',\n        left: 'Чап қирғоққа тўғрилаш',\n        center: 'Марказга тўғрилаш',\n        right: 'Ўнг қирғоққа тўғрилаш',\n        justify: 'Эни бўйлаб чўзиш',\n      },\n      color: {\n        recent: 'Охирги ранг',\n        more: 'Яна ранглар',\n        background: 'Фон  ранги',\n        foreground: 'Ҳарф ранги',\n        transparent: 'Шаффоф',\n        setTransparent: 'Шаффофдай қилиш',\n        reset: 'Бекор қилиш',\n        resetToDefault: 'Стандартга оид тиклаш',\n      },\n      shortcut: {\n        shortcuts: 'Клавишларнинг ҳамохҳанглиги',\n        close: 'Ёпиқ',\n        textFormatting: 'Матнни ',\n        action: 'Ҳаркат',\n        paragraphFormatting: 'Параграфни форматлаш',\n        documentStyle: 'Ҳужжатнинг тури',\n        extraKeys: 'Қўшимча имкониятлар',\n      },\n      history: {\n        undo: 'Бекор қилиш',\n        redo: 'Қайтариш',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","url","remove","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js
new file mode 100644
index 0000000..1f36694
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"uz-UZ":{font:{bold:"қалин",italic:"Курсив",underline:"Белгиланган",clear:"Ҳарф турларини олиб ташлаш",height:"Чизиқ баландлиги",name:"Ҳарф",strikethrough:"Ўчирилган",subscript:"Пастки индекс",superscript:"Юқори индекс",size:"ҳарф ҳажми"},image:{image:"Расм",insert:"расмни қўйиш",resizeFull:"Ҳажмни тиклаш",resizeHalf:"50% гача кичрайтириш",resizeQuarter:"25% гача кичрайтириш",floatLeft:"Чапда жойлаштириш",floatRight:"Ўнгда жойлаштириш",floatNone:"Стандарт бўйича жойлашув",shapeRounded:"Шакли: Юмалоқ",shapeCircle:"Шакли: Доира",shapeThumbnail:"Шакли: Миниатюра",shapeNone:"Шакли: Йўқ",dragImageHere:"Суратни кўчириб ўтинг",dropImage:"Суратни кўчириб ўтинг",selectFromFiles:"Файллардан бирини танлаш",url:"суратлар URL и",remove:"Суратни ўчириш"},video:{video:"Видео",videoLink:"Видеога ҳавола",insert:"Видео",url:"URL видео",providers:"(YouTube, Vimeo, Vine, Instagram, DailyMotion или Youku)"},link:{link:"Ҳавола",insert:"Ҳаволани қўйиш",unlink:"Ҳаволани олиб ташлаш",edit:"Таҳрир қилиш",textToDisplay:"Кўринадиган матн",url:"URL ўтиш учун",openInNewWindow:"Янги дарчада очиш"},table:{table:"Жадвал"},hr:{insert:"Горизонтал чизиқни қўйиш"},style:{style:"Услуб",p:"Яхши",blockquote:"Жумла",pre:"Код",h1:"Сарлавҳа 1",h2:"Сарлавҳа  2",h3:"Сарлавҳа  3",h4:"Сарлавҳа  4",h5:"Сарлавҳа  5",h6:"Сарлавҳа  6"},lists:{unordered:"Белгиланган рўйҳат",ordered:"Рақамланган рўйҳат"},options:{help:"Ёрдам",fullscreen:"Бутун экран бўйича",codeview:"Бошланғич код"},paragraph:{paragraph:"Параграф",outdent:"Орқага қайтишни камайтириш",indent:"Орқага қайтишни кўпайтириш",left:"Чап қирғоққа тўғрилаш",center:"Марказга тўғрилаш",right:"Ўнг қирғоққа тўғрилаш",justify:"Эни бўйлаб чўзиш"},color:{recent:"Охирги ранг",more:"Яна ранглар",background:"Фон  ранги",foreground:"Ҳарф ранги",transparent:"Шаффоф",setTransparent:"Шаффофдай қилиш",reset:"Бекор қилиш",resetToDefault:"Стандартга оид тиклаш"},shortcut:{shortcuts:"Клавишларнинг ҳамохҳанглиги",close:"Ёпиқ",textFormatting:"Матнни ",action:"Ҳаркат",paragraphFormatting:"Параграфни форматлаш",documentStyle:"Ҳужжатнинг тури",extraKeys:"Қўшимча имкониятлар"},history:{undo:"Бекор қилиш",redo:"Қайтариш"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-uz-UZ.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js
new file mode 100644
index 0000000..a297bf6
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'vi-VN': {
+      font: {
+        bold: 'In Đậm',
+        italic: 'In Nghiêng',
+        underline: 'Gạch dưới',
+        clear: 'Bỏ định dạng',
+        height: 'Chiều cao dòng',
+        name: 'Phông chữ',
+        strikethrough: 'Gạch ngang',
+        subscript: 'Subscript',
+        superscript: 'Superscript',
+        size: 'Cỡ chữ'
+      },
+      image: {
+        image: 'Hình ảnh',
+        insert: 'Chèn',
+        resizeFull: '100%',
+        resizeHalf: '50%',
+        resizeQuarter: '25%',
+        floatLeft: 'Trôi về trái',
+        floatRight: 'Trôi về phải',
+        floatNone: 'Không trôi',
+        shapeRounded: 'Shape: Rounded',
+        shapeCircle: 'Shape: Circle',
+        shapeThumbnail: 'Shape: Thumbnail',
+        shapeNone: 'Shape: None',
+        dragImageHere: 'Thả Ảnh ở vùng này',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: 'Chọn từ File',
+        maximumFileSize: 'Maximum file size',
+        maximumFileSizeError: 'Maximum file size exceeded.',
+        url: 'URL',
+        remove: 'Xóa',
+        original: 'Original'
+      },
+      video: {
+        video: 'Video',
+        videoLink: 'Link đến Video',
+        insert: 'Chèn Video',
+        url: 'URL',
+        providers: '(Hỗ trợ YouTube, Vimeo, Vine, Instagram, DailyMotion và Youku)'
+      },
+      link: {
+        link: 'Link',
+        insert: 'Chèn Link',
+        unlink: 'Gỡ Link',
+        edit: 'Sửa',
+        textToDisplay: 'Văn bản hiển thị',
+        url: 'URL',
+        openInNewWindow: 'Mở ở Cửa sổ mới'
+      },
+      table: {
+        table: 'Bảng',
+        addRowAbove: 'Chèn dòng phía trên',
+        addRowBelow: 'Chèn dòng phía dưới',
+        addColLeft: 'Chèn cột bên trái',
+        addColRight: 'Chèn cột bên phải',
+        delRow: 'Xóa dòng',
+        delCol: 'Xóa cột',
+        delTable: 'Xóa bảng'
+      },
+      hr: {
+        insert: 'Chèn'
+      },
+      style: {
+        style: 'Kiểu chữ',
+        p: 'Chữ thường',
+        blockquote: 'Đoạn trích',
+        pre: 'Mã Code',
+        h1: 'H1',
+        h2: 'H2',
+        h3: 'H3',
+        h4: 'H4',
+        h5: 'H5',
+        h6: 'H6'
+      },
+      lists: {
+        unordered: 'Liệt kê danh sách',
+        ordered: 'Liệt kê theo thứ tự'
+      },
+      options: {
+        help: 'Trợ giúp',
+        fullscreen: 'Toàn Màn hình',
+        codeview: 'Xem Code'
+      },
+      paragraph: {
+        paragraph: 'Canh lề',
+        outdent: 'Dịch sang trái',
+        indent: 'Dịch sang phải',
+        left: 'Canh trái',
+        center: 'Canh giữa',
+        right: 'Canh phải',
+        justify: 'Canh đều'
+      },
+      color: {
+        recent: 'Màu chữ',
+        more: 'Mở rộng',
+        background: 'Màu nền',
+        foreground: 'Màu chữ',
+        transparent: 'trong suốt',
+        setTransparent: 'Nền trong suốt',
+        reset: 'Thiết lập lại',
+        resetToDefault: 'Trở lại ban đầu'
+      },
+      shortcut: {
+        shortcuts: 'Phím tắt',
+        close: 'Đóng',
+        textFormatting: 'Định dạng Văn bản',
+        action: 'Hành động',
+        paragraphFormatting: 'Định dạng',
+        documentStyle: 'Kiểu văn bản',
+        extraKeys: 'Extra keys'
+      },
+      help: {
+        'insertParagraph': 'Chèn đo văn',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: 'Lùi lại',
+        redo: 'Làm lại'
+      },
+      specialChar: {
+        specialChar: 'KÝ TỰ ĐẶC BIỆT',
+        select: 'Chọn ký tự đặc biệt'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-vi-VN.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js.map
new file mode 100644
index 0000000..9fbefb4
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-vi-VN.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-vi-VN.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'vi-VN': {\n      font: {\n        bold: 'In Đậm',\n        italic: 'In Nghiêng',\n        underline: 'Gạch dưới',\n        clear: 'Bỏ định dạng',\n        height: 'Chiều cao dòng',\n        name: 'Phông chữ',\n        strikethrough: 'Gạch ngang',\n        subscript: 'Subscript',\n        superscript: 'Superscript',\n        size: 'Cỡ chữ',\n      },\n      image: {\n        image: 'Hình ảnh',\n        insert: 'Chèn',\n        resizeFull: '100%',\n        resizeHalf: '50%',\n        resizeQuarter: '25%',\n        floatLeft: 'Trôi về trái',\n        floatRight: 'Trôi về phải',\n        floatNone: 'Không trôi',\n        shapeRounded: 'Shape: Rounded',\n        shapeCircle: 'Shape: Circle',\n        shapeThumbnail: 'Shape: Thumbnail',\n        shapeNone: 'Shape: None',\n        dragImageHere: 'Thả Ảnh ở vùng này',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: 'Chọn từ File',\n        maximumFileSize: 'Maximum file size',\n        maximumFileSizeError: 'Maximum file size exceeded.',\n        url: 'URL',\n        remove: 'Xóa',\n        original: 'Original',\n      },\n      video: {\n        video: 'Video',\n        videoLink: 'Link đến Video',\n        insert: 'Chèn Video',\n        url: 'URL',\n        providers: '(Hỗ trợ YouTube, Vimeo, Vine, Instagram, DailyMotion và Youku)',\n      },\n      link: {\n        link: 'Link',\n        insert: 'Chèn Link',\n        unlink: 'Gỡ Link',\n        edit: 'Sửa',\n        textToDisplay: 'Văn bản hiển thị',\n        url: 'URL',\n        openInNewWindow: 'Mở ở Cửa sổ mới',\n      },\n      table: {\n        table: 'Bảng',\n        addRowAbove: 'Chèn dòng phía trên',\n        addRowBelow: 'Chèn dòng phía dưới',\n        addColLeft: 'Chèn cột bên trái',\n        addColRight: 'Chèn cột bên phải',\n        delRow: 'Xóa dòng',\n        delCol: 'Xóa cột',\n        delTable: 'Xóa bảng',\n      },\n      hr: {\n        insert: 'Chèn',\n      },\n      style: {\n        style: 'Kiểu chữ',\n        p: 'Chữ thường',\n        blockquote: 'Đoạn trích',\n        pre: 'Mã Code',\n        h1: 'H1',\n        h2: 'H2',\n        h3: 'H3',\n        h4: 'H4',\n        h5: 'H5',\n        h6: 'H6',\n      },\n      lists: {\n        unordered: 'Liệt kê danh sách',\n        ordered: 'Liệt kê theo thứ tự',\n      },\n      options: {\n        help: 'Trợ giúp',\n        fullscreen: 'Toàn Màn hình',\n        codeview: 'Xem Code',\n      },\n      paragraph: {\n        paragraph: 'Canh lề',\n        outdent: 'Dịch sang trái',\n        indent: 'Dịch sang phải',\n        left: 'Canh trái',\n        center: 'Canh giữa',\n        right: 'Canh phải',\n        justify: 'Canh đều',\n      },\n      color: {\n        recent: 'Màu chữ',\n        more: 'Mở rộng',\n        background: 'Màu nền',\n        foreground: 'Màu chữ',\n        transparent: 'trong suốt',\n        setTransparent: 'Nền trong suốt',\n        reset: 'Thiết lập lại',\n        resetToDefault: 'Trở lại ban đầu',\n      },\n      shortcut: {\n        shortcuts: 'Phím tắt',\n        close: 'Đóng',\n        textFormatting: 'Định dạng Văn bản',\n        action: 'Hành động',\n        paragraphFormatting: 'Định dạng',\n        documentStyle: 'Kiểu văn bản',\n        extraKeys: 'Extra keys',\n      },\n      help: {\n        'insertParagraph': 'Chèn đo văn',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: 'Lùi lại',\n        redo: 'Làm lại',\n      },\n      specialChar: {\n        specialChar: 'KÝ TỰ ĐẶC BIỆT',\n        select: 'Chọn ký tự đặc biệt',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js
new file mode 100644
index 0000000..babcaca
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"vi-VN":{font:{bold:"In Đậm",italic:"In Nghiêng",underline:"Gạch dưới",clear:"Bỏ định dạng",height:"Chiều cao dòng",name:"Phông chữ",strikethrough:"Gạch ngang",subscript:"Subscript",superscript:"Superscript",size:"Cỡ chữ"},image:{image:"Hình ảnh",insert:"Chèn",resizeFull:"100%",resizeHalf:"50%",resizeQuarter:"25%",floatLeft:"Trôi về trái",floatRight:"Trôi về phải",floatNone:"Không trôi",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Thả Ảnh ở vùng này",dropImage:"Drop image or Text",selectFromFiles:"Chọn từ File",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"URL",remove:"Xóa",original:"Original"},video:{video:"Video",videoLink:"Link đến Video",insert:"Chèn Video",url:"URL",providers:"(Hỗ trợ YouTube, Vimeo, Vine, Instagram, DailyMotion và Youku)"},link:{link:"Link",insert:"Chèn Link",unlink:"Gỡ Link",edit:"Sửa",textToDisplay:"Văn bản hiển thị",url:"URL",openInNewWindow:"Mở ở Cửa sổ mới"},table:{table:"Bảng",addRowAbove:"Chèn dòng phía trên",addRowBelow:"Chèn dòng phía dưới",addColLeft:"Chèn cột bên trái",addColRight:"Chèn cột bên phải",delRow:"Xóa dòng",delCol:"Xóa cột",delTable:"Xóa bảng"},hr:{insert:"Chèn"},style:{style:"Kiểu chữ",p:"Chữ thường",blockquote:"Đoạn trích",pre:"Mã Code",h1:"H1",h2:"H2",h3:"H3",h4:"H4",h5:"H5",h6:"H6"},lists:{unordered:"Liệt kê danh sách",ordered:"Liệt kê theo thứ tự"},options:{help:"Trợ giúp",fullscreen:"Toàn Màn hình",codeview:"Xem Code"},paragraph:{paragraph:"Canh lề",outdent:"Dịch sang trái",indent:"Dịch sang phải",left:"Canh trái",center:"Canh giữa",right:"Canh phải",justify:"Canh đều"},color:{recent:"Màu chữ",more:"Mở rộng",background:"Màu nền",foreground:"Màu chữ",transparent:"trong suốt",setTransparent:"Nền trong suốt",reset:"Thiết lập lại",resetToDefault:"Trở lại ban đầu"},shortcut:{shortcuts:"Phím tắt",close:"Đóng",textFormatting:"Định dạng Văn bản",action:"Hành động",paragraphFormatting:"Định dạng",documentStyle:"Kiểu văn bản",extraKeys:"Extra keys"},help:{insertParagraph:"Chèn đo văn",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Lùi lại",redo:"Làm lại"},specialChar:{specialChar:"KÝ TỰ ĐẶC BIỆT",select:"Chọn ký tự đặc biệt"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-vi-VN.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js
new file mode 100644
index 0000000..53106e6
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'zh-CN': {
+      font: {
+        bold: '粗体',
+        italic: '斜体',
+        underline: '下划线',
+        clear: '清除格式',
+        height: '行高',
+        name: '字体',
+        strikethrough: '删除线',
+        subscript: '下标',
+        superscript: '上标',
+        size: '字号'
+      },
+      image: {
+        image: '图片',
+        insert: '插入图片',
+        resizeFull: '缩放至 100%',
+        resizeHalf: '缩放至 50%',
+        resizeQuarter: '缩放至 25%',
+        floatLeft: '靠左浮动',
+        floatRight: '靠右浮动',
+        floatNone: '取消浮动',
+        shapeRounded: '形状: 圆角',
+        shapeCircle: '形状: 圆',
+        shapeThumbnail: '形状: 缩略图',
+        shapeNone: '形状: 无',
+        dragImageHere: '将图片拖拽至此处',
+        dropImage: '拖拽图片或文本',
+        selectFromFiles: '从本地上传',
+        maximumFileSize: '文件大小最大值',
+        maximumFileSizeError: '文件大小超出最大值。',
+        url: '图片地址',
+        remove: '移除图片',
+        original: '原始图片'
+      },
+      video: {
+        video: '视频',
+        videoLink: '视频链接',
+        insert: '插入视频',
+        url: '视频地址',
+        providers: '(优酷, 腾讯, Instagram, DailyMotion, Youtube等)'
+      },
+      link: {
+        link: '链接',
+        insert: '插入链接',
+        unlink: '去除链接',
+        edit: '编辑链接',
+        textToDisplay: '显示文本',
+        url: '链接地址',
+        openInNewWindow: '在新窗口打开'
+      },
+      table: {
+        table: '表格',
+        addRowAbove: '在上方插入行',
+        addRowBelow: '在下方插入行',
+        addColLeft: '在左侧插入列',
+        addColRight: '在右侧插入列',
+        delRow: '删除行',
+        delCol: '删除列',
+        delTable: '删除表格'
+      },
+      hr: {
+        insert: '水平线'
+      },
+      style: {
+        style: '样式',
+        p: '普通',
+        blockquote: '引用',
+        pre: '代码',
+        h1: '标题 1',
+        h2: '标题 2',
+        h3: '标题 3',
+        h4: '标题 4',
+        h5: '标题 5',
+        h6: '标题 6'
+      },
+      lists: {
+        unordered: '无序列表',
+        ordered: '有序列表'
+      },
+      options: {
+        help: '帮助',
+        fullscreen: '全屏',
+        codeview: '源代码'
+      },
+      paragraph: {
+        paragraph: '段落',
+        outdent: '减少缩进',
+        indent: '增加缩进',
+        left: '左对齐',
+        center: '居中对齐',
+        right: '右对齐',
+        justify: '两端对齐'
+      },
+      color: {
+        recent: '最近使用',
+        more: '更多',
+        background: '背景',
+        foreground: '前景',
+        transparent: '透明',
+        setTransparent: '透明',
+        reset: '重置',
+        resetToDefault: '默认'
+      },
+      shortcut: {
+        shortcuts: '快捷键',
+        close: '关闭',
+        textFormatting: '文本格式',
+        action: '动作',
+        paragraphFormatting: '段落格式',
+        documentStyle: '文档样式',
+        extraKeys: '额外按键'
+      },
+      help: {
+        insertParagraph: '插入段落',
+        undo: '撤销',
+        redo: '重做',
+        tab: '增加缩进',
+        untab: '减少缩进',
+        bold: '粗体',
+        italic: '斜体',
+        underline: '下划线',
+        strikethrough: '删除线',
+        removeFormat: '清除格式',
+        justifyLeft: '左对齐',
+        justifyCenter: '居中对齐',
+        justifyRight: '右对齐',
+        justifyFull: '两端对齐',
+        insertUnorderedList: '无序列表',
+        insertOrderedList: '有序列表',
+        outdent: '减少缩进',
+        indent: '增加缩进',
+        formatPara: '设置选中内容样式为 普通',
+        formatH1: '设置选中内容样式为 标题1',
+        formatH2: '设置选中内容样式为 标题2',
+        formatH3: '设置选中内容样式为 标题3',
+        formatH4: '设置选中内容样式为 标题4',
+        formatH5: '设置选中内容样式为 标题5',
+        formatH6: '设置选中内容样式为 标题6',
+        insertHorizontalRule: '插入水平线',
+        'linkDialog.show': '显示链接对话框'
+      },
+      history: {
+        undo: '撤销',
+        redo: '重做'
+      },
+      specialChar: {
+        specialChar: '特殊字符',
+        select: '选取特殊字符'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-zh-CN.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js.map
new file mode 100644
index 0000000..375c24d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-zh-CN.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-zh-CN.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'zh-CN': {\n      font: {\n        bold: '粗体',\n        italic: '斜体',\n        underline: '下划线',\n        clear: '清除格式',\n        height: '行高',\n        name: '字体',\n        strikethrough: '删除线',\n        subscript: '下标',\n        superscript: '上标',\n        size: '字号',\n      },\n      image: {\n        image: '图片',\n        insert: '插入图片',\n        resizeFull: '缩放至 100%',\n        resizeHalf: '缩放至 50%',\n        resizeQuarter: '缩放至 25%',\n        floatLeft: '靠左浮动',\n        floatRight: '靠右浮动',\n        floatNone: '取消浮动',\n        shapeRounded: '形状: 圆角',\n        shapeCircle: '形状: 圆',\n        shapeThumbnail: '形状: 缩略图',\n        shapeNone: '形状: 无',\n        dragImageHere: '将图片拖拽至此处',\n        dropImage: '拖拽图片或文本',\n        selectFromFiles: '从本地上传',\n        maximumFileSize: '文件大小最大值',\n        maximumFileSizeError: '文件大小超出最大值。',\n        url: '图片地址',\n        remove: '移除图片',\n        original: '原始图片',\n      },\n      video: {\n        video: '视频',\n        videoLink: '视频链接',\n        insert: '插入视频',\n        url: '视频地址',\n        providers: '(优酷, 腾讯, Instagram, DailyMotion, Youtube等)',\n      },\n      link: {\n        link: '链接',\n        insert: '插入链接',\n        unlink: '去除链接',\n        edit: '编辑链接',\n        textToDisplay: '显示文本',\n        url: '链接地址',\n        openInNewWindow: '在新窗口打开',\n      },\n      table: {\n        table: '表格',\n        addRowAbove: '在上方插入行',\n        addRowBelow: '在下方插入行',\n        addColLeft: '在左侧插入列',\n        addColRight: '在右侧插入列',\n        delRow: '删除行',\n        delCol: '删除列',\n        delTable: '删除表格',\n      },\n      hr: {\n        insert: '水平线',\n      },\n      style: {\n        style: '样式',\n        p: '普通',\n        blockquote: '引用',\n        pre: '代码',\n        h1: '标题 1',\n        h2: '标题 2',\n        h3: '标题 3',\n        h4: '标题 4',\n        h5: '标题 5',\n        h6: '标题 6',\n      },\n      lists: {\n        unordered: '无序列表',\n        ordered: '有序列表',\n      },\n      options: {\n        help: '帮助',\n        fullscreen: '全屏',\n        codeview: '源代码',\n      },\n      paragraph: {\n        paragraph: '段落',\n        outdent: '减少缩进',\n        indent: '增加缩进',\n        left: '左对齐',\n        center: '居中对齐',\n        right: '右对齐',\n        justify: '两端对齐',\n      },\n      color: {\n        recent: '最近使用',\n        more: '更多',\n        background: '背景',\n        foreground: '前景',\n        transparent: '透明',\n        setTransparent: '透明',\n        reset: '重置',\n        resetToDefault: '默认',\n      },\n      shortcut: {\n        shortcuts: '快捷键',\n        close: '关闭',\n        textFormatting: '文本格式',\n        action: '动作',\n        paragraphFormatting: '段落格式',\n        documentStyle: '文档样式',\n        extraKeys: '额外按键',\n      },\n      help: {\n        insertParagraph: '插入段落',\n        undo: '撤销',\n        redo: '重做',\n        tab: '增加缩进',\n        untab: '减少缩进',\n        bold: '粗体',\n        italic: '斜体',\n        underline: '下划线',\n        strikethrough: '删除线',\n        removeFormat: '清除格式',\n        justifyLeft: '左对齐',\n        justifyCenter: '居中对齐',\n        justifyRight: '右对齐',\n        justifyFull: '两端对齐',\n        insertUnorderedList: '无序列表',\n        insertOrderedList: '有序列表',\n        outdent: '减少缩进',\n        indent: '增加缩进',\n        formatPara: '设置选中内容样式为 普通',\n        formatH1: '设置选中内容样式为 标题1',\n        formatH2: '设置选中内容样式为 标题2',\n        formatH3: '设置选中内容样式为 标题3',\n        formatH4: '设置选中内容样式为 标题4',\n        formatH5: '设置选中内容样式为 标题5',\n        formatH6: '设置选中内容样式为 标题6',\n        insertHorizontalRule: '插入水平线',\n        'linkDialog.show': '显示链接对话框',\n      },\n      history: {\n        undo: '撤销',\n        redo: '重做',\n      },\n      specialChar: {\n        specialChar: '特殊字符',\n        select: '选取特殊字符',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","insertParagraph","undo","redo","tab","untab","removeFormat","justifyLeft","justifyCenter","justifyRight","justifyFull","insertUnorderedList","insertOrderedList","formatPara","formatH1","formatH2","formatH3","formatH4","formatH5","formatH6","insertHorizontalRule","history","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js
new file mode 100644
index 0000000..4e1ad61
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var o in r)("object"==typeof exports?exports:e)[o]=r[o]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"zh-CN":{font:{bold:"粗体",italic:"斜体",underline:"下划线",clear:"清除格式",height:"行高",name:"字体",strikethrough:"删除线",subscript:"下标",superscript:"上标",size:"字号"},image:{image:"图片",insert:"插入图片",resizeFull:"缩放至 100%",resizeHalf:"缩放至 50%",resizeQuarter:"缩放至 25%",floatLeft:"靠左浮动",floatRight:"靠右浮动",floatNone:"取消浮动",shapeRounded:"形状: 圆角",shapeCircle:"形状: 圆",shapeThumbnail:"形状: 缩略图",shapeNone:"形状: 无",dragImageHere:"将图片拖拽至此处",dropImage:"拖拽图片或文本",selectFromFiles:"从本地上传",maximumFileSize:"文件大小最大值",maximumFileSizeError:"文件大小超出最大值。",url:"图片地址",remove:"移除图片",original:"原始图片"},video:{video:"视频",videoLink:"视频链接",insert:"插入视频",url:"视频地址",providers:"(优酷, 腾讯, Instagram, DailyMotion, Youtube等)"},link:{link:"链接",insert:"插入链接",unlink:"去除链接",edit:"编辑链接",textToDisplay:"显示文本",url:"链接地址",openInNewWindow:"在新窗口打开"},table:{table:"表格",addRowAbove:"在上方插入行",addRowBelow:"在下方插入行",addColLeft:"在左侧插入列",addColRight:"在右侧插入列",delRow:"删除行",delCol:"删除列",delTable:"删除表格"},hr:{insert:"水平线"},style:{style:"样式",p:"普通",blockquote:"引用",pre:"代码",h1:"标题 1",h2:"标题 2",h3:"标题 3",h4:"标题 4",h5:"标题 5",h6:"标题 6"},lists:{unordered:"无序列表",ordered:"有序列表"},options:{help:"帮助",fullscreen:"全屏",codeview:"源代码"},paragraph:{paragraph:"段落",outdent:"减少缩进",indent:"增加缩进",left:"左对齐",center:"居中对齐",right:"右对齐",justify:"两端对齐"},color:{recent:"最近使用",more:"更多",background:"背景",foreground:"前景",transparent:"透明",setTransparent:"透明",reset:"重置",resetToDefault:"默认"},shortcut:{shortcuts:"快捷键",close:"关闭",textFormatting:"文本格式",action:"动作",paragraphFormatting:"段落格式",documentStyle:"文档样式",extraKeys:"额外按键"},help:{insertParagraph:"插入段落",undo:"撤销",redo:"重做",tab:"增加缩进",untab:"减少缩进",bold:"粗体",italic:"斜体",underline:"下划线",strikethrough:"删除线",removeFormat:"清除格式",justifyLeft:"左对齐",justifyCenter:"居中对齐",justifyRight:"右对齐",justifyFull:"两端对齐",insertUnorderedList:"无序列表",insertOrderedList:"有序列表",outdent:"减少缩进",indent:"增加缩进",formatPara:"设置选中内容样式为 普通",formatH1:"设置选中内容样式为 标题1",formatH2:"设置选中内容样式为 标题2",formatH3:"设置选中内容样式为 标题3",formatH4:"设置选中内容样式为 标题4",formatH5:"设置选中内容样式为 标题5",formatH6:"设置选中内容样式为 标题6",insertHorizontalRule:"插入水平线","linkDialog.show":"显示链接对话框"},history:{undo:"撤销",redo:"重做"},specialChar:{specialChar:"特殊字符",select:"选取特殊字符"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-CN.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js
new file mode 100644
index 0000000..97e0e8a
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js
@@ -0,0 +1,184 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function() {
+return /******/ (() => { // webpackBootstrap
+var __webpack_exports__ = {};
+(function ($) {
+  $.extend($.summernote.lang, {
+    'zh-TW': {
+      font: {
+        bold: '粗體',
+        italic: '斜體',
+        underline: '底線',
+        clear: '清除格式',
+        height: '行高',
+        name: '字體',
+        strikethrough: '刪除線',
+        subscript: '下標',
+        superscript: '上標',
+        size: '字號'
+      },
+      image: {
+        image: '圖片',
+        insert: '插入圖片',
+        resizeFull: '縮放至100%',
+        resizeHalf: '縮放至 50%',
+        resizeQuarter: '縮放至 25%',
+        floatLeft: '靠左浮動',
+        floatRight: '靠右浮動',
+        floatNone: '取消浮動',
+        shapeRounded: '形狀: 圓角',
+        shapeCircle: '形狀: 圓',
+        shapeThumbnail: '形狀: 縮略圖',
+        shapeNone: '形狀: 無',
+        dragImageHere: '將圖片拖曳至此處',
+        dropImage: 'Drop image or Text',
+        selectFromFiles: '從本機上傳',
+        maximumFileSize: '文件大小最大值',
+        maximumFileSizeError: '文件大小超出最大值。',
+        url: '圖片網址',
+        remove: '移除圖片',
+        original: 'Original'
+      },
+      video: {
+        video: '影片',
+        videoLink: '影片連結',
+        insert: '插入影片',
+        url: '影片網址',
+        providers: '(優酷, Instagram, DailyMotion, Youtube等)'
+      },
+      link: {
+        link: '連結',
+        insert: '插入連結',
+        unlink: '取消連結',
+        edit: '編輯連結',
+        textToDisplay: '顯示文字',
+        url: '連結網址',
+        openInNewWindow: '在新視窗開啟'
+      },
+      table: {
+        table: '表格',
+        addRowAbove: '上方插入列',
+        addRowBelow: '下方插入列',
+        addColLeft: '左方插入欄',
+        addColRight: '右方插入欄',
+        delRow: '刪除列',
+        delCol: '刪除欄',
+        delTable: '刪除表格'
+      },
+      hr: {
+        insert: '水平線'
+      },
+      style: {
+        style: '樣式',
+        p: '一般',
+        blockquote: '引用區塊',
+        pre: '程式碼區塊',
+        h1: '標題 1',
+        h2: '標題 2',
+        h3: '標題 3',
+        h4: '標題 4',
+        h5: '標題 5',
+        h6: '標題 6'
+      },
+      lists: {
+        unordered: '項目清單',
+        ordered: '編號清單'
+      },
+      options: {
+        help: '幫助',
+        fullscreen: '全螢幕',
+        codeview: '原始碼'
+      },
+      paragraph: {
+        paragraph: '段落',
+        outdent: '取消縮排',
+        indent: '增加縮排',
+        left: '靠右對齊',
+        center: '靠中對齊',
+        right: '靠右對齊',
+        justify: '左右對齊'
+      },
+      color: {
+        recent: '字型顏色',
+        more: '更多',
+        background: '背景',
+        foreground: '字體',
+        transparent: '透明',
+        setTransparent: '透明',
+        reset: '重設',
+        resetToDefault: '預設'
+      },
+      shortcut: {
+        shortcuts: '快捷鍵',
+        close: '關閉',
+        textFormatting: '文字格式',
+        action: '動作',
+        paragraphFormatting: '段落格式',
+        documentStyle: '文件格式',
+        extraKeys: '額外按鍵'
+      },
+      help: {
+        'insertParagraph': 'Insert Paragraph',
+        'undo': 'Undoes the last command',
+        'redo': 'Redoes the last command',
+        'tab': 'Tab',
+        'untab': 'Untab',
+        'bold': 'Set a bold style',
+        'italic': 'Set a italic style',
+        'underline': 'Set a underline style',
+        'strikethrough': 'Set a strikethrough style',
+        'removeFormat': 'Clean a style',
+        'justifyLeft': 'Set left align',
+        'justifyCenter': 'Set center align',
+        'justifyRight': 'Set right align',
+        'justifyFull': 'Set full align',
+        'insertUnorderedList': 'Toggle unordered list',
+        'insertOrderedList': 'Toggle ordered list',
+        'outdent': 'Outdent on current paragraph',
+        'indent': 'Indent on current paragraph',
+        'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+        'formatH1': 'Change current block\'s format as H1',
+        'formatH2': 'Change current block\'s format as H2',
+        'formatH3': 'Change current block\'s format as H3',
+        'formatH4': 'Change current block\'s format as H4',
+        'formatH5': 'Change current block\'s format as H5',
+        'formatH6': 'Change current block\'s format as H6',
+        'insertHorizontalRule': 'Insert horizontal rule',
+        'linkDialog.show': 'Show Link Dialog'
+      },
+      history: {
+        undo: '復原',
+        redo: '取消復原'
+      },
+      specialChar: {
+        specialChar: 'SPECIAL CHARACTERS',
+        select: 'Select Special characters'
+      }
+    }
+  });
+})(jQuery);
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-zh-TW.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js.map b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js.map
new file mode 100644
index 0000000..01e41d8
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lang/summernote-zh-TW.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-zh-TW.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function() {\nreturn ","(function($) {\n  $.extend($.summernote.lang, {\n    'zh-TW': {\n      font: {\n        bold: '粗體',\n        italic: '斜體',\n        underline: '底線',\n        clear: '清除格式',\n        height: '行高',\n        name: '字體',\n        strikethrough: '刪除線',\n        subscript: '下標',\n        superscript: '上標',\n        size: '字號',\n      },\n      image: {\n        image: '圖片',\n        insert: '插入圖片',\n        resizeFull: '縮放至100%',\n        resizeHalf: '縮放至 50%',\n        resizeQuarter: '縮放至 25%',\n        floatLeft: '靠左浮動',\n        floatRight: '靠右浮動',\n        floatNone: '取消浮動',\n        shapeRounded: '形狀: 圓角',\n        shapeCircle: '形狀: 圓',\n        shapeThumbnail: '形狀: 縮略圖',\n        shapeNone: '形狀: 無',\n        dragImageHere: '將圖片拖曳至此處',\n        dropImage: 'Drop image or Text',\n        selectFromFiles: '從本機上傳',\n        maximumFileSize: '文件大小最大值',\n        maximumFileSizeError: '文件大小超出最大值。',\n        url: '圖片網址',\n        remove: '移除圖片',\n        original: 'Original',\n      },\n      video: {\n        video: '影片',\n        videoLink: '影片連結',\n        insert: '插入影片',\n        url: '影片網址',\n        providers: '(優酷, Instagram, DailyMotion, Youtube等)',\n      },\n      link: {\n        link: '連結',\n        insert: '插入連結',\n        unlink: '取消連結',\n        edit: '編輯連結',\n        textToDisplay: '顯示文字',\n        url: '連結網址',\n        openInNewWindow: '在新視窗開啟',\n      },\n      table: {\n        table: '表格',\n        addRowAbove: '上方插入列',\n        addRowBelow: '下方插入列',\n        addColLeft: '左方插入欄',\n        addColRight: '右方插入欄',\n        delRow: '刪除列',\n        delCol: '刪除欄',\n        delTable: '刪除表格',\n      },\n      hr: {\n        insert: '水平線',\n      },\n      style: {\n        style: '樣式',\n        p: '一般',\n        blockquote: '引用區塊',\n        pre: '程式碼區塊',\n        h1: '標題 1',\n        h2: '標題 2',\n        h3: '標題 3',\n        h4: '標題 4',\n        h5: '標題 5',\n        h6: '標題 6',\n      },\n      lists: {\n        unordered: '項目清單',\n        ordered: '編號清單',\n      },\n      options: {\n        help: '幫助',\n        fullscreen: '全螢幕',\n        codeview: '原始碼',\n      },\n      paragraph: {\n        paragraph: '段落',\n        outdent: '取消縮排',\n        indent: '增加縮排',\n        left: '靠右對齊',\n        center: '靠中對齊',\n        right: '靠右對齊',\n        justify: '左右對齊',\n      },\n      color: {\n        recent: '字型顏色',\n        more: '更多',\n        background: '背景',\n        foreground: '字體',\n        transparent: '透明',\n        setTransparent: '透明',\n        reset: '重設',\n        resetToDefault: '預設',\n      },\n      shortcut: {\n        shortcuts: '快捷鍵',\n        close: '關閉',\n        textFormatting: '文字格式',\n        action: '動作',\n        paragraphFormatting: '段落格式',\n        documentStyle: '文件格式',\n        extraKeys: '額外按鍵',\n      },\n      help: {\n        'insertParagraph': 'Insert Paragraph',\n        'undo': 'Undoes the last command',\n        'redo': 'Redoes the last command',\n        'tab': 'Tab',\n        'untab': 'Untab',\n        'bold': 'Set a bold style',\n        'italic': 'Set a italic style',\n        'underline': 'Set a underline style',\n        'strikethrough': 'Set a strikethrough style',\n        'removeFormat': 'Clean a style',\n        'justifyLeft': 'Set left align',\n        'justifyCenter': 'Set center align',\n        'justifyRight': 'Set right align',\n        'justifyFull': 'Set full align',\n        'insertUnorderedList': 'Toggle unordered list',\n        'insertOrderedList': 'Toggle ordered list',\n        'outdent': 'Outdent on current paragraph',\n        'indent': 'Indent on current paragraph',\n        'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n        'formatH1': 'Change current block\\'s format as H1',\n        'formatH2': 'Change current block\\'s format as H2',\n        'formatH3': 'Change current block\\'s format as H3',\n        'formatH4': 'Change current block\\'s format as H4',\n        'formatH5': 'Change current block\\'s format as H5',\n        'formatH6': 'Change current block\\'s format as H6',\n        'insertHorizontalRule': 'Insert horizontal rule',\n        'linkDialog.show': 'Show Link Dialog',\n      },\n      history: {\n        undo: '復原',\n        redo: '取消復原',\n      },\n      specialChar: {\n        specialChar: 'SPECIAL CHARACTERS',\n        select: 'Select Special characters',\n      },\n    },\n  });\n})(jQuery);\n"],"names":["$","extend","summernote","lang","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","image","insert","resizeFull","resizeHalf","resizeQuarter","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","jQuery"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js
new file mode 100644
index 0000000..e2c6217
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var a in r)("object"==typeof exports?exports:e)[a]=r[a]}}(self,(function(){return(e=jQuery).extend(e.summernote.lang,{"zh-TW":{font:{bold:"粗體",italic:"斜體",underline:"底線",clear:"清除格式",height:"行高",name:"字體",strikethrough:"刪除線",subscript:"下標",superscript:"上標",size:"字號"},image:{image:"圖片",insert:"插入圖片",resizeFull:"縮放至100%",resizeHalf:"縮放至 50%",resizeQuarter:"縮放至 25%",floatLeft:"靠左浮動",floatRight:"靠右浮動",floatNone:"取消浮動",shapeRounded:"形狀: 圓角",shapeCircle:"形狀: 圓",shapeThumbnail:"形狀: 縮略圖",shapeNone:"形狀: 無",dragImageHere:"將圖片拖曳至此處",dropImage:"Drop image or Text",selectFromFiles:"從本機上傳",maximumFileSize:"文件大小最大值",maximumFileSizeError:"文件大小超出最大值。",url:"圖片網址",remove:"移除圖片",original:"Original"},video:{video:"影片",videoLink:"影片連結",insert:"插入影片",url:"影片網址",providers:"(優酷, Instagram, DailyMotion, Youtube等)"},link:{link:"連結",insert:"插入連結",unlink:"取消連結",edit:"編輯連結",textToDisplay:"顯示文字",url:"連結網址",openInNewWindow:"在新視窗開啟"},table:{table:"表格",addRowAbove:"上方插入列",addRowBelow:"下方插入列",addColLeft:"左方插入欄",addColRight:"右方插入欄",delRow:"刪除列",delCol:"刪除欄",delTable:"刪除表格"},hr:{insert:"水平線"},style:{style:"樣式",p:"一般",blockquote:"引用區塊",pre:"程式碼區塊",h1:"標題 1",h2:"標題 2",h3:"標題 3",h4:"標題 4",h5:"標題 5",h6:"標題 6"},lists:{unordered:"項目清單",ordered:"編號清單"},options:{help:"幫助",fullscreen:"全螢幕",codeview:"原始碼"},paragraph:{paragraph:"段落",outdent:"取消縮排",indent:"增加縮排",left:"靠右對齊",center:"靠中對齊",right:"靠右對齊",justify:"左右對齊"},color:{recent:"字型顏色",more:"更多",background:"背景",foreground:"字體",transparent:"透明",setTransparent:"透明",reset:"重設",resetToDefault:"預設"},shortcut:{shortcuts:"快捷鍵",close:"關閉",textFormatting:"文字格式",action:"動作",paragraphFormatting:"段落格式",documentStyle:"文件格式",extraKeys:"額外按鍵"},help:{insertParagraph:"Insert Paragraph",undo:"Undoes the last command",redo:"Redoes the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"復原",redo:"取消復原"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"}}}),{};var e}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/lang/summernote-zh-TW.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.css b/public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.css
new file mode 100644
index 0000000..6232dde
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.css
@@ -0,0 +1,16 @@
+.ext-databasic {
+	position: relative;
+	display: block;
+	min-height: 50px;
+	background-color: cyan;
+	text-align: center;
+	padding: 20px;
+	border: 1px solid white;
+	border-radius: 10px;
+}
+
+.ext-databasic p {
+	color: white;
+	font-size: 1.2em;
+	margin: 0;
+}
diff --git a/public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.js b/public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.js
new file mode 100644
index 0000000..749a867
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/plugin/databasic/summernote-ext-databasic.js
@@ -0,0 +1,291 @@
+(function(factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module.
+    define(['jquery'], factory);
+  } else if (typeof module === 'object' && module.exports) {
+    // Node/CommonJS
+    module.exports = factory(require('jquery'));
+  } else {
+    // Browser globals
+    factory(window.jQuery);
+  }
+}(function($) {
+  // pull in some summernote core functions
+  var ui = $.summernote.ui;
+  var dom = $.summernote.dom;
+
+  // define the popover plugin
+  var DataBasicPlugin = function(context) {
+    var self = this;
+    var options = context.options;
+    var lang = options.langInfo;
+
+    self.icon = '<i class="fa fa-object-group"></i>';
+
+    // add context menu button for dialog
+    context.memo('button.databasic', function() {
+      return ui.button({
+        contents: self.icon,
+        tooltip: lang.databasic.insert,
+        click: context.createInvokeHandler('databasic.showDialog'),
+      }).render();
+    });
+
+    // add popover edit button
+    context.memo('button.databasicDialog', function() {
+      return ui.button({
+        contents: self.icon,
+        tooltip: lang.databasic.edit,
+        click: context.createInvokeHandler('databasic.showDialog'),
+      }).render();
+    });
+
+    //  add popover size buttons
+    context.memo('button.databasicSize100', function() {
+      return ui.button({
+        contents: '<span class="note-fontsize-10">100%</span>',
+        tooltip: lang.image.resizeFull,
+        click: context.createInvokeHandler('editor.resize', '1'),
+      }).render();
+    });
+    context.memo('button.databasicSize50', function() {
+      return ui.button({
+        contents: '<span class="note-fontsize-10">50%</span>',
+        tooltip: lang.image.resizeHalf,
+        click: context.createInvokeHandler('editor.resize', '0.5'),
+      }).render();
+    });
+    context.memo('button.databasicSize25', function() {
+      return ui.button({
+        contents: '<span class="note-fontsize-10">25%</span>',
+        tooltip: lang.image.resizeQuarter,
+        click: context.createInvokeHandler('editor.resize', '0.25'),
+      }).render();
+    });
+
+    self.events = {
+      'summernote.init': function(we, e) {
+        // update existing containers
+        $('data.ext-databasic', e.editable).each(function() { self.setContent($(this)); });
+        // TODO: make this an undo snapshot...
+      },
+      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function() {
+        self.update();
+      },
+      'summernote.dialog.shown': function() {
+        self.hidePopover();
+      },
+    };
+
+    self.initialize = function() {
+      // create dialog markup
+      var $container = options.dialogsInBody ? $(document.body) : context.layoutInfo.editor;
+
+      var body = '<div class="form-group row-fluid">' +
+          '<label>' + lang.databasic.testLabel + '</label>' +
+          '<input class="ext-databasic-test form-control" type="text" />' +
+          '</div>';
+      var footer = '<button href="#" class="btn btn-primary ext-databasic-save">' + lang.databasic.insert + '</button>';
+
+      self.$dialog = ui.dialog({
+        title: lang.databasic.name,
+        fade: options.dialogsFade,
+        body: body,
+        footer: footer,
+      }).render().appendTo($container);
+
+      // create popover
+      self.$popover = ui.popover({
+        className: 'ext-databasic-popover',
+      }).render().appendTo('body');
+      var $content = self.$popover.find('.popover-content');
+
+      context.invoke('buttons.build', $content, options.popover.databasic);
+    };
+
+    self.destroy = function() {
+      self.$popover.remove();
+      self.$popover = null;
+      self.$dialog.remove();
+      self.$dialog = null;
+    };
+
+    self.update = function() {
+      // Prevent focusing on editable when invoke('code') is executed
+      if (!context.invoke('editor.hasFocus')) {
+        self.hidePopover();
+        return;
+      }
+
+      var rng = context.invoke('editor.createRange');
+      var visible = false;
+
+      if (rng.isOnData()) {
+        var $data = $(rng.sc).closest('data.ext-databasic');
+
+        if ($data.length) {
+          var pos = dom.posFromPlaceholder($data[0]);
+
+          self.$popover.css({
+            display: 'block',
+            left: pos.left,
+            top: pos.top,
+          });
+
+          // save editor target to let size buttons resize the container
+          context.invoke('editor.saveTarget', $data[0]);
+
+          visible = true;
+        }
+      }
+
+      // hide if not visible
+      if (!visible) {
+        self.hidePopover();
+      }
+    };
+
+    self.hidePopover = function() {
+      self.$popover.hide();
+    };
+
+    // define plugin dialog
+    self.getInfo = function() {
+      var rng = context.invoke('editor.createRange');
+
+      if (rng.isOnData()) {
+        var $data = $(rng.sc).closest('data.ext-databasic');
+
+        if ($data.length) {
+          // Get the first node on range(for edit).
+          return {
+            node: $data,
+            test: $data.attr('data-test'),
+          };
+        }
+      }
+
+      return {};
+    };
+
+    self.setContent = function($node) {
+      $node.html('<p contenteditable="false">' + self.icon + ' ' + lang.databasic.name + ': ' +
+        $node.attr('data-test') + '</p>');
+    };
+
+    self.updateNode = function(info) {
+      self.setContent(info.node
+        .attr('data-test', info.test));
+    };
+
+    self.createNode = function(info) {
+      var $node = $('<data class="ext-databasic"></data>');
+
+      if ($node) {
+        // save node to info structure
+        info.node = $node;
+        // insert node into editor dom
+        context.invoke('editor.insertNode', $node[0]);
+      }
+
+      return $node;
+    };
+
+    self.showDialog = function() {
+      var info = self.getInfo();
+      var newNode = !info.node;
+      context.invoke('editor.saveRange');
+
+      self
+        .openDialog(info)
+        .then(function(dialogInfo) {
+          // [workaround] hide dialog before restore range for IE range focus
+          ui.hideDialog(self.$dialog);
+          context.invoke('editor.restoreRange');
+
+          // insert a new node
+          if (newNode) {
+            self.createNode(info);
+          }
+
+          // update info with dialog info
+          $.extend(info, dialogInfo);
+
+          self.updateNode(info);
+        })
+        .fail(function() {
+          context.invoke('editor.restoreRange');
+        });
+    };
+
+    self.openDialog = function(info) {
+      return $.Deferred(function(deferred) {
+        var $inpTest = self.$dialog.find('.ext-databasic-test');
+        var $saveBtn = self.$dialog.find('.ext-databasic-save');
+        var onKeyup = function(event) {
+          if (event.keyCode === 13) {
+            $saveBtn.trigger('click');
+          }
+        };
+
+        ui.onDialogShown(self.$dialog, function() {
+          context.triggerEvent('dialog.shown');
+
+          $inpTest.val(info.test).on('input', function() {
+            ui.toggleBtn($saveBtn, $inpTest.val());
+          }).trigger('focus').on('keyup', onKeyup);
+
+          $saveBtn
+            .text(info.node ? lang.databasic.edit : lang.databasic.insert)
+            .click(function(event) {
+              event.preventDefault();
+
+              deferred.resolve({ test: $inpTest.val() });
+            });
+
+          // init save button
+          ui.toggleBtn($saveBtn, $inpTest.val());
+        });
+
+        ui.onDialogHidden(self.$dialog, function() {
+          $inpTest.off('input keyup');
+          $saveBtn.off('click');
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        ui.showDialog(self.$dialog);
+      });
+    };
+  };
+
+  // Extends summernote
+  $.extend(true, $.summernote, {
+    plugins: {
+      databasic: DataBasicPlugin,
+    },
+
+    options: {
+      popover: {
+        databasic: [
+          ['databasic', ['databasicDialog', 'databasicSize100', 'databasicSize50', 'databasicSize25']],
+        ],
+      },
+    },
+
+    // add localization texts
+    lang: {
+      'en-US': {
+        databasic: {
+          name: 'Basic Data Container',
+          insert: 'insert basic data container',
+          edit: 'edit basic data container',
+          testLabel: 'test input',
+        },
+      },
+    },
+
+  });
+}));
diff --git a/public_html/vendor/admin-lte-plugins/summernote/plugin/hello/summernote-ext-hello.js b/public_html/vendor/admin-lte-plugins/summernote/plugin/hello/summernote-ext-hello.js
new file mode 100644
index 0000000..f95d302
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/plugin/hello/summernote-ext-hello.js
@@ -0,0 +1,82 @@
+(function(factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module.
+    define(['jquery'], factory);
+  } else if (typeof module === 'object' && module.exports) {
+    // Node/CommonJS
+    module.exports = factory(require('jquery'));
+  } else {
+    // Browser globals
+    factory(window.jQuery);
+  }
+}(function($) {
+  // Extends plugins for adding hello.
+  //  - plugin is external module for customizing.
+  $.extend($.summernote.plugins, {
+    /**
+     * @param {Object} context - context object has status of editor.
+     */
+    'hello': function(context) {
+      var self = this;
+
+      // ui has renders to build ui elements.
+      //  - you can create a button with `ui.button`
+      var ui = $.summernote.ui;
+
+      // add hello button
+      context.memo('button.hello', function() {
+        // create button
+        var button = ui.button({
+          contents: '<i class="fa fa-child"/> Hello',
+          tooltip: 'hello',
+          click: function() {
+            self.$panel.show();
+            self.$panel.hide(500);
+            // invoke insertText method with 'hello' on editor module.
+            context.invoke('editor.insertText', 'hello');
+          },
+        });
+
+        // create jQuery object from button instance.
+        var $hello = button.render();
+        return $hello;
+      });
+
+      // This events will be attached when editor is initialized.
+      this.events = {
+        // This will be called after modules are initialized.
+        'summernote.init': function(we, e) {
+          // eslint-disable-next-line
+          console.log('summernote initialized', we, e);
+        },
+        // This will be called when user releases a key on editable.
+        'summernote.keyup': function(we, e) {
+          // eslint-disable-next-line
+          console.log('summernote keyup', we, e);
+        },
+      };
+
+      // This method will be called when editor is initialized by $('..').summernote();
+      // You can create elements for plugin
+      this.initialize = function() {
+        this.$panel = $('<div class="hello-panel"/>').css({
+          position: 'absolute',
+          width: 100,
+          height: 100,
+          left: '50%',
+          top: '50%',
+          background: 'red',
+        }).hide();
+
+        this.$panel.appendTo('body');
+      };
+
+      // This methods will be called when editor is destroyed by $('..').summernote('destroy');
+      // You should remove elements on `initialize`.
+      this.destroy = function() {
+        this.$panel.remove();
+        this.$panel = null;
+      };
+    },
+  });
+}));
diff --git a/public_html/vendor/admin-lte-plugins/summernote/plugin/specialchars/summernote-ext-specialchars.js b/public_html/vendor/admin-lte-plugins/summernote/plugin/specialchars/summernote-ext-specialchars.js
new file mode 100644
index 0000000..d80eb19
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/plugin/specialchars/summernote-ext-specialchars.js
@@ -0,0 +1,311 @@
+(function(factory) {
+  if (typeof define === 'function' && define.amd) {
+    // AMD. Register as an anonymous module.
+    define(['jquery'], factory);
+  } else if (typeof module === 'object' && module.exports) {
+    // Node/CommonJS
+    module.exports = factory(require('jquery'));
+  } else {
+    // Browser globals
+    factory(window.jQuery);
+  }
+}(function($) {
+  $.extend($.summernote.plugins, {
+    'specialchars': function(context) {
+      var self = this;
+      var ui = $.summernote.ui;
+
+      var $editor = context.layoutInfo.editor;
+      var options = context.options;
+      var lang = options.langInfo;
+
+      var KEY = {
+        UP: 38,
+        DOWN: 40,
+        LEFT: 37,
+        RIGHT: 39,
+        ENTER: 13,
+      };
+      var COLUMN_LENGTH = 12;
+      var COLUMN_WIDTH = 35;
+
+      var currentColumn = 0;
+      var currentRow = 0;
+      var totalColumn = 0;
+      var totalRow = 0;
+
+      // special characters data set
+      var specialCharDataSet = [
+        '&quot;', '&amp;', '&lt;', '&gt;', '&iexcl;', '&cent;',
+        '&pound;', '&curren;', '&yen;', '&brvbar;', '&sect;',
+        '&uml;', '&copy;', '&ordf;', '&laquo;', '&not;',
+        '&reg;', '&macr;', '&deg;', '&plusmn;', '&sup2;',
+        '&sup3;', '&acute;', '&micro;', '&para;', '&middot;',
+        '&cedil;', '&sup1;', '&ordm;', '&raquo;', '&frac14;',
+        '&frac12;', '&frac34;', '&iquest;', '&times;', '&divide;',
+        '&fnof;', '&circ;', '&tilde;', '&ndash;', '&mdash;',
+        '&lsquo;', '&rsquo;', '&sbquo;', '&ldquo;', '&rdquo;',
+        '&bdquo;', '&dagger;', '&Dagger;', '&bull;', '&hellip;',
+        '&permil;', '&prime;', '&Prime;', '&lsaquo;', '&rsaquo;',
+        '&oline;', '&frasl;', '&euro;', '&image;', '&weierp;',
+        '&real;', '&trade;', '&alefsym;', '&larr;', '&uarr;',
+        '&rarr;', '&darr;', '&harr;', '&crarr;', '&lArr;',
+        '&uArr;', '&rArr;', '&dArr;', '&hArr;', '&forall;',
+        '&part;', '&exist;', '&empty;', '&nabla;', '&isin;',
+        '&notin;', '&ni;', '&prod;', '&sum;', '&minus;',
+        '&lowast;', '&radic;', '&prop;', '&infin;', '&ang;',
+        '&and;', '&or;', '&cap;', '&cup;', '&int;',
+        '&there4;', '&sim;', '&cong;', '&asymp;', '&ne;',
+        '&equiv;', '&le;', '&ge;', '&sub;', '&sup;',
+        '&nsub;', '&sube;', '&supe;', '&oplus;', '&otimes;',
+        '&perp;', '&sdot;', '&lceil;', '&rceil;', '&lfloor;',
+        '&rfloor;', '&loz;', '&spades;', '&clubs;', '&hearts;',
+        '&diams;',
+      ];
+
+      context.memo('button.specialchars', function() {
+        return ui.button({
+          contents: '<i class="fa fa-font fa-flip-vertical"></i>',
+          tooltip: lang.specialChar.specialChar,
+          click: function() {
+            self.show();
+          },
+        }).render();
+      });
+
+      /**
+       * Make Special Characters Table
+       *
+       * @member plugin.specialChar
+       * @private
+       * @return {jQuery}
+       */
+      this.makeSpecialCharSetTable = function() {
+        var $table = $('<table></table>');
+        $.each(specialCharDataSet, function(idx, text) {
+          var $td = $('<td></td>').addClass('note-specialchar-node');
+          var $tr = (idx % COLUMN_LENGTH === 0) ? $('<tr></tr>') : $table.find('tr').last();
+
+          var $button = ui.button({
+            callback: function($node) {
+              $node.html(text);
+              $node.attr('title', text);
+              $node.attr('data-value', encodeURIComponent(text));
+              $node.css({
+                width: COLUMN_WIDTH,
+                'margin-right': '2px',
+                'margin-bottom': '2px',
+              });
+            },
+          }).render();
+
+          $td.append($button);
+
+          $tr.append($td);
+          if (idx % COLUMN_LENGTH === 0) {
+            $table.append($tr);
+          }
+        });
+
+        totalRow = $table.find('tr').length;
+        totalColumn = COLUMN_LENGTH;
+
+        return $table;
+      };
+
+      this.initialize = function() {
+        var $container = options.dialogsInBody ? $(document.body) : $editor;
+
+        var body = '<div class="form-group row-fluid">' + this.makeSpecialCharSetTable()[0].outerHTML + '</div>';
+
+        this.$dialog = ui.dialog({
+          title: lang.specialChar.select,
+          body: body,
+        }).render().appendTo($container);
+      };
+
+      this.show = function() {
+        var text = context.invoke('editor.getSelectedText');
+        context.invoke('editor.saveRange');
+        this.showSpecialCharDialog(text).then(function(selectChar) {
+          context.invoke('editor.restoreRange');
+
+          // build node
+          var $node = $('<span></span>').html(selectChar)[0];
+
+          if ($node) {
+            // insert video node
+            context.invoke('editor.insertNode', $node);
+          }
+        }).fail(function() {
+          context.invoke('editor.restoreRange');
+        });
+      };
+
+      /**
+       * show image dialog
+       *
+       * @param {jQuery} $dialog
+       * @return {Promise}
+       */
+      this.showSpecialCharDialog = function(text) {
+        return $.Deferred(function(deferred) {
+          var $specialCharDialog = self.$dialog;
+          var $specialCharNode = $specialCharDialog.find('.note-specialchar-node');
+          var $selectedNode = null;
+          var ARROW_KEYS = [KEY.UP, KEY.DOWN, KEY.LEFT, KEY.RIGHT];
+          var ENTER_KEY = KEY.ENTER;
+
+          function addActiveClass($target) {
+            if (!$target) {
+              return;
+            }
+            $target.find('button').addClass('active');
+            $selectedNode = $target;
+          }
+
+          function removeActiveClass($target) {
+            $target.find('button').removeClass('active');
+            $selectedNode = null;
+          }
+
+          // find next node
+          function findNextNode(row, column) {
+            var findNode = null;
+            $.each($specialCharNode, function(idx, $node) {
+              var findRow = Math.ceil((idx + 1) / COLUMN_LENGTH);
+              var findColumn = ((idx + 1) % COLUMN_LENGTH === 0) ? COLUMN_LENGTH : (idx + 1) % COLUMN_LENGTH;
+              if (findRow === row && findColumn === column) {
+                findNode = $node;
+                return false;
+              }
+            });
+            return $(findNode);
+          }
+
+          function arrowKeyHandler(keyCode) {
+            // left, right, up, down key
+            var $nextNode;
+            var lastRowColumnLength = $specialCharNode.length % totalColumn;
+
+            if (KEY.LEFT === keyCode) {
+              if (currentColumn > 1) {
+                currentColumn = currentColumn - 1;
+              } else if (currentRow === 1 && currentColumn === 1) {
+                currentColumn = lastRowColumnLength;
+                currentRow = totalRow;
+              } else {
+                currentColumn = totalColumn;
+                currentRow = currentRow - 1;
+              }
+            } else if (KEY.RIGHT === keyCode) {
+              if (currentRow === totalRow && lastRowColumnLength === currentColumn) {
+                currentColumn = 1;
+                currentRow = 1;
+              } else if (currentColumn < totalColumn) {
+                currentColumn = currentColumn + 1;
+              } else {
+                currentColumn = 1;
+                currentRow = currentRow + 1;
+              }
+            } else if (KEY.UP === keyCode) {
+              if (currentRow === 1 && lastRowColumnLength < currentColumn) {
+                currentRow = totalRow - 1;
+              } else {
+                currentRow = currentRow - 1;
+              }
+            } else if (KEY.DOWN === keyCode) {
+              currentRow = currentRow + 1;
+            }
+
+            if (currentRow === totalRow && currentColumn > lastRowColumnLength) {
+              currentRow = 1;
+            } else if (currentRow > totalRow) {
+              currentRow = 1;
+            } else if (currentRow < 1) {
+              currentRow = totalRow;
+            }
+
+            $nextNode = findNextNode(currentRow, currentColumn);
+
+            if ($nextNode) {
+              removeActiveClass($selectedNode);
+              addActiveClass($nextNode);
+            }
+          }
+
+          function enterKeyHandler() {
+            if (!$selectedNode) {
+              return;
+            }
+
+            deferred.resolve(decodeURIComponent($selectedNode.find('button').attr('data-value')));
+            $specialCharDialog.modal('hide');
+          }
+
+          function keyDownEventHandler(event) {
+            event.preventDefault();
+            var keyCode = event.keyCode;
+            if (keyCode === undefined || keyCode === null) {
+              return;
+            }
+            // check arrowKeys match
+            if (ARROW_KEYS.indexOf(keyCode) > -1) {
+              if ($selectedNode === null) {
+                addActiveClass($specialCharNode.eq(0));
+                currentColumn = 1;
+                currentRow = 1;
+                return;
+              }
+              arrowKeyHandler(keyCode);
+            } else if (keyCode === ENTER_KEY) {
+              enterKeyHandler();
+            }
+            return false;
+          }
+
+          // remove class
+          removeActiveClass($specialCharNode);
+
+          // find selected node
+          if (text) {
+            for (var i = 0; i < $specialCharNode.length; i++) {
+              var $checkNode = $($specialCharNode[i]);
+              if ($checkNode.text() === text) {
+                addActiveClass($checkNode);
+                currentRow = Math.ceil((i + 1) / COLUMN_LENGTH);
+                currentColumn = (i + 1) % COLUMN_LENGTH;
+              }
+            }
+          }
+
+          ui.onDialogShown(self.$dialog, function() {
+            $(document).on('keydown', keyDownEventHandler);
+
+            self.$dialog.find('button').tooltip();
+
+            $specialCharNode.on('click', function(event) {
+              event.preventDefault();
+              deferred.resolve(decodeURIComponent($(event.currentTarget).find('button').attr('data-value')));
+              ui.hideDialog(self.$dialog);
+            });
+          });
+
+          ui.onDialogHidden(self.$dialog, function() {
+            $specialCharNode.off('click');
+
+            self.$dialog.find('button').tooltip();
+
+            $(document).off('keydown', keyDownEventHandler);
+
+            if (deferred.state() === 'pending') {
+              deferred.reject();
+            }
+          });
+
+          ui.showDialog(self.$dialog);
+        });
+      };
+    },
+  });
+}));
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css
new file mode 100644
index 0000000..5ccc7e7
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css
@@ -0,0 +1,822 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+@font-face {
+    font-family: "summernote";
+    font-style: normal;
+    font-weight: 400;
+    font-display: auto;
+    src: url("./font/summernote.eot?#iefix") format("embedded-opentype"), url("./font/summernote.woff2") format("woff2"), url("./font/summernote.woff") format("woff"), url("./font/summernote.ttf") format("truetype");
+}
+[class^=note-icon]:before,
+[class*=" note-icon"]:before {
+    display: inline-block;
+    font-family: "summernote";
+    font-style: normal;
+    font-size: inherit;
+    text-decoration: inherit;
+    text-rendering: auto;
+    text-transform: none;
+    vertical-align: middle;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    speak: none;
+}
+
+.note-icon-fw {
+    text-align: center;
+    width: 1.25em;
+}
+
+.note-icon-border {
+    border: solid 0.08em #eee;
+    border-radius: 0.1em;
+    padding: 0.2em 0.25em 0.15em;
+}
+
+.note-icon-pull-left {
+    float: left;
+}
+
+.note-icon-pull-right {
+    float: right;
+}
+
+.note-icon.note-icon-pull-left {
+    margin-right: 0.3em;
+}
+.note-icon.note-icon-pull-right {
+    margin-left: 0.3em;
+}
+
+.note-icon-align::before {
+    content: "\ea01";
+}
+
+.note-icon-align-center::before {
+    content: "\ea02";
+}
+
+.note-icon-align-indent::before {
+    content: "\ea03";
+}
+
+.note-icon-align-justify::before {
+    content: "\ea04";
+}
+
+.note-icon-align-left::before {
+    content: "\ea05";
+}
+
+.note-icon-align-outdent::before {
+    content: "\ea06";
+}
+
+.note-icon-align-right::before {
+    content: "\ea07";
+}
+
+.note-icon-arrow-circle-down::before {
+    content: "\ea08";
+}
+
+.note-icon-arrow-circle-left::before {
+    content: "\ea09";
+}
+
+.note-icon-arrow-circle-right::before {
+    content: "\ea0a";
+}
+
+.note-icon-arrow-circle-up::before {
+    content: "\ea0b";
+}
+
+.note-icon-arrows-alt::before {
+    content: "\ea0c";
+}
+
+.note-icon-arrows-h::before {
+    content: "\ea0d";
+}
+
+.note-icon-arrows-v::before {
+    content: "\ea0e";
+}
+
+.note-icon-bold::before {
+    content: "\ea0f";
+}
+
+.note-icon-caret::before {
+    content: "\ea10";
+}
+
+.note-icon-chain-broken::before {
+    content: "\ea11";
+}
+
+.note-icon-circle::before {
+    content: "\ea12";
+}
+
+.note-icon-close::before {
+    content: "\ea13";
+}
+
+.note-icon-code::before {
+    content: "\ea14";
+}
+
+.note-icon-col-after::before {
+    content: "\ea15";
+}
+
+.note-icon-col-before::before {
+    content: "\ea16";
+}
+
+.note-icon-col-remove::before {
+    content: "\ea17";
+}
+
+.note-icon-eraser::before {
+    content: "\ea18";
+}
+
+.note-icon-float-left::before {
+    content: "\ea19";
+}
+
+.note-icon-float-none::before {
+    content: "\ea1a";
+}
+
+.note-icon-float-right::before {
+    content: "\ea1b";
+}
+
+.note-icon-font::before {
+    content: "\ea1c";
+}
+
+.note-icon-frame::before {
+    content: "\ea1d";
+}
+
+.note-icon-italic::before {
+    content: "\ea1e";
+}
+
+.note-icon-link::before {
+    content: "\ea1f";
+}
+
+.note-icon-magic::before {
+    content: "\ea20";
+}
+
+.note-icon-menu-check::before {
+    content: "\ea21";
+}
+
+.note-icon-minus::before {
+    content: "\ea22";
+}
+
+.note-icon-orderedlist::before {
+    content: "\ea23";
+}
+
+.note-icon-pencil::before {
+    content: "\ea24";
+}
+
+.note-icon-picture::before {
+    content: "\ea25";
+}
+
+.note-icon-question::before {
+    content: "\ea26";
+}
+
+.note-icon-redo::before {
+    content: "\ea27";
+}
+
+.note-icon-rollback::before {
+    content: "\ea28";
+}
+
+.note-icon-row-above::before {
+    content: "\ea29";
+}
+
+.note-icon-row-below::before {
+    content: "\ea2a";
+}
+
+.note-icon-row-remove::before {
+    content: "\ea2b";
+}
+
+.note-icon-special-character::before {
+    content: "\ea2c";
+}
+
+.note-icon-square::before {
+    content: "\ea2d";
+}
+
+.note-icon-strikethrough::before {
+    content: "\ea2e";
+}
+
+.note-icon-subscript::before {
+    content: "\ea2f";
+}
+
+.note-icon-summernote::before {
+    content: "\ea30";
+}
+
+.note-icon-superscript::before {
+    content: "\ea31";
+}
+
+.note-icon-table::before {
+    content: "\ea32";
+}
+
+.note-icon-text-height::before {
+    content: "\ea33";
+}
+
+.note-icon-trash::before {
+    content: "\ea34";
+}
+
+.note-icon-underline::before {
+    content: "\ea35";
+}
+
+.note-icon-undo::before {
+    content: "\ea36";
+}
+
+.note-icon-unorderedlist::before {
+    content: "\ea37";
+}
+
+.note-icon-video::before {
+    content: "\ea38";
+}
+
+/* Theme Variables
+ ------------------------------------------ */
+/* Layout
+ ------------------------------------------ */
+.note-editor {
+    position: relative;
+}
+.note-editor .note-dropzone {
+    position: absolute;
+    display: none;
+    z-index: 100;
+    color: lightskyblue;
+    background-color: #fff;
+    opacity: 0.95;
+}
+.note-editor .note-dropzone .note-dropzone-message {
+    display: table-cell;
+    vertical-align: middle;
+    text-align: center;
+    font-size: 28px;
+    font-weight: 700;
+}
+.note-editor .note-dropzone.hover {
+    color: #098ddf;
+}
+.note-editor.dragover .note-dropzone {
+    display: table;
+}
+.note-editor .note-editing-area {
+    position: relative;
+}
+.note-editor .note-editing-area .note-editable {
+    outline: none;
+}
+.note-editor .note-editing-area .note-editable sup {
+    vertical-align: super;
+}
+.note-editor .note-editing-area .note-editable sub {
+    vertical-align: sub;
+}
+.note-editor .note-editing-area .note-editable img.note-float-left {
+    margin-right: 10px;
+}
+.note-editor .note-editing-area .note-editable img.note-float-right {
+    margin-left: 10px;
+}
+
+/* Frame mode layout
+ ------------------------------------------ */
+.note-editor.note-frame,
+.note-editor.note-airframe {
+    border: 1px solid #00000032;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-editable,
+.note-editor.note-airframe.codeview .note-editing-area .note-editable {
+    display: none;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-codable,
+.note-editor.note-airframe.codeview .note-editing-area .note-codable {
+    display: block;
+}
+.note-editor.note-frame .note-editing-area,
+.note-editor.note-airframe .note-editing-area {
+    overflow: hidden;
+}
+.note-editor.note-frame .note-editing-area .note-editable,
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 10px;
+    overflow: auto;
+    word-wrap: break-word;
+}
+.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],
+.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false] {
+    background-color: #8080801d;
+}
+.note-editor.note-frame .note-editing-area .note-codable,
+.note-editor.note-airframe .note-editing-area .note-codable {
+    display: none;
+    width: 100%;
+    padding: 10px;
+    border: none;
+    box-shadow: none;
+    font-family: Menlo, Monaco, monospace, sans-serif;
+    font-size: 14px;
+    color: #ccc;
+    background-color: #222;
+    resize: none;
+    outline: none;
+    -ms-box-sizing: border-box;
+    box-sizing: border-box;
+    border-radius: 0;
+    margin-bottom: 0;
+}
+.note-editor.note-frame.fullscreen,
+.note-editor.note-airframe.fullscreen {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100% !important;
+    z-index: 1050;
+}
+.note-editor.note-frame.fullscreen .note-resizebar,
+.note-editor.note-airframe.fullscreen .note-resizebar {
+    display: none;
+}
+.note-editor.note-frame .note-status-output,
+.note-editor.note-airframe .note-status-output {
+    display: block;
+    width: 100%;
+    font-size: 14px;
+    line-height: 1.42857143;
+    height: 20px;
+    margin-bottom: 0;
+    color: #000;
+    border: 0;
+    border-top: 1px solid #e2e2e2;
+}
+.note-editor.note-frame .note-status-output:empty,
+.note-editor.note-airframe .note-status-output:empty {
+    height: 0;
+    border-top: 0 solid transparent;
+}
+.note-editor.note-frame .note-status-output .pull-right,
+.note-editor.note-airframe .note-status-output .pull-right {
+    float: right !important;
+}
+.note-editor.note-frame .note-status-output .text-muted,
+.note-editor.note-airframe .note-status-output .text-muted {
+    color: #777;
+}
+.note-editor.note-frame .note-status-output .text-primary,
+.note-editor.note-airframe .note-status-output .text-primary {
+    color: #286090;
+}
+.note-editor.note-frame .note-status-output .text-success,
+.note-editor.note-airframe .note-status-output .text-success {
+    color: #3c763d;
+}
+.note-editor.note-frame .note-status-output .text-info,
+.note-editor.note-airframe .note-status-output .text-info {
+    color: #31708f;
+}
+.note-editor.note-frame .note-status-output .text-warning,
+.note-editor.note-airframe .note-status-output .text-warning {
+    color: #8a6d3b;
+}
+.note-editor.note-frame .note-status-output .text-danger,
+.note-editor.note-airframe .note-status-output .text-danger {
+    color: #a94442;
+}
+.note-editor.note-frame .note-status-output .alert,
+.note-editor.note-airframe .note-status-output .alert {
+    margin: -7px 0 0 0;
+    padding: 7px 10px 2px 10px;
+    border-radius: 0;
+    color: #000;
+    background-color: #f5f5f5;
+}
+.note-editor.note-frame .note-status-output .alert .note-icon,
+.note-editor.note-airframe .note-status-output .alert .note-icon {
+    margin-right: 5px;
+}
+.note-editor.note-frame .note-status-output .alert-success,
+.note-editor.note-airframe .note-status-output .alert-success {
+    color: #3c763d !important;
+    background-color: #dff0d8 !important;
+}
+.note-editor.note-frame .note-status-output .alert-info,
+.note-editor.note-airframe .note-status-output .alert-info {
+    color: #31708f !important;
+    background-color: #d9edf7 !important;
+}
+.note-editor.note-frame .note-status-output .alert-warning,
+.note-editor.note-airframe .note-status-output .alert-warning {
+    color: #8a6d3b !important;
+    background-color: #fcf8e3 !important;
+}
+.note-editor.note-frame .note-status-output .alert-danger,
+.note-editor.note-airframe .note-status-output .alert-danger {
+    color: #a94442 !important;
+    background-color: #f2dede !important;
+}
+.note-editor.note-frame .note-statusbar,
+.note-editor.note-airframe .note-statusbar {
+    background-color: #8080801d;
+    border-bottom-left-radius: 4px;
+    border-bottom-right-radius: 4px;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar,
+.note-editor.note-airframe .note-statusbar .note-resizebar {
+    padding-top: 1px;
+    height: 9px;
+    width: 100%;
+    cursor: ns-resize;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar {
+    width: 20px;
+    margin: 1px auto;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar {
+    cursor: default;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar {
+    display: none;
+}
+.note-editor.note-frame .note-placeholder,
+.note-editor.note-airframe .note-placeholder {
+    padding: 10px;
+}
+
+.note-editor.note-airframe {
+    border: 0;
+}
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 0;
+}
+
+/* Popover
+ ------------------------------------------ */
+.note-popover.popover {
+    display: none;
+    max-width: none;
+}
+.note-popover.popover .popover-content a {
+    display: inline-block;
+    max-width: 200px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    vertical-align: middle;
+}
+.note-popover.popover .arrow {
+    left: 20px !important;
+}
+
+/* Popover and Toolbar (Button container)
+ ------------------------------------------ */
+.note-toolbar {
+    position: relative;
+}
+
+.note-popover .popover-content, .note-editor .note-toolbar {
+    margin: 0;
+    padding: 0 0 5px 5px;
+}
+.note-popover .popover-content > .note-btn-group, .note-editor .note-toolbar > .note-btn-group {
+    margin-top: 5px;
+    margin-left: 0;
+    margin-right: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table, .note-editor .note-toolbar .note-btn-group .note-table {
+    min-width: 0;
+    padding: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker {
+    font-size: 18px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher {
+    position: absolute !important;
+    z-index: 3;
+    width: 10em;
+    height: 10em;
+    cursor: pointer;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted {
+    position: relative !important;
+    z-index: 1;
+    width: 5em;
+    height: 5em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted {
+    position: absolute !important;
+    z-index: 2;
+    width: 1em;
+    height: 1em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-style .dropdown-style blockquote, .note-popover .popover-content .note-style .dropdown-style pre, .note-editor .note-toolbar .note-style .dropdown-style blockquote, .note-editor .note-toolbar .note-style .dropdown-style pre {
+    margin: 0;
+    padding: 5px 10px;
+}
+.note-popover .popover-content .note-style .dropdown-style h1, .note-popover .popover-content .note-style .dropdown-style h2, .note-popover .popover-content .note-style .dropdown-style h3, .note-popover .popover-content .note-style .dropdown-style h4, .note-popover .popover-content .note-style .dropdown-style h5, .note-popover .popover-content .note-style .dropdown-style h6, .note-popover .popover-content .note-style .dropdown-style p, .note-editor .note-toolbar .note-style .dropdown-style h1, .note-editor .note-toolbar .note-style .dropdown-style h2, .note-editor .note-toolbar .note-style .dropdown-style h3, .note-editor .note-toolbar .note-style .dropdown-style h4, .note-editor .note-toolbar .note-style .dropdown-style h5, .note-editor .note-toolbar .note-style .dropdown-style h6, .note-editor .note-toolbar .note-style .dropdown-style p {
+    margin: 0;
+    padding: 0;
+}
+.note-popover .popover-content .note-color-all .note-dropdown-menu, .note-editor .note-toolbar .note-color-all .note-dropdown-menu {
+    min-width: 337px;
+}
+.note-popover .popover-content .note-color .dropdown-toggle, .note-editor .note-toolbar .note-color .dropdown-toggle {
+    width: 20px;
+    padding-left: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette {
+    display: inline-block;
+    margin: 0;
+    width: 160px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child {
+    margin: 0 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title {
+    font-size: 12px;
+    margin: 2px 7px;
+    text-align: center;
+    border-bottom: 1px solid #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select {
+    font-size: 11px;
+    margin: 3px;
+    padding: 0 3px;
+    cursor: pointer;
+    width: 100%;
+    border-radius: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover {
+    background: #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row {
+    height: 20px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn {
+    display: none;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn {
+    border: 1px solid #eee;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu, .note-editor .note-toolbar .note-para .note-dropdown-menu {
+    min-width: 228px;
+    padding: 5px;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu > div + div, .note-editor .note-toolbar .note-para .note-dropdown-menu > div + div {
+    margin-left: 5px;
+}
+.note-popover .popover-content .note-dropdown-menu, .note-editor .note-toolbar .note-dropdown-menu {
+    min-width: 160px;
+}
+.note-popover .popover-content .note-dropdown-menu.right, .note-editor .note-toolbar .note-dropdown-menu.right {
+    right: 0;
+    left: auto;
+}
+.note-popover .popover-content .note-dropdown-menu.right::before, .note-editor .note-toolbar .note-dropdown-menu.right::before {
+    right: 9px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.right::after, .note-editor .note-toolbar .note-dropdown-menu.right::after {
+    right: 10px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a i, .note-editor .note-toolbar .note-dropdown-menu.note-check a i {
+    color: deepskyblue;
+    visibility: hidden;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a.checked i, .note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i {
+    visibility: visible;
+}
+.note-popover .popover-content .note-fontsize-10, .note-editor .note-toolbar .note-fontsize-10 {
+    font-size: 10px;
+}
+.note-popover .popover-content .note-color-palette, .note-editor .note-toolbar .note-color-palette {
+    line-height: 1;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn, .note-editor .note-toolbar .note-color-palette div .note-color-btn {
+    width: 20px;
+    height: 20px;
+    padding: 0;
+    margin: 0;
+    border: 0;
+    border-radius: 0;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn:hover, .note-editor .note-toolbar .note-color-palette div .note-color-btn:hover {
+    transform: scale(1.2);
+    transition: all 0.2s;
+}
+
+/* Dialog
+ ------------------------------------------ */
+.note-modal .modal-dialog {
+    outline: 0;
+    border-radius: 5px;
+    box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+}
+.note-modal .form-group {
+    margin-left: 0;
+    margin-right: 0;
+}
+.note-modal .note-modal-form {
+    margin: 0;
+}
+.note-modal .note-image-dialog .note-dropzone {
+    min-height: 100px;
+    font-size: 30px;
+    line-height: 4;
+    color: lightgray;
+    text-align: center;
+    border: 4px dashed lightgray;
+    margin-bottom: 10px;
+}
+@-moz-document url-prefix() {
+    .note-modal .note-image-input {
+        height: auto;
+    }
+}
+
+/* Placeholder
+ ------------------------------------------ */
+.note-placeholder {
+    position: absolute;
+    display: none;
+    color: gray;
+}
+
+/* Handle
+ ------------------------------------------ */
+.note-handle .note-control-selection {
+    position: absolute;
+    display: none;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection > div {
+    position: absolute;
+}
+.note-handle .note-control-selection .note-control-selection-bg {
+    width: 100%;
+    height: 100%;
+    background-color: #000;
+    -webkit-opacity: 0.3;
+    -khtml-opacity: 0.3;
+    -moz-opacity: 0.3;
+    opacity: 0.3;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+    filter: alpha(opacity=30);
+}
+.note-handle .note-control-selection .note-control-handle, .note-handle .note-control-selection .note-control-sizing, .note-handle .note-control-selection .note-control-holder {
+    width: 7px;
+    height: 7px;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection .note-control-sizing {
+    background-color: #000;
+}
+.note-handle .note-control-selection .note-control-nw {
+    top: -5px;
+    left: -5px;
+    border-right: none;
+    border-bottom: none;
+}
+.note-handle .note-control-selection .note-control-ne {
+    top: -5px;
+    right: -5px;
+    border-bottom: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-sw {
+    bottom: -5px;
+    left: -5px;
+    border-top: none;
+    border-right: none;
+}
+.note-handle .note-control-selection .note-control-se {
+    right: -5px;
+    bottom: -5px;
+    cursor: se-resize;
+}
+.note-handle .note-control-selection .note-control-se.note-control-holder {
+    cursor: default;
+    border-top: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-selection-info {
+    right: 0;
+    bottom: 0;
+    padding: 5px;
+    margin: 5px;
+    color: #fff;
+    background-color: #000;
+    font-size: 12px;
+    border-radius: 5px;
+    -webkit-opacity: 0.7;
+    -khtml-opacity: 0.7;
+    -moz-opacity: 0.7;
+    opacity: 0.7;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=70);
+    filter: alpha(opacity=70);
+}
+
+.note-hint-popover {
+    min-width: 100px;
+    padding: 2px;
+}
+.note-hint-popover .popover-content {
+    padding: 3px;
+    max-height: 150px;
+    overflow: auto;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item {
+    display: block !important;
+    padding: 3px;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item.active, .note-hint-popover .popover-content .note-hint-group .note-hint-item:hover {
+    display: block;
+    clear: both;
+    font-weight: 400;
+    line-height: 1.4;
+    color: white;
+    white-space: nowrap;
+    text-decoration: none;
+    background-color: #428bca;
+    outline: 0;
+    cursor: pointer;
+}
+
+/* Handle
+ ------------------------------------------ */
+html .note-fullscreen-body, body .note-fullscreen-body {
+    overflow: hidden !important;
+}
+
+.note-toolbar {
+    background: #8080801d;
+}
+
+.note-btn-group .note-btn {
+    border-color: #00000032;
+    padding: 0.28rem 0.65rem;
+    font-size: 13px;
+}
+
+/*# sourceMappingURL=summernote-bs4.css.map*/
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css.map
new file mode 100644
index 0000000..ef31755
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote-bs4.css","mappings":";;;;;;;;;;;;AAMA;IACE;IACA;IACA;IACA;IACA;ACLF;ADSA;;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ACPF;;ADYA;IACE;IACA;ACTF;;ADYA;IACE;IACA;IACA;ACTF;;ADYA;IACE;ACTF;;ADYA;IACE;ACTF;;ADaE;IACE;ACVJ;ADYE;IACE;ACVJ;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgC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","sources":["webpack:///./src/styles/summernote/font.scss","webpack:///./src/styles/bs4/summernote-bs4.scss","webpack:///./src/styles/summernote/common.scss","webpack:///./src/styles/summernote/elements.scss"],"sourcesContent":["// Variables\n\n$sni-css-prefix: note-icon !default;\n\n// Path\n\n@font-face {\n  font-family: \"summernote\";\n  font-style: normal;\n  font-weight: 400;\n  font-display: auto;\n  src: url(\"./font/summernote.eot?#iefix\") format(\"embedded-opentype\"), url(\"./font/summernote.woff2\") format(\"woff2\"), url(\"./font/summernote.woff\") format(\"woff\"), url(\"./font/summernote.ttf\") format(\"truetype\");}\n\n// Core\n\n[class^=\"#{$sni-css-prefix}\"]:before,\n[class*=\" #{$sni-css-prefix}\"]:before {\n  display: inline-block;\n  font-family: \"summernote\";\n  font-style: normal;\n  font-size: inherit;\n  text-decoration: inherit;\n  text-rendering: auto;\n  text-transform: none;\n  vertical-align: middle;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  speak: none;\n}\n\n// Extras\n\n.#{$sni-css-prefix}-fw {\n  text-align: center;\n  width: 1.25em;\n}\n\n.#{$sni-css-prefix}-border {\n  border: solid 0.08em #eee;\n  border-radius: 0.1em;\n  padding: 0.2em 0.25em 0.15em;\n}\n\n.#{$sni-css-prefix}-pull-left {\n  float: left;\n}\n\n.#{$sni-css-prefix}-pull-right {\n  float: right;\n}\n\n.#{$sni-css-prefix} {\n  &.#{$sni-css-prefix}-pull-left {\n    margin-right: 0.3em;\n  }\n  &.#{$sni-css-prefix}-pull-right {\n    margin-left: 0.3em;\n  }\n}\n\n// Functions\n\n@function char($character-code) {\n  @if function-exists(\"selector-append\") {\n    @return unquote(\"\\\"\\\\#{$character-code}\\\"\");\n  }\n\n  @if \"\\\\#{'x'}\" == \"\\\\x\" {\n    @return str-slice(\"\\x\", 1, 1) + $character-code;\n  }\n  @else {\n    @return #{\"\\\"\\\\\"}#{$character-code + \"\\\"\"};\n  }\n}\n\n// Icons\n\n\n.note-icon-align::before {\n  content: \"\\ea01\";\n}\n\n.note-icon-align-center::before {\n  content: \"\\ea02\";\n}\n\n.note-icon-align-indent::before {\n  content: \"\\ea03\";\n}\n\n.note-icon-align-justify::before {\n  content: \"\\ea04\";\n}\n\n.note-icon-align-left::before {\n  content: \"\\ea05\";\n}\n\n.note-icon-align-outdent::before {\n  content: \"\\ea06\";\n}\n\n.note-icon-align-right::before {\n  content: \"\\ea07\";\n}\n\n.note-icon-arrow-circle-down::before {\n  content: \"\\ea08\";\n}\n\n.note-icon-arrow-circle-left::before {\n  content: \"\\ea09\";\n}\n\n.note-icon-arrow-circle-right::before {\n  content: \"\\ea0a\";\n}\n\n.note-icon-arrow-circle-up::before {\n  content: \"\\ea0b\";\n}\n\n.note-icon-arrows-alt::before {\n  content: \"\\ea0c\";\n}\n\n.note-icon-arrows-h::before {\n  content: \"\\ea0d\";\n}\n\n.note-icon-arrows-v::before {\n  content: \"\\ea0e\";\n}\n\n.note-icon-bold::before {\n  content: \"\\ea0f\";\n}\n\n.note-icon-caret::before {\n  content: \"\\ea10\";\n}\n\n.note-icon-chain-broken::before {\n  content: \"\\ea11\";\n}\n\n.note-icon-circle::before {\n  content: \"\\ea12\";\n}\n\n.note-icon-close::before {\n  content: \"\\ea13\";\n}\n\n.note-icon-code::before {\n  content: \"\\ea14\";\n}\n\n.note-icon-col-after::before {\n  content: \"\\ea15\";\n}\n\n.note-icon-col-before::before {\n  content: \"\\ea16\";\n}\n\n.note-icon-col-remove::before {\n  content: \"\\ea17\";\n}\n\n.note-icon-eraser::before {\n  content: \"\\ea18\";\n}\n\n.note-icon-float-left::before {\n  content: \"\\ea19\";\n}\n\n.note-icon-float-none::before {\n  content: \"\\ea1a\";\n}\n\n.note-icon-float-right::before {\n  content: \"\\ea1b\";\n}\n\n.note-icon-font::before {\n  content: \"\\ea1c\";\n}\n\n.note-icon-frame::before {\n  content: \"\\ea1d\";\n}\n\n.note-icon-italic::before {\n  content: \"\\ea1e\";\n}\n\n.note-icon-link::before {\n  content: \"\\ea1f\";\n}\n\n.note-icon-magic::before {\n  content: \"\\ea20\";\n}\n\n.note-icon-menu-check::before {\n  content: \"\\ea21\";\n}\n\n.note-icon-minus::before {\n  content: \"\\ea22\";\n}\n\n.note-icon-orderedlist::before {\n  content: \"\\ea23\";\n}\n\n.note-icon-pencil::before {\n  content: \"\\ea24\";\n}\n\n.note-icon-picture::before {\n  content: \"\\ea25\";\n}\n\n.note-icon-question::before {\n  content: \"\\ea26\";\n}\n\n.note-icon-redo::before {\n  content: \"\\ea27\";\n}\n\n.note-icon-rollback::before {\n  content: \"\\ea28\";\n}\n\n.note-icon-row-above::before {\n  content: \"\\ea29\";\n}\n\n.note-icon-row-below::before {\n  content: \"\\ea2a\";\n}\n\n.note-icon-row-remove::before {\n  content: \"\\ea2b\";\n}\n\n.note-icon-special-character::before {\n  content: \"\\ea2c\";\n}\n\n.note-icon-square::before {\n  content: \"\\ea2d\";\n}\n\n.note-icon-strikethrough::before {\n  content: \"\\ea2e\";\n}\n\n.note-icon-subscript::before {\n  content: \"\\ea2f\";\n}\n\n.note-icon-summernote::before {\n  content: \"\\ea30\";\n}\n\n.note-icon-superscript::before {\n  content: \"\\ea31\";\n}\n\n.note-icon-table::before {\n  content: \"\\ea32\";\n}\n\n.note-icon-text-height::before {\n  content: \"\\ea33\";\n}\n\n.note-icon-trash::before {\n  content: \"\\ea34\";\n}\n\n.note-icon-underline::before {\n  content: \"\\ea35\";\n}\n\n.note-icon-undo::before {\n  content: \"\\ea36\";\n}\n\n.note-icon-unorderedlist::before {\n  content: \"\\ea37\";\n}\n\n.note-icon-video::before {\n  content: \"\\ea38\";\n}\n\n","@import '../summernote/font.scss';\n@import '../summernote/common.scss';\n\n.note-toolbar {\n  background: $background-color;\n}\n\n.note-btn-group .note-btn {\n  border-color: $border-color;\n  padding: 0.28rem 0.65rem;\n  font-size: 13px;\n}\n","@import \"elements.scss\";\n\n/* Theme Variables\n ------------------------------------------ */\n$border-color: #00000032;\n$background-color: #8080801d;\n\n$img-margin-left: 10px;\n$img-margin-right: 10px;\n\n/* Layout\n ------------------------------------------ */\n.note-editor {\n  position: relative;\n\n  // dropzone\n  $dropzone-color: lightskyblue;\n  $dropzone-active-color: darken($dropzone-color, 30);\n  .note-dropzone {\n    position: absolute;\n    display: none;\n    z-index: 100;\n    color: $dropzone-color;\n    background-color: #fff;\n    opacity: 0.95;\n\n    .note-dropzone-message {\n      display: table-cell;\n      vertical-align: middle;\n      text-align: center;\n      font-size: 28px;\n      font-weight: 700;\n    }\n\n    &.hover {\n      color: $dropzone-active-color;\n    }\n  }\n\n  &.dragover .note-dropzone {\n    display: table;\n  }\n\n  .note-editing-area {\n    position: relative;\n\n    .note-editable {\n      outline: none;\n\n      sup {\n        vertical-align: super;\n      }\n\n      sub {\n        vertical-align: sub;\n      }\n\n      img.note-float-left {\n        margin-right: $img-margin-right;\n      }\n\n      img.note-float-right {\n        margin-left: $img-margin-left;\n      }\n    }\n  }\n}\n\n/* Frame mode layout\n ------------------------------------------ */\n.note-editor.note-frame,\n.note-editor.note-airframe {\n  border: 1px solid $border-color;\n\n  // codeview mode\n  &.codeview {\n    .note-editing-area {\n      .note-editable {\n        display: none;\n      }\n      .note-codable {\n        display: block;\n      }\n    }\n  }\n\n  .note-editing-area {\n    overflow: hidden;\n\n    // editable\n    .note-editable {\n      padding: 10px;\n      overflow: auto;\n      word-wrap: break-word;\n\n      &[contenteditable=\"false\"] {\n        background-color: $background-color;\n      }\n    }\n\n    // codeable\n    .note-codable {\n      display: none;\n      width: 100%;\n      padding: 10px;\n      border: none;\n      box-shadow: none;\n      font-family: Menlo, Monaco, monospace, sans-serif;\n      font-size: 14px;\n      color: #ccc;\n      background-color: #222;\n      resize: none;\n      outline: none;\n\n      // override BS2 default style\n      @include box-sizing(border-box);\n      @include rounded(0);\n      margin-bottom: 0;\n    }\n  }\n\n  // fullscreen mode\n  &.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100% !important;\n    z-index: 1050; // bs3 modal-backdrop: 1030, bs2: 1040\n    .note-resizebar {\n      display: none;\n    }\n  }\n\n  // Notifications\n  .note-status-output {\n    display: block;\n    width: 100%;\n    font-size: 14px;\n    line-height: 1.42857143;\n    height: 20px;\n    margin-bottom: 0;\n    color: #000;\n    border: 0;\n    border-top: 1px solid #e2e2e2;\n  }\n\n  .note-status-output:empty {\n    height: 0;\n    border-top: 0 solid transparent;\n  }\n\n  .note-status-output .pull-right {\n    float: right !important;\n  }\n\n  .note-status-output .text-muted {\n    color: #777;\n  }\n\n  .note-status-output .text-primary {\n    color: #286090;\n  }\n\n  .note-status-output .text-success {\n    color: #3c763d;\n  }\n\n  .note-status-output .text-info {\n    color: #31708f;\n  }\n\n  .note-status-output .text-warning {\n    color: #8a6d3b;\n  }\n\n  .note-status-output .text-danger {\n    color: #a94442;\n  }\n\n  .note-status-output .alert {\n    margin: -7px 0 0 0;\n    padding: 7px 10px 2px 10px;\n    border-radius: 0;\n    color: #000;\n    background-color: #f5f5f5;\n  }\n\n  .note-status-output .alert .note-icon {\n    margin-right: 5px;\n  }\n\n  .note-status-output .alert-success {\n    color: #3c763d !important;\n    background-color: #dff0d8 !important;\n  }\n\n  .note-status-output .alert-info {\n    color: #31708f !important;\n    background-color: #d9edf7 !important;\n  }\n\n  .note-status-output .alert-warning {\n    color: #8a6d3b !important;\n    background-color: #fcf8e3 !important;\n  }\n\n  .note-status-output .alert-danger {\n    color: #a94442 !important;\n    background-color: #f2dede !important;\n  }\n\n  // statusbar\n  .note-statusbar {\n    background-color: $background-color;\n    border-bottom-left-radius: 4px;\n    border-bottom-right-radius: 4px;\n    border-top: 1px solid $border-color;\n    .note-resizebar {\n      padding-top: 1px;\n      height: 9px;\n      width: 100%;\n      cursor: ns-resize;\n      .note-icon-bar {\n        width: 20px;\n        margin: 1px auto;\n        border-top: 1px solid $border-color;\n      }\n    }\n\n    &.locked {\n      .note-resizebar {\n        cursor: default;\n        .note-icon-bar {\n          display: none;\n        }\n      }\n    }\n  }\n  .note-placeholder {\n    padding: 10px;\n  }\n}\n\n.note-editor.note-airframe {\n  border: 0;\n\n  .note-editing-area {\n    .note-editable {\n      padding: 0;\n    }\n  }\n}\n\n\n/* Popover\n ------------------------------------------ */\n.note-popover.popover {\n  display: none;\n  max-width: none;\n\n  .popover-content {\n    a {\n      display: inline-block;\n      max-width: 200px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap; // for FF\n      vertical-align: middle; // for FF\n    }\n  }\n  .arrow {\n    left: 20px !important;\n  }\n}\n\n/* Popover and Toolbar (Button container)\n ------------------------------------------ */\n.note-toolbar {\n  position: relative;\n}\n\n.note-popover .popover-content, .note-editor .note-toolbar {\n  margin: 0;\n  padding: 0 0 5px 5px;\n\n  & > .note-btn-group {\n    margin-top: 5px;\n    margin-left: 0;\n    margin-right: 5px;\n  }\n\n  .note-btn-group {\n    .note-table {\n      min-width: 0;\n      padding: 5px;\n      .note-dimension-picker {\n        font-size: 18px;\n        .note-dimension-picker-mousecatcher {\n          position: absolute !important;\n          z-index: 3;\n          width: 10em;\n          height: 10em;\n          cursor: pointer;\n        }\n        .note-dimension-picker-unhighlighted {\n          position: relative !important;\n          z-index: 1;\n          width: 5em;\n          height: 5em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n        .note-dimension-picker-highlighted {\n          position: absolute !important;\n          z-index: 2;\n          width: 1em;\n          height: 1em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n      }\n    }\n  }\n\n  .note-style {\n    .dropdown-style {\n      blockquote, pre {\n        margin: 0;\n        padding: 5px 10px;\n      }\n      h1, h2, h3, h4, h5, h6, p {\n        margin: 0;\n        padding: 0;\n      }\n    }\n  }\n\n  .note-color-all {\n    .note-dropdown-menu {\n      min-width: 337px;\n    }\n  }\n\n  .note-color {\n    .dropdown-toggle {\n      width: 20px;\n      padding-left: 5px;\n    }\n    .note-dropdown-menu {\n      .note-palette {\n        display: inline-block;\n        margin: 0;\n        width: 160px;\n        &:first-child {\n          margin: 0 5px;\n        }\n\n        .note-palette-title {\n          font-size: 12px;\n          margin: 2px 7px;\n          text-align: center;\n          border-bottom: 1px solid #eee;\n        }\n\n        .note-color-reset,\n        .note-color-select {\n          font-size: 11px;\n          margin: 3px;\n          padding: 0 3px;\n          cursor: pointer;\n          width: 100%;\n          @include rounded(5px);\n\n          &:hover {\n            background: #eee;\n          }\n        }\n\n        .note-color-row {\n          height: 20px;\n        }\n\n        .note-color-select-btn {\n          display: none;\n        }\n\n        .note-holder-custom {\n          .note-color-btn {\n            border: 1px solid #eee;\n          }\n        }\n      }\n    }\n  }\n\n  .note-para {\n    .note-dropdown-menu {\n      min-width: 228px;\n      padding: 5px;\n      & > div + div {\n        margin-left: 5px;\n      }\n    }\n  }\n\n  // dropdown-menu for toolbar and popover\n  .note-dropdown-menu {\n    min-width: 160px;\n\n    // dropdown-menu right position\n    // http://forrst.com/posts/Bootstrap_right_positioned_dropdown-2KB\n    &.right {\n      right: 0;\n      left: auto;\n      &::before {\n        right: 9px;\n        left: auto !important;\n      }\n      &::after {\n        right: 10px;\n        left: auto !important;\n      }\n    }\n    // dropdown-menu for selectbox\n    &.note-check {\n      a i {\n        color: deepskyblue;\n        visibility: hidden;\n      }\n      a.checked i {\n        visibility: visible;\n      }\n    }\n  }\n\n  .note-fontsize-10 {\n    font-size: 10px;\n  }\n\n  // color palette for toolbar and popover\n  .note-color-palette {\n    line-height: 1;\n    div {\n      .note-color-btn {\n        width: 20px;\n        height: 20px;\n        padding: 0;\n        margin: 0;\n        border: 0;\n        border-radius: 0;\n      }\n      .note-color-btn:hover {\n        transform: scale(1.2);\n        transition: all 0.2s;\n      }\n    }\n  }\n}\n\n/* Dialog\n ------------------------------------------ */\n.note-modal {\n  .modal-dialog {\n    outline: 0;\n    border-radius: 5px;\n    @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n  }\n  .form-group { // overwrite BS's form-horizontal minus margins\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .note-modal-form {\n    margin: 0; // overwrite BS2's form margin bottom\n  }\n  .note-image-dialog {\n    .note-dropzone {\n      min-height: 100px;\n      font-size: 30px;\n      line-height: 4; // vertical-align\n      color: lightgray;\n      text-align: center;\n      border: 4px dashed lightgray;\n      margin-bottom: 10px;\n    }\n  }\n\n  // [workaround] firefox fileinput\n  @-moz-document url-prefix() {\n    .note-image-input {\n      height: auto;\n    }\n  }\n}\n\n/* Placeholder\n ------------------------------------------ */\n.note-placeholder {\n  position: absolute;\n  display: none;\n  color: gray;\n}\n\n/* Handle\n ------------------------------------------ */\n.note-handle {\n  // control selection\n  .note-control-selection {\n    position: absolute;\n    display: none;\n    border: 1px solid #000;\n    & > div {\n      position: absolute;\n    }\n\n    .note-control-selection-bg {\n      width: 100%;\n      height: 100%;\n      background-color: #000;\n      @include opacity(0.3);\n    }\n\n    .note-control-handle {\n      width: 7px;\n      height: 7px;\n      border: 1px solid #000;\n    }\n\n    .note-control-holder {\n      @extend .note-control-handle;\n    }\n\n    .note-control-sizing {\n      @extend .note-control-handle;\n      background-color: #000;\n    }\n\n    .note-control-nw {\n      top: -5px;\n      left: -5px;\n      border-right: none;\n      border-bottom: none;\n    }\n\n    .note-control-ne {\n      top: -5px;\n      right: -5px;\n      border-bottom: none;\n      border-left: none;\n    }\n\n    .note-control-sw {\n      bottom: -5px;\n      left: -5px;\n      border-top: none;\n      border-right: none;\n    }\n\n    .note-control-se {\n      right: -5px;\n      bottom: -5px;\n      cursor: se-resize;\n    }\n\n    .note-control-se.note-control-holder {\n      cursor: default;\n      border-top: none;\n      border-left: none;\n    }\n\n    .note-control-selection-info {\n      right: 0;\n      bottom: 0;\n      padding: 5px;\n      margin: 5px;\n      color: #fff;\n      background-color: #000;\n      font-size: 12px;\n      @include rounded(5px);\n      @include opacity(0.7);\n    }\n  }\n}\n\n.note-hint-popover {\n  min-width: 100px;\n  padding: 2px;\n\n  .popover-content {\n    padding: 3px;\n    max-height: 150px;\n    overflow: auto;\n\n    .note-hint-group {\n      .note-hint-item {\n        display: block !important;\n        padding: 3px;\n\n        &.active, &:hover {\n          display: block;\n          clear: both;\n          font-weight: 400;\n          line-height: 1.4;\n          color: white;\n          white-space: nowrap;\n          text-decoration: none;\n          background-color: #428bca;\n          outline: 0;\n          cursor: pointer;\n        }\n      }\n    }\n  }\n}\n\n/* Handle\n ------------------------------------------ */\nhtml, body {\n  .note-fullscreen-body {\n    overflow: hidden !important;\n  }\n}\n","@mixin gradient($color: #F5F5F5, $start: #EEE, $stop: #FFF) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, $start),\n                               color-stop(1, $stop));\n  background: -ms-linear-gradient(bottom,\n                                  $start,\n                                  $stop);\n  background: -moz-linear-gradient(center bottom,\n                                   $start 0%,\n                                   $stop 100%);\n  background: -o-linear-gradient($stop,\n                                 $start);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($stop)}', endColorstr='#{ie-hex-str($start)}', GradientType=0);\n}\n@mixin bw-gradient($color: #F5F5F5, $start: 0, $stop: 255) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, rgb($start,$start,$start)),\n                               color-stop(1, rgb($stop,$stop,$stop)));\n  background: -ms-linear-gradient(bottom,\n                                  rgb($start,$start,$start) 0%,\n                                  rgb($stop,$stop,$stop) 100%);\n  background: -moz-linear-gradient(center bottom,\n                                   rgb($start,$start,$start) 0%,\n                                   rgb($stop,$stop,$stop) 100%);\n  background: -o-linear-gradient(rgb($stop,$stop,$stop),\n                                 rgb($start,$start,$start));\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str(rgb($stop,$stop,$stop))}', endColorstr='#{ie-hex-str(rgb($start,$start,$start))}', GradientType=0);\n}\n@mixin bordered($top-color: #EEE, $right-color: #EEE, $bottom-color: #EEE, $left-color: #EEE) {\n  border-top: solid 1px $top-color;\n  border-left: solid 1px $left-color;\n  border-right: solid 1px $right-color;\n  border-bottom: solid 1px $bottom-color;\n}\n@mixin drop-shadow($x-axis: 0, $y-axis: 1px, $blur: 2px, $alpha: 0.1) {\n  -webkit-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n}\n@mixin rounded($radius: 2px) {\n  -webkit-border-radius: $radius;\n  -moz-border-radius: $radius;\n  border-radius: $radius;\n}\n@mixin border-radius($topright: 0, $bottomright: 0, $bottomleft: 0, $topleft: 0) {\n  -webkit-border-top-right-radius: $topright;\n  -webkit-border-bottom-right-radius: $bottomright;\n  -webkit-border-bottom-left-radius: $bottomleft;\n  -webkit-border-top-left-radius: $topleft;\n  -moz-border-radius-topright: $topright;\n  -moz-border-radius-bottomright: $bottomright;\n  -moz-border-radius-bottomleft: $bottomleft;\n  -moz-border-radius-topleft: $topleft;\n  border-top-right-radius: $topright;\n  border-bottom-right-radius: $bottomright;\n  border-bottom-left-radius: $bottomleft;\n  border-top-left-radius: $topleft;\n  @include background-clip(padding-box);\n}\n@mixin opacity($opacity: 0.5) {\n  -webkit-opacity: $opacity;\n  -khtml-opacity: $opacity;\n  -moz-opacity: $opacity;\n  opacity: $opacity;\n  $opperc: $opacity * 100;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=#{$opperc});\n  filter: alpha(opacity=$opperc);\n}\n@mixin transition-duration($duration: 0.2s) {\n  -moz-transition-duration: $duration;\n  -webkit-transition-duration: $duration;\n  -o-transition-duration: $duration;\n  transition-duration: $duration;\n}\n@mixin transform($arguments...) {\n  -webkit-transform: $arguments;\n  -moz-transform: $arguments;\n  -o-transform: $arguments;\n  -ms-transform: $arguments;\n  transform: $arguments;\n}\n@mixin rotation($deg:5deg) {\n  @include transform(rotate($deg));\n}\n@mixin scale($ratio:1.5) {\n  @include transform(scale($ratio));\n}\n@mixin transition($duration:0.2s, $ease:ease-out) {\n  -webkit-transition: all $duration $ease;\n  -moz-transition: all $duration $ease;\n  -o-transition: all $duration $ease;\n  transition: all $duration $ease;\n}\n@mixin inner-shadow($horizontal:0, $vertical:1px, $blur:2px, $alpha: 0.4) {\n  -webkit-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n}\n@mixin box-shadow($arguments) {\n  -webkit-box-shadow: $arguments;\n  -moz-box-shadow: $arguments;\n  box-shadow: $arguments;\n}\n@mixin box-sizing($sizing: border-box) {\n  -ms-box-sizing: $sizing;\n  -moz-box-sizing: $sizing;\n  -webkit-box-sizing: $sizing;\n  box-sizing: $sizing;\n}\n@mixin user-select($argument: none) {\n  -webkit-user-select: $argument;\n  -moz-user-select: $argument;\n  -ms-user-select: $argument;\n  user-select: $argument;\n}\n@mixin columns($colwidth: 250px, $colcount: 0, $colgap: 50px, $columnRuleColor: #EEE, $columnRuleStyle: solid, $columnRuleWidth: 1px) {\n  -moz-column-width: $colwidth;\n  -moz-column-count: $colcount;\n  -moz-column-gap: $colgap;\n  -moz-column-rule-color: $columnRuleColor;\n  -moz-column-rule-style: $columnRuleStyle;\n  -moz-column-rule-width: $columnRuleWidth;\n  -webkit-column-width: $colwidth;\n  -webkit-column-count: $colcount;\n  -webkit-column-gap: $colgap;\n  -webkit-column-rule-color: $columnRuleColor;\n  -webkit-column-rule-style: $columnRuleStyle;\n  -webkit-column-rule-width: $columnRuleWidth;\n  column-width: $colwidth;\n  column-count: $colcount;\n  column-gap: $colgap;\n  column-rule-color: $columnRuleColor;\n  column-rule-style: $columnRuleStyle;\n  column-rule-width: $columnRuleWidth;\n}\n@mixin translate($x:0, $y:0) {\n  @include transform(translate($x, $y));\n}\n@mixin background-clip($argument: padding-box) {\n  -moz-background-clip: $argument;\n  -webkit-background-clip: $argument;\n  background-clip: $argument;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js
new file mode 100644
index 0000000..d342fdc
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js
@@ -0,0 +1,10235 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("jQuery"));
+	else if(typeof define === 'function' && define.amd)
+		define(["jQuery"], factory);
+	else {
+		var a = typeof exports === 'object' ? factory(require("jQuery")) : factory(root["jQuery"]);
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {
+return /******/ (() => { // webpackBootstrap
+/******/ 	"use strict";
+/******/ 	var __webpack_modules__ = ({
+
+/***/ 9770:
+/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => {
+
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1145);
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
+
+(jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) = (jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) || {
+  lang: {}
+};
+jquery__WEBPACK_IMPORTED_MODULE_0___default().extend((jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote.lang), {
+  'en-US': {
+    font: {
+      bold: 'Bold',
+      italic: 'Italic',
+      underline: 'Underline',
+      clear: 'Remove Font Style',
+      height: 'Line Height',
+      name: 'Font Family',
+      strikethrough: 'Strikethrough',
+      subscript: 'Subscript',
+      superscript: 'Superscript',
+      size: 'Font Size',
+      sizeunit: 'Font Size Unit'
+    },
+    image: {
+      image: 'Picture',
+      insert: 'Insert Image',
+      resizeFull: 'Resize full',
+      resizeHalf: 'Resize half',
+      resizeQuarter: 'Resize quarter',
+      resizeNone: 'Original size',
+      floatLeft: 'Float Left',
+      floatRight: 'Float Right',
+      floatNone: 'Remove float',
+      shapeRounded: 'Shape: Rounded',
+      shapeCircle: 'Shape: Circle',
+      shapeThumbnail: 'Shape: Thumbnail',
+      shapeNone: 'Shape: None',
+      dragImageHere: 'Drag image or text here',
+      dropImage: 'Drop image or Text',
+      selectFromFiles: 'Select from files',
+      maximumFileSize: 'Maximum file size',
+      maximumFileSizeError: 'Maximum file size exceeded.',
+      url: 'Image URL',
+      remove: 'Remove Image',
+      original: 'Original'
+    },
+    video: {
+      video: 'Video',
+      videoLink: 'Video Link',
+      insert: 'Insert Video',
+      url: 'Video URL',
+      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)'
+    },
+    link: {
+      link: 'Link',
+      insert: 'Insert Link',
+      unlink: 'Unlink',
+      edit: 'Edit',
+      textToDisplay: 'Text to display',
+      url: 'To what URL should this link go?',
+      openInNewWindow: 'Open in new window',
+      useProtocol: 'Use default protocol'
+    },
+    table: {
+      table: 'Table',
+      addRowAbove: 'Add row above',
+      addRowBelow: 'Add row below',
+      addColLeft: 'Add column left',
+      addColRight: 'Add column right',
+      delRow: 'Delete row',
+      delCol: 'Delete column',
+      delTable: 'Delete table'
+    },
+    hr: {
+      insert: 'Insert Horizontal Rule'
+    },
+    style: {
+      style: 'Style',
+      p: 'Normal',
+      blockquote: 'Quote',
+      pre: 'Code',
+      h1: 'Header 1',
+      h2: 'Header 2',
+      h3: 'Header 3',
+      h4: 'Header 4',
+      h5: 'Header 5',
+      h6: 'Header 6'
+    },
+    lists: {
+      unordered: 'Unordered list',
+      ordered: 'Ordered list'
+    },
+    options: {
+      help: 'Help',
+      fullscreen: 'Full Screen',
+      codeview: 'Code View'
+    },
+    paragraph: {
+      paragraph: 'Paragraph',
+      outdent: 'Outdent',
+      indent: 'Indent',
+      left: 'Align left',
+      center: 'Align center',
+      right: 'Align right',
+      justify: 'Justify full'
+    },
+    color: {
+      recent: 'Recent Color',
+      more: 'More Color',
+      background: 'Background Color',
+      foreground: 'Text Color',
+      transparent: 'Transparent',
+      setTransparent: 'Set transparent',
+      reset: 'Reset',
+      resetToDefault: 'Reset to default',
+      cpSelect: 'Select'
+    },
+    shortcut: {
+      shortcuts: 'Keyboard shortcuts',
+      close: 'Close',
+      textFormatting: 'Text formatting',
+      action: 'Action',
+      paragraphFormatting: 'Paragraph formatting',
+      documentStyle: 'Document Style',
+      extraKeys: 'Extra keys'
+    },
+    help: {
+      'escape': 'Escape',
+      'insertParagraph': 'Insert Paragraph',
+      'undo': 'Undo the last command',
+      'redo': 'Redo the last command',
+      'tab': 'Tab',
+      'untab': 'Untab',
+      'bold': 'Set a bold style',
+      'italic': 'Set a italic style',
+      'underline': 'Set a underline style',
+      'strikethrough': 'Set a strikethrough style',
+      'removeFormat': 'Clean a style',
+      'justifyLeft': 'Set left align',
+      'justifyCenter': 'Set center align',
+      'justifyRight': 'Set right align',
+      'justifyFull': 'Set full align',
+      'insertUnorderedList': 'Toggle unordered list',
+      'insertOrderedList': 'Toggle ordered list',
+      'outdent': 'Outdent on current paragraph',
+      'indent': 'Indent on current paragraph',
+      'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+      'formatH1': 'Change current block\'s format as H1',
+      'formatH2': 'Change current block\'s format as H2',
+      'formatH3': 'Change current block\'s format as H3',
+      'formatH4': 'Change current block\'s format as H4',
+      'formatH5': 'Change current block\'s format as H5',
+      'formatH6': 'Change current block\'s format as H6',
+      'insertHorizontalRule': 'Insert horizontal rule',
+      'linkDialog.show': 'Show Link Dialog'
+    },
+    history: {
+      undo: 'Undo',
+      redo: 'Redo'
+    },
+    specialChar: {
+      specialChar: 'SPECIAL CHARACTERS',
+      select: 'Select Special characters'
+    },
+    output: {
+      noSelection: 'No Selection Made!'
+    }
+  }
+});
+
+/***/ }),
+
+/***/ 1145:
+/***/ ((module) => {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;
+
+/***/ })
+
+/******/ 	});
+/************************************************************************/
+/******/ 	// The module cache
+/******/ 	var __webpack_module_cache__ = {};
+/******/ 	
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// Check if module is in cache
+/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
+/******/ 		if (cachedModule !== undefined) {
+/******/ 			return cachedModule.exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = __webpack_module_cache__[moduleId] = {
+/******/ 			// no module.id needed
+/******/ 			// no module.loaded needed
+/******/ 			exports: {}
+/******/ 		};
+/******/ 	
+/******/ 		// Execute the module function
+/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/ 	
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/compat get default export */
+/******/ 	(() => {
+/******/ 		// getDefaultExport function for compatibility with non-harmony modules
+/******/ 		__webpack_require__.n = (module) => {
+/******/ 			var getter = module && module.__esModule ?
+/******/ 				() => (module['default']) :
+/******/ 				() => (module);
+/******/ 			__webpack_require__.d(getter, { a: getter });
+/******/ 			return getter;
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	(() => {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = (exports, definition) => {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	(() => {
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/make namespace object */
+/******/ 	(() => {
+/******/ 		// define __esModule on exports
+/******/ 		__webpack_require__.r = (exports) => {
+/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 			}
+/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+// ESM COMPAT FLAG
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: external "jQuery"
+var external_jQuery_ = __webpack_require__(1145);
+var external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_);
+// EXTERNAL MODULE: ./src/lang/summernote-en-US.js
+var summernote_en_US = __webpack_require__(9770);
+;// CONCATENATED MODULE: ./src/js/core/env.js
+
+/**
+ * returns whether font is installed or not.
+ *
+ * @param {String} fontName
+ * @return {Boolean}
+ */
+
+var genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];
+
+function validFontName(fontName) {
+  return external_jQuery_default().inArray(fontName.toLowerCase(), genericFontFamilies) === -1 ? "'".concat(fontName, "'") : fontName;
+}
+
+function isFontInstalled(fontName) {
+  var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';
+  var testText = 'mmmmmmmmmmwwwww';
+  var testSize = '200px';
+  var canvas = document.createElement('canvas');
+  var context = canvas.getContext('2d');
+  context.font = testSize + " '" + testFontName + "'";
+  var originalWidth = context.measureText(testText).width;
+  context.font = testSize + ' ' + validFontName(fontName) + ', "' + testFontName + '"';
+  var width = context.measureText(testText).width;
+  return originalWidth !== width;
+}
+
+var userAgent = navigator.userAgent;
+var isMSIE = /MSIE|Trident/i.test(userAgent);
+var browserVersion;
+
+if (isMSIE) {
+  var matches = /MSIE (\d+[.]\d+)/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+
+  matches = /Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+}
+
+var isEdge = /Edge\/\d+/.test(userAgent);
+var isSupportTouch = 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; // [workaround] IE doesn't have input events for contentEditable
+// - see: https://goo.gl/4bfIvA
+
+var inputEventName = isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';
+/**
+ * @class core.env
+ *
+ * Object which check platform and agent
+ *
+ * @singleton
+ * @alternateClassName env
+ */
+
+/* harmony default export */ const env = ({
+  isMac: navigator.appVersion.indexOf('Mac') > -1,
+  isMSIE: isMSIE,
+  isEdge: isEdge,
+  isFF: !isEdge && /firefox/i.test(userAgent),
+  isPhantom: /PhantomJS/i.test(userAgent),
+  isWebkit: !isEdge && /webkit/i.test(userAgent),
+  isChrome: !isEdge && /chrome/i.test(userAgent),
+  isSafari: !isEdge && /safari/i.test(userAgent) && !/chrome/i.test(userAgent),
+  browserVersion: browserVersion,
+  isSupportTouch: isSupportTouch,
+  isFontInstalled: isFontInstalled,
+  isW3CRangeSupport: !!document.createRange,
+  inputEventName: inputEventName,
+  genericFontFamilies: genericFontFamilies,
+  validFontName: validFontName
+});
+;// CONCATENATED MODULE: ./src/js/core/func.js
+
+/**
+ * @class core.func
+ *
+ * func utils (for high-order func's arg)
+ *
+ * @singleton
+ * @alternateClassName func
+ */
+
+function eq(itemA) {
+  return function (itemB) {
+    return itemA === itemB;
+  };
+}
+
+function eq2(itemA, itemB) {
+  return itemA === itemB;
+}
+
+function peq2(propName) {
+  return function (itemA, itemB) {
+    return itemA[propName] === itemB[propName];
+  };
+}
+
+function ok() {
+  return true;
+}
+
+function fail() {
+  return false;
+}
+
+function not(f) {
+  return function () {
+    return !f.apply(f, arguments);
+  };
+}
+
+function and(fA, fB) {
+  return function (item) {
+    return fA(item) && fB(item);
+  };
+}
+
+function func_self(a) {
+  return a;
+}
+
+function invoke(obj, method) {
+  return function () {
+    return obj[method].apply(obj, arguments);
+  };
+}
+
+var idCounter = 0;
+/**
+ * reset globally-unique id
+ *
+ */
+
+function resetUniqueId() {
+  idCounter = 0;
+}
+/**
+ * generate a globally-unique id
+ *
+ * @param {String} [prefix]
+ */
+
+
+function uniqueId(prefix) {
+  var id = ++idCounter + '';
+  return prefix ? prefix + id : id;
+}
+/**
+ * returns bnd (bounds) from rect
+ *
+ * - IE Compatibility Issue: http://goo.gl/sRLOAo
+ * - Scroll Issue: http://goo.gl/sNjUc
+ *
+ * @param {Rect} rect
+ * @return {Object} bounds
+ * @return {Number} bounds.top
+ * @return {Number} bounds.left
+ * @return {Number} bounds.width
+ * @return {Number} bounds.height
+ */
+
+
+function rect2bnd(rect) {
+  var $document = external_jQuery_default()(document);
+  return {
+    top: rect.top + $document.scrollTop(),
+    left: rect.left + $document.scrollLeft(),
+    width: rect.right - rect.left,
+    height: rect.bottom - rect.top
+  };
+}
+/**
+ * returns a copy of the object where the keys have become the values and the values the keys.
+ * @param {Object} obj
+ * @return {Object}
+ */
+
+
+function invertObject(obj) {
+  var inverted = {};
+
+  for (var key in obj) {
+    if (Object.prototype.hasOwnProperty.call(obj, key)) {
+      inverted[obj[key]] = key;
+    }
+  }
+
+  return inverted;
+}
+/**
+ * @param {String} namespace
+ * @param {String} [prefix]
+ * @return {String}
+ */
+
+
+function namespaceToCamel(namespace, prefix) {
+  prefix = prefix || '';
+  return prefix + namespace.split('.').map(function (name) {
+    return name.substring(0, 1).toUpperCase() + name.substring(1);
+  }).join('');
+}
+/**
+ * Returns a function, that, as long as it continues to be invoked, will not
+ * be triggered. The function will be called after it stops being called for
+ * N milliseconds. If `immediate` is passed, trigger the function on the
+ * leading edge, instead of the trailing.
+ * @param {Function} func
+ * @param {Number} wait
+ * @param {Boolean} immediate
+ * @return {Function}
+ */
+
+
+function debounce(func, wait, immediate) {
+  var timeout;
+  return function () {
+    var context = this;
+    var args = arguments;
+
+    var later = function later() {
+      timeout = null;
+
+      if (!immediate) {
+        func.apply(context, args);
+      }
+    };
+
+    var callNow = immediate && !timeout;
+    clearTimeout(timeout);
+    timeout = setTimeout(later, wait);
+
+    if (callNow) {
+      func.apply(context, args);
+    }
+  };
+}
+/**
+ *
+ * @param {String} url
+ * @return {Boolean}
+ */
+
+
+function isValidUrl(url) {
+  var expression = /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
+  return expression.test(url);
+}
+
+/* harmony default export */ const func = ({
+  eq: eq,
+  eq2: eq2,
+  peq2: peq2,
+  ok: ok,
+  fail: fail,
+  self: func_self,
+  not: not,
+  and: and,
+  invoke: invoke,
+  resetUniqueId: resetUniqueId,
+  uniqueId: uniqueId,
+  rect2bnd: rect2bnd,
+  invertObject: invertObject,
+  namespaceToCamel: namespaceToCamel,
+  debounce: debounce,
+  isValidUrl: isValidUrl
+});
+;// CONCATENATED MODULE: ./src/js/core/lists.js
+
+/**
+ * returns the first item of an array.
+ *
+ * @param {Array} array
+ */
+
+function head(array) {
+  return array[0];
+}
+/**
+ * returns the last item of an array.
+ *
+ * @param {Array} array
+ */
+
+
+function last(array) {
+  return array[array.length - 1];
+}
+/**
+ * returns everything but the last entry of the array.
+ *
+ * @param {Array} array
+ */
+
+
+function initial(array) {
+  return array.slice(0, array.length - 1);
+}
+/**
+ * returns the rest of the items in an array.
+ *
+ * @param {Array} array
+ */
+
+
+function tail(array) {
+  return array.slice(1);
+}
+/**
+ * returns item of array
+ */
+
+
+function find(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    var item = array[idx];
+
+    if (pred(item)) {
+      return item;
+    }
+  }
+}
+/**
+ * returns true if all of the values in the array pass the predicate truth test.
+ */
+
+
+function lists_all(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!pred(array[idx])) {
+      return false;
+    }
+  }
+
+  return true;
+}
+/**
+ * returns true if the value is present in the list.
+ */
+
+
+function contains(array, item) {
+  if (array && array.length && item) {
+    if (array.indexOf) {
+      return array.indexOf(item) !== -1;
+    } else if (array.contains) {
+      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`
+      return array.contains(item);
+    }
+  }
+
+  return false;
+}
+/**
+ * get sum from a list
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - iterator
+ */
+
+
+function sum(array, fn) {
+  fn = fn || func.self;
+  return array.reduce(function (memo, v) {
+    return memo + fn(v);
+  }, 0);
+}
+/**
+ * returns a copy of the collection with array type.
+ * @param {Collection} collection - collection eg) node.childNodes, ...
+ */
+
+
+function from(collection) {
+  var result = [];
+  var length = collection.length;
+  var idx = -1;
+
+  while (++idx < length) {
+    result[idx] = collection[idx];
+  }
+
+  return result;
+}
+/**
+ * returns whether list is empty or not
+ */
+
+
+function isEmpty(array) {
+  return !array || !array.length;
+}
+/**
+ * cluster elements by predicate function.
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ * @param {Array[]}
+ */
+
+
+function clusterBy(array, fn) {
+  if (!array.length) {
+    return [];
+  }
+
+  var aTail = tail(array);
+  return aTail.reduce(function (memo, v) {
+    var aLast = last(memo);
+
+    if (fn(last(aLast), v)) {
+      aLast[aLast.length] = v;
+    } else {
+      memo[memo.length] = [v];
+    }
+
+    return memo;
+  }, [[head(array)]]);
+}
+/**
+ * returns a copy of the array with all false values removed
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ */
+
+
+function compact(array) {
+  var aResult = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (array[idx]) {
+      aResult.push(array[idx]);
+    }
+  }
+
+  return aResult;
+}
+/**
+ * produces a duplicate-free version of the array
+ *
+ * @param {Array} array
+ */
+
+
+function unique(array) {
+  var results = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!contains(results, array[idx])) {
+      results.push(array[idx]);
+    }
+  }
+
+  return results;
+}
+/**
+ * returns next item.
+ * @param {Array} array
+ */
+
+
+function next(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx + 1];
+  }
+
+  return null;
+}
+/**
+ * returns prev item.
+ * @param {Array} array
+ */
+
+
+function prev(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx - 1];
+  }
+
+  return null;
+}
+/**
+ * @class core.list
+ *
+ * list utils
+ *
+ * @singleton
+ * @alternateClassName list
+ */
+
+
+/* harmony default export */ const lists = ({
+  head: head,
+  last: last,
+  initial: initial,
+  tail: tail,
+  prev: prev,
+  next: next,
+  find: find,
+  contains: contains,
+  all: lists_all,
+  sum: sum,
+  from: from,
+  isEmpty: isEmpty,
+  clusterBy: clusterBy,
+  compact: compact,
+  unique: unique
+});
+;// CONCATENATED MODULE: ./src/js/core/dom.js
+
+
+
+
+var NBSP_CHAR = String.fromCharCode(160);
+var ZERO_WIDTH_NBSP_CHAR = "\uFEFF";
+/**
+ * @method isEditable
+ *
+ * returns whether node is `note-editable` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+function isEditable(node) {
+  return node && external_jQuery_default()(node).hasClass('note-editable');
+}
+/**
+ * @method isControlSizing
+ *
+ * returns whether node is `note-control-sizing` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function isControlSizing(node) {
+  return node && external_jQuery_default()(node).hasClass('note-control-sizing');
+}
+/**
+ * @method makePredByNodeName
+ *
+ * returns predicate which judge whether nodeName is same
+ *
+ * @param {String} nodeName
+ * @return {Function}
+ */
+
+
+function makePredByNodeName(nodeName) {
+  nodeName = nodeName.toUpperCase();
+  return function (node) {
+    return node && node.nodeName.toUpperCase() === nodeName;
+  };
+}
+/**
+ * @method isText
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is text(3)
+ */
+
+
+function isText(node) {
+  return node && node.nodeType === 3;
+}
+/**
+ * @method isElement
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is element(1)
+ */
+
+
+function isElement(node) {
+  return node && node.nodeType === 1;
+}
+/**
+ * ex) br, col, embed, hr, img, input, ...
+ * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
+ */
+
+
+function isVoid(node) {
+  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());
+}
+
+function isPara(node) {
+  if (isEditable(node)) {
+    return false;
+  } // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
+
+
+  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+function isHeading(node) {
+  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+var isPre = makePredByNodeName('PRE');
+var isLi = makePredByNodeName('LI');
+
+function isPurePara(node) {
+  return isPara(node) && !isLi(node);
+}
+
+var isTable = makePredByNodeName('TABLE');
+var isData = makePredByNodeName('DATA');
+
+function isInline(node) {
+  return !isBodyContainer(node) && !isList(node) && !isHr(node) && !isPara(node) && !isTable(node) && !isBlockquote(node) && !isData(node);
+}
+
+function isList(node) {
+  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
+}
+
+var isHr = makePredByNodeName('HR');
+
+function isCell(node) {
+  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
+}
+
+var isBlockquote = makePredByNodeName('BLOCKQUOTE');
+
+function isBodyContainer(node) {
+  return isCell(node) || isBlockquote(node) || isEditable(node);
+}
+
+var isAnchor = makePredByNodeName('A');
+
+function isParaInline(node) {
+  return isInline(node) && !!ancestor(node, isPara);
+}
+
+function isBodyInline(node) {
+  return isInline(node) && !ancestor(node, isPara);
+}
+
+var isBody = makePredByNodeName('BODY');
+/**
+ * returns whether nodeB is closest sibling of nodeA
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ * @return {Boolean}
+ */
+
+function isClosestSibling(nodeA, nodeB) {
+  return nodeA.nextSibling === nodeB || nodeA.previousSibling === nodeB;
+}
+/**
+ * returns array of closest siblings with node
+ *
+ * @param {Node} node
+ * @param {function} [pred] - predicate function
+ * @return {Node[]}
+ */
+
+
+function withClosestSiblings(node, pred) {
+  pred = pred || func.ok;
+  var siblings = [];
+
+  if (node.previousSibling && pred(node.previousSibling)) {
+    siblings.push(node.previousSibling);
+  }
+
+  siblings.push(node);
+
+  if (node.nextSibling && pred(node.nextSibling)) {
+    siblings.push(node.nextSibling);
+  }
+
+  return siblings;
+}
+/**
+ * blank HTML for cursor position
+ * - [workaround] old IE only works with &nbsp;
+ * - [workaround] IE11 and other browser works with bogus br
+ */
+
+
+var blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';
+/**
+ * @method nodeLength
+ *
+ * returns #text's text size or element's childNodes size
+ *
+ * @param {Node} node
+ */
+
+function nodeLength(node) {
+  if (isText(node)) {
+    return node.nodeValue.length;
+  }
+
+  if (node) {
+    return node.childNodes.length;
+  }
+
+  return 0;
+}
+/**
+ * returns whether deepest child node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function deepestChildIsEmpty(node) {
+  do {
+    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;
+  } while (node = node.firstElementChild);
+
+  return dom_isEmpty(node);
+}
+/**
+ * returns whether node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function dom_isEmpty(node) {
+  var len = nodeLength(node);
+
+  if (len === 0) {
+    return true;
+  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {
+    // ex) <p><br></p>, <span><br></span>
+    return true;
+  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {
+    // ex) <p></p>, <span></span>
+    return true;
+  }
+
+  return false;
+}
+/**
+ * padding blankHTML if node is empty (for cursor position)
+ */
+
+
+function paddingBlankHTML(node) {
+  if (!isVoid(node) && !nodeLength(node)) {
+    node.innerHTML = blankHTML;
+  }
+}
+/**
+ * find nearest ancestor predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function ancestor(node, pred) {
+  while (node) {
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * find nearest ancestor only single child blood line and predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function singleChildAncestor(node, pred) {
+  node = node.parentNode;
+
+  while (node) {
+    if (nodeLength(node) !== 1) {
+      break;
+    }
+
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * returns new array of ancestor nodes (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listAncestor(node, pred) {
+  pred = pred || func.fail;
+  var ancestors = [];
+  ancestor(node, function (el) {
+    if (!isEditable(el)) {
+      ancestors.push(el);
+    }
+
+    return pred(el);
+  });
+  return ancestors;
+}
+/**
+ * find farthest ancestor predicate hit
+ */
+
+
+function lastAncestor(node, pred) {
+  var ancestors = listAncestor(node);
+  return lists.last(ancestors.filter(pred));
+}
+/**
+ * returns common ancestor node between two nodes.
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ */
+
+
+function commonAncestor(nodeA, nodeB) {
+  var ancestors = listAncestor(nodeA);
+
+  for (var n = nodeB; n; n = n.parentNode) {
+    if (ancestors.indexOf(n) > -1) return n;
+  }
+
+  return null; // difference document area
+}
+/**
+ * listing all previous siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listPrev(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.previousSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing next siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listNext(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.nextSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing descendant nodes
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listDescendant(node, pred) {
+  var descendants = [];
+  pred = pred || func.ok; // start DFS(depth first search) with node
+
+  (function fnWalk(current) {
+    if (node !== current && pred(current)) {
+      descendants.push(current);
+    }
+
+    for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
+      fnWalk(current.childNodes[idx]);
+    }
+  })(node);
+
+  return descendants;
+}
+/**
+ * wrap node with new tag.
+ *
+ * @param {Node} node
+ * @param {Node} tagName of wrapper
+ * @return {Node} - wrapper
+ */
+
+
+function wrap(node, wrapperName) {
+  var parent = node.parentNode;
+  var wrapper = external_jQuery_default()('<' + wrapperName + '>')[0];
+  parent.insertBefore(wrapper, node);
+  wrapper.appendChild(node);
+  return wrapper;
+}
+/**
+ * insert node after preceding
+ *
+ * @param {Node} node
+ * @param {Node} preceding - predicate function
+ */
+
+
+function insertAfter(node, preceding) {
+  var next = preceding.nextSibling;
+  var parent = preceding.parentNode;
+
+  if (next) {
+    parent.insertBefore(node, next);
+  } else {
+    parent.appendChild(node);
+  }
+
+  return node;
+}
+/**
+ * append elements.
+ *
+ * @param {Node} node
+ * @param {Collection} aChild
+ */
+
+
+function appendChildNodes(node, aChild) {
+  external_jQuery_default().each(aChild, function (idx, child) {
+    node.appendChild(child);
+  });
+  return node;
+}
+/**
+ * returns whether boundaryPoint is left edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePoint(point) {
+  return point.offset === 0;
+}
+/**
+ * returns whether boundaryPoint is right edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePoint(point) {
+  return point.offset === nodeLength(point.node);
+}
+/**
+ * returns whether boundaryPoint is edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isEdgePoint(point) {
+  return isLeftEdgePoint(point) || isRightEdgePoint(point);
+}
+/**
+ * returns whether node is left edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgeOf(node, ancestor) {
+  while (node && node !== ancestor) {
+    if (position(node) !== 0) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether node is right edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgeOf(node, ancestor) {
+  if (!ancestor) {
+    return false;
+  }
+
+  while (node && node !== ancestor) {
+    if (position(node) !== nodeLength(node.parentNode) - 1) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether point is left edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePointOf(point, ancestor) {
+  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);
+}
+/**
+ * returns whether point is right edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePointOf(point, ancestor) {
+  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);
+}
+/**
+ * returns offset from parent.
+ *
+ * @param {Node} node
+ */
+
+
+function position(node) {
+  var offset = 0;
+
+  while (node = node.previousSibling) {
+    offset += 1;
+  }
+
+  return offset;
+}
+
+function hasChildren(node) {
+  return !!(node && node.childNodes && node.childNodes.length);
+}
+/**
+ * returns previous boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPoint(point, isSkipInnerOffset) {
+  var node;
+  var offset;
+
+  if (point.offset === 0) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node);
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset - 1];
+    offset = nodeLength(node);
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? 0 : point.offset - 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPoint(point, isSkipInnerOffset) {
+  var node, offset;
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    var nextTextNode = getNextTextNode(point.node);
+
+    if (nextTextNode) {
+      node = nextTextNode;
+      offset = 0;
+    } else {
+      node = point.node.parentNode;
+      offset = position(point.node) + 1;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint with empty node
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointWithEmptyNode(point, isSkipInnerOffset) {
+  var node,
+      offset = 0; // if node is empty string node, return current node's sibling.
+
+  if (dom_isEmpty(point.node)) {
+    if (point.node === null) {
+      return null;
+    }
+
+    node = point.node.nextSibling;
+    offset = 0;
+    return {
+      node: node,
+      offset: offset
+    };
+  }
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node) + 1; // if next node is editable ,  return current node's sibling node.
+
+    if (isEditable(node)) {
+      node = point.node.nextSibling;
+      offset = 0;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+
+    if (dom_isEmpty(node)) {
+      if (!dom_isEmpty(point.node.nextSibling)) {
+        return {
+          node: point.node.nextSibling,
+          offset: offset
+        };
+      }
+
+      return null;
+    }
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+
+    if (dom_isEmpty(node)) {
+      return null;
+    }
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/*
+* returns the next Text node index or 0 if not found.
+*/
+
+
+function getNextTextNode(actual) {
+  if (!actual.nextSibling) return undefined;
+  if (actual.parent !== actual.nextSibling.parent) return undefined;
+  if (isText(actual.nextSibling)) return actual.nextSibling;else return getNextTextNode(actual.nextSibling);
+}
+/**
+ * returns whether pointA and pointB is same or not.
+ *
+ * @param {BoundaryPoint} pointA
+ * @param {BoundaryPoint} pointB
+ * @return {Boolean}
+ */
+
+
+function isSamePoint(pointA, pointB) {
+  return pointA.node === pointB.node && pointA.offset === pointB.offset;
+}
+/**
+ * returns whether point is visible (can set cursor) or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isVisiblePoint(point) {
+  if (isText(point.node) || !hasChildren(point.node) || dom_isEmpty(point.node)) {
+    return true;
+  }
+
+  var leftNode = point.node.childNodes[point.offset - 1];
+  var rightNode = point.node.childNodes[point.offset];
+
+  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {
+    return true;
+  }
+
+  return false;
+}
+/**
+ * @method prevPointUtil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = prevPoint(point);
+  }
+
+  return null;
+}
+/**
+ * @method nextPointUntil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = nextPoint(point);
+  }
+
+  return null;
+}
+/**
+ * returns whether point has character or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isCharPoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch && ch !== ' ' && ch !== NBSP_CHAR;
+}
+/**
+ * returns whether point has space or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isSpacePoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch === ' ' || ch === NBSP_CHAR;
+}
+/**
+ * @method walkPoint
+ *
+ * @param {BoundaryPoint} startPoint
+ * @param {BoundaryPoint} endPoint
+ * @param {Function} handler
+ * @param {Boolean} isSkipInnerOffset
+ */
+
+
+function walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {
+  var point = startPoint;
+
+  while (point) {
+    handler(point);
+
+    if (isSamePoint(point, endPoint)) {
+      break;
+    }
+
+    var isSkipOffset = isSkipInnerOffset && startPoint.node !== point.node && endPoint.node !== point.node;
+    point = nextPointWithEmptyNode(point, isSkipOffset);
+  }
+}
+/**
+ * @method makeOffsetPath
+ *
+ * return offsetPath(array of offset) from ancestor
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {Node} node
+ */
+
+
+function makeOffsetPath(ancestor, node) {
+  var ancestors = listAncestor(node, func.eq(ancestor));
+  return ancestors.map(position).reverse();
+}
+/**
+ * @method fromOffsetPath
+ *
+ * return element from offsetPath(array of offset)
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {array} offsets - offsetPath
+ */
+
+
+function fromOffsetPath(ancestor, offsets) {
+  var current = ancestor;
+
+  for (var i = 0, len = offsets.length; i < len; i++) {
+    if (current.childNodes.length <= offsets[i]) {
+      current = current.childNodes[current.childNodes.length - 1];
+    } else {
+      current = current.childNodes[offsets[i]];
+    }
+  }
+
+  return current;
+}
+/**
+ * @method splitNode
+ *
+ * split element or #text
+ *
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @param {Boolean} [options.isDiscardEmptySplits] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitNode(point, options) {
+  var isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;
+  var isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;
+  var isDiscardEmptySplits = options && options.isDiscardEmptySplits;
+
+  if (isDiscardEmptySplits) {
+    isSkipPaddingBlankHTML = true;
+  } // edge case
+
+
+  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {
+    if (isLeftEdgePoint(point)) {
+      return point.node;
+    } else if (isRightEdgePoint(point)) {
+      return point.node.nextSibling;
+    }
+  } // split #text
+
+
+  if (isText(point.node)) {
+    return point.node.splitText(point.offset);
+  } else {
+    var childNode = point.node.childNodes[point.offset];
+    var clone = insertAfter(point.node.cloneNode(false), point.node);
+    appendChildNodes(clone, listNext(childNode));
+
+    if (!isSkipPaddingBlankHTML) {
+      paddingBlankHTML(point.node);
+      paddingBlankHTML(clone);
+    }
+
+    if (isDiscardEmptySplits) {
+      if (dom_isEmpty(point.node)) {
+        remove(point.node);
+      }
+
+      if (dom_isEmpty(clone)) {
+        remove(clone);
+        return point.node.nextSibling;
+      }
+    }
+
+    return clone;
+  }
+}
+/**
+ * @method splitTree
+ *
+ * split tree by point
+ *
+ * @param {Node} root - split root
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitTree(root, point, options) {
+  // ex) [#text, <span>, <p>]
+  var ancestors = listAncestor(point.node, func.eq(root));
+
+  if (!ancestors.length) {
+    return null;
+  } else if (ancestors.length === 1) {
+    return splitNode(point, options);
+  }
+
+  return ancestors.reduce(function (node, parent) {
+    if (node === point.node) {
+      node = splitNode(point, options);
+    }
+
+    return splitNode({
+      node: parent,
+      offset: node ? position(node) : nodeLength(parent)
+    }, options);
+  });
+}
+/**
+ * split point
+ *
+ * @param {Point} point
+ * @param {Boolean} isInline
+ * @return {Object}
+ */
+
+
+function splitPoint(point, isInline) {
+  // find splitRoot, container
+  //  - inline: splitRoot is a child of paragraph
+  //  - block: splitRoot is a child of bodyContainer
+  var pred = isInline ? isPara : isBodyContainer;
+  var ancestors = listAncestor(point.node, pred);
+  var topAncestor = lists.last(ancestors) || point.node;
+  var splitRoot, container;
+
+  if (pred(topAncestor)) {
+    splitRoot = ancestors[ancestors.length - 2];
+    container = topAncestor;
+  } else {
+    splitRoot = topAncestor;
+    container = splitRoot.parentNode;
+  } // if splitRoot is exists, split with splitTree
+
+
+  var pivot = splitRoot && splitTree(splitRoot, point, {
+    isSkipPaddingBlankHTML: isInline,
+    isNotSplitEdgePoint: isInline
+  }); // if container is point.node, find pivot with point.offset
+
+  if (!pivot && container === point.node) {
+    pivot = point.node.childNodes[point.offset];
+  }
+
+  return {
+    rightNode: pivot,
+    container: container
+  };
+}
+
+function create(nodeName) {
+  return document.createElement(nodeName);
+}
+
+function createText(text) {
+  return document.createTextNode(text);
+}
+/**
+ * @method remove
+ *
+ * remove node, (isRemoveChild: remove child or not)
+ *
+ * @param {Node} node
+ * @param {Boolean} isRemoveChild
+ */
+
+
+function remove(node, isRemoveChild) {
+  if (!node || !node.parentNode) {
+    return;
+  }
+
+  if (node.removeNode) {
+    return node.removeNode(isRemoveChild);
+  }
+
+  var parent = node.parentNode;
+
+  if (!isRemoveChild) {
+    var nodes = [];
+
+    for (var i = 0, len = node.childNodes.length; i < len; i++) {
+      nodes.push(node.childNodes[i]);
+    }
+
+    for (var _i = 0, _len = nodes.length; _i < _len; _i++) {
+      parent.insertBefore(nodes[_i], node);
+    }
+  }
+
+  parent.removeChild(node);
+}
+/**
+ * @method removeWhile
+ *
+ * @param {Node} node
+ * @param {Function} pred
+ */
+
+
+function removeWhile(node, pred) {
+  while (node) {
+    if (isEditable(node) || !pred(node)) {
+      break;
+    }
+
+    var parent = node.parentNode;
+    remove(node);
+    node = parent;
+  }
+}
+/**
+ * @method replace
+ *
+ * replace node with provided nodeName
+ *
+ * @param {Node} node
+ * @param {String} nodeName
+ * @return {Node} - new node
+ */
+
+
+function replace(node, nodeName) {
+  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {
+    return node;
+  }
+
+  var newNode = create(nodeName);
+
+  if (node.style.cssText) {
+    newNode.style.cssText = node.style.cssText;
+  }
+
+  appendChildNodes(newNode, lists.from(node.childNodes));
+  insertAfter(newNode, node);
+  remove(node);
+  return newNode;
+}
+
+var isTextarea = makePredByNodeName('TEXTAREA');
+/**
+ * @param {jQuery} $node
+ * @param {Boolean} [stripLinebreaks] - default: false
+ */
+
+function value($node, stripLinebreaks) {
+  var val = isTextarea($node[0]) ? $node.val() : $node.html();
+
+  if (stripLinebreaks) {
+    return val.replace(/[\n\r]/g, '');
+  }
+
+  return val;
+}
+/**
+ * @method html
+ *
+ * get the HTML contents of node
+ *
+ * @param {jQuery} $node
+ * @param {Boolean} [isNewlineOnBlock]
+ */
+
+
+function html($node, isNewlineOnBlock) {
+  var markup = value($node);
+
+  if (isNewlineOnBlock) {
+    var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g;
+    markup = markup.replace(regexTag, function (match, endSlash, name) {
+      name = name.toUpperCase();
+      var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) && !!endSlash;
+      var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);
+      return match + (isEndOfInlineContainer || isBlockNode ? '\n' : '');
+    });
+    markup = markup.trim();
+  }
+
+  return markup;
+}
+
+function posFromPlaceholder(placeholder) {
+  var $placeholder = external_jQuery_default()(placeholder);
+  var pos = $placeholder.offset();
+  var height = $placeholder.outerHeight(true); // include margin
+
+  return {
+    left: pos.left,
+    top: pos.top + height
+  };
+}
+
+function attachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.on(key, events[key]);
+  });
+}
+
+function detachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.off(key, events[key]);
+  });
+}
+/**
+ * @method isCustomStyleTag
+ *
+ * assert if a node contains a "note-styletag" class,
+ * which implies that's a custom-made style tag node
+ *
+ * @param {Node} an HTML DOM node
+ */
+
+
+function isCustomStyleTag(node) {
+  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');
+}
+
+/* harmony default export */ const dom = ({
+  /** @property {String} NBSP_CHAR */
+  NBSP_CHAR: NBSP_CHAR,
+
+  /** @property {String} ZERO_WIDTH_NBSP_CHAR */
+  ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR,
+
+  /** @property {String} blank */
+  blank: blankHTML,
+
+  /** @property {String} emptyPara */
+  emptyPara: "<p>".concat(blankHTML, "</p>"),
+  makePredByNodeName: makePredByNodeName,
+  isEditable: isEditable,
+  isControlSizing: isControlSizing,
+  isText: isText,
+  isElement: isElement,
+  isVoid: isVoid,
+  isPara: isPara,
+  isPurePara: isPurePara,
+  isHeading: isHeading,
+  isInline: isInline,
+  isBlock: func.not(isInline),
+  isBodyInline: isBodyInline,
+  isBody: isBody,
+  isParaInline: isParaInline,
+  isPre: isPre,
+  isList: isList,
+  isTable: isTable,
+  isData: isData,
+  isCell: isCell,
+  isBlockquote: isBlockquote,
+  isBodyContainer: isBodyContainer,
+  isAnchor: isAnchor,
+  isDiv: makePredByNodeName('DIV'),
+  isLi: isLi,
+  isBR: makePredByNodeName('BR'),
+  isSpan: makePredByNodeName('SPAN'),
+  isB: makePredByNodeName('B'),
+  isU: makePredByNodeName('U'),
+  isS: makePredByNodeName('S'),
+  isI: makePredByNodeName('I'),
+  isImg: makePredByNodeName('IMG'),
+  isTextarea: isTextarea,
+  deepestChildIsEmpty: deepestChildIsEmpty,
+  isEmpty: dom_isEmpty,
+  isEmptyAnchor: func.and(isAnchor, dom_isEmpty),
+  isClosestSibling: isClosestSibling,
+  withClosestSiblings: withClosestSiblings,
+  nodeLength: nodeLength,
+  isLeftEdgePoint: isLeftEdgePoint,
+  isRightEdgePoint: isRightEdgePoint,
+  isEdgePoint: isEdgePoint,
+  isLeftEdgeOf: isLeftEdgeOf,
+  isRightEdgeOf: isRightEdgeOf,
+  isLeftEdgePointOf: isLeftEdgePointOf,
+  isRightEdgePointOf: isRightEdgePointOf,
+  prevPoint: prevPoint,
+  nextPoint: nextPoint,
+  nextPointWithEmptyNode: nextPointWithEmptyNode,
+  isSamePoint: isSamePoint,
+  isVisiblePoint: isVisiblePoint,
+  prevPointUntil: prevPointUntil,
+  nextPointUntil: nextPointUntil,
+  isCharPoint: isCharPoint,
+  isSpacePoint: isSpacePoint,
+  walkPoint: walkPoint,
+  ancestor: ancestor,
+  singleChildAncestor: singleChildAncestor,
+  listAncestor: listAncestor,
+  lastAncestor: lastAncestor,
+  listNext: listNext,
+  listPrev: listPrev,
+  listDescendant: listDescendant,
+  commonAncestor: commonAncestor,
+  wrap: wrap,
+  insertAfter: insertAfter,
+  appendChildNodes: appendChildNodes,
+  position: position,
+  hasChildren: hasChildren,
+  makeOffsetPath: makeOffsetPath,
+  fromOffsetPath: fromOffsetPath,
+  splitTree: splitTree,
+  splitPoint: splitPoint,
+  create: create,
+  createText: createText,
+  remove: remove,
+  removeWhile: removeWhile,
+  replace: replace,
+  html: html,
+  value: value,
+  posFromPlaceholder: posFromPlaceholder,
+  attachEvents: attachEvents,
+  detachEvents: detachEvents,
+  isCustomStyleTag: isCustomStyleTag
+});
+;// CONCATENATED MODULE: ./src/js/Context.js
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Context = /*#__PURE__*/function () {
+  /**
+   * @param {jQuery} $note
+   * @param {Object} options
+   */
+  function Context($note, options) {
+    _classCallCheck(this, Context);
+
+    this.$note = $note;
+    this.memos = {};
+    this.modules = {};
+    this.layoutInfo = {};
+    this.options = external_jQuery_default().extend(true, {}, options); // init ui with options
+
+    (external_jQuery_default()).summernote.ui = external_jQuery_default().summernote.ui_template(this.options);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.initialize();
+  }
+  /**
+   * create layout and initialize modules and other resources
+   */
+
+
+  _createClass(Context, [{
+    key: "initialize",
+    value: function initialize() {
+      this.layoutInfo = this.ui.createLayout(this.$note);
+
+      this._initialize();
+
+      this.$note.hide();
+      return this;
+    }
+    /**
+     * destroy modules and other resources and remove layout
+     */
+
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this._destroy();
+
+      this.$note.removeData('summernote');
+      this.ui.removeLayout(this.$note, this.layoutInfo);
+    }
+    /**
+     * destory modules and other resources and initialize it again
+     */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      var disabled = this.isDisabled();
+      this.code(dom.emptyPara);
+
+      this._destroy();
+
+      this._initialize();
+
+      if (disabled) {
+        this.disable();
+      }
+    }
+  }, {
+    key: "_initialize",
+    value: function _initialize() {
+      var _this = this;
+
+      // set own id
+      this.options.id = func.uniqueId(external_jQuery_default().now()); // set default container for tooltips, popovers, and dialogs
+
+      this.options.container = this.options.container || this.layoutInfo.editor; // add optional buttons
+
+      var buttons = external_jQuery_default().extend({}, this.options.buttons);
+      Object.keys(buttons).forEach(function (key) {
+        _this.memo('button.' + key, buttons[key]);
+      });
+      var modules = external_jQuery_default().extend({}, this.options.modules, (external_jQuery_default()).summernote.plugins || {}); // add and initialize modules
+
+      Object.keys(modules).forEach(function (key) {
+        _this.module(key, modules[key], true);
+      });
+      Object.keys(this.modules).forEach(function (key) {
+        _this.initializeModule(key);
+      });
+    }
+  }, {
+    key: "_destroy",
+    value: function _destroy() {
+      var _this2 = this;
+
+      // destroy modules with reversed order
+      Object.keys(this.modules).reverse().forEach(function (key) {
+        _this2.removeModule(key);
+      });
+      Object.keys(this.memos).forEach(function (key) {
+        _this2.removeMemo(key);
+      }); // trigger custom onDestroy callback
+
+      this.triggerEvent('destroy', this);
+    }
+  }, {
+    key: "code",
+    value: function code(html) {
+      var isActivated = this.invoke('codeview.isActivated');
+
+      if (html === undefined) {
+        this.invoke('codeview.sync');
+        return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();
+      } else {
+        if (isActivated) {
+          this.invoke('codeview.sync', html);
+        } else {
+          this.layoutInfo.editable.html(html);
+        }
+
+        this.$note.val(html);
+        this.triggerEvent('change', html, this.layoutInfo.editable);
+      }
+    }
+  }, {
+    key: "isDisabled",
+    value: function isDisabled() {
+      return this.layoutInfo.editable.attr('contenteditable') === 'false';
+    }
+  }, {
+    key: "enable",
+    value: function enable() {
+      this.layoutInfo.editable.attr('contenteditable', true);
+      this.invoke('toolbar.activate', true);
+      this.triggerEvent('disable', false);
+      this.options.editing = true;
+    }
+  }, {
+    key: "disable",
+    value: function disable() {
+      // close codeview if codeview is opend
+      if (this.invoke('codeview.isActivated')) {
+        this.invoke('codeview.deactivate');
+      }
+
+      this.layoutInfo.editable.attr('contenteditable', false);
+      this.options.editing = false;
+      this.invoke('toolbar.deactivate', true);
+      this.triggerEvent('disable', true);
+    }
+  }, {
+    key: "triggerEvent",
+    value: function triggerEvent() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];
+
+      if (callback) {
+        callback.apply(this.$note[0], args);
+      }
+
+      this.$note.trigger('summernote.' + namespace, args);
+    }
+  }, {
+    key: "initializeModule",
+    value: function initializeModule(key) {
+      var module = this.modules[key];
+      module.shouldInitialize = module.shouldInitialize || func.ok;
+
+      if (!module.shouldInitialize()) {
+        return;
+      } // initialize module
+
+
+      if (module.initialize) {
+        module.initialize();
+      } // attach events
+
+
+      if (module.events) {
+        dom.attachEvents(this.$note, module.events);
+      }
+    }
+  }, {
+    key: "module",
+    value: function module(key, ModuleClass, withoutIntialize) {
+      if (arguments.length === 1) {
+        return this.modules[key];
+      }
+
+      this.modules[key] = new ModuleClass(this);
+
+      if (!withoutIntialize) {
+        this.initializeModule(key);
+      }
+    }
+  }, {
+    key: "removeModule",
+    value: function removeModule(key) {
+      var module = this.modules[key];
+
+      if (module.shouldInitialize()) {
+        if (module.events) {
+          dom.detachEvents(this.$note, module.events);
+        }
+
+        if (module.destroy) {
+          module.destroy();
+        }
+      }
+
+      delete this.modules[key];
+    }
+  }, {
+    key: "memo",
+    value: function memo(key, obj) {
+      if (arguments.length === 1) {
+        return this.memos[key];
+      }
+
+      this.memos[key] = obj;
+    }
+  }, {
+    key: "removeMemo",
+    value: function removeMemo(key) {
+      if (this.memos[key] && this.memos[key].destroy) {
+        this.memos[key].destroy();
+      }
+
+      delete this.memos[key];
+    }
+    /**
+     * Some buttons need to change their visual style immediately once they get pressed
+     */
+
+  }, {
+    key: "createInvokeHandlerAndUpdateState",
+    value: function createInvokeHandlerAndUpdateState(namespace, value) {
+      var _this3 = this;
+
+      return function (event) {
+        _this3.createInvokeHandler(namespace, value)(event);
+
+        _this3.invoke('buttons.updateCurrentStyle');
+      };
+    }
+  }, {
+    key: "createInvokeHandler",
+    value: function createInvokeHandler(namespace, value) {
+      var _this4 = this;
+
+      return function (event) {
+        event.preventDefault();
+        var $target = external_jQuery_default()(event.target);
+
+        _this4.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);
+      };
+    }
+  }, {
+    key: "invoke",
+    value: function invoke() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var splits = namespace.split('.');
+      var hasSeparator = splits.length > 1;
+      var moduleName = hasSeparator && lists.head(splits);
+      var methodName = hasSeparator ? lists.last(splits) : lists.head(splits);
+      var module = this.modules[moduleName || 'editor'];
+
+      if (!moduleName && this[methodName]) {
+        return this[methodName].apply(this, args);
+      } else if (module && module[methodName] && module.shouldInitialize()) {
+        return module[methodName].apply(module, args);
+      }
+    }
+  }]);
+
+  return Context;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/summernote.js
+
+
+
+
+external_jQuery_default().fn.extend({
+  /**
+   * Summernote API
+   *
+   * @param {Object|String}
+   * @return {this}
+   */
+  summernote: function summernote() {
+    var type = external_jQuery_default().type(lists.head(arguments));
+    var isExternalAPICalled = type === 'string';
+    var hasInitOptions = type === 'object';
+    var options = external_jQuery_default().extend({}, (external_jQuery_default()).summernote.options, hasInitOptions ? lists.head(arguments) : {}); // Update options
+
+    options.langInfo = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.lang["en-US"], (external_jQuery_default()).summernote.lang[options.lang]);
+    options.icons = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.options.icons, options.icons);
+    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;
+    this.each(function (idx, note) {
+      var $note = external_jQuery_default()(note);
+
+      if (!$note.data('summernote')) {
+        var context = new Context($note, options);
+        $note.data('summernote', context);
+        $note.data('summernote').triggerEvent('init', context.layoutInfo);
+      }
+    });
+    var $note = this.first();
+
+    if ($note.length) {
+      var context = $note.data('summernote');
+
+      if (isExternalAPICalled) {
+        return context.invoke.apply(context, lists.from(arguments));
+      } else if (options.focus) {
+        context.invoke('editor.focus');
+      }
+    }
+
+    return this;
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/range.js
+function range_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function range_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function range_createClass(Constructor, protoProps, staticProps) { if (protoProps) range_defineProperties(Constructor.prototype, protoProps); if (staticProps) range_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+/**
+ * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
+ *
+ * @param {TextRange} textRange
+ * @param {Boolean} isStart
+ * @return {BoundaryPoint}
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
+ */
+
+function textRangeToPoint(textRange, isStart) {
+  var container = textRange.parentElement();
+  var offset;
+  var tester = document.body.createTextRange();
+  var prevContainer;
+  var childNodes = lists.from(container.childNodes);
+
+  for (offset = 0; offset < childNodes.length; offset++) {
+    if (dom.isText(childNodes[offset])) {
+      continue;
+    }
+
+    tester.moveToElementText(childNodes[offset]);
+
+    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {
+      break;
+    }
+
+    prevContainer = childNodes[offset];
+  }
+
+  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {
+    var textRangeStart = document.body.createTextRange();
+    var curTextNode = null;
+    textRangeStart.moveToElementText(prevContainer || container);
+    textRangeStart.collapse(!prevContainer);
+    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;
+    var pointTester = textRange.duplicate();
+    pointTester.setEndPoint('StartToStart', textRangeStart);
+    var textCount = pointTester.text.replace(/[\r\n]/g, '').length;
+
+    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    } // [workaround] enforce IE to re-reference curTextNode, hack
+
+
+    var dummy = curTextNode.nodeValue; // eslint-disable-line
+
+    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) && textCount === curTextNode.nodeValue.length) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    }
+
+    container = curTextNode;
+    offset = textCount;
+  }
+
+  return {
+    cont: container,
+    offset: offset
+  };
+}
+/**
+ * return TextRange from boundary point (inspired by google closure-library)
+ * @param {BoundaryPoint} point
+ * @return {TextRange}
+ */
+
+
+function pointToTextRange(point) {
+  var textRangeInfo = function textRangeInfo(container, offset) {
+    var node, isCollapseToStart;
+
+    if (dom.isText(container)) {
+      var prevTextNodes = dom.listPrev(container, func.not(dom.isText));
+      var prevContainer = lists.last(prevTextNodes).previousSibling;
+      node = prevContainer || container.parentNode;
+      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);
+      isCollapseToStart = !prevContainer;
+    } else {
+      node = container.childNodes[offset] || container;
+
+      if (dom.isText(node)) {
+        return textRangeInfo(node, 0);
+      }
+
+      offset = 0;
+      isCollapseToStart = false;
+    }
+
+    return {
+      node: node,
+      collapseToStart: isCollapseToStart,
+      offset: offset
+    };
+  };
+
+  var textRange = document.body.createTextRange();
+  var info = textRangeInfo(point.node, point.offset);
+  textRange.moveToElementText(info.node);
+  textRange.collapse(info.collapseToStart);
+  textRange.moveStart('character', info.offset);
+  return textRange;
+}
+/**
+   * Wrapped Range
+   *
+   * @constructor
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   */
+
+
+var WrappedRange = /*#__PURE__*/function () {
+  function WrappedRange(sc, so, ec, eo) {
+    range_classCallCheck(this, WrappedRange);
+
+    this.sc = sc;
+    this.so = so;
+    this.ec = ec;
+    this.eo = eo; // isOnEditable: judge whether range is on editable or not
+
+    this.isOnEditable = this.makeIsOn(dom.isEditable); // isOnList: judge whether range is on list node or not
+
+    this.isOnList = this.makeIsOn(dom.isList); // isOnAnchor: judge whether range is on anchor node or not
+
+    this.isOnAnchor = this.makeIsOn(dom.isAnchor); // isOnCell: judge whether range is on cell node or not
+
+    this.isOnCell = this.makeIsOn(dom.isCell); // isOnData: judge whether range is on data node or not
+
+    this.isOnData = this.makeIsOn(dom.isData);
+  } // nativeRange: get nativeRange from sc, so, ec, eo
+
+
+  range_createClass(WrappedRange, [{
+    key: "nativeRange",
+    value: function nativeRange() {
+      if (env.isW3CRangeSupport) {
+        var w3cRange = document.createRange();
+        w3cRange.setStart(this.sc, this.so);
+        w3cRange.setEnd(this.ec, this.eo);
+        return w3cRange;
+      } else {
+        var textRange = pointToTextRange({
+          node: this.sc,
+          offset: this.so
+        });
+        textRange.setEndPoint('EndToEnd', pointToTextRange({
+          node: this.ec,
+          offset: this.eo
+        }));
+        return textRange;
+      }
+    }
+  }, {
+    key: "getPoints",
+    value: function getPoints() {
+      return {
+        sc: this.sc,
+        so: this.so,
+        ec: this.ec,
+        eo: this.eo
+      };
+    }
+  }, {
+    key: "getStartPoint",
+    value: function getStartPoint() {
+      return {
+        node: this.sc,
+        offset: this.so
+      };
+    }
+  }, {
+    key: "getEndPoint",
+    value: function getEndPoint() {
+      return {
+        node: this.ec,
+        offset: this.eo
+      };
+    }
+    /**
+     * select update visible range
+     */
+
+  }, {
+    key: "select",
+    value: function select() {
+      var nativeRng = this.nativeRange();
+
+      if (env.isW3CRangeSupport) {
+        var selection = document.getSelection();
+
+        if (selection.rangeCount > 0) {
+          selection.removeAllRanges();
+        }
+
+        selection.addRange(nativeRng);
+      } else {
+        nativeRng.select();
+      }
+
+      return this;
+    }
+    /**
+     * Moves the scrollbar to start container(sc) of current range
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "scrollIntoView",
+    value: function scrollIntoView(container) {
+      var height = external_jQuery_default()(container).height();
+
+      if (container.scrollTop + height < this.sc.offsetTop) {
+        container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);
+      }
+
+      return this;
+    }
+    /**
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "normalize",
+    value: function normalize() {
+      /**
+       * @param {BoundaryPoint} point
+       * @param {Boolean} isLeftToRight - true: prefer to choose right node
+       *                                - false: prefer to choose left node
+       * @return {BoundaryPoint}
+       */
+      var getVisiblePoint = function getVisiblePoint(point, isLeftToRight) {
+        if (!point) {
+          return point;
+        } // Just use the given point [XXX:Adhoc]
+        //  - case 01. if the point is on the middle of the node
+        //  - case 02. if the point is on the right edge and prefer to choose left node
+        //  - case 03. if the point is on the left edge and prefer to choose right node
+        //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void
+        //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void
+        //  - case 06. if the point is on the block node and there is no children
+
+
+        if (dom.isVisiblePoint(point)) {
+          if (!dom.isEdgePoint(point) || dom.isRightEdgePoint(point) && !isLeftToRight || dom.isLeftEdgePoint(point) && isLeftToRight || dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling) || dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling) || dom.isBlock(point.node) && dom.isEmpty(point.node)) {
+            return point;
+          }
+        } // point on block's edge
+
+
+        var block = dom.ancestor(point.node, dom.isBlock);
+        var hasRightNode = false;
+
+        if (!hasRightNode) {
+          var prevPoint = dom.prevPoint(point) || {
+            node: null
+          };
+          hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;
+        }
+
+        var hasLeftNode = false;
+
+        if (!hasLeftNode) {
+          var _nextPoint = dom.nextPoint(point) || {
+            node: null
+          };
+
+          hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(_nextPoint.node)) && isLeftToRight;
+        }
+
+        if (hasRightNode || hasLeftNode) {
+          // returns point already on visible point
+          if (dom.isVisiblePoint(point)) {
+            return point;
+          } // reverse direction
+
+
+          isLeftToRight = !isLeftToRight;
+        }
+
+        var nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint) : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);
+        return nextPoint || point;
+      };
+
+      var endPoint = getVisiblePoint(this.getEndPoint(), false);
+      var startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns matched nodes on range
+     *
+     * @param {Function} [pred] - predicate function
+     * @param {Object} [options]
+     * @param {Boolean} [options.includeAncestor]
+     * @param {Boolean} [options.fullyContains]
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "nodes",
+    value: function nodes(pred, options) {
+      pred = pred || func.ok;
+      var includeAncestor = options && options.includeAncestor;
+      var fullyContains = options && options.fullyContains; // TODO compare points and sort
+
+      var startPoint = this.getStartPoint();
+      var endPoint = this.getEndPoint();
+      var nodes = [];
+      var leftEdgeNodes = [];
+      dom.walkPoint(startPoint, endPoint, function (point) {
+        if (dom.isEditable(point.node)) {
+          return;
+        }
+
+        var node;
+
+        if (fullyContains) {
+          if (dom.isLeftEdgePoint(point)) {
+            leftEdgeNodes.push(point.node);
+          }
+
+          if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {
+            node = point.node;
+          }
+        } else if (includeAncestor) {
+          node = dom.ancestor(point.node, pred);
+        } else {
+          node = point.node;
+        }
+
+        if (node && pred(node)) {
+          nodes.push(node);
+        }
+      }, true);
+      return lists.unique(nodes);
+    }
+    /**
+     * returns commonAncestor of range
+     * @return {Element} - commonAncestor
+     */
+
+  }, {
+    key: "commonAncestor",
+    value: function commonAncestor() {
+      return dom.commonAncestor(this.sc, this.ec);
+    }
+    /**
+     * returns expanded range by pred
+     *
+     * @param {Function} pred - predicate function
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "expand",
+    value: function expand(pred) {
+      var startAncestor = dom.ancestor(this.sc, pred);
+      var endAncestor = dom.ancestor(this.ec, pred);
+
+      if (!startAncestor && !endAncestor) {
+        return new WrappedRange(this.sc, this.so, this.ec, this.eo);
+      }
+
+      var boundaryPoints = this.getPoints();
+
+      if (startAncestor) {
+        boundaryPoints.sc = startAncestor;
+        boundaryPoints.so = 0;
+      }
+
+      if (endAncestor) {
+        boundaryPoints.ec = endAncestor;
+        boundaryPoints.eo = dom.nodeLength(endAncestor);
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * @param {Boolean} isCollapseToStart
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "collapse",
+    value: function collapse(isCollapseToStart) {
+      if (isCollapseToStart) {
+        return new WrappedRange(this.sc, this.so, this.sc, this.so);
+      } else {
+        return new WrappedRange(this.ec, this.eo, this.ec, this.eo);
+      }
+    }
+    /**
+     * splitText on range
+     */
+
+  }, {
+    key: "splitText",
+    value: function splitText() {
+      var isSameContainer = this.sc === this.ec;
+      var boundaryPoints = this.getPoints();
+
+      if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {
+        this.ec.splitText(this.eo);
+      }
+
+      if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {
+        boundaryPoints.sc = this.sc.splitText(this.so);
+        boundaryPoints.so = 0;
+
+        if (isSameContainer) {
+          boundaryPoints.ec = boundaryPoints.sc;
+          boundaryPoints.eo = this.eo - this.so;
+        }
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * delete contents on range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "deleteContents",
+    value: function deleteContents() {
+      if (this.isCollapsed()) {
+        return this;
+      }
+
+      var rng = this.splitText();
+      var nodes = rng.nodes(null, {
+        fullyContains: true
+      }); // find new cursor point
+
+      var point = dom.prevPointUntil(rng.getStartPoint(), function (point) {
+        return !lists.contains(nodes, point.node);
+      });
+      var emptyParents = [];
+      external_jQuery_default().each(nodes, function (idx, node) {
+        // find empty parents
+        var parent = node.parentNode;
+
+        if (point.node !== parent && dom.nodeLength(parent) === 1) {
+          emptyParents.push(parent);
+        }
+
+        dom.remove(node, false);
+      }); // remove empty parents
+
+      external_jQuery_default().each(emptyParents, function (idx, node) {
+        dom.remove(node, false);
+      });
+      return new WrappedRange(point.node, point.offset, point.node, point.offset).normalize();
+    }
+    /**
+     * makeIsOn: return isOn(pred) function
+     */
+
+  }, {
+    key: "makeIsOn",
+    value: function makeIsOn(pred) {
+      return function () {
+        var ancestor = dom.ancestor(this.sc, pred);
+        return !!ancestor && ancestor === dom.ancestor(this.ec, pred);
+      };
+    }
+    /**
+     * @param {Function} pred
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isLeftEdgeOf",
+    value: function isLeftEdgeOf(pred) {
+      if (!dom.isLeftEdgePoint(this.getStartPoint())) {
+        return false;
+      }
+
+      var node = dom.ancestor(this.sc, pred);
+      return node && dom.isLeftEdgeOf(this.sc, node);
+    }
+    /**
+     * returns whether range was collapsed or not
+     */
+
+  }, {
+    key: "isCollapsed",
+    value: function isCollapsed() {
+      return this.sc === this.ec && this.so === this.eo;
+    }
+    /**
+     * wrap inline nodes which children of body with paragraph
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "wrapBodyInlineWithPara",
+    value: function wrapBodyInlineWithPara() {
+      if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {
+        this.sc.innerHTML = dom.emptyPara;
+        return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);
+      }
+      /**
+       * [workaround] firefox often create range on not visible point. so normalize here.
+       *  - firefox: |<p>text</p>|
+       *  - chrome: <p>|text|</p>
+       */
+
+
+      var rng = this.normalize();
+
+      if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {
+        return rng;
+      } // find inline top ancestor
+
+
+      var topAncestor;
+
+      if (dom.isInline(rng.sc)) {
+        var ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));
+        topAncestor = lists.last(ancestors);
+
+        if (!dom.isInline(topAncestor)) {
+          topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];
+        }
+      } else {
+        topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];
+      }
+
+      if (topAncestor) {
+        // siblings not in paragraph
+        var inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();
+        inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline)); // wrap with paragraph
+
+        if (inlineSiblings.length) {
+          var para = dom.wrap(lists.head(inlineSiblings), 'p');
+          dom.appendChildNodes(para, lists.tail(inlineSiblings));
+        }
+      }
+
+      return this.normalize();
+    }
+    /**
+     * insert node at current cursor
+     *
+     * @param {Node} node
+     * @return {Node}
+     */
+
+  }, {
+    key: "insertNode",
+    value: function insertNode(node) {
+      var rng = this;
+
+      if (dom.isText(node) || dom.isInline(node)) {
+        rng = this.wrapBodyInlineWithPara().deleteContents();
+      }
+
+      var info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));
+
+      if (info.rightNode) {
+        info.rightNode.parentNode.insertBefore(node, info.rightNode);
+
+        if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {
+          info.rightNode.parentNode.removeChild(info.rightNode);
+        }
+      } else {
+        info.container.appendChild(node);
+      }
+
+      return node;
+    }
+    /**
+     * insert html at current cursor
+     */
+
+  }, {
+    key: "pasteHTML",
+    value: function pasteHTML(markup) {
+      markup = external_jQuery_default().trim(markup);
+      var contentsContainer = external_jQuery_default()('<div></div>').html(markup)[0];
+      var childNodes = lists.from(contentsContainer.childNodes); // const rng = this.wrapBodyInlineWithPara().deleteContents();
+
+      var rng = this;
+      var reversed = false;
+
+      if (rng.so >= 0) {
+        childNodes = childNodes.reverse();
+        reversed = true;
+      }
+
+      childNodes = childNodes.map(function (childNode) {
+        return rng.insertNode(childNode);
+      });
+
+      if (reversed) {
+        childNodes = childNodes.reverse();
+      }
+
+      return childNodes;
+    }
+    /**
+     * returns text in range
+     *
+     * @return {String}
+     */
+
+  }, {
+    key: "toString",
+    value: function toString() {
+      var nativeRng = this.nativeRange();
+      return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
+    }
+    /**
+     * returns range for word before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordRange",
+    value: function getWordRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      if (!dom.isCharPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        return !dom.isCharPoint(point);
+      });
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, function (point) {
+          return !dom.isCharPoint(point);
+        });
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordsRange",
+    value: function getWordsRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      var isNotTextPoint = function isNotTextPoint(point) {
+        return !dom.isCharPoint(point) && !dom.isSpacePoint(point);
+      };
+
+      if (isNotTextPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor that match with a Regex
+     *
+     * example:
+     *  range: 'hi @Peter Pan'
+     *  regex: '/@[a-z ]+/i'
+     *  return range: '@Peter Pan'
+     *
+     * @param {RegExp} [regex]
+     * @return {WrappedRange|null}
+     */
+
+  }, {
+    key: "getWordsMatchRange",
+    value: function getWordsMatchRange(regex) {
+      var endPoint = this.getEndPoint();
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {
+          return true;
+        }
+
+        var rng = new WrappedRange(point.node, point.offset, endPoint.node, endPoint.offset);
+        var result = regex.exec(rng.toString());
+        return result && result.index === 0;
+      });
+      var rng = new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+      var text = rng.toString();
+      var result = regex.exec(text);
+
+      if (result && result[0].length === text.length) {
+        return rng;
+      } else {
+        return null;
+      }
+    }
+    /**
+     * create offsetPath bookmark
+     *
+     * @param {Node} editable
+     */
+
+  }, {
+    key: "bookmark",
+    value: function bookmark(editable) {
+      return {
+        s: {
+          path: dom.makeOffsetPath(editable, this.sc),
+          offset: this.so
+        },
+        e: {
+          path: dom.makeOffsetPath(editable, this.ec),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * create offsetPath bookmark base on paragraph
+     *
+     * @param {Node[]} paras
+     */
+
+  }, {
+    key: "paraBookmark",
+    value: function paraBookmark(paras) {
+      return {
+        s: {
+          path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),
+          offset: this.so
+        },
+        e: {
+          path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * getClientRects
+     * @return {Rect[]}
+     */
+
+  }, {
+    key: "getClientRects",
+    value: function getClientRects() {
+      var nativeRng = this.nativeRange();
+      return nativeRng.getClientRects();
+    }
+  }]);
+
+  return WrappedRange;
+}();
+/**
+ * Data structure
+ *  * BoundaryPoint: a point of dom tree
+ *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range
+ *
+ * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
+ */
+
+
+/* harmony default export */ const range = ({
+  /**
+   * create Range Object From arguments or Browser Selection
+   *
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   * @return {WrappedRange}
+   */
+  create: function create(sc, so, ec, eo) {
+    if (arguments.length === 4) {
+      return new WrappedRange(sc, so, ec, eo);
+    } else if (arguments.length === 2) {
+      // collapsed
+      ec = sc;
+      eo = so;
+      return new WrappedRange(sc, so, ec, eo);
+    } else {
+      var wrappedRange = this.createFromSelection();
+
+      if (!wrappedRange && arguments.length === 1) {
+        var bodyElement = arguments[0];
+
+        if (dom.isEditable(bodyElement)) {
+          bodyElement = bodyElement.lastChild;
+        }
+
+        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);
+      }
+
+      return wrappedRange;
+    }
+  },
+  createFromBodyElement: function createFromBodyElement(bodyElement) {
+    var isCollapseToStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+    var wrappedRange = this.createFromNode(bodyElement);
+    return wrappedRange.collapse(isCollapseToStart);
+  },
+  createFromSelection: function createFromSelection() {
+    var sc, so, ec, eo;
+
+    if (env.isW3CRangeSupport) {
+      var selection = document.getSelection();
+
+      if (!selection || selection.rangeCount === 0) {
+        return null;
+      } else if (dom.isBody(selection.anchorNode)) {
+        // Firefox: returns entire body as range on initialization.
+        // We won't never need it.
+        return null;
+      }
+
+      var nativeRng = selection.getRangeAt(0);
+      sc = nativeRng.startContainer;
+      so = nativeRng.startOffset;
+      ec = nativeRng.endContainer;
+      eo = nativeRng.endOffset;
+    } else {
+      // IE8: TextRange
+      var textRange = document.selection.createRange();
+      var textRangeEnd = textRange.duplicate();
+      textRangeEnd.collapse(false);
+      var textRangeStart = textRange;
+      textRangeStart.collapse(true);
+      var startPoint = textRangeToPoint(textRangeStart, true);
+      var endPoint = textRangeToPoint(textRangeEnd, false); // same visible point case: range was collapsed.
+
+      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) && dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) && endPoint.node.nextSibling === startPoint.node) {
+        startPoint = endPoint;
+      }
+
+      sc = startPoint.cont;
+      so = startPoint.offset;
+      ec = endPoint.cont;
+      eo = endPoint.offset;
+    }
+
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from node
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNode: function createFromNode(node) {
+    var sc = node;
+    var so = 0;
+    var ec = node;
+    var eo = dom.nodeLength(ec); // browsers can't target a picture or void node
+
+    if (dom.isVoid(sc)) {
+      so = dom.listPrev(sc).length - 1;
+      sc = sc.parentNode;
+    }
+
+    if (dom.isBR(ec)) {
+      eo = dom.listPrev(ec).length - 1;
+      ec = ec.parentNode;
+    } else if (dom.isVoid(ec)) {
+      eo = dom.listPrev(ec).length;
+      ec = ec.parentNode;
+    }
+
+    return this.create(sc, so, ec, eo);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeBefore: function createFromNodeBefore(node) {
+    return this.createFromNode(node).collapse(true);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeAfter: function createFromNodeAfter(node) {
+    return this.createFromNode(node).collapse();
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from bookmark
+   *
+   * @param {Node} editable
+   * @param {Object} bookmark
+   * @return {WrappedRange}
+   */
+  createFromBookmark: function createFromBookmark(editable, bookmark) {
+    var sc = dom.fromOffsetPath(editable, bookmark.s.path);
+    var so = bookmark.s.offset;
+    var ec = dom.fromOffsetPath(editable, bookmark.e.path);
+    var eo = bookmark.e.offset;
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from paraBookmark
+   *
+   * @param {Object} bookmark
+   * @param {Node[]} paras
+   * @return {WrappedRange}
+   */
+  createFromParaBookmark: function createFromParaBookmark(bookmark, paras) {
+    var so = bookmark.s.offset;
+    var eo = bookmark.e.offset;
+    var sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);
+    var ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);
+    return new WrappedRange(sc, so, ec, eo);
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/key.js
+
+
+var KEY_MAP = {
+  'BACKSPACE': 8,
+  'TAB': 9,
+  'ENTER': 13,
+  'ESCAPE': 27,
+  'SPACE': 32,
+  'DELETE': 46,
+  // Arrow
+  'LEFT': 37,
+  'UP': 38,
+  'RIGHT': 39,
+  'DOWN': 40,
+  // Number: 0-9
+  'NUM0': 48,
+  'NUM1': 49,
+  'NUM2': 50,
+  'NUM3': 51,
+  'NUM4': 52,
+  'NUM5': 53,
+  'NUM6': 54,
+  'NUM7': 55,
+  'NUM8': 56,
+  // Alphabet: a-z
+  'B': 66,
+  'E': 69,
+  'I': 73,
+  'J': 74,
+  'K': 75,
+  'L': 76,
+  'R': 82,
+  'S': 83,
+  'U': 85,
+  'V': 86,
+  'Y': 89,
+  'Z': 90,
+  'SLASH': 191,
+  'LEFTBRACKET': 219,
+  'BACKSLASH': 220,
+  'RIGHTBRACKET': 221,
+  // Navigation
+  'HOME': 36,
+  'END': 35,
+  'PAGEUP': 33,
+  'PAGEDOWN': 34
+};
+/**
+ * @class core.key
+ *
+ * Object for keycodes.
+ *
+ * @singleton
+ * @alternateClassName key
+ */
+
+/* harmony default export */ const key = ({
+  /**
+   * @method isEdit
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isEdit: function isEdit(keyCode) {
+    return lists.contains([KEY_MAP.BACKSPACE, KEY_MAP.TAB, KEY_MAP.ENTER, KEY_MAP.SPACE, KEY_MAP.DELETE], keyCode);
+  },
+
+  /**
+   * @method isMove
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isMove: function isMove(keyCode) {
+    return lists.contains([KEY_MAP.LEFT, KEY_MAP.UP, KEY_MAP.RIGHT, KEY_MAP.DOWN], keyCode);
+  },
+
+  /**
+   * @method isNavigation
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isNavigation: function isNavigation(keyCode) {
+    return lists.contains([KEY_MAP.HOME, KEY_MAP.END, KEY_MAP.PAGEUP, KEY_MAP.PAGEDOWN], keyCode);
+  },
+
+  /**
+   * @property {Object} nameFromCode
+   * @property {String} nameFromCode.8 "BACKSPACE"
+   */
+  nameFromCode: func.invertObject(KEY_MAP),
+  code: KEY_MAP
+});
+;// CONCATENATED MODULE: ./src/js/core/async.js
+
+/**
+ * @method readFileAsDataURL
+ *
+ * read contents of file as representing URL
+ *
+ * @param {File} file
+ * @return {Promise} - then: dataUrl
+ */
+
+function readFileAsDataURL(file) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    external_jQuery_default().extend(new FileReader(), {
+      onload: function onload(e) {
+        var dataURL = e.target.result;
+        deferred.resolve(dataURL);
+      },
+      onerror: function onerror(err) {
+        deferred.reject(err);
+      }
+    }).readAsDataURL(file);
+  }).promise();
+}
+/**
+ * @method createImage
+ *
+ * create `<image>` from url string
+ *
+ * @param {String} url
+ * @return {Promise} - then: $image
+ */
+
+function createImage(url) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    var $img = external_jQuery_default()('<img>');
+    $img.one('load', function () {
+      $img.off('error abort');
+      deferred.resolve($img);
+    }).one('error abort', function () {
+      $img.off('load').detach();
+      deferred.reject($img);
+    }).css({
+      display: 'none'
+    }).appendTo(document.body).attr('src', url);
+  }).promise();
+}
+;// CONCATENATED MODULE: ./src/js/editing/History.js
+function History_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function History_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function History_createClass(Constructor, protoProps, staticProps) { if (protoProps) History_defineProperties(Constructor.prototype, protoProps); if (staticProps) History_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var History = /*#__PURE__*/function () {
+  function History(context) {
+    History_classCallCheck(this, History);
+
+    this.stack = [];
+    this.stackOffset = -1;
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+    this.editable = this.$editable[0];
+  }
+
+  History_createClass(History, [{
+    key: "makeSnapshot",
+    value: function makeSnapshot() {
+      var rng = range.create(this.editable);
+      var emptyBookmark = {
+        s: {
+          path: [],
+          offset: 0
+        },
+        e: {
+          path: [],
+          offset: 0
+        }
+      };
+      return {
+        contents: this.$editable.html(),
+        bookmark: rng && rng.isOnEditable() ? rng.bookmark(this.editable) : emptyBookmark
+      };
+    }
+  }, {
+    key: "applySnapshot",
+    value: function applySnapshot(snapshot) {
+      if (snapshot.contents !== null) {
+        this.$editable.html(snapshot.contents);
+      }
+
+      if (snapshot.bookmark !== null) {
+        range.createFromBookmark(this.editable, snapshot.bookmark).select();
+      }
+    }
+    /**
+    * @method rewind
+    * Rewinds the history stack back to the first snapshot taken.
+    * Leaves the stack intact, so that "Redo" can still be used.
+    */
+
+  }, {
+    key: "rewind",
+    value: function rewind() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      } // Return to the first available snapshot.
+
+
+      this.stackOffset = 0; // Apply that snapshot.
+
+      this.applySnapshot(this.stack[this.stackOffset]);
+    }
+    /**
+    *  @method commit
+    *  Resets history stack, but keeps current editor's content.
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+    * @method reset
+    * Resets the history stack completely; reverting to an empty editor.
+    */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Clear the editable area.
+
+      this.$editable.html(''); // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      }
+
+      if (this.stackOffset > 0) {
+        this.stackOffset--;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      if (this.stack.length - 1 > this.stackOffset) {
+        this.stackOffset++;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * recorded undo
+     */
+
+  }, {
+    key: "recordUndo",
+    value: function recordUndo() {
+      this.stackOffset++; // Wash out stack after stackOffset
+
+      if (this.stack.length > this.stackOffset) {
+        this.stack = this.stack.slice(0, this.stackOffset);
+      } // Create new snapshot and push it to the end
+
+
+      this.stack.push(this.makeSnapshot()); // If the stack size reachs to the limit, then slice it
+
+      if (this.stack.length > this.context.options.historyLimit) {
+        this.stack.shift();
+        this.stackOffset -= 1;
+      }
+    }
+  }]);
+
+  return History;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Style.js
+function Style_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Style_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Style_createClass(Constructor, protoProps, staticProps) { if (protoProps) Style_defineProperties(Constructor.prototype, protoProps); if (staticProps) Style_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Style = /*#__PURE__*/function () {
+  function Style() {
+    Style_classCallCheck(this, Style);
+  }
+
+  Style_createClass(Style, [{
+    key: "jQueryCSS",
+    value:
+    /**
+     * @method jQueryCSS
+     *
+     * [workaround] for old jQuery
+     * passing an array of style properties to .css()
+     * will result in an object of property-value pairs.
+     * (compability with version < 1.9)
+     *
+     * @private
+     * @param  {jQuery} $obj
+     * @param  {Array} propertyNames - An array of one or more CSS properties.
+     * @return {Object}
+     */
+    function jQueryCSS($obj, propertyNames) {
+      var result = {};
+      external_jQuery_default().each(propertyNames, function (idx, propertyName) {
+        result[propertyName] = $obj.css(propertyName);
+      });
+      return result;
+    }
+    /**
+     * returns style object from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "fromNode",
+    value: function fromNode($node) {
+      var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
+      var styleInfo = this.jQueryCSS($node, properties) || {};
+      var fontSize = $node[0].style.fontSize || styleInfo['font-size'];
+      styleInfo['font-size'] = parseInt(fontSize, 10);
+      styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);
+      return styleInfo;
+    }
+    /**
+     * paragraph level style
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} styleInfo
+     */
+
+  }, {
+    key: "stylePara",
+    value: function stylePara(rng, styleInfo) {
+      external_jQuery_default().each(rng.nodes(dom.isPara, {
+        includeAncestor: true
+      }), function (idx, para) {
+        external_jQuery_default()(para).css(styleInfo);
+      });
+    }
+    /**
+     * insert and returns styleNodes on range.
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} [options] - options for styleNodes
+     * @param {String} [options.nodeName] - default: `SPAN`
+     * @param {Boolean} [options.expandClosestSibling] - default: `false`
+     * @param {Boolean} [options.onlyPartialContains] - default: `false`
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "styleNodes",
+    value: function styleNodes(rng, options) {
+      rng = rng.splitText();
+      var nodeName = options && options.nodeName || 'SPAN';
+      var expandClosestSibling = !!(options && options.expandClosestSibling);
+      var onlyPartialContains = !!(options && options.onlyPartialContains);
+
+      if (rng.isCollapsed()) {
+        return [rng.insertNode(dom.create(nodeName))];
+      }
+
+      var pred = dom.makePredByNodeName(nodeName);
+      var nodes = rng.nodes(dom.isText, {
+        fullyContains: true
+      }).map(function (text) {
+        return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
+      });
+
+      if (expandClosestSibling) {
+        if (onlyPartialContains) {
+          var nodesInRange = rng.nodes(); // compose with partial contains predication
+
+          pred = func.and(pred, function (node) {
+            return lists.contains(nodesInRange, node);
+          });
+        }
+
+        return nodes.map(function (node) {
+          var siblings = dom.withClosestSiblings(node, pred);
+          var head = lists.head(siblings);
+          var tails = lists.tail(siblings);
+          external_jQuery_default().each(tails, function (idx, elem) {
+            dom.appendChildNodes(head, elem.childNodes);
+            dom.remove(elem);
+          });
+          return lists.head(siblings);
+        });
+      } else {
+        return nodes;
+      }
+    }
+    /**
+     * get current style on cursor
+     *
+     * @param {WrappedRange} rng
+     * @return {Object} - object contains style properties.
+     */
+
+  }, {
+    key: "current",
+    value: function current(rng) {
+      var $cont = external_jQuery_default()(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);
+      var styleInfo = this.fromNode($cont); // document.queryCommandState for toggle state
+      // [workaround] prevent Firefox nsresult: "0x80004005 (NS_ERROR_FAILURE)"
+
+      try {
+        styleInfo = external_jQuery_default().extend(styleInfo, {
+          'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',
+          'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',
+          'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',
+          'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',
+          'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',
+          'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',
+          'font-family': document.queryCommandValue('fontname') || styleInfo['font-family']
+        });
+      } catch (e) {// eslint-disable-next-line
+      } // list-style-type to list-style(unordered, ordered)
+
+
+      if (!rng.isOnList()) {
+        styleInfo['list-style'] = 'none';
+      } else {
+        var orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];
+        var isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;
+        styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';
+      }
+
+      var para = dom.ancestor(rng.sc, dom.isPara);
+
+      if (para && para.style['line-height']) {
+        styleInfo['line-height'] = para.style.lineHeight;
+      } else {
+        var lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);
+        styleInfo['line-height'] = lineHeight.toFixed(1);
+      }
+
+      styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
+      styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
+      styleInfo.range = rng;
+      return styleInfo;
+    }
+  }]);
+
+  return Style;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Bullet.js
+function Bullet_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Bullet_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Bullet_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bullet_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bullet_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var Bullet = /*#__PURE__*/function () {
+  function Bullet() {
+    Bullet_classCallCheck(this, Bullet);
+  }
+
+  Bullet_createClass(Bullet, [{
+    key: "insertOrderedList",
+    value:
+    /**
+     * toggle ordered list
+     */
+    function insertOrderedList(editable) {
+      this.toggleList('OL', editable);
+    }
+    /**
+     * toggle unordered list
+     */
+
+  }, {
+    key: "insertUnorderedList",
+    value: function insertUnorderedList(editable) {
+      this.toggleList('UL', editable);
+    }
+    /**
+     * indent
+     */
+
+  }, {
+    key: "indent",
+    value: function indent(editable) {
+      var _this = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          var previousList = _this.findList(head.previousSibling);
+
+          if (previousList) {
+            paras.map(function (para) {
+              return previousList.appendChild(para);
+            });
+          } else {
+            _this.wrapList(paras, head.parentNode.nodeName);
+
+            paras.map(function (para) {
+              return para.parentNode;
+            }).map(function (para) {
+              return _this.appendToPrevious(para);
+            });
+          }
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              return (parseInt(val, 10) || 0) + 25;
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * outdent
+     */
+
+  }, {
+    key: "outdent",
+    value: function outdent(editable) {
+      var _this2 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          _this2.releaseList([paras]);
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              val = parseInt(val, 10) || 0;
+              return val > 25 ? val - 25 : '';
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * toggle list
+     *
+     * @param {String} listName - OL or UL
+     */
+
+  }, {
+    key: "toggleList",
+    value: function toggleList(listName, editable) {
+      var _this3 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var bookmark = rng.paraBookmark(paras);
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode')); // paragraph to list
+
+      if (lists.find(paras, dom.isPurePara)) {
+        var wrappedParas = [];
+        external_jQuery_default().each(clustereds, function (idx, paras) {
+          wrappedParas = wrappedParas.concat(_this3.wrapList(paras, listName));
+        });
+        paras = wrappedParas; // list to paragraph or change list style
+      } else {
+        var diffLists = rng.nodes(dom.isList, {
+          includeAncestor: true
+        }).filter(function (listNode) {
+          return !external_jQuery_default().nodeName(listNode, listName);
+        });
+
+        if (diffLists.length) {
+          external_jQuery_default().each(diffLists, function (idx, listNode) {
+            dom.replace(listNode, listName);
+          });
+        } else {
+          paras = this.releaseList(clustereds, true);
+        }
+      }
+
+      range.createFromParaBookmark(bookmark, paras).select();
+    }
+    /**
+     * @param {Node[]} paras
+     * @param {String} listName
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "wrapList",
+    value: function wrapList(paras, listName) {
+      var head = lists.head(paras);
+      var last = lists.last(paras);
+      var prevList = dom.isList(head.previousSibling) && head.previousSibling;
+      var nextList = dom.isList(last.nextSibling) && last.nextSibling;
+      var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last); // P to LI
+
+      paras = paras.map(function (para) {
+        return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
+      }); // append to list(<ul>, <ol>)
+
+      dom.appendChildNodes(listNode, paras);
+
+      if (nextList) {
+        dom.appendChildNodes(listNode, lists.from(nextList.childNodes));
+        dom.remove(nextList);
+      }
+
+      return paras;
+    }
+    /**
+     * @method releaseList
+     *
+     * @param {Array[]} clustereds
+     * @param {Boolean} isEscapseToBody
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "releaseList",
+    value: function releaseList(clustereds, isEscapseToBody) {
+      var _this4 = this;
+
+      var releasedParas = [];
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+        var last = lists.last(paras);
+        var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;
+        var parentItem = headList.parentNode;
+
+        if (headList.parentNode.nodeName === 'LI') {
+          paras.map(function (para) {
+            var newList = _this4.findNextSiblings(para);
+
+            if (parentItem.nextSibling) {
+              parentItem.parentNode.insertBefore(para, parentItem.nextSibling);
+            } else {
+              parentItem.parentNode.appendChild(para);
+            }
+
+            if (newList.length) {
+              _this4.wrapList(newList, headList.nodeName);
+
+              para.appendChild(newList[0].parentNode);
+            }
+          });
+
+          if (headList.children.length === 0) {
+            parentItem.removeChild(headList);
+          }
+
+          if (parentItem.childNodes.length === 0) {
+            parentItem.parentNode.removeChild(parentItem);
+          }
+        } else {
+          var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {
+            node: last.parentNode,
+            offset: dom.position(last) + 1
+          }, {
+            isSkipPaddingBlankHTML: true
+          }) : null;
+          var middleList = dom.splitTree(headList, {
+            node: head.parentNode,
+            offset: dom.position(head)
+          }, {
+            isSkipPaddingBlankHTML: true
+          });
+          paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) : lists.from(middleList.childNodes).filter(dom.isLi); // LI to P
+
+          if (isEscapseToBody || !dom.isList(headList.parentNode)) {
+            paras = paras.map(function (para) {
+              return dom.replace(para, 'P');
+            });
+          }
+
+          external_jQuery_default().each(lists.from(paras).reverse(), function (idx, para) {
+            dom.insertAfter(para, headList);
+          }); // remove empty lists
+
+          var rootLists = lists.compact([headList, middleList, lastList]);
+          external_jQuery_default().each(rootLists, function (idx, rootList) {
+            var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));
+            external_jQuery_default().each(listNodes.reverse(), function (idx, listNode) {
+              if (!dom.nodeLength(listNode)) {
+                dom.remove(listNode, true);
+              }
+            });
+          });
+        }
+
+        releasedParas = releasedParas.concat(paras);
+      });
+      return releasedParas;
+    }
+    /**
+     * @method appendToPrevious
+     *
+     * Appends list to previous list item, if
+     * none exist it wraps the list in a new list item.
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "appendToPrevious",
+    value: function appendToPrevious(node) {
+      return node.previousSibling ? dom.appendChildNodes(node.previousSibling, [node]) : this.wrapList([node], 'LI');
+    }
+    /**
+     * @method findList
+     *
+     * Finds an existing list in list item
+     *
+     * @param {HTMLNode} ListItem
+     * @return {Array[]}
+     */
+
+  }, {
+    key: "findList",
+    value: function findList(node) {
+      return node ? lists.find(node.children, function (child) {
+        return ['OL', 'UL'].indexOf(child.nodeName) > -1;
+      }) : null;
+    }
+    /**
+     * @method findNextSiblings
+     *
+     * Finds all list item siblings that follow it
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "findNextSiblings",
+    value: function findNextSiblings(node) {
+      var siblings = [];
+
+      while (node.nextSibling) {
+        siblings.push(node.nextSibling);
+        node = node.nextSibling;
+      }
+
+      return siblings;
+    }
+  }]);
+
+  return Bullet;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Typing.js
+function Typing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Typing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Typing_createClass(Constructor, protoProps, staticProps) { if (protoProps) Typing_defineProperties(Constructor.prototype, protoProps); if (staticProps) Typing_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class editing.Typing
+ *
+ * Typing
+ *
+ */
+
+var Typing = /*#__PURE__*/function () {
+  function Typing(context) {
+    Typing_classCallCheck(this, Typing);
+
+    // a Bullet instance to toggle lists off
+    this.bullet = new Bullet();
+    this.options = context.options;
+  }
+  /**
+   * insert tab
+   *
+   * @param {WrappedRange} rng
+   * @param {Number} tabsize
+   */
+
+
+  Typing_createClass(Typing, [{
+    key: "insertTab",
+    value: function insertTab(rng, tabsize) {
+      var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
+      rng = rng.deleteContents();
+      rng.insertNode(tab, true);
+      rng = range.create(tab, tabsize);
+      rng.select();
+    }
+    /**
+     * insert paragraph
+     *
+     * @param {jQuery} $editable
+     * @param {WrappedRange} rng Can be used in unit tests to "mock" the range
+     *
+     * blockquoteBreakingLevel
+     *   0 - No break, the new paragraph remains inside the quote
+     *   1 - Break the first blockquote in the ancestors list
+     *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)
+     */
+
+  }, {
+    key: "insertParagraph",
+    value: function insertParagraph(editable, rng) {
+      rng = rng || range.create(editable); // deleteContents on range.
+
+      rng = rng.deleteContents(); // Wrap range if it needs to be wrapped by paragraph
+
+      rng = rng.wrapBodyInlineWithPara(); // finding paragraph
+
+      var splitRoot = dom.ancestor(rng.sc, dom.isPara);
+      var nextPara; // on paragraph: split paragraph
+
+      if (splitRoot) {
+        // if it is an empty line with li
+        if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {
+          // toggle UL/OL and escape
+          this.bullet.toggleList(splitRoot.parentNode.nodeName);
+          return;
+        } else {
+          var blockquote = null;
+
+          if (this.options.blockquoteBreakingLevel === 1) {
+            blockquote = dom.ancestor(splitRoot, dom.isBlockquote);
+          } else if (this.options.blockquoteBreakingLevel === 2) {
+            blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);
+          }
+
+          if (blockquote) {
+            // We're inside a blockquote and options ask us to break it
+            nextPara = external_jQuery_default()(dom.emptyPara)[0]; // If the split is right before a <br>, remove it so that there's no "empty line"
+            // after the split in the new blockquote created
+
+            if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {
+              external_jQuery_default()(rng.sc.nextSibling).remove();
+            }
+
+            var split = dom.splitTree(blockquote, rng.getStartPoint(), {
+              isDiscardEmptySplits: true
+            });
+
+            if (split) {
+              split.parentNode.insertBefore(nextPara, split);
+            } else {
+              dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote
+            }
+          } else {
+            nextPara = dom.splitTree(splitRoot, rng.getStartPoint()); // not a blockquote, just insert the paragraph
+
+            var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
+            emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));
+            external_jQuery_default().each(emptyAnchors, function (idx, anchor) {
+              dom.remove(anchor);
+            }); // replace empty heading, pre or custom-made styleTag with P tag
+
+            if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {
+              nextPara = dom.replace(nextPara, 'p');
+            }
+          }
+        } // no paragraph: insert empty paragraph
+
+      } else {
+        var next = rng.sc.childNodes[rng.so];
+        nextPara = external_jQuery_default()(dom.emptyPara)[0];
+
+        if (next) {
+          rng.sc.insertBefore(nextPara, next);
+        } else {
+          rng.sc.appendChild(nextPara);
+        }
+      }
+
+      range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
+    }
+  }]);
+
+  return Typing;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Table.js
+function Table_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Table_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Table_createClass(Constructor, protoProps, staticProps) { if (protoProps) Table_defineProperties(Constructor.prototype, protoProps); if (staticProps) Table_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class Create a virtual table to create what actions to do in change.
+ * @param {object} startPoint Cell selected to apply change.
+ * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where
+ * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction
+ * @param {object} domTable Dom element of table to make changes.
+ */
+
+var TableResultAction = function TableResultAction(startPoint, where, action, domTable) {
+  var _startPoint = {
+    'colPos': 0,
+    'rowPos': 0
+  };
+  var _virtualTable = [];
+  var _actionCellList = []; /// ///////////////////////////////////////////
+  // Private functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Set the startPoint of action.
+   */
+
+  function setStartPoint() {
+    if (!startPoint || !startPoint.tagName || startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th') {
+      // Impossible to identify start Cell point
+      return;
+    }
+
+    _startPoint.colPos = startPoint.cellIndex;
+
+    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {
+      // Impossible to identify start Row point
+      return;
+    }
+
+    _startPoint.rowPos = startPoint.parentElement.rowIndex;
+  }
+  /**
+   * Define virtual table position info object.
+   *
+   * @param {int} rowIndex Index position in line of virtual table.
+   * @param {int} cellIndex Index position in column of virtual table.
+   * @param {object} baseRow Row affected by this position.
+   * @param {object} baseCell Cell affected by this position.
+   * @param {bool} isSpan Inform if it is an span cell/row.
+   */
+
+
+  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {
+    var objPosition = {
+      'baseRow': baseRow,
+      'baseCell': baseCell,
+      'isRowSpan': isRowSpan,
+      'isColSpan': isColSpan,
+      'isVirtual': isVirtualCell
+    };
+
+    if (!_virtualTable[rowIndex]) {
+      _virtualTable[rowIndex] = [];
+    }
+
+    _virtualTable[rowIndex][cellIndex] = objPosition;
+  }
+  /**
+   * Create action cell object.
+   *
+   * @param {object} virtualTableCellObj Object of specific position on virtual table.
+   * @param {enum} resultAction Action to be applied in that item.
+   */
+
+
+  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {
+    return {
+      'baseCell': virtualTableCellObj.baseCell,
+      'action': resultAction,
+      'virtualTable': {
+        'rowIndex': virtualRowPosition,
+        'cellIndex': virtualColPosition
+      }
+    };
+  }
+  /**
+   * Recover free index of row to append Cell.
+   *
+   * @param {int} rowIndex Index of row to find free space.
+   * @param {int} cellIndex Index of cell to find free space in table.
+   */
+
+
+  function recoverCellIndex(rowIndex, cellIndex) {
+    if (!_virtualTable[rowIndex]) {
+      return cellIndex;
+    }
+
+    if (!_virtualTable[rowIndex][cellIndex]) {
+      return cellIndex;
+    }
+
+    var newCellIndex = cellIndex;
+
+    while (_virtualTable[rowIndex][newCellIndex]) {
+      newCellIndex++;
+
+      if (!_virtualTable[rowIndex][newCellIndex]) {
+        return newCellIndex;
+      }
+    }
+  }
+  /**
+   * Recover info about row and cell and add information to virtual table.
+   *
+   * @param {object} row Row to recover information.
+   * @param {object} cell Cell to recover information.
+   */
+
+
+  function addCellInfoToVirtual(row, cell) {
+    var cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);
+    var cellHasColspan = cell.colSpan > 1;
+    var cellHasRowspan = cell.rowSpan > 1;
+    var isThisSelectedCell = row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos;
+    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false); // Add span rows to virtual Table.
+
+    var rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;
+
+    if (rowspanNumber > 1) {
+      for (var rp = 1; rp < rowspanNumber; rp++) {
+        var rowspanIndex = row.rowIndex + rp;
+        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);
+      }
+    } // Add span cols to virtual table.
+
+
+    var colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;
+
+    if (colspanNumber > 1) {
+      for (var cp = 1; cp < colspanNumber; cp++) {
+        var cellspanIndex = recoverCellIndex(row.rowIndex, cellIndex + cp);
+        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);
+      }
+    }
+  }
+  /**
+   * Process validation and adjust of start point if needed
+   *
+   * @param {int} rowIndex
+   * @param {int} cellIndex
+   * @param {object} cell
+   * @param {bool} isSelectedCell
+   */
+
+
+  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {
+    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {
+      _startPoint.colPos++;
+    }
+  }
+  /**
+   * Create virtual table of cells with all cells, including span cells.
+   */
+
+
+  function createVirtualTable() {
+    var rows = domTable.rows;
+
+    for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
+      var cells = rows[rowIndex].cells;
+
+      for (var cellIndex = 0; cellIndex < cells.length; cellIndex++) {
+        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);
+      }
+    }
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getDeleteResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (!cell.isVirtual && cell.isRowSpan) {
+          return TableResultAction.resultAction.AddCell;
+        } else if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.RemoveCell;
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getAddResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isRowSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isColSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.AddCell;
+  }
+
+  function init() {
+    setStartPoint();
+    createVirtualTable();
+  } /// ///////////////////////////////////////////
+  // Public functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Recover array os what to do in table.
+   */
+
+
+  this.getActionList = function () {
+    var fixedRow = where === TableResultAction.where.Row ? _startPoint.rowPos : -1;
+    var fixedCol = where === TableResultAction.where.Column ? _startPoint.colPos : -1;
+    var actualPosition = 0;
+    var canContinue = true;
+
+    while (canContinue) {
+      var rowPosition = fixedRow >= 0 ? fixedRow : actualPosition;
+      var colPosition = fixedCol >= 0 ? fixedCol : actualPosition;
+      var row = _virtualTable[rowPosition];
+
+      if (!row) {
+        canContinue = false;
+        return _actionCellList;
+      }
+
+      var cell = row[colPosition];
+
+      if (!cell) {
+        canContinue = false;
+        return _actionCellList;
+      } // Define action to be applied in this cell
+
+
+      var resultAction = TableResultAction.resultAction.Ignore;
+
+      switch (action) {
+        case TableResultAction.requestAction.Add:
+          resultAction = getAddResultActionToCell(cell);
+          break;
+
+        case TableResultAction.requestAction.Delete:
+          resultAction = getDeleteResultActionToCell(cell);
+          break;
+      }
+
+      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));
+
+      actualPosition++;
+    }
+
+    return _actionCellList;
+  };
+
+  init();
+};
+/**
+*
+* Where action occours enum.
+*/
+
+
+TableResultAction.where = {
+  'Row': 0,
+  'Column': 1
+};
+/**
+*
+* Requested action to apply enum.
+*/
+
+TableResultAction.requestAction = {
+  'Add': 0,
+  'Delete': 1
+};
+/**
+*
+* Result action to be executed enum.
+*/
+
+TableResultAction.resultAction = {
+  'Ignore': 0,
+  'SubtractSpanCount': 1,
+  'RemoveCell': 2,
+  'AddCell': 3,
+  'SumSpanCount': 4
+};
+/**
+ *
+ * @class editing.Table
+ *
+ * Table
+ *
+ */
+
+var Table = /*#__PURE__*/function () {
+  function Table() {
+    Table_classCallCheck(this, Table);
+  }
+
+  Table_createClass(Table, [{
+    key: "tab",
+    value:
+    /**
+     * handle tab key
+     *
+     * @param {WrappedRange} rng
+     * @param {Boolean} isShift
+     */
+    function tab(rng, isShift) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var table = dom.ancestor(cell, dom.isTable);
+      var cells = dom.listDescendant(table, dom.isCell);
+      var nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);
+
+      if (nextCell) {
+        range.create(nextCell, 0).select();
+      }
+    }
+    /**
+     * Add a new row
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (top/bottom)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addRow",
+    value: function addRow(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var currentTr = external_jQuery_default()(cell).closest('tr');
+      var trAttributes = this.recoverAttributes(currentTr);
+      var html = external_jQuery_default()('<tr' + trAttributes + '></tr>');
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Add, external_jQuery_default()(currentTr).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var idCell = 0; idCell < actions.length; idCell++) {
+        var currentCell = actions[idCell];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            {
+              if (position === 'top') {
+                var baseCellTr = currentCell.baseCell.parent;
+                var isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;
+
+                if (isTopFromRowSpan) {
+                  var newTd = external_jQuery_default()('<div></div>').append(external_jQuery_default()('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();
+                  html.append(newTd);
+                  break;
+                }
+              }
+
+              var rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);
+              rowspanNumber++;
+              currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);
+            }
+            break;
+        }
+      }
+
+      if (position === 'top') {
+        currentTr.before(html);
+      } else {
+        var cellHasRowspan = cell.rowSpan > 1;
+
+        if (cellHasRowspan) {
+          var lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);
+          external_jQuery_default()(external_jQuery_default()(currentTr).parent().find('tr')[lastTrIndex]).after(external_jQuery_default()(html));
+          return;
+        }
+
+        currentTr.after(html);
+      }
+    }
+    /**
+     * Add a new col
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (left/right)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addCol",
+    value: function addCol(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var rowsGroup = external_jQuery_default()(row).siblings();
+      rowsGroup.push(row);
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Add, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        var currentCell = actions[actionIndex];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            if (position === 'right') {
+              external_jQuery_default()(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            if (position === 'right') {
+              var colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);
+              colspanNumber++;
+              currentCell.baseCell.setAttribute('colSpan', colspanNumber);
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+        }
+      }
+    }
+    /*
+    * Copy attributes from element.
+    *
+    * @param {object} Element to recover attributes.
+    * @return {string} Copied string elements.
+    */
+
+  }, {
+    key: "recoverAttributes",
+    value: function recoverAttributes(el) {
+      var resultStr = '';
+
+      if (!el) {
+        return resultStr;
+      }
+
+      var attrList = el.attributes || [];
+
+      for (var i = 0; i < attrList.length; i++) {
+        if (attrList[i].name.toLowerCase() === 'id') {
+          continue;
+        }
+
+        if (attrList[i].specified) {
+          resultStr += ' ' + attrList[i].name + '=\'' + attrList[i].value + '\'';
+        }
+      }
+
+      return resultStr;
+    }
+    /**
+     * Delete current row
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteRow",
+    value: function deleteRow(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var rowPos = row[0].rowIndex;
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        var baseCell = actions[actionIndex].baseCell;
+        var virtualPosition = actions[actionIndex].virtualTable;
+        var hasRowspan = baseCell.rowSpan && baseCell.rowSpan > 1;
+        var rowspanNumber = hasRowspan ? parseInt(baseCell.rowSpan, 10) : 0;
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.AddCell:
+            {
+              var nextRow = row.next('tr')[0];
+
+              if (!nextRow) {
+                continue;
+              }
+
+              var cloneRow = row[0].cells[cellPos];
+
+              if (hasRowspan) {
+                if (rowspanNumber > 2) {
+                  rowspanNumber--;
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);
+                  nextRow.cells[cellPos].innerHTML = '';
+                } else if (rowspanNumber === 2) {
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].removeAttribute('rowSpan');
+                  nextRow.cells[cellPos].innerHTML = '';
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            if (hasRowspan) {
+              if (rowspanNumber > 2) {
+                rowspanNumber--;
+                baseCell.setAttribute('rowSpan', rowspanNumber);
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              } else if (rowspanNumber === 2) {
+                baseCell.removeAttribute('rowSpan');
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              }
+            }
+
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            // Do not need remove cell because row will be deleted.
+            continue;
+        }
+      }
+
+      row.remove();
+    }
+    /**
+     * Delete current col
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteCol",
+    value: function deleteCol(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            {
+              var baseCell = actions[actionIndex].baseCell;
+              var hasColspan = baseCell.colSpan && baseCell.colSpan > 1;
+
+              if (hasColspan) {
+                var colspanNumber = baseCell.colSpan ? parseInt(baseCell.colSpan, 10) : 0;
+
+                if (colspanNumber > 2) {
+                  colspanNumber--;
+                  baseCell.setAttribute('colSpan', colspanNumber);
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                } else if (colspanNumber === 2) {
+                  baseCell.removeAttribute('colSpan');
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            dom.remove(actions[actionIndex].baseCell, true);
+            continue;
+        }
+      }
+    }
+    /**
+     * create empty table element
+     *
+     * @param {Number} rowCount
+     * @param {Number} colCount
+     * @return {Node}
+     */
+
+  }, {
+    key: "createTable",
+    value: function createTable(colCount, rowCount, options) {
+      var tds = [];
+      var tdHTML;
+
+      for (var idxCol = 0; idxCol < colCount; idxCol++) {
+        tds.push('<td>' + dom.blank + '</td>');
+      }
+
+      tdHTML = tds.join('');
+      var trs = [];
+      var trHTML;
+
+      for (var idxRow = 0; idxRow < rowCount; idxRow++) {
+        trs.push('<tr>' + tdHTML + '</tr>');
+      }
+
+      trHTML = trs.join('');
+      var $table = external_jQuery_default()('<table>' + trHTML + '</table>');
+
+      if (options && options.tableClassName) {
+        $table.addClass(options.tableClassName);
+      }
+
+      return $table[0];
+    }
+    /**
+     * Delete current table
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteTable",
+    value: function deleteTable(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      external_jQuery_default()(cell).closest('table').remove();
+    }
+  }]);
+
+  return Table;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Editor.js
+function Editor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Editor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Editor_createClass(Constructor, protoProps, staticProps) { if (protoProps) Editor_defineProperties(Constructor.prototype, protoProps); if (staticProps) Editor_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var KEY_BOGUS = 'bogus';
+/**
+ * @class Editor
+ */
+
+var Editor = /*#__PURE__*/function () {
+  function Editor(context) {
+    var _this = this;
+
+    Editor_classCallCheck(this, Editor);
+
+    this.context = context;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.editable = this.$editable[0];
+    this.lastRange = null;
+    this.snapshot = null;
+    this.style = new Style();
+    this.table = new Table();
+    this.typing = new Typing(context);
+    this.bullet = new Bullet();
+    this.history = new History(context);
+    this.context.memo('help.escape', this.lang.help.escape);
+    this.context.memo('help.undo', this.lang.help.undo);
+    this.context.memo('help.redo', this.lang.help.redo);
+    this.context.memo('help.tab', this.lang.help.tab);
+    this.context.memo('help.untab', this.lang.help.untab);
+    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);
+    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);
+    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);
+    this.context.memo('help.indent', this.lang.help.indent);
+    this.context.memo('help.outdent', this.lang.help.outdent);
+    this.context.memo('help.formatPara', this.lang.help.formatPara);
+    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);
+    this.context.memo('help.fontName', this.lang.help.fontName); // native commands(with execCommand), generate function for execCommand
+
+    var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'formatBlock', 'removeFormat', 'backColor'];
+
+    for (var idx = 0, len = commands.length; idx < len; idx++) {
+      this[commands[idx]] = function (sCmd) {
+        return function (value) {
+          _this.beforeCommand();
+
+          document.execCommand(sCmd, false, value);
+
+          _this.afterCommand(true);
+        };
+      }(commands[idx]);
+
+      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);
+    }
+
+    this.fontName = this.wrapCommand(function (value) {
+      return _this.fontStyling('font-family', env.validFontName(value));
+    });
+    this.fontSize = this.wrapCommand(function (value) {
+      var unit = _this.currentStyle()['font-size-unit'];
+
+      return _this.fontStyling('font-size', value + unit);
+    });
+    this.fontSizeUnit = this.wrapCommand(function (value) {
+      var size = _this.currentStyle()['font-size'];
+
+      return _this.fontStyling('font-size', size + value);
+    });
+
+    for (var _idx = 1; _idx <= 6; _idx++) {
+      this['formatH' + _idx] = function (idx) {
+        return function () {
+          _this.formatBlock('H' + idx);
+        };
+      }(_idx);
+
+      this.context.memo('help.formatH' + _idx, this.lang.help['formatH' + _idx]);
+    }
+
+    this.insertParagraph = this.wrapCommand(function () {
+      _this.typing.insertParagraph(_this.editable);
+    });
+    this.insertOrderedList = this.wrapCommand(function () {
+      _this.bullet.insertOrderedList(_this.editable);
+    });
+    this.insertUnorderedList = this.wrapCommand(function () {
+      _this.bullet.insertUnorderedList(_this.editable);
+    });
+    this.indent = this.wrapCommand(function () {
+      _this.bullet.indent(_this.editable);
+    });
+    this.outdent = this.wrapCommand(function () {
+      _this.bullet.outdent(_this.editable);
+    });
+    /**
+     * insertNode
+     * insert node
+     * @param {Node} node
+     */
+
+    this.insertNode = this.wrapCommand(function (node) {
+      if (_this.isLimited(external_jQuery_default()(node).text().length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      rng.insertNode(node);
+
+      _this.setLastRange(range.createFromNodeAfter(node).select());
+    });
+    /**
+     * insert text
+     * @param {String} text
+     */
+
+    this.insertText = this.wrapCommand(function (text) {
+      if (_this.isLimited(text.length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      var textNode = rng.insertNode(dom.createText(text));
+
+      _this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());
+    });
+    /**
+     * paste HTML
+     * @param {String} markup
+     */
+
+    this.pasteHTML = this.wrapCommand(function (markup) {
+      if (_this.isLimited(markup.length)) {
+        return;
+      }
+
+      markup = _this.context.invoke('codeview.purify', markup);
+
+      var contents = _this.getLastRange().pasteHTML(markup);
+
+      _this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());
+    });
+    /**
+     * formatBlock
+     *
+     * @param {String} tagName
+     */
+
+    this.formatBlock = this.wrapCommand(function (tagName, $target) {
+      var onApplyCustomStyle = _this.options.callbacks.onApplyCustomStyle;
+
+      if (onApplyCustomStyle) {
+        onApplyCustomStyle.call(_this, $target, _this.context, _this.onFormatBlock);
+      } else {
+        _this.onFormatBlock(tagName, $target);
+      }
+    });
+    /**
+     * insert horizontal rule
+     */
+
+    this.insertHorizontalRule = this.wrapCommand(function () {
+      var hrNode = _this.getLastRange().insertNode(dom.create('HR'));
+
+      if (hrNode.nextSibling) {
+        _this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());
+      }
+    });
+    /**
+     * lineHeight
+     * @param {String} value
+     */
+
+    this.lineHeight = this.wrapCommand(function (value) {
+      _this.style.stylePara(_this.getLastRange(), {
+        lineHeight: value
+      });
+    });
+    /**
+     * create link (command)
+     *
+     * @param {Object} linkInfo
+     */
+
+    this.createLink = this.wrapCommand(function (linkInfo) {
+      var linkUrl = linkInfo.url;
+      var linkText = linkInfo.text;
+      var isNewWindow = linkInfo.isNewWindow;
+      var checkProtocol = linkInfo.checkProtocol;
+
+      var rng = linkInfo.range || _this.getLastRange();
+
+      var additionalTextLength = linkText.length - rng.toString().length;
+
+      if (additionalTextLength > 0 && _this.isLimited(additionalTextLength)) {
+        return;
+      }
+
+      var isTextChanged = rng.toString() !== linkText; // handle spaced urls from input
+
+      if (typeof linkUrl === 'string') {
+        linkUrl = linkUrl.trim();
+      }
+
+      if (_this.options.onCreateLink) {
+        linkUrl = _this.options.onCreateLink(linkUrl);
+      } else if (checkProtocol) {
+        // if url doesn't have any protocol and not even a relative or a label, use http:// as default
+        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(linkUrl) ? linkUrl : _this.options.defaultProtocol + linkUrl;
+      }
+
+      var anchors = [];
+
+      if (isTextChanged) {
+        rng = rng.deleteContents();
+        var anchor = rng.insertNode(external_jQuery_default()('<A>' + linkText + '</A>')[0]);
+        anchors.push(anchor);
+      } else {
+        anchors = _this.style.styleNodes(rng, {
+          nodeName: 'A',
+          expandClosestSibling: true,
+          onlyPartialContains: true
+        });
+      }
+
+      external_jQuery_default().each(anchors, function (idx, anchor) {
+        external_jQuery_default()(anchor).attr('href', linkUrl);
+
+        if (isNewWindow) {
+          external_jQuery_default()(anchor).attr('target', '_blank');
+        } else {
+          external_jQuery_default()(anchor).removeAttr('target');
+        }
+      });
+
+      _this.setLastRange(_this.createRangeFromList(anchors).select());
+    });
+    /**
+     * setting color
+     *
+     * @param {Object} sObjColor  color code
+     * @param {String} sObjColor.foreColor foreground color
+     * @param {String} sObjColor.backColor background color
+     */
+
+    this.color = this.wrapCommand(function (colorInfo) {
+      var foreColor = colorInfo.foreColor;
+      var backColor = colorInfo.backColor;
+
+      if (foreColor) {
+        document.execCommand('foreColor', false, foreColor);
+      }
+
+      if (backColor) {
+        document.execCommand('backColor', false, backColor);
+      }
+    });
+    /**
+     * Set foreground color
+     *
+     * @param {String} colorCode foreground color code
+     */
+
+    this.foreColor = this.wrapCommand(function (colorInfo) {
+      document.execCommand('foreColor', false, colorInfo);
+    });
+    /**
+     * insert Table
+     *
+     * @param {String} dimension of table (ex : "5x5")
+     */
+
+    this.insertTable = this.wrapCommand(function (dim) {
+      var dimension = dim.split('x');
+
+      var rng = _this.getLastRange().deleteContents();
+
+      rng.insertNode(_this.table.createTable(dimension[0], dimension[1], _this.options));
+    });
+    /**
+     * remove media object and Figure Elements if media object is img with Figure.
+     */
+
+    this.removeMedia = this.wrapCommand(function () {
+      var $target = external_jQuery_default()(_this.restoreTarget()).parent();
+
+      if ($target.closest('figure').length) {
+        $target.closest('figure').remove();
+      } else {
+        $target = external_jQuery_default()(_this.restoreTarget()).detach();
+      }
+
+      _this.context.triggerEvent('media.delete', $target, _this.$editable);
+    });
+    /**
+     * float me
+     *
+     * @param {String} value
+     */
+
+    this.floatMe = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      $target.toggleClass('note-float-left', value === 'left');
+      $target.toggleClass('note-float-right', value === 'right');
+      $target.css('float', value === 'none' ? '' : value);
+    });
+    /**
+     * resize overlay element
+     * @param {String} value
+     */
+
+    this.resize = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      value = parseFloat(value);
+
+      if (value === 0) {
+        $target.css('width', '');
+      } else {
+        $target.css({
+          width: value * 100 + '%',
+          height: ''
+        });
+      }
+    });
+  }
+
+  Editor_createClass(Editor, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      // bind custom events
+      this.$editable.on('keydown', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          _this2.context.triggerEvent('enter', event);
+        }
+
+        _this2.context.triggerEvent('keydown', event); // keep a snapshot to limit text on input event
+
+
+        _this2.snapshot = _this2.history.makeSnapshot();
+        _this2.hasKeyShortCut = false;
+
+        if (!event.isDefaultPrevented()) {
+          if (_this2.options.shortcuts) {
+            _this2.hasKeyShortCut = _this2.handleKeyMap(event);
+          } else {
+            _this2.preventDefaultEditableShortCuts(event);
+          }
+        }
+
+        if (_this2.isLimited(1, event)) {
+          var lastRange = _this2.getLastRange();
+
+          if (lastRange.eo - lastRange.so === 0) {
+            return false;
+          }
+        }
+
+        _this2.setLastRange(); // record undo in the key event except keyMap.
+
+
+        if (_this2.options.recordEveryKeystroke) {
+          if (_this2.hasKeyShortCut === false) {
+            _this2.history.recordUndo();
+          }
+        }
+      }).on('keyup', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('keyup', event);
+      }).on('focus', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('focus', event);
+      }).on('blur', function (event) {
+        _this2.context.triggerEvent('blur', event);
+      }).on('mousedown', function (event) {
+        _this2.context.triggerEvent('mousedown', event);
+      }).on('mouseup', function (event) {
+        _this2.setLastRange();
+
+        _this2.history.recordUndo();
+
+        _this2.context.triggerEvent('mouseup', event);
+      }).on('scroll', function (event) {
+        _this2.context.triggerEvent('scroll', event);
+      }).on('paste', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('paste', event);
+      }).on('input', function () {
+        // To limit composition characters (e.g. Korean)
+        if (_this2.isLimited(0) && _this2.snapshot) {
+          _this2.history.applySnapshot(_this2.snapshot);
+        }
+      });
+      this.$editable.attr('spellcheck', this.options.spellCheck);
+      this.$editable.attr('autocorrect', this.options.spellCheck);
+
+      if (this.options.disableGrammar) {
+        this.$editable.attr('data-gramm', false);
+      } // init content before set event
+
+
+      this.$editable.html(dom.html(this.$note) || dom.emptyPara);
+      this.$editable.on(env.inputEventName, func.debounce(function () {
+        _this2.context.triggerEvent('change', _this2.$editable.html(), _this2.$editable);
+      }, 10));
+      this.$editable.on('focusin', function (event) {
+        _this2.context.triggerEvent('focusin', event);
+      }).on('focusout', function (event) {
+        _this2.context.triggerEvent('focusout', event);
+      });
+
+      if (this.options.airMode) {
+        if (this.options.overrideContextMenu) {
+          this.$editor.on('contextmenu', function (event) {
+            _this2.context.triggerEvent('contextmenu', event);
+
+            return false;
+          });
+        }
+      } else {
+        if (this.options.width) {
+          this.$editor.outerWidth(this.options.width);
+        }
+
+        if (this.options.height) {
+          this.$editable.outerHeight(this.options.height);
+        }
+
+        if (this.options.maxHeight) {
+          this.$editable.css('max-height', this.options.maxHeight);
+        }
+
+        if (this.options.minHeight) {
+          this.$editable.css('min-height', this.options.minHeight);
+        }
+      }
+
+      this.history.recordUndo();
+      this.setLastRange();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$editable.off();
+    }
+  }, {
+    key: "handleKeyMap",
+    value: function handleKeyMap(event) {
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      var keys = [];
+
+      if (event.metaKey) {
+        keys.push('CMD');
+      }
+
+      if (event.ctrlKey && !event.altKey) {
+        keys.push('CTRL');
+      }
+
+      if (event.shiftKey) {
+        keys.push('SHIFT');
+      }
+
+      var keyName = key.nameFromCode[event.keyCode];
+
+      if (keyName) {
+        keys.push(keyName);
+      }
+
+      var eventName = keyMap[keys.join('+')];
+
+      if (keyName === 'TAB' && !this.options.tabDisable) {
+        this.afterCommand();
+      } else if (eventName) {
+        if (this.context.invoke(eventName) !== false) {
+          event.preventDefault(); // if keyMap action was invoked
+
+          return true;
+        }
+      } else if (key.isEdit(event.keyCode)) {
+        this.afterCommand();
+      }
+
+      return false;
+    }
+  }, {
+    key: "preventDefaultEditableShortCuts",
+    value: function preventDefaultEditableShortCuts(event) {
+      // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)
+      if ((event.ctrlKey || event.metaKey) && lists.contains([66, 73, 85], event.keyCode)) {
+        event.preventDefault();
+      }
+    }
+  }, {
+    key: "isLimited",
+    value: function isLimited(pad, event) {
+      pad = pad || 0;
+
+      if (typeof event !== 'undefined') {
+        if (key.isMove(event.keyCode) || key.isNavigation(event.keyCode) || event.ctrlKey || event.metaKey || lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {
+          return false;
+        }
+      }
+
+      if (this.options.maxTextLength > 0) {
+        if (this.$editable.text().length + pad > this.options.maxTextLength) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+    /**
+     * create range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRange",
+    value: function createRange() {
+      this.focus();
+      this.setLastRange();
+      return this.getLastRange();
+    }
+    /**
+     * create a new range from the list of elements
+     *
+     * @param {list} dom element list
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRangeFromList",
+    value: function createRangeFromList(lst) {
+      var startRange = range.createFromNodeBefore(lists.head(lst));
+      var startPoint = startRange.getStartPoint();
+      var endRange = range.createFromNodeAfter(lists.last(lst));
+      var endPoint = endRange.getEndPoint();
+      return range.create(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * set the last range
+     *
+     * if given rng is exist, set rng as the last range
+     * or create a new range at the end of the document
+     *
+     * @param {WrappedRange} rng
+     */
+
+  }, {
+    key: "setLastRange",
+    value: function setLastRange(rng) {
+      if (rng) {
+        this.lastRange = rng;
+      } else {
+        this.lastRange = range.create(this.editable);
+
+        if (external_jQuery_default()(this.lastRange.sc).closest('.note-editable').length === 0) {
+          this.lastRange = range.createFromBodyElement(this.editable);
+        }
+      }
+    }
+    /**
+     * get the last range
+     *
+     * if there is a saved last range, return it
+     * or create a new range and return it
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getLastRange",
+    value: function getLastRange() {
+      if (!this.lastRange) {
+        this.setLastRange();
+      }
+
+      return this.lastRange;
+    }
+    /**
+     * saveRange
+     *
+     * save current range
+     *
+     * @param {Boolean} [thenCollapse=false]
+     */
+
+  }, {
+    key: "saveRange",
+    value: function saveRange(thenCollapse) {
+      if (thenCollapse) {
+        this.getLastRange().collapse().select();
+      }
+    }
+    /**
+     * restoreRange
+     *
+     * restore lately range
+     */
+
+  }, {
+    key: "restoreRange",
+    value: function restoreRange() {
+      if (this.lastRange) {
+        this.lastRange.select();
+        this.focus();
+      }
+    }
+  }, {
+    key: "saveTarget",
+    value: function saveTarget(node) {
+      this.$editable.data('target', node);
+    }
+  }, {
+    key: "clearTarget",
+    value: function clearTarget() {
+      this.$editable.removeData('target');
+    }
+  }, {
+    key: "restoreTarget",
+    value: function restoreTarget() {
+      return this.$editable.data('target');
+    }
+    /**
+     * currentStyle
+     *
+     * current style
+     * @return {Object|Boolean} unfocus
+     */
+
+  }, {
+    key: "currentStyle",
+    value: function currentStyle() {
+      var rng = range.create();
+
+      if (rng) {
+        rng = rng.normalize();
+      }
+
+      return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);
+    }
+    /**
+     * style from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "styleFromNode",
+    value: function styleFromNode($node) {
+      return this.style.fromNode($node);
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.undo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /*
+    * commit
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.commit();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.redo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * before command
+     */
+
+  }, {
+    key: "beforeCommand",
+    value: function beforeCommand() {
+      this.context.triggerEvent('before.command', this.$editable.html()); // Set styleWithCSS before run a command
+
+      document.execCommand('styleWithCSS', false, this.options.styleWithCSS); // keep focus on editable before command execution
+
+      this.focus();
+    }
+    /**
+     * after command
+     * @param {Boolean} isPreventTrigger
+     */
+
+  }, {
+    key: "afterCommand",
+    value: function afterCommand(isPreventTrigger) {
+      this.normalizeContent();
+      this.history.recordUndo();
+
+      if (!isPreventTrigger) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+    /**
+     * handle tab key
+     */
+
+  }, {
+    key: "tab",
+    value: function tab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+
+        if (!this.isLimited(this.options.tabSize)) {
+          this.beforeCommand();
+          this.typing.insertTab(rng, this.options.tabSize);
+          this.afterCommand();
+        }
+      }
+    }
+    /**
+     * handle shift+tab key
+     */
+
+  }, {
+    key: "untab",
+    value: function untab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng, true);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+      }
+    }
+    /**
+     * run given function between beforeCommand and afterCommand
+     */
+
+  }, {
+    key: "wrapCommand",
+    value: function wrapCommand(fn) {
+      return function () {
+        this.beforeCommand();
+        fn.apply(this, arguments);
+        this.afterCommand();
+      };
+    }
+    /**
+     * insert image
+     *
+     * @param {String} src
+     * @param {String|Function} param
+     * @return {Promise}
+     */
+
+  }, {
+    key: "insertImage",
+    value: function insertImage(src, param) {
+      var _this3 = this;
+
+      return createImage(src, param).then(function ($image) {
+        _this3.beforeCommand();
+
+        if (typeof param === 'function') {
+          param($image);
+        } else {
+          if (typeof param === 'string') {
+            $image.attr('data-filename', param);
+          }
+
+          $image.css('width', Math.min(_this3.$editable.width(), $image.width()));
+        }
+
+        $image.show();
+
+        _this3.getLastRange().insertNode($image[0]);
+
+        _this3.setLastRange(range.createFromNodeAfter($image[0]).select());
+
+        _this3.afterCommand();
+      }).fail(function (e) {
+        _this3.context.triggerEvent('image.upload.error', e);
+      });
+    }
+    /**
+     * insertImages
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesAsDataURL",
+    value: function insertImagesAsDataURL(files) {
+      var _this4 = this;
+
+      external_jQuery_default().each(files, function (idx, file) {
+        var filename = file.name;
+
+        if (_this4.options.maximumImageFileSize && _this4.options.maximumImageFileSize < file.size) {
+          _this4.context.triggerEvent('image.upload.error', _this4.lang.image.maximumFileSizeError);
+        } else {
+          readFileAsDataURL(file).then(function (dataURL) {
+            return _this4.insertImage(dataURL, filename);
+          }).fail(function () {
+            _this4.context.triggerEvent('image.upload.error');
+          });
+        }
+      });
+    }
+    /**
+     * insertImagesOrCallback
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesOrCallback",
+    value: function insertImagesOrCallback(files) {
+      var callbacks = this.options.callbacks; // If onImageUpload set,
+
+      if (callbacks.onImageUpload) {
+        this.context.triggerEvent('image.upload', files); // else insert Image as dataURL
+      } else {
+        this.insertImagesAsDataURL(files);
+      }
+    }
+    /**
+     * return selected plain text
+     * @return {String} text
+     */
+
+  }, {
+    key: "getSelectedText",
+    value: function getSelectedText() {
+      var rng = this.getLastRange(); // if range on anchor, expand range with anchor
+
+      if (rng.isOnAnchor()) {
+        rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));
+      }
+
+      return rng.toString();
+    }
+  }, {
+    key: "onFormatBlock",
+    value: function onFormatBlock(tagName, $target) {
+      // [workaround] for MSIE, IE need `<`
+      document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName); // support custom class
+
+      if ($target && $target.length) {
+        // find the exact element has given tagName
+        if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {
+          $target = $target.find(tagName);
+        }
+
+        if ($target && $target.length) {
+          var currentRange = this.createRange();
+          var $parent = external_jQuery_default()([currentRange.sc, currentRange.ec]).closest(tagName); // remove class added for current block
+
+          $parent.removeClass();
+          var className = $target[0].className || '';
+
+          if (className) {
+            $parent.addClass(className);
+          }
+        }
+      }
+    }
+  }, {
+    key: "formatPara",
+    value: function formatPara() {
+      this.formatBlock('P');
+    }
+  }, {
+    key: "fontStyling",
+    value: function fontStyling(target, value) {
+      var rng = this.getLastRange();
+
+      if (rng !== '') {
+        var spans = this.style.styleNodes(rng);
+        this.$editor.find('.note-status-output').html('');
+        external_jQuery_default()(spans).css(target, value); // [workaround] added styled bogus span for style
+        //  - also bogus character needed for cursor position
+
+        if (rng.isCollapsed()) {
+          var firstSpan = lists.head(spans);
+
+          if (firstSpan && !dom.nodeLength(firstSpan)) {
+            firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;
+            range.createFromNode(firstSpan.firstChild).select();
+            this.setLastRange();
+            this.$editable.data(KEY_BOGUS, firstSpan);
+          }
+        } else {
+          this.setLastRange(this.createRangeFromList(spans).select());
+        }
+      } else {
+        var noteStatusOutput = external_jQuery_default().now();
+        this.$editor.find('.note-status-output').html('<div id="note-status-output-' + noteStatusOutput + '" class="alert alert-info">' + this.lang.output.noSelection + '</div>');
+        setTimeout(function () {
+          external_jQuery_default()('#note-status-output-' + noteStatusOutput).remove();
+        }, 5000);
+      }
+    }
+    /**
+     * unlink
+     *
+     * @type command
+     */
+
+  }, {
+    key: "unlink",
+    value: function unlink() {
+      var rng = this.getLastRange();
+
+      if (rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        rng = range.createFromNode(anchor);
+        rng.select();
+        this.setLastRange();
+        this.beforeCommand();
+        document.execCommand('unlink');
+        this.afterCommand();
+      }
+    }
+    /**
+     * returns link info
+     *
+     * @return {Object}
+     * @return {WrappedRange} return.range
+     * @return {String} return.text
+     * @return {Boolean} [return.isNewWindow=true]
+     * @return {String} [return.url=""]
+     */
+
+  }, {
+    key: "getLinkInfo",
+    value: function getLinkInfo() {
+      var rng = this.getLastRange().expand(dom.isAnchor); // Get the first anchor on range(for edit).
+
+      var $anchor = external_jQuery_default()(lists.head(rng.nodes(dom.isAnchor)));
+      var linkInfo = {
+        range: rng,
+        text: rng.toString(),
+        url: $anchor.length ? $anchor.attr('href') : ''
+      }; // When anchor exists,
+
+      if ($anchor.length) {
+        // Set isNewWindow by checking its target.
+        linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
+      }
+
+      return linkInfo;
+    }
+  }, {
+    key: "addRow",
+    value: function addRow(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addRow(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "addCol",
+    value: function addCol(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addCol(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteRow",
+    value: function deleteRow() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteRow(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteCol",
+    value: function deleteCol() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteCol(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteTable",
+    value: function deleteTable() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteTable(rng);
+        this.afterCommand();
+      }
+    }
+    /**
+     * @param {Position} pos
+     * @param {jQuery} $target - target element
+     * @param {Boolean} [bKeepRatio] - keep ratio
+     */
+
+  }, {
+    key: "resizeTo",
+    value: function resizeTo(pos, $target, bKeepRatio) {
+      var imageSize;
+
+      if (bKeepRatio) {
+        var newRatio = pos.y / pos.x;
+        var ratio = $target.data('ratio');
+        imageSize = {
+          width: ratio > newRatio ? pos.x : pos.y / ratio,
+          height: ratio > newRatio ? pos.x * ratio : pos.y
+        };
+      } else {
+        imageSize = {
+          width: pos.x,
+          height: pos.y
+        };
+      }
+
+      $target.css(imageSize);
+    }
+    /**
+     * returns whether editable area has focus or not.
+     */
+
+  }, {
+    key: "hasFocus",
+    value: function hasFocus() {
+      return this.$editable.is(':focus');
+    }
+    /**
+     * set focus
+     */
+
+  }, {
+    key: "focus",
+    value: function focus() {
+      // [workaround] Screen will move when page is scolled in IE.
+      //  - do focus when not focused
+      if (!this.hasFocus()) {
+        this.$editable.focus();
+      }
+    }
+    /**
+     * returns whether contents is empty or not.
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isEmpty",
+    value: function isEmpty() {
+      return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();
+    }
+    /**
+     * Removes all contents and restores the editable instance to an _emptyPara_.
+     */
+
+  }, {
+    key: "empty",
+    value: function empty() {
+      this.context.invoke('code', dom.emptyPara);
+    }
+    /**
+     * normalize content
+     */
+
+  }, {
+    key: "normalizeContent",
+    value: function normalizeContent() {
+      this.$editable[0].normalize();
+    }
+  }]);
+
+  return Editor;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Clipboard.js
+function Clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Clipboard_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Clipboard_createClass(Constructor, protoProps, staticProps) { if (protoProps) Clipboard_defineProperties(Constructor.prototype, protoProps); if (staticProps) Clipboard_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Clipboard = /*#__PURE__*/function () {
+  function Clipboard(context) {
+    Clipboard_classCallCheck(this, Clipboard);
+
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+  }
+
+  Clipboard_createClass(Clipboard, [{
+    key: "initialize",
+    value: function initialize() {
+      this.$editable.on('paste', this.pasteByEvent.bind(this));
+    }
+    /**
+     * paste by clipboard event
+     *
+     * @param {Event} event
+     */
+
+  }, {
+    key: "pasteByEvent",
+    value: function pasteByEvent(event) {
+      var _this = this;
+
+      var clipboardData = event.originalEvent.clipboardData;
+
+      if (clipboardData && clipboardData.items && clipboardData.items.length) {
+        var item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);
+
+        if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
+          // paste img file
+          this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);
+          event.preventDefault();
+        } else if (item.kind === 'string') {
+          // paste text with maxTextLength check
+          if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {
+            event.preventDefault();
+          }
+        }
+      } else if (window.clipboardData) {
+        // for IE
+        var text = window.clipboardData.getData('text');
+
+        if (this.context.invoke('editor.isLimited', text.length)) {
+          event.preventDefault();
+        }
+      } // Call editor.afterCommand after proceeding default event handler
+
+
+      setTimeout(function () {
+        _this.context.invoke('editor.afterCommand');
+      }, 10);
+    }
+  }]);
+
+  return Clipboard;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Dropzone.js
+function Dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) Dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) Dropzone_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Dropzone = /*#__PURE__*/function () {
+  function Dropzone(context) {
+    Dropzone_classCallCheck(this, Dropzone);
+
+    this.context = context;
+    this.$eventListener = external_jQuery_default()(document);
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.documentEventHandlers = {};
+    this.$dropzone = external_jQuery_default()(['<div class="note-dropzone">', '<div class="note-dropzone-message"></div>', '</div>'].join('')).prependTo(this.$editor);
+  }
+  /**
+   * attach Drag and Drop Events
+   */
+
+
+  Dropzone_createClass(Dropzone, [{
+    key: "initialize",
+    value: function initialize() {
+      if (this.options.disableDragAndDrop) {
+        // prevent default drop event
+        this.documentEventHandlers.onDrop = function (e) {
+          e.preventDefault();
+        }; // do not consider outside of dropzone
+
+
+        this.$eventListener = this.$dropzone;
+        this.$eventListener.on('drop', this.documentEventHandlers.onDrop);
+      } else {
+        this.attachDragAndDropEvent();
+      }
+    }
+    /**
+     * attach Drag and Drop Events
+     */
+
+  }, {
+    key: "attachDragAndDropEvent",
+    value: function attachDragAndDropEvent() {
+      var _this = this;
+
+      var collection = external_jQuery_default()();
+      var $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');
+
+      this.documentEventHandlers.onDragenter = function (e) {
+        var isCodeview = _this.context.invoke('codeview.isActivated');
+
+        var hasEditorSize = _this.$editor.width() > 0 && _this.$editor.height() > 0;
+
+        if (!isCodeview && !collection.length && hasEditorSize) {
+          _this.$editor.addClass('dragover');
+
+          _this.$dropzone.width(_this.$editor.width());
+
+          _this.$dropzone.height(_this.$editor.height());
+
+          $dropzoneMessage.text(_this.lang.image.dragImageHere);
+        }
+
+        collection = collection.add(e.target);
+      };
+
+      this.documentEventHandlers.onDragleave = function (e) {
+        collection = collection.not(e.target); // If nodeName is BODY, then just make it over (fix for IE)
+
+        if (!collection.length || e.target.nodeName === 'BODY') {
+          collection = external_jQuery_default()();
+
+          _this.$editor.removeClass('dragover');
+        }
+      };
+
+      this.documentEventHandlers.onDrop = function () {
+        collection = external_jQuery_default()();
+
+        _this.$editor.removeClass('dragover');
+      }; // show dropzone on dragenter when dragging a object to document
+      // -but only if the editor is visible, i.e. has a positive width and height
+
+
+      this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter).on('dragleave', this.documentEventHandlers.onDragleave).on('drop', this.documentEventHandlers.onDrop); // change dropzone's message on hover.
+
+      this.$dropzone.on('dragenter', function () {
+        _this.$dropzone.addClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dropImage);
+      }).on('dragleave', function () {
+        _this.$dropzone.removeClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dragImageHere);
+      }); // attach dropImage
+
+      this.$dropzone.on('drop', function (event) {
+        var dataTransfer = event.originalEvent.dataTransfer; // stop the browser from opening the dropped content
+
+        event.preventDefault();
+
+        if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
+          _this.$editable.focus();
+
+          _this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);
+        } else {
+          external_jQuery_default().each(dataTransfer.types, function (idx, type) {
+            // skip moz-specific types
+            if (type.toLowerCase().indexOf('_moz_') > -1) {
+              return;
+            }
+
+            var content = dataTransfer.getData(type);
+
+            if (type.toLowerCase().indexOf('text') > -1) {
+              _this.context.invoke('editor.pasteHTML', content);
+            } else {
+              external_jQuery_default()(content).each(function (idx, item) {
+                _this.context.invoke('editor.insertNode', item);
+              });
+            }
+          });
+        }
+      }).on('dragover', false); // prevent default dragover event
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      var _this2 = this;
+
+      Object.keys(this.documentEventHandlers).forEach(function (key) {
+        _this2.$eventListener.off(key.substr(2).toLowerCase(), _this2.documentEventHandlers[key]);
+      });
+      this.documentEventHandlers = {};
+    }
+  }]);
+
+  return Dropzone;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Codeview.js
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function Codeview_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Codeview_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Codeview_createClass(Constructor, protoProps, staticProps) { if (protoProps) Codeview_defineProperties(Constructor.prototype, protoProps); if (staticProps) Codeview_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+/**
+ * @class Codeview
+ */
+
+var CodeView = /*#__PURE__*/function () {
+  function CodeView(context) {
+    Codeview_classCallCheck(this, CodeView);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+    this.CodeMirrorConstructor = window.CodeMirror;
+
+    if (this.options.codemirror.CodeMirrorConstructor) {
+      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;
+    }
+  }
+
+  Codeview_createClass(CodeView, [{
+    key: "sync",
+    value: function sync(html) {
+      var isCodeview = this.isActivated();
+      var CodeMirror = this.CodeMirrorConstructor;
+
+      if (isCodeview) {
+        if (html) {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').getDoc().setValue(html);
+          } else {
+            this.$codable.val(html);
+          }
+        } else {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').save();
+          }
+        }
+      }
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.$codable.on('keyup', function (event) {
+        if (event.keyCode === key.code.ESCAPE) {
+          _this.deactivate();
+        }
+      });
+    }
+    /**
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isActivated",
+    value: function isActivated() {
+      return this.$editor.hasClass('codeview');
+    }
+    /**
+     * toggle codeview
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      if (this.isActivated()) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+
+      this.context.triggerEvent('codeview.toggled');
+    }
+    /**
+     * purify input value
+     * @param value
+     * @returns {*}
+     */
+
+  }, {
+    key: "purify",
+    value: function purify(value) {
+      if (this.options.codeviewFilter) {
+        // filter code view regex
+        value = value.replace(this.options.codeviewFilterRegex, ''); // allow specific iframe tag
+
+        if (this.options.codeviewIframeFilter) {
+          var whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);
+          value = value.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi, function (tag) {
+            // remove if src attribute is duplicated
+            if (/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(tag)) {
+              return '';
+            }
+
+            var _iterator = _createForOfIteratorHelper(whitelist),
+                _step;
+
+            try {
+              for (_iterator.s(); !(_step = _iterator.n()).done;) {
+                var src = _step.value;
+
+                // pass if src is trusted
+                if (new RegExp('src="(https?:)?\/\/' + src.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '\/(.+)"').test(tag)) {
+                  return tag;
+                }
+              }
+            } catch (err) {
+              _iterator.e(err);
+            } finally {
+              _iterator.f();
+            }
+
+            return '';
+          });
+        }
+      }
+
+      return value;
+    }
+    /**
+     * activate code view
+     */
+
+  }, {
+    key: "activate",
+    value: function activate() {
+      var _this2 = this;
+
+      var CodeMirror = this.CodeMirrorConstructor;
+      this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));
+      this.$codable.height(this.$editable.height());
+      this.context.invoke('toolbar.updateCodeview', true);
+      this.context.invoke('airPopover.updateCodeview', true);
+      this.$editor.addClass('codeview');
+      this.$codable.focus(); // activate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror); // CodeMirror TernServer
+
+        if (this.options.codemirror.tern) {
+          var server = new CodeMirror.TernServer(this.options.codemirror.tern);
+          cmEditor.ternServer = server;
+          cmEditor.on('cursorActivity', function (cm) {
+            server.updateArgHints(cm);
+          });
+        }
+
+        cmEditor.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);
+        });
+        cmEditor.on('change', function () {
+          _this2.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);
+        }); // CodeMirror hasn't Padding.
+
+        cmEditor.setSize(null, this.$editable.outerHeight());
+        this.$codable.data('cmEditor', cmEditor);
+      } else {
+        this.$codable.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', _this2.$codable.val(), event);
+        });
+        this.$codable.on('input', function () {
+          _this2.context.triggerEvent('change.codeview', _this2.$codable.val(), _this2.$codable);
+        });
+      }
+    }
+    /**
+     * deactivate code view
+     */
+
+  }, {
+    key: "deactivate",
+    value: function deactivate() {
+      var CodeMirror = this.CodeMirrorConstructor; // deactivate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = this.$codable.data('cmEditor');
+        this.$codable.val(cmEditor.getValue());
+        cmEditor.toTextArea();
+      }
+
+      var value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);
+      var isChange = this.$editable.html() !== value;
+      this.$editable.html(value);
+      this.$editable.height(this.options.height ? this.$codable.height() : 'auto');
+      this.$editor.removeClass('codeview');
+
+      if (isChange) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+
+      this.$editable.focus();
+      this.context.invoke('toolbar.updateCodeview', false);
+      this.context.invoke('airPopover.updateCodeview', false);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      if (this.isActivated()) {
+        this.deactivate();
+      }
+    }
+  }]);
+
+  return CodeView;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Statusbar.js
+function Statusbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Statusbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Statusbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Statusbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Statusbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+var EDITABLE_PADDING = 24;
+
+var Statusbar = /*#__PURE__*/function () {
+  function Statusbar(context) {
+    Statusbar_classCallCheck(this, Statusbar);
+
+    this.$document = external_jQuery_default()(document);
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+  }
+
+  Statusbar_createClass(Statusbar, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      if (this.options.airMode || this.options.disableResizeEditor) {
+        this.destroy();
+        return;
+      }
+
+      this.$statusbar.on('mousedown', function (event) {
+        event.preventDefault();
+        event.stopPropagation();
+
+        var editableTop = _this.$editable.offset().top - _this.$document.scrollTop();
+
+        var editableCodeTop = _this.$codable.offset().top - _this.$document.scrollTop();
+
+        var onMouseMove = function onMouseMove(event) {
+          var height = event.clientY - (editableTop + EDITABLE_PADDING);
+          var heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);
+          height = _this.options.minheight > 0 ? Math.max(height, _this.options.minheight) : height;
+          height = _this.options.maxHeight > 0 ? Math.min(height, _this.options.maxHeight) : height;
+          heightCode = _this.options.minheight > 0 ? Math.max(heightCode, _this.options.minheight) : heightCode;
+          heightCode = _this.options.maxHeight > 0 ? Math.min(heightCode, _this.options.maxHeight) : heightCode;
+
+          _this.$editable.height(height);
+
+          _this.$codable.height(heightCode);
+        };
+
+        _this.$document.on('mousemove', onMouseMove).one('mouseup', function () {
+          _this.$document.off('mousemove', onMouseMove);
+        });
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$statusbar.off();
+      this.$statusbar.addClass('locked');
+    }
+  }]);
+
+  return Statusbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Fullscreen.js
+function Fullscreen_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Fullscreen_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Fullscreen_createClass(Constructor, protoProps, staticProps) { if (protoProps) Fullscreen_defineProperties(Constructor.prototype, protoProps); if (staticProps) Fullscreen_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Fullscreen = /*#__PURE__*/function () {
+  function Fullscreen(context) {
+    var _this = this;
+
+    Fullscreen_classCallCheck(this, Fullscreen);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.$window = external_jQuery_default()(window);
+    this.$scrollbar = external_jQuery_default()('html, body');
+    this.scrollbarClassName = 'note-fullscreen-body';
+
+    this.onResize = function () {
+      _this.resizeTo({
+        h: _this.$window.height() - _this.$toolbar.outerHeight()
+      });
+    };
+  }
+
+  Fullscreen_createClass(Fullscreen, [{
+    key: "resizeTo",
+    value: function resizeTo(size) {
+      this.$editable.css('height', size.h);
+      this.$codable.css('height', size.h);
+
+      if (this.$codable.data('cmeditor')) {
+        this.$codable.data('cmeditor').setsize(null, size.h);
+      }
+    }
+    /**
+     * toggle fullscreen
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      this.$editor.toggleClass('fullscreen');
+      var isFullscreen = this.isFullscreen();
+      this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);
+
+      if (isFullscreen) {
+        this.$editable.data('orgHeight', this.$editable.css('height'));
+        this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));
+        this.$editable.css('maxHeight', '');
+        this.$window.on('resize', this.onResize).trigger('resize');
+      } else {
+        this.$window.off('resize', this.onResize);
+        this.resizeTo({
+          h: this.$editable.data('orgHeight')
+        });
+        this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));
+      }
+
+      this.context.invoke('toolbar.updateFullscreen', isFullscreen);
+    }
+  }, {
+    key: "isFullscreen",
+    value: function isFullscreen() {
+      return this.$editor.hasClass('fullscreen');
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$scrollbar.removeClass(this.scrollbarClassName);
+    }
+  }]);
+
+  return Fullscreen;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Handle.js
+function Handle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Handle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Handle_createClass(Constructor, protoProps, staticProps) { if (protoProps) Handle_defineProperties(Constructor.prototype, protoProps); if (staticProps) Handle_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Handle = /*#__PURE__*/function () {
+  function Handle(context) {
+    var _this = this;
+
+    Handle_classCallCheck(this, Handle);
+
+    this.context = context;
+    this.$document = external_jQuery_default()(document);
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        if (_this.update(e.target, e)) {
+          e.preventDefault();
+        }
+      },
+      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': function summernoteKeyupSummernoteScrollSummernoteChangeSummernoteDialogShown() {
+        _this.update();
+      },
+      'summernote.disable summernote.blur': function summernoteDisableSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Handle_createClass(Handle, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$handle = external_jQuery_default()(['<div class="note-handle">', '<div class="note-control-selection">', '<div class="note-control-selection-bg"></div>', '<div class="note-control-holder note-control-nw"></div>', '<div class="note-control-holder note-control-ne"></div>', '<div class="note-control-holder note-control-sw"></div>', '<div class="', this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing', ' note-control-se"></div>', this.options.disableResizeImage ? '' : '<div class="note-control-selection-info"></div>', '</div>', '</div>'].join('')).prependTo(this.$editingArea);
+      this.$handle.on('mousedown', function (event) {
+        if (dom.isControlSizing(event.target)) {
+          event.preventDefault();
+          event.stopPropagation();
+
+          var $target = _this2.$handle.find('.note-control-selection').data('target');
+
+          var posStart = $target.offset();
+
+          var scrollTop = _this2.$document.scrollTop();
+
+          var onMouseMove = function onMouseMove(event) {
+            _this2.context.invoke('editor.resizeTo', {
+              x: event.clientX - posStart.left,
+              y: event.clientY - (posStart.top - scrollTop)
+            }, $target, !event.shiftKey);
+
+            _this2.update($target[0], event);
+          };
+
+          _this2.$document.on('mousemove', onMouseMove).one('mouseup', function (e) {
+            e.preventDefault();
+
+            _this2.$document.off('mousemove', onMouseMove);
+
+            _this2.context.invoke('editor.afterCommand');
+          });
+
+          if (!$target.data('ratio')) {
+            // original ratio.
+            $target.data('ratio', $target.height() / $target.width());
+          }
+        }
+      }); // Listen for scrolling on the handle overlay.
+
+      this.$handle.on('wheel', function (e) {
+        e.preventDefault();
+
+        _this2.update();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$handle.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isImage = dom.isImg(target);
+      var $selection = this.$handle.find('.note-control-selection');
+      this.context.invoke('imagePopover.update', target, event);
+
+      if (isImage) {
+        var $image = external_jQuery_default()(target);
+        var position = $image.position();
+        var pos = {
+          left: position.left + parseInt($image.css('marginLeft'), 10),
+          top: position.top + parseInt($image.css('marginTop'), 10)
+        }; // exclude margin
+
+        var imageSize = {
+          w: $image.outerWidth(false),
+          h: $image.outerHeight(false)
+        };
+        $selection.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top,
+          width: imageSize.w,
+          height: imageSize.h
+        }).data('target', $image); // save current image element.
+
+        var origImageObj = new Image();
+        origImageObj.src = $image.attr('src');
+        var sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';
+        $selection.find('.note-control-selection-info').text(sizingText);
+        this.context.invoke('editor.saveTarget', target);
+      } else {
+        this.hide();
+      }
+
+      return isImage;
+    }
+    /**
+     * hide
+     *
+     * @param {jQuery} $handle
+     */
+
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.context.invoke('editor.clearTarget');
+      this.$handle.children().hide();
+    }
+  }]);
+
+  return Handle;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoLink.js
+function AutoLink_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoLink_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoLink_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoLink_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoLink_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var defaultScheme = 'http://';
+var linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i;
+
+var AutoLink = /*#__PURE__*/function () {
+  function AutoLink(context) {
+    var _this = this;
+
+    AutoLink_classCallCheck(this, AutoLink);
+
+    this.context = context;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoLink_createClass(AutoLink, [{
+    key: "initialize",
+    value: function initialize() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWordRange) {
+        return;
+      }
+
+      var keyword = this.lastWordRange.toString();
+      var match = keyword.match(linkPattern);
+
+      if (match && (match[1] || match[2])) {
+        var link = match[1] ? keyword : defaultScheme + keyword;
+        var urlText = this.options.showDomainOnlyForAutolink ? keyword.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i, '').split('/')[0] : keyword;
+        var node = external_jQuery_default()('<a></a>').html(urlText).attr('href', link)[0];
+
+        if (this.context.options.linkTargetBlank) {
+          external_jQuery_default()(node).attr('target', '_blank');
+        }
+
+        this.lastWordRange.insertNode(node);
+        this.lastWordRange = null;
+        this.context.invoke('editor.focus');
+      }
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWordRange = wordRange;
+      }
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoLink;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoSync.js
+function AutoSync_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoSync_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoSync_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoSync_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoSync_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+/**
+ * textarea auto sync.
+ */
+
+var AutoSync = /*#__PURE__*/function () {
+  function AutoSync(context) {
+    var _this = this;
+
+    AutoSync_classCallCheck(this, AutoSync);
+
+    this.$note = context.layoutInfo.note;
+    this.events = {
+      'summernote.change': function summernoteChange() {
+        _this.$note.val(context.invoke('code'));
+      }
+    };
+  }
+
+  AutoSync_createClass(AutoSync, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return dom.isTextarea(this.$note[0]);
+    }
+  }]);
+
+  return AutoSync;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoReplace.js
+function AutoReplace_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoReplace_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoReplace_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoReplace_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoReplace_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var AutoReplace = /*#__PURE__*/function () {
+  function AutoReplace(context) {
+    var _this = this;
+
+    AutoReplace_classCallCheck(this, AutoReplace);
+
+    this.context = context;
+    this.options = context.options.replace || {};
+    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];
+    this.previousKeydownCode = null;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoReplace_createClass(AutoReplace, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.match;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWord) {
+        return;
+      }
+
+      var self = this;
+      var keyword = this.lastWord.toString();
+      this.options.match(keyword, function (match) {
+        if (match) {
+          var node = '';
+
+          if (typeof match === 'string') {
+            node = dom.createText(match);
+          } else if (match instanceof jQuery) {
+            node = match[0];
+          } else if (match instanceof Node) {
+            node = match;
+          }
+
+          if (!node) return;
+          self.lastWord.insertNode(node);
+          self.lastWord = null;
+          self.context.invoke('editor.focus');
+        }
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      // this forces it to remember the last whole word, even if multiple termination keys are pressed
+      // before the previous key is let go.
+      if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {
+        this.previousKeydownCode = e.keyCode;
+        return;
+      }
+
+      if (lists.contains(this.keys, e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWord = wordRange;
+      }
+
+      this.previousKeydownCode = e.keyCode;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains(this.keys, e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoReplace;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Placeholder.js
+function Placeholder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Placeholder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Placeholder_createClass(Constructor, protoProps, staticProps) { if (protoProps) Placeholder_defineProperties(Constructor.prototype, protoProps); if (staticProps) Placeholder_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Placeholder = /*#__PURE__*/function () {
+  function Placeholder(context) {
+    var _this = this;
+
+    Placeholder_classCallCheck(this, Placeholder);
+
+    this.context = context;
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+
+    if (this.options.inheritPlaceholder === true) {
+      // get placeholder value from the original element
+      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;
+    }
+
+    this.events = {
+      'summernote.init summernote.change': function summernoteInitSummernoteChange() {
+        _this.update();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Placeholder_createClass(Placeholder, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.placeholder;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$placeholder = external_jQuery_default()('<div class="note-placeholder"></div>');
+      this.$placeholder.on('click', function () {
+        _this2.context.invoke('focus');
+      }).html(this.options.placeholder).prependTo(this.$editingArea);
+      this.update();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$placeholder.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      var isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');
+      this.$placeholder.toggle(isShow);
+    }
+  }]);
+
+  return Placeholder;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Buttons.js
+function Buttons_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Buttons_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Buttons_createClass(Constructor, protoProps, staticProps) { if (protoProps) Buttons_defineProperties(Constructor.prototype, protoProps); if (staticProps) Buttons_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Buttons = /*#__PURE__*/function () {
+  function Buttons(context) {
+    Buttons_classCallCheck(this, Buttons);
+
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.context = context;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.invertedKeyMap = func.invertObject(this.options.keyMap[env.isMac ? 'mac' : 'pc']);
+  }
+
+  Buttons_createClass(Buttons, [{
+    key: "representShortcut",
+    value: function representShortcut(editorMethod) {
+      var shortcut = this.invertedKeyMap[editorMethod];
+
+      if (!this.options.shortcuts || !shortcut) {
+        return '';
+      }
+
+      if (env.isMac) {
+        shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');
+      }
+
+      shortcut = shortcut.replace('BACKSLASH', '\\').replace('SLASH', '/').replace('LEFTBRACKET', '[').replace('RIGHTBRACKET', ']');
+      return ' (' + shortcut + ')';
+    }
+  }, {
+    key: "button",
+    value: function button(o) {
+      if (!this.options.tooltip && o.tooltip) {
+        delete o.tooltip;
+      }
+
+      o.container = this.options.container;
+      return this.ui.button(o);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.addToolbarButtons();
+      this.addImagePopoverButtons();
+      this.addLinkPopoverButtons();
+      this.addTablePopoverButtons();
+      this.fontInstalledMap = {};
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      delete this.fontInstalledMap;
+    }
+  }, {
+    key: "isFontInstalled",
+    value: function isFontInstalled(name) {
+      if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {
+        this.fontInstalledMap[name] = env.isFontInstalled(name) || lists.contains(this.options.fontNamesIgnoreCheck, name);
+      }
+
+      return this.fontInstalledMap[name];
+    }
+  }, {
+    key: "isFontDeservedToAdd",
+    value: function isFontDeservedToAdd(name) {
+      name = name.toLowerCase();
+      return name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1;
+    }
+  }, {
+    key: "colorPalette",
+    value: function colorPalette(className, tooltip, backColor, foreColor) {
+      var _this = this;
+
+      return this.ui.buttonGroup({
+        className: 'note-color ' + className,
+        children: [this.button({
+          className: 'note-current-color-button',
+          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),
+          tooltip: tooltip,
+          click: function click(e) {
+            var $button = external_jQuery_default()(e.currentTarget);
+
+            if (backColor && foreColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor'),
+                foreColor: $button.attr('data-foreColor')
+              });
+            } else if (backColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor')
+              });
+            } else if (foreColor) {
+              _this.context.invoke('editor.color', {
+                foreColor: $button.attr('data-foreColor')
+              });
+            }
+          },
+          callback: function callback($button) {
+            var $recentColor = $button.find('.note-recent-color');
+
+            if (backColor) {
+              $recentColor.css('background-color', _this.options.colorButton.backColor);
+              $button.attr('data-backColor', _this.options.colorButton.backColor);
+            }
+
+            if (foreColor) {
+              $recentColor.css('color', _this.options.colorButton.foreColor);
+              $button.attr('data-foreColor', _this.options.colorButton.foreColor);
+            } else {
+              $recentColor.css('color', 'transparent');
+            }
+          }
+        }), this.button({
+          className: 'dropdown-toggle',
+          contents: this.ui.dropdownButtonContents('', this.options),
+          tooltip: this.lang.color.more,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), this.ui.dropdown({
+          items: (backColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.background + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">', this.lang.color.transparent, '</button>', '</div>', '<div class="note-holder" data-event="backColor"><!-- back colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="backColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.backColor + '" data-event="backColorPalette-' + this.options.id + '">', '</div>', '<div class="note-holder-custom" id="backColorPalette-' + this.options.id + '" data-event="backColor"></div>', '</div>'].join('') : '') + (foreColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.foreground + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">', this.lang.color.resetToDefault, '</button>', '</div>', '<div class="note-holder" data-event="foreColor"><!-- fore colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="foreColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.foreColor + '" data-event="foreColorPalette-' + this.options.id + '">', '</div>', // Fix missing Div, Commented to find easily if it's wrong
+          '<div class="note-holder-custom" id="foreColorPalette-' + this.options.id + '" data-event="foreColor"></div>', '</div>'].join('') : ''),
+          callback: function callback($dropdown) {
+            $dropdown.find('.note-holder').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: _this.options.colors,
+                colorsName: _this.options.colorsName,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            /* TODO: do we have to record recent custom colors within cookies? */
+
+            var customColors = [['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF']];
+            $dropdown.find('.note-holder-custom').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: customColors,
+                colorsName: customColors,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            $dropdown.find('input[type=color]').each(function (idx, item) {
+              external_jQuery_default()(item).change(function () {
+                var $chip = $dropdown.find('#' + external_jQuery_default()(this).data('event')).find('.note-color-btn').first();
+                var color = this.value.toUpperCase();
+                $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+                $chip.click();
+              });
+            });
+          },
+          click: function click(event) {
+            event.stopPropagation();
+            var $parent = external_jQuery_default()('.' + className).find('.note-dropdown-menu');
+            var $button = external_jQuery_default()(event.target);
+            var eventName = $button.data('event');
+            var value = $button.attr('data-value');
+
+            if (eventName === 'openPalette') {
+              var $picker = $parent.find('#' + value);
+              var $palette = external_jQuery_default()($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]); // Shift palette chips
+
+              var $chip = $palette.find('.note-color-btn').last().detach(); // Set chip attributes
+
+              var color = $picker.val();
+              $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+              $palette.prepend($chip);
+              $picker.click();
+            } else {
+              if (lists.contains(['backColor', 'foreColor'], eventName)) {
+                var key = eventName === 'backColor' ? 'background-color' : 'color';
+                var $color = $button.closest('.note-color').find('.note-recent-color');
+                var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
+                $color.css(key, value);
+                $currentButton.attr('data-' + eventName, value);
+              }
+
+              _this.context.invoke('editor.' + eventName, value);
+            }
+          }
+        })]
+      }).render();
+    }
+  }, {
+    key: "addToolbarButtons",
+    value: function addToolbarButtons() {
+      var _this2 = this;
+
+      this.context.memo('button.style', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.magic), _this2.options),
+          tooltip: _this2.lang.style.style,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          className: 'dropdown-style',
+          items: _this2.options.styleTags,
+          title: _this2.lang.style.style,
+          template: function template(item) {
+            // TBD: need to be simplified
+            if (typeof item === 'string') {
+              item = {
+                tag: item,
+                title: Object.prototype.hasOwnProperty.call(_this2.lang.style, item) ? _this2.lang.style[item] : item
+              };
+            }
+
+            var tag = item.tag;
+            var title = item.title;
+            var style = item.style ? ' style="' + item.style + '" ' : '';
+            var className = item.className ? ' class="' + item.className + '"' : '';
+            return '<' + tag + style + className + '>' + title + '</' + tag + '>';
+          },
+          click: _this2.context.createInvokeHandler('editor.formatBlock')
+        })]).render();
+      });
+
+      var _loop = function _loop(styleIdx, styleLen) {
+        var item = _this2.options.styleTags[styleIdx];
+
+        _this2.context.memo('button.style.' + item, function () {
+          return _this2.button({
+            className: 'note-btn-style-' + item,
+            contents: '<div data-value="' + item + '">' + item.toUpperCase() + '</div>',
+            tooltip: _this2.lang.style[item],
+            click: _this2.context.createInvokeHandler('editor.formatBlock')
+          }).render();
+        });
+      };
+
+      for (var styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {
+        _loop(styleIdx, styleLen);
+      }
+
+      this.context.memo('button.bold', function () {
+        return _this2.button({
+          className: 'note-btn-bold',
+          contents: _this2.ui.icon(_this2.options.icons.bold),
+          tooltip: _this2.lang.font.bold + _this2.representShortcut('bold'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.bold')
+        }).render();
+      });
+      this.context.memo('button.italic', function () {
+        return _this2.button({
+          className: 'note-btn-italic',
+          contents: _this2.ui.icon(_this2.options.icons.italic),
+          tooltip: _this2.lang.font.italic + _this2.representShortcut('italic'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.italic')
+        }).render();
+      });
+      this.context.memo('button.underline', function () {
+        return _this2.button({
+          className: 'note-btn-underline',
+          contents: _this2.ui.icon(_this2.options.icons.underline),
+          tooltip: _this2.lang.font.underline + _this2.representShortcut('underline'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.underline')
+        }).render();
+      });
+      this.context.memo('button.clear', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.eraser),
+          tooltip: _this2.lang.font.clear + _this2.representShortcut('removeFormat'),
+          click: _this2.context.createInvokeHandler('editor.removeFormat')
+        }).render();
+      });
+      this.context.memo('button.strikethrough', function () {
+        return _this2.button({
+          className: 'note-btn-strikethrough',
+          contents: _this2.ui.icon(_this2.options.icons.strikethrough),
+          tooltip: _this2.lang.font.strikethrough + _this2.representShortcut('strikethrough'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.strikethrough')
+        }).render();
+      });
+      this.context.memo('button.superscript', function () {
+        return _this2.button({
+          className: 'note-btn-superscript',
+          contents: _this2.ui.icon(_this2.options.icons.superscript),
+          tooltip: _this2.lang.font.superscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.superscript')
+        }).render();
+      });
+      this.context.memo('button.subscript', function () {
+        return _this2.button({
+          className: 'note-btn-subscript',
+          contents: _this2.ui.icon(_this2.options.icons.subscript),
+          tooltip: _this2.lang.font.subscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.subscript')
+        }).render();
+      });
+      this.context.memo('button.fontname', function () {
+        var styleInfo = _this2.context.invoke('editor.currentStyle');
+
+        if (_this2.options.addDefaultFonts) {
+          // Add 'default' fonts into the fontnames array if not exist
+          external_jQuery_default().each(styleInfo['font-family'].split(','), function (idx, fontname) {
+            fontname = fontname.trim().replace(/['"]+/g, '');
+
+            if (_this2.isFontDeservedToAdd(fontname)) {
+              if (_this2.options.fontNames.indexOf(fontname) === -1) {
+                _this2.options.fontNames.push(fontname);
+              }
+            }
+          });
+        }
+
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontname"></span>', _this2.options),
+          tooltip: _this2.lang.font.name,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontname',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontNames.filter(_this2.isFontInstalled.bind(_this2)),
+          title: _this2.lang.font.name,
+          template: function template(item) {
+            return '<span style="font-family: ' + env.validFontName(item) + '">' + item + '</span>';
+          },
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontName')
+        })]).render();
+      });
+      this.context.memo('button.fontsize', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>', _this2.options),
+          tooltip: _this2.lang.font.size,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsize',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizes,
+          title: _this2.lang.font.size,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSize')
+        })]).render();
+      });
+      this.context.memo('button.fontsizeunit', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>', _this2.options),
+          tooltip: _this2.lang.font.sizeunit,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsizeunit',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizeUnits,
+          title: _this2.lang.font.sizeunit,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit')
+        })]).render();
+      });
+      this.context.memo('button.color', function () {
+        return _this2.colorPalette('note-color-all', _this2.lang.color.recent, true, true);
+      });
+      this.context.memo('button.forecolor', function () {
+        return _this2.colorPalette('note-color-fore', _this2.lang.color.foreground, false, true);
+      });
+      this.context.memo('button.backcolor', function () {
+        return _this2.colorPalette('note-color-back', _this2.lang.color.background, true, false);
+      });
+      this.context.memo('button.ul', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.unorderedlist),
+          tooltip: _this2.lang.lists.unordered + _this2.representShortcut('insertUnorderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertUnorderedList')
+        }).render();
+      });
+      this.context.memo('button.ol', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.orderedlist),
+          tooltip: _this2.lang.lists.ordered + _this2.representShortcut('insertOrderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertOrderedList')
+        }).render();
+      });
+      var justifyLeft = this.button({
+        contents: this.ui.icon(this.options.icons.alignLeft),
+        tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),
+        click: this.context.createInvokeHandler('editor.justifyLeft')
+      });
+      var justifyCenter = this.button({
+        contents: this.ui.icon(this.options.icons.alignCenter),
+        tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),
+        click: this.context.createInvokeHandler('editor.justifyCenter')
+      });
+      var justifyRight = this.button({
+        contents: this.ui.icon(this.options.icons.alignRight),
+        tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),
+        click: this.context.createInvokeHandler('editor.justifyRight')
+      });
+      var justifyFull = this.button({
+        contents: this.ui.icon(this.options.icons.alignJustify),
+        tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),
+        click: this.context.createInvokeHandler('editor.justifyFull')
+      });
+      var outdent = this.button({
+        contents: this.ui.icon(this.options.icons.outdent),
+        tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),
+        click: this.context.createInvokeHandler('editor.outdent')
+      });
+      var indent = this.button({
+        contents: this.ui.icon(this.options.icons.indent),
+        tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),
+        click: this.context.createInvokeHandler('editor.indent')
+      });
+      this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));
+      this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));
+      this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));
+      this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));
+      this.context.memo('button.outdent', func.invoke(outdent, 'render'));
+      this.context.memo('button.indent', func.invoke(indent, 'render'));
+      this.context.memo('button.paragraph', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.alignLeft), _this2.options),
+          tooltip: _this2.lang.paragraph.paragraph,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown([_this2.ui.buttonGroup({
+          className: 'note-align',
+          children: [justifyLeft, justifyCenter, justifyRight, justifyFull]
+        }), _this2.ui.buttonGroup({
+          className: 'note-list',
+          children: [outdent, indent]
+        })])]).render();
+      });
+      this.context.memo('button.height', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.textHeight), _this2.options),
+          tooltip: _this2.lang.font.height,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          items: _this2.options.lineHeights,
+          checkClassName: _this2.options.icons.menuCheck,
+          className: 'dropdown-line-height',
+          title: _this2.lang.font.height,
+          click: _this2.context.createInvokeHandler('editor.lineHeight')
+        })]).render();
+      });
+      this.context.memo('button.table', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.table), _this2.options),
+          tooltip: _this2.lang.table.table,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          title: _this2.lang.table.table,
+          className: 'note-table',
+          items: ['<div class="note-dimension-picker">', '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>', '<div class="note-dimension-picker-highlighted"></div>', '<div class="note-dimension-picker-unhighlighted"></div>', '</div>', '<div class="note-dimension-display">1 x 1</div>'].join('')
+        })], {
+          callback: function callback($node) {
+            var $catcher = $node.find('.note-dimension-picker-mousecatcher');
+            $catcher.css({
+              width: _this2.options.insertTableMaxSize.col + 'em',
+              height: _this2.options.insertTableMaxSize.row + 'em'
+            }).mouseup(_this2.context.createInvokeHandler('editor.insertTable')).on('mousemove', _this2.tableMoveHandler.bind(_this2));
+          }
+        }).render();
+      });
+      this.context.memo('button.link', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.link),
+          tooltip: _this2.lang.link.link + _this2.representShortcut('linkDialog.show'),
+          click: _this2.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.picture', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.picture),
+          tooltip: _this2.lang.image.image,
+          click: _this2.context.createInvokeHandler('imageDialog.show')
+        }).render();
+      });
+      this.context.memo('button.video', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.video),
+          tooltip: _this2.lang.video.video,
+          click: _this2.context.createInvokeHandler('videoDialog.show')
+        }).render();
+      });
+      this.context.memo('button.hr', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.minus),
+          tooltip: _this2.lang.hr.insert + _this2.representShortcut('insertHorizontalRule'),
+          click: _this2.context.createInvokeHandler('editor.insertHorizontalRule')
+        }).render();
+      });
+      this.context.memo('button.fullscreen', function () {
+        return _this2.button({
+          className: 'btn-fullscreen note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.arrowsAlt),
+          tooltip: _this2.lang.options.fullscreen,
+          click: _this2.context.createInvokeHandler('fullscreen.toggle')
+        }).render();
+      });
+      this.context.memo('button.codeview', function () {
+        return _this2.button({
+          className: 'btn-codeview note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.code),
+          tooltip: _this2.lang.options.codeview,
+          click: _this2.context.createInvokeHandler('codeview.toggle')
+        }).render();
+      });
+      this.context.memo('button.redo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.redo),
+          tooltip: _this2.lang.history.redo + _this2.representShortcut('redo'),
+          click: _this2.context.createInvokeHandler('editor.redo')
+        }).render();
+      });
+      this.context.memo('button.undo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.undo),
+          tooltip: _this2.lang.history.undo + _this2.representShortcut('undo'),
+          click: _this2.context.createInvokeHandler('editor.undo')
+        }).render();
+      });
+      this.context.memo('button.help', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.question),
+          tooltip: _this2.lang.options.help,
+          click: _this2.context.createInvokeHandler('helpDialog.show')
+        }).render();
+      });
+    }
+    /**
+     * image: [
+     *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],
+     *   ['float', ['floatLeft', 'floatRight', 'floatNone']],
+     *   ['remove', ['removeMedia']],
+     * ],
+     */
+
+  }, {
+    key: "addImagePopoverButtons",
+    value: function addImagePopoverButtons() {
+      var _this3 = this;
+
+      // Image Size Buttons
+      this.context.memo('button.resizeFull', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">100%</span>',
+          tooltip: _this3.lang.image.resizeFull,
+          click: _this3.context.createInvokeHandler('editor.resize', '1')
+        }).render();
+      });
+      this.context.memo('button.resizeHalf', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">50%</span>',
+          tooltip: _this3.lang.image.resizeHalf,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.5')
+        }).render();
+      });
+      this.context.memo('button.resizeQuarter', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">25%</span>',
+          tooltip: _this3.lang.image.resizeQuarter,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.25')
+        }).render();
+      });
+      this.context.memo('button.resizeNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.resizeNone,
+          click: _this3.context.createInvokeHandler('editor.resize', '0')
+        }).render();
+      }); // Float Buttons
+
+      this.context.memo('button.floatLeft', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatLeft),
+          tooltip: _this3.lang.image.floatLeft,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'left')
+        }).render();
+      });
+      this.context.memo('button.floatRight', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatRight),
+          tooltip: _this3.lang.image.floatRight,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'right')
+        }).render();
+      });
+      this.context.memo('button.floatNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.floatNone,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'none')
+        }).render();
+      }); // Remove Buttons
+
+      this.context.memo('button.removeMedia', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.trash),
+          tooltip: _this3.lang.image.remove,
+          click: _this3.context.createInvokeHandler('editor.removeMedia')
+        }).render();
+      });
+    }
+  }, {
+    key: "addLinkPopoverButtons",
+    value: function addLinkPopoverButtons() {
+      var _this4 = this;
+
+      this.context.memo('button.linkDialogShow', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.link),
+          tooltip: _this4.lang.link.edit,
+          click: _this4.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.unlink', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.unlink),
+          tooltip: _this4.lang.link.unlink,
+          click: _this4.context.createInvokeHandler('editor.unlink')
+        }).render();
+      });
+    }
+    /**
+     * table : [
+     *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],
+     *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]
+     * ],
+     */
+
+  }, {
+    key: "addTablePopoverButtons",
+    value: function addTablePopoverButtons() {
+      var _this5 = this;
+
+      this.context.memo('button.addRowUp', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowAbove),
+          tooltip: _this5.lang.table.addRowAbove,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'top')
+        }).render();
+      });
+      this.context.memo('button.addRowDown', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowBelow),
+          tooltip: _this5.lang.table.addRowBelow,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'bottom')
+        }).render();
+      });
+      this.context.memo('button.addColLeft', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colBefore),
+          tooltip: _this5.lang.table.addColLeft,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'left')
+        }).render();
+      });
+      this.context.memo('button.addColRight', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colAfter),
+          tooltip: _this5.lang.table.addColRight,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'right')
+        }).render();
+      });
+      this.context.memo('button.deleteRow', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowRemove),
+          tooltip: _this5.lang.table.delRow,
+          click: _this5.context.createInvokeHandler('editor.deleteRow')
+        }).render();
+      });
+      this.context.memo('button.deleteCol', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colRemove),
+          tooltip: _this5.lang.table.delCol,
+          click: _this5.context.createInvokeHandler('editor.deleteCol')
+        }).render();
+      });
+      this.context.memo('button.deleteTable', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.trash),
+          tooltip: _this5.lang.table.delTable,
+          click: _this5.context.createInvokeHandler('editor.deleteTable')
+        }).render();
+      });
+    }
+  }, {
+    key: "build",
+    value: function build($container, groups) {
+      for (var groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {
+        var group = groups[groupIdx];
+        var groupName = Array.isArray(group) ? group[0] : group;
+        var buttons = Array.isArray(group) ? group.length === 1 ? [group[0]] : group[1] : [group];
+        var $group = this.ui.buttonGroup({
+          className: 'note-' + groupName
+        }).render();
+
+        for (var idx = 0, len = buttons.length; idx < len; idx++) {
+          var btn = this.context.memo('button.' + buttons[idx]);
+
+          if (btn) {
+            $group.append(typeof btn === 'function' ? btn(this.context) : btn);
+          }
+        }
+
+        $group.appendTo($container);
+      }
+    }
+    /**
+     * @param {jQuery} [$container]
+     */
+
+  }, {
+    key: "updateCurrentStyle",
+    value: function updateCurrentStyle($container) {
+      var $cont = $container || this.$toolbar;
+      var styleInfo = this.context.invoke('editor.currentStyle');
+      this.updateBtnStates($cont, {
+        '.note-btn-bold': function noteBtnBold() {
+          return styleInfo['font-bold'] === 'bold';
+        },
+        '.note-btn-italic': function noteBtnItalic() {
+          return styleInfo['font-italic'] === 'italic';
+        },
+        '.note-btn-underline': function noteBtnUnderline() {
+          return styleInfo['font-underline'] === 'underline';
+        },
+        '.note-btn-subscript': function noteBtnSubscript() {
+          return styleInfo['font-subscript'] === 'subscript';
+        },
+        '.note-btn-superscript': function noteBtnSuperscript() {
+          return styleInfo['font-superscript'] === 'superscript';
+        },
+        '.note-btn-strikethrough': function noteBtnStrikethrough() {
+          return styleInfo['font-strikethrough'] === 'strikethrough';
+        }
+      });
+
+      if (styleInfo['font-family']) {
+        var fontNames = styleInfo['font-family'].split(',').map(function (name) {
+          return name.replace(/[\'\"]/g, '').replace(/\s+$/, '').replace(/^\s+/, '');
+        });
+        var fontName = lists.find(fontNames, this.isFontInstalled.bind(this));
+        $cont.find('.dropdown-fontname a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontName + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);
+      }
+
+      if (styleInfo['font-size']) {
+        var fontSize = styleInfo['font-size'];
+        $cont.find('.dropdown-fontsize a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontSize + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsize').text(fontSize);
+        var fontSizeUnit = styleInfo['font-size-unit'];
+        $cont.find('.dropdown-fontsizeunit a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item);
+          var isChecked = $item.data('value') + '' === fontSizeUnit + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);
+      }
+
+      if (styleInfo['line-height']) {
+        var lineHeight = styleInfo['line-height'];
+        $cont.find('.dropdown-line-height a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = external_jQuery_default()(item).data('value') + '' === lineHeight + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-line-height').text(lineHeight);
+      }
+    }
+  }, {
+    key: "updateBtnStates",
+    value: function updateBtnStates($container, infos) {
+      var _this6 = this;
+
+      external_jQuery_default().each(infos, function (selector, pred) {
+        _this6.ui.toggleBtnActive($container.find(selector), pred());
+      });
+    }
+  }, {
+    key: "tableMoveHandler",
+    value: function tableMoveHandler(event) {
+      var PX_PER_EM = 18;
+      var $picker = external_jQuery_default()(event.target.parentNode); // target is mousecatcher
+
+      var $dimensionDisplay = $picker.next();
+      var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
+      var $highlighted = $picker.find('.note-dimension-picker-highlighted');
+      var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
+      var posOffset; // HTML5 with jQuery - e.offsetX is undefined in Firefox
+
+      if (event.offsetX === undefined) {
+        var posCatcher = external_jQuery_default()(event.target).offset();
+        posOffset = {
+          x: event.pageX - posCatcher.left,
+          y: event.pageY - posCatcher.top
+        };
+      } else {
+        posOffset = {
+          x: event.offsetX,
+          y: event.offsetY
+        };
+      }
+
+      var dim = {
+        c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
+        r: Math.ceil(posOffset.y / PX_PER_EM) || 1
+      };
+      $highlighted.css({
+        width: dim.c + 'em',
+        height: dim.r + 'em'
+      });
+      $catcher.data('value', dim.c + 'x' + dim.r);
+
+      if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {
+        $unhighlighted.css({
+          width: dim.c + 1 + 'em'
+        });
+      }
+
+      if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {
+        $unhighlighted.css({
+          height: dim.r + 1 + 'em'
+        });
+      }
+
+      $dimensionDisplay.html(dim.c + ' x ' + dim.r);
+    }
+  }]);
+
+  return Buttons;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Toolbar.js
+function Toolbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Toolbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Toolbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Toolbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Toolbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Toolbar = /*#__PURE__*/function () {
+  function Toolbar(context) {
+    Toolbar_classCallCheck(this, Toolbar);
+
+    this.context = context;
+    this.$window = external_jQuery_default()(window);
+    this.$document = external_jQuery_default()(document);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.options = context.options;
+    this.isFollowing = false;
+    this.followScroll = this.followScroll.bind(this);
+  }
+
+  Toolbar_createClass(Toolbar, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !this.options.airMode;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.options.toolbar = this.options.toolbar || [];
+
+      if (!this.options.toolbar.length) {
+        this.$toolbar.hide();
+      } else {
+        this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);
+      }
+
+      if (this.options.toolbarContainer) {
+        this.$toolbar.appendTo(this.options.toolbarContainer);
+      }
+
+      this.changeContainer(false);
+      this.$note.on('summernote.keyup summernote.mouseup summernote.change', function () {
+        _this.context.invoke('buttons.updateCurrentStyle');
+      });
+      this.context.invoke('buttons.updateCurrentStyle');
+
+      if (this.options.followingToolbar) {
+        this.$window.on('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$toolbar.children().remove();
+
+      if (this.options.followingToolbar) {
+        this.$window.off('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "followScroll",
+    value: function followScroll() {
+      if (this.$editor.hasClass('fullscreen')) {
+        return false;
+      }
+
+      var editorHeight = this.$editor.outerHeight();
+      var editorWidth = this.$editor.width();
+      var toolbarHeight = this.$toolbar.height();
+      var statusbarHeight = this.$statusbar.height(); // check if the web app is currently using another static bar
+
+      var otherBarHeight = 0;
+
+      if (this.options.otherStaticBar) {
+        otherBarHeight = external_jQuery_default()(this.options.otherStaticBar).outerHeight();
+      }
+
+      var currentOffset = this.$document.scrollTop();
+      var editorOffsetTop = this.$editor.offset().top;
+      var editorOffsetBottom = editorOffsetTop + editorHeight;
+      var activateOffset = editorOffsetTop - otherBarHeight;
+      var deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;
+
+      if (!this.isFollowing && currentOffset > activateOffset && currentOffset < deactivateOffsetBottom - toolbarHeight) {
+        this.isFollowing = true;
+        this.$editable.css({
+          marginTop: this.$toolbar.outerHeight()
+        });
+        this.$toolbar.css({
+          position: 'fixed',
+          top: otherBarHeight,
+          width: editorWidth,
+          zIndex: 1000
+        });
+      } else if (this.isFollowing && (currentOffset < activateOffset || currentOffset > deactivateOffsetBottom)) {
+        this.isFollowing = false;
+        this.$toolbar.css({
+          position: 'relative',
+          top: 0,
+          width: '100%',
+          zIndex: 'auto'
+        });
+        this.$editable.css({
+          marginTop: ''
+        });
+      }
+    }
+  }, {
+    key: "changeContainer",
+    value: function changeContainer(isFullscreen) {
+      if (isFullscreen) {
+        this.$toolbar.prependTo(this.$editor);
+      } else {
+        if (this.options.toolbarContainer) {
+          this.$toolbar.appendTo(this.options.toolbarContainer);
+        }
+      }
+
+      if (this.options.followingToolbar) {
+        this.followScroll();
+      }
+    }
+  }, {
+    key: "updateFullscreen",
+    value: function updateFullscreen(isFullscreen) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);
+      this.changeContainer(isFullscreen);
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+    }
+  }, {
+    key: "activate",
+    value: function activate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, true);
+    }
+  }, {
+    key: "deactivate",
+    value: function deactivate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, false);
+    }
+  }]);
+
+  return Toolbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkDialog.js
+function LinkDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var LinkDialog = /*#__PURE__*/function () {
+  function LinkDialog(context) {
+    LinkDialog_classCallCheck(this, LinkDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);
+  }
+
+  LinkDialog_createClass(LinkDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group">', "<label for=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.textToDisplay, "</label>"), "<input id=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>"), '</div>', '<div class="form-group note-form-group">', "<label for=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.url, "</label>"), "<input id=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>"), '</div>', !this.options.disableLinkTarget ? external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-open-in-new-window',
+        text: this.lang.link.openInNewWindow,
+        checked: true
+      }).render()).html() : '', external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-use-protocol',
+        text: this.lang.link.useProtocol,
+        checked: true
+      }).render()).html()].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.link.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        className: 'link-dialog',
+        title: this.lang.link.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+    /**
+     * toggle update button
+     */
+
+  }, {
+    key: "toggleLinkBtn",
+    value: function toggleLinkBtn($linkBtn, $linkText, $linkUrl) {
+      this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());
+    }
+    /**
+     * Show link dialog and set event handlers on dialog controls.
+     *
+     * @param {Object} linkInfo
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showLinkDialog",
+    value: function showLinkDialog(linkInfo) {
+      var _this = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $linkText = _this.$dialog.find('.note-link-text');
+
+        var $linkUrl = _this.$dialog.find('.note-link-url');
+
+        var $linkBtn = _this.$dialog.find('.note-link-btn');
+
+        var $openInNewWindow = _this.$dialog.find('.sn-checkbox-open-in-new-window input[type=checkbox]');
+
+        var $useProtocol = _this.$dialog.find('.sn-checkbox-use-protocol input[type=checkbox]');
+
+        _this.ui.onDialogShown(_this.$dialog, function () {
+          _this.context.triggerEvent('dialog.shown'); // If no url was given and given text is valid URL then copy that into URL Field
+
+
+          if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {
+            linkInfo.url = linkInfo.text;
+          }
+
+          $linkText.on('input paste propertychange', function () {
+            // If linktext was modified by input events,
+            // cloning text from linkUrl will be stopped.
+            linkInfo.text = $linkText.val();
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.text);
+          $linkUrl.on('input paste propertychange', function () {
+            // Display same text on `Text to display` as default
+            // when linktext has no text
+            if (!linkInfo.text) {
+              $linkText.val($linkUrl.val());
+            }
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.url);
+
+          if (!env.isSupportTouch) {
+            $linkUrl.trigger('focus');
+          }
+
+          _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+
+          _this.bindEnterKey($linkUrl, $linkBtn);
+
+          _this.bindEnterKey($linkText, $linkBtn);
+
+          var isNewWindowChecked = linkInfo.isNewWindow !== undefined ? linkInfo.isNewWindow : _this.context.options.linkTargetBlank;
+          $openInNewWindow.prop('checked', isNewWindowChecked);
+          var useProtocolChecked = linkInfo.url ? false : _this.context.options.useProtocol;
+          $useProtocol.prop('checked', useProtocolChecked);
+          $linkBtn.one('click', function (event) {
+            event.preventDefault();
+            deferred.resolve({
+              range: linkInfo.range,
+              url: $linkUrl.val(),
+              text: $linkText.val(),
+              isNewWindow: $openInNewWindow.is(':checked'),
+              checkProtocol: $useProtocol.is(':checked')
+            });
+
+            _this.ui.hideDialog(_this.$dialog);
+          });
+        });
+
+        _this.ui.onDialogHidden(_this.$dialog, function () {
+          // detach events
+          $linkText.off();
+          $linkUrl.off();
+          $linkBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this.ui.showDialog(_this.$dialog);
+      }).promise();
+    }
+    /**
+     * @param {Object} layoutInfo
+     */
+
+  }, {
+    key: "show",
+    value: function show() {
+      var _this2 = this;
+
+      var linkInfo = this.context.invoke('editor.getLinkInfo');
+      this.context.invoke('editor.saveRange');
+      this.showLinkDialog(linkInfo).then(function (linkInfo) {
+        _this2.context.invoke('editor.restoreRange');
+
+        _this2.context.invoke('editor.createLink', linkInfo);
+      }).fail(function () {
+        _this2.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return LinkDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkPopover.js
+function LinkPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var LinkPopover = /*#__PURE__*/function () {
+  function LinkPopover(context) {
+    var _this = this;
+
+    LinkPopover_classCallCheck(this, LinkPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteChangeSummernoteScroll() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  LinkPopover_createClass(LinkPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.link);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-link-popover',
+        callback: function callback($node) {
+          var $content = $node.find('.popover-content,.note-popover-content');
+          $content.prepend('<span><a target="_blank"></a>&nbsp;</span>');
+        }
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.link);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      // Prevent focusing on editable when invoke('code') is executed
+      if (!this.context.invoke('editor.hasFocus')) {
+        this.hide();
+        return;
+      }
+
+      var rng = this.context.invoke('editor.getLastRange');
+
+      if (rng.isCollapsed() && rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        var href = external_jQuery_default()(anchor).attr('href');
+        this.$popover.find('a').attr('href', href).text(href);
+        var pos = dom.posFromPlaceholder(anchor);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return LinkPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImageDialog.js
+function ImageDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImageDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImageDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var ImageDialog = /*#__PURE__*/function () {
+  function ImageDialog(context) {
+    ImageDialog_classCallCheck(this, ImageDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  ImageDialog_createClass(ImageDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var imageLimitation = '';
+
+      if (this.options.maximumImageFileSize) {
+        var unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));
+        var readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 + ' ' + ' KMGTP'[unit] + 'B';
+        imageLimitation = "<small>".concat(this.lang.image.maximumFileSize + ' : ' + readableSize, "</small>");
+      }
+
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group note-group-select-from-files">', '<label for="note-dialog-image-file-' + this.options.id + '" class="note-form-label">' + this.lang.image.selectFromFiles + '</label>', '<input id="note-dialog-image-file-' + this.options.id + '" class="note-image-input form-control-file note-form-control note-input" ', ' type="file" name="files" accept="' + this.options.acceptImageFileTypes + '" multiple="multiple"/>', imageLimitation, '</div>', '<div class="form-group note-group-image-url">', '<label for="note-dialog-image-url-' + this.options.id + '" class="note-form-label">' + this.lang.image.url + '</label>', '<input id="note-dialog-image-url-' + this.options.id + '" class="note-image-url form-control note-form-control note-input" type="text"/>', '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.image.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.image.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showImageDialog().then(function (data) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange');
+
+        if (typeof data === 'string') {
+          // image url
+          // If onImageLinkInsert set,
+          if (_this.options.callbacks.onImageLinkInsert) {
+            _this.context.triggerEvent('image.link.insert', data);
+          } else {
+            _this.context.invoke('editor.insertImage', data);
+          }
+        } else {
+          // array of files
+          _this.context.invoke('editor.insertImagesOrCallback', data);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show image dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showImageDialog",
+    value: function showImageDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $imageInput = _this2.$dialog.find('.note-image-input');
+
+        var $imageUrl = _this2.$dialog.find('.note-image-url');
+
+        var $imageBtn = _this2.$dialog.find('.note-image-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown'); // Cloning imageInput to clear element.
+
+
+          $imageInput.replaceWith($imageInput.clone().on('change', function (event) {
+            deferred.resolve(event.target.files || event.target.value);
+          }).val(''));
+          $imageUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($imageBtn, $imageUrl.val());
+          }).val('');
+
+          if (!env.isSupportTouch) {
+            $imageUrl.trigger('focus');
+          }
+
+          $imageBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($imageUrl.val());
+          });
+
+          _this2.bindEnterKey($imageUrl, $imageBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $imageInput.off();
+          $imageUrl.off();
+          $imageBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return ImageDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImagePopover.js
+function ImagePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImagePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImagePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImagePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImagePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+/**
+ * Image popover module
+ *  mouse events that show/hide popover will be handled by Handle.js.
+ *  Handle.js will receive the events and invoke 'imagePopover.update'.
+ */
+
+var ImagePopover = /*#__PURE__*/function () {
+  function ImagePopover(context) {
+    var _this = this;
+
+    ImagePopover_classCallCheck(this, ImagePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.editable = context.layoutInfo.editable[0];
+    this.options = context.options;
+    this.events = {
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  ImagePopover_createClass(ImagePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.image);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-image-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.image);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (dom.isImg(target)) {
+        var position = external_jQuery_default()(target).offset();
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        var pos = {};
+
+        if (this.options.popatmouse) {
+          pos.left = event.pageX - 20;
+          pos.top = event.pageY;
+        } else {
+          pos = position;
+        }
+
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return ImagePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/TablePopover.js
+function TablePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function TablePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function TablePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) TablePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) TablePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var TablePopover = /*#__PURE__*/function () {
+  function TablePopover(context) {
+    var _this = this;
+
+    TablePopover_classCallCheck(this, TablePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.update(e.target);
+      },
+      'summernote.keyup summernote.scroll summernote.change': function summernoteKeyupSummernoteScrollSummernoteChange() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  TablePopover_createClass(TablePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.table);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-table-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.table); // [workaround] Disable Firefox's default table editor
+
+      if (env.isFF) {
+        document.execCommand('enableInlineTableEditing', false, false);
+      }
+
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isCell = dom.isCell(target) || dom.isCell(target === null || target === void 0 ? void 0 : target.parentElement);
+
+      if (isCell) {
+        var pos = dom.posFromPlaceholder(target);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+
+      return isCell;
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return TablePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/VideoDialog.js
+function VideoDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function VideoDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function VideoDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) VideoDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) VideoDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var VideoDialog = /*#__PURE__*/function () {
+  function VideoDialog(context) {
+    VideoDialog_classCallCheck(this, VideoDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  VideoDialog_createClass(VideoDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group row-fluid">', "<label for=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.video.url, " <small class=\"text-muted\">").concat(this.lang.video.providers, "</small></label>"), "<input id=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>"), '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.video.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.video.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "createVideoNode",
+    value: function createVideoNode(url) {
+      // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)
+      var ytRegExp = /\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/;
+      var ytRegExpForStart = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/;
+      var ytMatch = url.match(ytRegExp);
+      var gdRegExp = /(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/;
+      var gdMatch = url.match(gdRegExp);
+      var igRegExp = /(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/;
+      var igMatch = url.match(igRegExp);
+      var vRegExp = /\/\/vine\.co\/v\/([a-zA-Z0-9]+)/;
+      var vMatch = url.match(vRegExp);
+      var vimRegExp = /\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/;
+      var vimMatch = url.match(vimRegExp);
+      var dmRegExp = /.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/;
+      var dmMatch = url.match(dmRegExp);
+      var youkuRegExp = /\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/;
+      var youkuMatch = url.match(youkuRegExp);
+      var peerTubeRegExp = /\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/;
+      var peerTubeMatch = url.match(peerTubeRegExp);
+      var qqRegExp = /\/\/v\.qq\.com.*?vid=(.+)/;
+      var qqMatch = url.match(qqRegExp);
+      var qqRegExp2 = /\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/;
+      var qqMatch2 = url.match(qqRegExp2);
+      var mp4RegExp = /^.+.(mp4|m4v)$/;
+      var mp4Match = url.match(mp4RegExp);
+      var oggRegExp = /^.+.(ogg|ogv)$/;
+      var oggMatch = url.match(oggRegExp);
+      var webmRegExp = /^.+.(webm)$/;
+      var webmMatch = url.match(webmRegExp);
+      var fbRegExp = /(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/;
+      var fbMatch = url.match(fbRegExp);
+      var $video;
+
+      if (ytMatch && ytMatch[1].length === 11) {
+        var youtubeId = ytMatch[1];
+        var start = 0;
+
+        if (typeof ytMatch[2] !== 'undefined') {
+          var ytMatchForStart = ytMatch[2].match(ytRegExpForStart);
+
+          if (ytMatchForStart) {
+            for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {
+              start += typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0;
+            }
+          }
+        }
+
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : '')).attr('width', '640').attr('height', '360');
+      } else if (gdMatch && gdMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview').attr('width', '640').attr('height', '480');
+      } else if (igMatch && igMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/').attr('width', '612').attr('height', '710').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else if (vMatch && vMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', vMatch[0] + '/embed/simple').attr('width', '600').attr('height', '600').attr('class', 'vine-embed');
+      } else if (vimMatch && vimMatch[3].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('src', '//player.vimeo.com/video/' + vimMatch[3]).attr('width', '640').attr('height', '360');
+      } else if (dmMatch && dmMatch[2].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2]).attr('width', '640').attr('height', '360');
+      } else if (youkuMatch && youkuMatch[1].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '498').attr('width', '510').attr('src', '//player.youku.com/embed/' + youkuMatch[1]);
+      } else if (peerTubeMatch && peerTubeMatch[0].length) {
+        var begin = 0;
+        if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];
+        var end = 0;
+        if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];
+        var loop = 0;
+        if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];
+        var autoplay = 0;
+        if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];
+        var muted = 0;
+        if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];
+        $video = external_jQuery_default()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr('frameborder', 0).attr('src', '//' + peerTubeMatch[1] + '/videos/embed/' + peerTubeMatch[2] + "?loop=" + loop + "&autoplay=" + autoplay + "&muted=" + muted + (begin > 0 ? '&start=' + begin : '') + (end > 0 ? '&end=' + start : '')).attr('width', '560').attr('height', '315');
+      } else if (qqMatch && qqMatch[1].length || qqMatch2 && qqMatch2[2].length) {
+        var vid = qqMatch && qqMatch[1].length ? qqMatch[1] : qqMatch2[2];
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '310').attr('width', '500').attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');
+      } else if (mp4Match || oggMatch || webmMatch) {
+        $video = external_jQuery_default()('<video controls>').attr('src', url).attr('width', '640').attr('height', '360');
+      } else if (fbMatch && fbMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560').attr('width', '560').attr('height', '301').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else {
+        // this is not a known video link. Now what, Cat? Now what?
+        return false;
+      }
+
+      $video.addClass('note-video-clip');
+      return $video[0];
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      var text = this.context.invoke('editor.getSelectedText');
+      this.context.invoke('editor.saveRange');
+      this.showVideoDialog(text).then(function (url) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange'); // build node
+
+
+        var $node = _this.createVideoNode(url);
+
+        if ($node) {
+          // insert video node
+          _this.context.invoke('editor.insertNode', $node);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show video dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showVideoDialog",
+    value: function showVideoDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $videoUrl = _this2.$dialog.find('.note-video-url');
+
+        var $videoBtn = _this2.$dialog.find('.note-video-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          $videoUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($videoBtn, $videoUrl.val());
+          });
+
+          if (!env.isSupportTouch) {
+            $videoUrl.trigger('focus');
+          }
+
+          $videoBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($videoUrl.val());
+          });
+
+          _this2.bindEnterKey($videoUrl, $videoBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $videoUrl.off();
+          $videoBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return VideoDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HelpDialog.js
+function HelpDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HelpDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HelpDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) HelpDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) HelpDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var HelpDialog = /*#__PURE__*/function () {
+  function HelpDialog(context) {
+    HelpDialog_classCallCheck(this, HelpDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  HelpDialog_createClass(HelpDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<p class="text-center">', '<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ', '<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ', '<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>', '</p>'].join('');
+      this.$dialog = this.ui.dialog({
+        title: this.lang.options.help,
+        fade: this.options.dialogsFade,
+        body: this.createShortcutList(),
+        footer: body,
+        callback: function callback($node) {
+          $node.find('.modal-body,.note-modal-body').css({
+            'max-height': 300,
+            'overflow': 'scroll'
+          });
+        }
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "createShortcutList",
+    value: function createShortcutList() {
+      var _this = this;
+
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      return Object.keys(keyMap).map(function (key) {
+        var command = keyMap[key];
+        var $row = external_jQuery_default()('<div><div class="help-list-item"></div></div>');
+        $row.append(external_jQuery_default()('<label><kbd>' + key + '</kdb></label>').css({
+          'width': 180,
+          'margin-right': 10
+        })).append(external_jQuery_default()('<span></span>').html(_this.context.memo('help.' + command) || command));
+        return $row.html();
+      }).join('');
+    }
+    /**
+     * show help dialog
+     *
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showHelpDialog",
+    value: function showHelpDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          deferred.resolve();
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      }).promise();
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this3 = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showHelpDialog().then(function () {
+        _this3.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return HelpDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AirPopover.js
+function AirPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AirPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AirPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) AirPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) AirPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var AIRMODE_POPOVER_X_OFFSET = -5;
+var AIRMODE_POPOVER_Y_OFFSET = 5;
+
+var AirPopover = /*#__PURE__*/function () {
+  function AirPopover(context) {
+    var _this = this;
+
+    AirPopover_classCallCheck(this, AirPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.hidable = true;
+    this.onContextmenu = false;
+    this.pageX = null;
+    this.pageY = null;
+    this.events = {
+      'summernote.contextmenu': function summernoteContextmenu(e) {
+        if (_this.options.editing) {
+          e.preventDefault();
+          e.stopPropagation();
+          _this.onContextmenu = true;
+
+          _this.update(true);
+        }
+      },
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.pageX = e.pageX;
+        _this.pageY = e.pageY;
+      },
+      'summernote.keyup summernote.mouseup summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteScroll(we, e) {
+        if (_this.options.editing && !_this.onContextmenu) {
+          _this.pageX = e.pageX;
+          _this.pageY = e.pageY;
+
+          _this.update();
+        }
+
+        _this.onContextmenu = false;
+      },
+      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteChangeSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.focusout': function summernoteFocusout() {
+        if (!_this.$popover.is(':active,:focus')) {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  AirPopover_createClass(AirPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.options.airMode && !lists.isEmpty(this.options.popover.air);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$popover = this.ui.popover({
+        className: 'note-air-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.air); // disable hiding this popover preemptively by 'summernote.blur' event.
+
+      this.$popover.on('mousedown', function () {
+        _this2.hidable = false;
+      }); // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).
+
+      this.$popover.on('mouseup', function () {
+        _this2.hidable = true;
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(forcelyOpen) {
+      var styleInfo = this.context.invoke('editor.currentStyle');
+
+      if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {
+        var rect = {
+          left: this.pageX,
+          top: this.pageY
+        };
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        rect.top -= containerOffset.top;
+        rect.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,
+          top: rect.top + AIRMODE_POPOVER_Y_OFFSET
+        });
+        this.context.invoke('buttons.updateCurrentStyle', this.$popover);
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      if (this.hidable) {
+        this.$popover.hide();
+      }
+    }
+  }]);
+
+  return AirPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HintPopover.js
+function HintPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HintPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HintPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) HintPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) HintPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var POPOVER_DIST = 5;
+
+var HintPopover = /*#__PURE__*/function () {
+  function HintPopover(context) {
+    var _this = this;
+
+    HintPopover_classCallCheck(this, HintPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.hint = this.options.hint || [];
+    this.direction = this.options.hintDirection || 'bottom';
+    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      },
+      'summernote.disable summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      }
+    };
+  }
+
+  HintPopover_createClass(HintPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.hints.length > 0;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.lastWordRange = null;
+      this.matchingWord = null;
+      this.$popover = this.ui.popover({
+        className: 'note-hint-popover',
+        hideArrow: true,
+        direction: ''
+      }).render().appendTo(this.options.container);
+      this.$popover.hide();
+      this.$content = this.$popover.find('.popover-content,.note-popover-content');
+      this.$content.on('click', '.note-hint-item', function (e) {
+        _this2.$content.find('.active').removeClass('active');
+
+        external_jQuery_default()(e.currentTarget).addClass('active');
+
+        _this2.replace();
+      });
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "selectItem",
+    value: function selectItem($item) {
+      this.$content.find('.active').removeClass('active');
+      $item.addClass('active');
+      this.$content[0].scrollTop = $item[0].offsetTop - this.$content.innerHeight() / 2;
+    }
+  }, {
+    key: "moveDown",
+    value: function moveDown() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $next = $current.next();
+
+      if ($next.length) {
+        this.selectItem($next);
+      } else {
+        var $nextGroup = $current.parent().next();
+
+        if (!$nextGroup.length) {
+          $nextGroup = this.$content.find('.note-hint-group').first();
+        }
+
+        this.selectItem($nextGroup.find('.note-hint-item').first());
+      }
+    }
+  }, {
+    key: "moveUp",
+    value: function moveUp() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $prev = $current.prev();
+
+      if ($prev.length) {
+        this.selectItem($prev);
+      } else {
+        var $prevGroup = $current.parent().prev();
+
+        if (!$prevGroup.length) {
+          $prevGroup = this.$content.find('.note-hint-group').last();
+        }
+
+        this.selectItem($prevGroup.find('.note-hint-item').last());
+      }
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      var $item = this.$content.find('.note-hint-item.active');
+
+      if ($item.length) {
+        var node = this.nodeFromItem($item); // If matchingWord length = 0 -> capture OK / open hint / but as mention capture "" (\w*)
+
+        if (this.matchingWord !== null && this.matchingWord.length === 0) {
+          this.lastWordRange.so = this.lastWordRange.eo; // Else si > 0 and normal case -> adjust range "before" for correct position of insertion
+        } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {
+          var rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;
+
+          if (rangeCompute > 0) {
+            this.lastWordRange.so += rangeCompute;
+          }
+        }
+
+        this.lastWordRange.insertNode(node);
+
+        if (this.options.hintSelect === 'next') {
+          var blank = document.createTextNode('');
+          external_jQuery_default()(node).after(blank);
+          range.createFromNodeBefore(blank).select();
+        } else {
+          range.createFromNodeAfter(node).select();
+        }
+
+        this.lastWordRange = null;
+        this.hide();
+        this.context.invoke('editor.focus');
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+  }, {
+    key: "nodeFromItem",
+    value: function nodeFromItem($item) {
+      var hint = this.hints[$item.data('index')];
+      var item = $item.data('item');
+      var node = hint.content ? hint.content(item) : item;
+
+      if (typeof node === 'string') {
+        node = dom.createText(node);
+      }
+
+      return node;
+    }
+  }, {
+    key: "createItemTemplates",
+    value: function createItemTemplates(hintIdx, items) {
+      var hint = this.hints[hintIdx];
+      return items.map(function (item
+      /*, idx */
+      ) {
+        var $item = external_jQuery_default()('<div class="note-hint-item"></div>');
+        $item.append(hint.template ? hint.template(item) : item + '');
+        $item.data({
+          'index': hintIdx,
+          'item': item
+        });
+        return $item;
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (!this.$popover.is(':visible')) {
+        return;
+      }
+
+      if (e.keyCode === key.code.ENTER) {
+        e.preventDefault();
+        this.replace();
+      } else if (e.keyCode === key.code.UP) {
+        e.preventDefault();
+        this.moveUp();
+      } else if (e.keyCode === key.code.DOWN) {
+        e.preventDefault();
+        this.moveDown();
+      }
+    }
+  }, {
+    key: "searchKeyword",
+    value: function searchKeyword(index, keyword, callback) {
+      var hint = this.hints[index];
+
+      if (hint && hint.match.test(keyword) && hint.search) {
+        var matches = hint.match.exec(keyword);
+        this.matchingWord = matches[0];
+        hint.search(matches[1], callback);
+      } else {
+        callback();
+      }
+    }
+  }, {
+    key: "createGroup",
+    value: function createGroup(idx, keyword) {
+      var _this3 = this;
+
+      var $group = external_jQuery_default()('<div class="note-hint-group note-hint-group-' + idx + '"></div>');
+      this.searchKeyword(idx, keyword, function (items) {
+        items = items || [];
+
+        if (items.length) {
+          $group.html(_this3.createItemTemplates(idx, items));
+
+          _this3.show();
+        }
+      });
+      return $group;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      var _this4 = this;
+
+      if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {
+        var _range = this.context.invoke('editor.getLastRange');
+
+        var wordRange, keyword;
+
+        if (this.options.hintMode === 'words') {
+          wordRange = _range.getWordsRange(_range);
+          keyword = wordRange.toString();
+          this.hints.forEach(function (hint) {
+            if (hint.match.test(keyword)) {
+              wordRange = _range.getWordsMatchRange(hint.match);
+              return false;
+            }
+          });
+
+          if (!wordRange) {
+            this.hide();
+            return;
+          }
+
+          keyword = wordRange.toString();
+        } else {
+          wordRange = _range.getWordRange();
+          keyword = wordRange.toString();
+        }
+
+        if (this.hints.length && keyword) {
+          this.$content.empty();
+          var bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));
+          var containerOffset = external_jQuery_default()(this.options.container).offset();
+
+          if (bnd) {
+            bnd.top -= containerOffset.top;
+            bnd.left -= containerOffset.left;
+            this.$popover.hide();
+            this.lastWordRange = wordRange;
+            this.hints.forEach(function (hint, idx) {
+              if (hint.match.test(keyword)) {
+                _this4.createGroup(idx, keyword).appendTo(_this4.$content);
+              }
+            }); // select first .note-hint-item
+
+            this.$content.find('.note-hint-item:first').addClass('active'); // set position for popover after group is created
+
+            if (this.direction === 'top') {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST
+              });
+            } else {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top + bnd.height + POPOVER_DIST
+              });
+            }
+          }
+        } else {
+          this.hide();
+        }
+      }
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      this.$popover.show();
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return HintPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/settings.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  version: '0.8.20',
+  plugins: {},
+  dom: dom,
+  range: range,
+  lists: lists,
+  options: {
+    langInfo: (external_jQuery_default()).summernote.lang["en-US"],
+    editing: true,
+    modules: {
+      'editor': Editor,
+      'clipboard': Clipboard,
+      'dropzone': Dropzone,
+      'codeview': CodeView,
+      'statusbar': Statusbar,
+      'fullscreen': Fullscreen,
+      'handle': Handle,
+      // FIXME: HintPopover must be front of autolink
+      //  - Script error about range when Enter key is pressed on hint popover
+      'hintPopover': HintPopover,
+      'autoLink': AutoLink,
+      'autoSync': AutoSync,
+      'autoReplace': AutoReplace,
+      'placeholder': Placeholder,
+      'buttons': Buttons,
+      'toolbar': Toolbar,
+      'linkDialog': LinkDialog,
+      'linkPopover': LinkPopover,
+      'imageDialog': ImageDialog,
+      'imagePopover': ImagePopover,
+      'tablePopover': TablePopover,
+      'videoDialog': VideoDialog,
+      'helpDialog': HelpDialog,
+      'airPopover': AirPopover
+    },
+    buttons: {},
+    lang: 'en-US',
+    followingToolbar: false,
+    toolbarPosition: 'top',
+    otherStaticBar: '',
+    // toolbar
+    codeviewKeepButton: false,
+    toolbar: [['style', ['style']], ['font', ['bold', 'underline', 'clear']], ['fontname', ['fontname']], ['color', ['color']], ['para', ['ul', 'ol', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture', 'video']], ['view', ['fullscreen', 'codeview', 'help']]],
+    // popover
+    popatmouse: true,
+    popover: {
+      image: [['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']], ['float', ['floatLeft', 'floatRight', 'floatNone']], ['remove', ['removeMedia']]],
+      link: [['link', ['linkDialogShow', 'unlink']]],
+      table: [['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']], ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]],
+      air: [['color', ['color']], ['font', ['bold', 'underline', 'clear']], ['para', ['ul', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture']], ['view', ['fullscreen', 'codeview']]]
+    },
+    // air mode: inline editor
+    airMode: false,
+    overrideContextMenu: false,
+    // TBD
+    width: null,
+    height: null,
+    linkTargetBlank: true,
+    useProtocol: true,
+    defaultProtocol: 'http://',
+    focus: false,
+    tabDisabled: false,
+    tabSize: 4,
+    styleWithCSS: false,
+    shortcuts: true,
+    textareaAutoSync: true,
+    tooltip: 'auto',
+    container: null,
+    maxTextLength: 0,
+    blockquoteBreakingLevel: 2,
+    spellCheck: true,
+    disableGrammar: false,
+    placeholder: null,
+    inheritPlaceholder: false,
+    // TODO: need to be documented
+    recordEveryKeystroke: false,
+    historyLimit: 200,
+    // TODO: need to be documented
+    showDomainOnlyForAutolink: false,
+    // TODO: need to be documented
+    hintMode: 'word',
+    hintSelect: 'after',
+    hintDirection: 'bottom',
+    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
+    fontNames: ['Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande', 'Tahoma', 'Times New Roman', 'Verdana'],
+    fontNamesIgnoreCheck: [],
+    addDefaultFonts: true,
+    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],
+    fontSizeUnits: ['px', 'pt'],
+    // pallete colors(n x n)
+    colors: [['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'], ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'], ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'], ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'], ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'], ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'], ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'], ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031']],
+    // http://chir.ag/projects/name-that-color/
+    colorsName: [['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'], ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'], ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'], ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'], ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'], ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'], ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'], ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou']],
+    colorButton: {
+      foreColor: '#000000',
+      backColor: '#FFFF00'
+    },
+    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],
+    tableClassName: 'table table-bordered',
+    insertTableMaxSize: {
+      col: 10,
+      row: 10
+    },
+    // By default, dialogs are attached in container.
+    dialogsInBody: false,
+    dialogsFade: false,
+    maximumImageFileSize: null,
+    acceptImageFileTypes: "image/*",
+    callbacks: {
+      onBeforeCommand: null,
+      onBlur: null,
+      onBlurCodeview: null,
+      onChange: null,
+      onChangeCodeview: null,
+      onDialogShown: null,
+      onEnter: null,
+      onFocus: null,
+      onImageLinkInsert: null,
+      onImageUpload: null,
+      onImageUploadError: null,
+      onInit: null,
+      onKeydown: null,
+      onKeyup: null,
+      onMousedown: null,
+      onMouseup: null,
+      onPaste: null,
+      onScroll: null
+    },
+    codemirror: {
+      mode: 'text/html',
+      htmlMode: true,
+      lineNumbers: true
+    },
+    codeviewFilter: true,
+    codeviewFilterRegex: /<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,
+    codeviewIframeFilter: true,
+    codeviewIframeWhitelistSrc: [],
+    codeviewIframeWhitelistSrcBase: ['www.youtube.com', 'www.youtube-nocookie.com', 'www.facebook.com', 'vine.co', 'instagram.com', 'player.vimeo.com', 'www.dailymotion.com', 'player.youku.com', 'jumpingbean.tv', 'v.qq.com'],
+    keyMap: {
+      pc: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CTRL+Z': 'undo',
+        'CTRL+Y': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CTRL+B': 'bold',
+        'CTRL+I': 'italic',
+        'CTRL+U': 'underline',
+        'CTRL+SHIFT+S': 'strikethrough',
+        'CTRL+BACKSLASH': 'removeFormat',
+        'CTRL+SHIFT+L': 'justifyLeft',
+        'CTRL+SHIFT+E': 'justifyCenter',
+        'CTRL+SHIFT+R': 'justifyRight',
+        'CTRL+SHIFT+J': 'justifyFull',
+        'CTRL+SHIFT+NUM7': 'insertUnorderedList',
+        'CTRL+SHIFT+NUM8': 'insertOrderedList',
+        'CTRL+LEFTBRACKET': 'outdent',
+        'CTRL+RIGHTBRACKET': 'indent',
+        'CTRL+NUM0': 'formatPara',
+        'CTRL+NUM1': 'formatH1',
+        'CTRL+NUM2': 'formatH2',
+        'CTRL+NUM3': 'formatH3',
+        'CTRL+NUM4': 'formatH4',
+        'CTRL+NUM5': 'formatH5',
+        'CTRL+NUM6': 'formatH6',
+        'CTRL+ENTER': 'insertHorizontalRule',
+        'CTRL+K': 'linkDialog.show'
+      },
+      mac: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CMD+Z': 'undo',
+        'CMD+SHIFT+Z': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CMD+B': 'bold',
+        'CMD+I': 'italic',
+        'CMD+U': 'underline',
+        'CMD+SHIFT+S': 'strikethrough',
+        'CMD+BACKSLASH': 'removeFormat',
+        'CMD+SHIFT+L': 'justifyLeft',
+        'CMD+SHIFT+E': 'justifyCenter',
+        'CMD+SHIFT+R': 'justifyRight',
+        'CMD+SHIFT+J': 'justifyFull',
+        'CMD+SHIFT+NUM7': 'insertUnorderedList',
+        'CMD+SHIFT+NUM8': 'insertOrderedList',
+        'CMD+LEFTBRACKET': 'outdent',
+        'CMD+RIGHTBRACKET': 'indent',
+        'CMD+NUM0': 'formatPara',
+        'CMD+NUM1': 'formatH1',
+        'CMD+NUM2': 'formatH2',
+        'CMD+NUM3': 'formatH3',
+        'CMD+NUM4': 'formatH4',
+        'CMD+NUM5': 'formatH5',
+        'CMD+NUM6': 'formatH6',
+        'CMD+ENTER': 'insertHorizontalRule',
+        'CMD+K': 'linkDialog.show'
+      }
+    },
+    icons: {
+      'align': 'note-icon-align',
+      'alignCenter': 'note-icon-align-center',
+      'alignJustify': 'note-icon-align-justify',
+      'alignLeft': 'note-icon-align-left',
+      'alignRight': 'note-icon-align-right',
+      'rowBelow': 'note-icon-row-below',
+      'colBefore': 'note-icon-col-before',
+      'colAfter': 'note-icon-col-after',
+      'rowAbove': 'note-icon-row-above',
+      'rowRemove': 'note-icon-row-remove',
+      'colRemove': 'note-icon-col-remove',
+      'indent': 'note-icon-align-indent',
+      'outdent': 'note-icon-align-outdent',
+      'arrowsAlt': 'note-icon-arrows-alt',
+      'bold': 'note-icon-bold',
+      'caret': 'note-icon-caret',
+      'circle': 'note-icon-circle',
+      'close': 'note-icon-close',
+      'code': 'note-icon-code',
+      'eraser': 'note-icon-eraser',
+      'floatLeft': 'note-icon-float-left',
+      'floatRight': 'note-icon-float-right',
+      'font': 'note-icon-font',
+      'frame': 'note-icon-frame',
+      'italic': 'note-icon-italic',
+      'link': 'note-icon-link',
+      'unlink': 'note-icon-chain-broken',
+      'magic': 'note-icon-magic',
+      'menuCheck': 'note-icon-menu-check',
+      'minus': 'note-icon-minus',
+      'orderedlist': 'note-icon-orderedlist',
+      'pencil': 'note-icon-pencil',
+      'picture': 'note-icon-picture',
+      'question': 'note-icon-question',
+      'redo': 'note-icon-redo',
+      'rollback': 'note-icon-rollback',
+      'square': 'note-icon-square',
+      'strikethrough': 'note-icon-strikethrough',
+      'subscript': 'note-icon-subscript',
+      'superscript': 'note-icon-superscript',
+      'table': 'note-icon-table',
+      'textHeight': 'note-icon-text-height',
+      'trash': 'note-icon-trash',
+      'underline': 'note-icon-underline',
+      'undo': 'note-icon-undo',
+      'unorderedlist': 'note-icon-unorderedlist',
+      'video': 'note-icon-video'
+    }
+  }
+});
+;// CONCATENATED MODULE: ./src/js/renderer.js
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function renderer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function renderer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function renderer_createClass(Constructor, protoProps, staticProps) { if (protoProps) renderer_defineProperties(Constructor.prototype, protoProps); if (staticProps) renderer_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Renderer = /*#__PURE__*/function () {
+  function Renderer(markup, children, options, callback) {
+    renderer_classCallCheck(this, Renderer);
+
+    this.markup = markup;
+    this.children = children;
+    this.options = options;
+    this.callback = callback;
+  }
+
+  renderer_createClass(Renderer, [{
+    key: "render",
+    value: function render($parent) {
+      var $node = external_jQuery_default()(this.markup);
+
+      if (this.options && this.options.contents) {
+        $node.html(this.options.contents);
+      }
+
+      if (this.options && this.options.className) {
+        $node.addClass(this.options.className);
+      }
+
+      if (this.options && this.options.data) {
+        external_jQuery_default().each(this.options.data, function (k, v) {
+          $node.attr('data-' + k, v);
+        });
+      }
+
+      if (this.options && this.options.click) {
+        $node.on('click', this.options.click);
+      }
+
+      if (this.children) {
+        var $container = $node.find('.note-children-container');
+        this.children.forEach(function (child) {
+          child.render($container.length ? $container : $node);
+        });
+      }
+
+      if (this.callback) {
+        this.callback($node, this.options);
+      }
+
+      if (this.options && this.options.callback) {
+        this.options.callback($node);
+      }
+
+      if ($parent) {
+        $parent.append($node);
+      }
+
+      return $node;
+    }
+  }]);
+
+  return Renderer;
+}();
+
+/* harmony default export */ const renderer = ({
+  create: function create(markup, callback) {
+    return function () {
+      var options = _typeof(arguments[1]) === 'object' ? arguments[1] : arguments[0];
+      var children = Array.isArray(arguments[0]) ? arguments[0] : [];
+
+      if (options && options.children) {
+        children = options.children;
+      }
+
+      return new Renderer(markup, children, options, callback);
+    };
+  }
+});
+;// CONCATENATED MODULE: ./src/styles/bs4/summernote-bs4.js
+function summernote_bs4_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { summernote_bs4_typeof = function _typeof(obj) { return typeof obj; }; } else { summernote_bs4_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return summernote_bs4_typeof(obj); }
+
+
+
+
+
+var editor = renderer.create('<div class="note-editor note-frame card"></div>');
+var toolbar = renderer.create('<div class="note-toolbar card-header" role="toolbar"></div>');
+var editingArea = renderer.create('<div class="note-editing-area"></div>');
+var codable = renderer.create('<textarea class="note-codable" aria-multiline="true"></textarea>');
+var editable = renderer.create('<div class="note-editable card-block" contentEditable="true" role="textbox" aria-multiline="true"></div>');
+var statusbar = renderer.create(['<output class="note-status-output" role="status" aria-live="polite"></output>', '<div class="note-statusbar" role="status">', '<div class="note-resizebar" aria-label="Resize">', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '</div>', '</div>'].join(''));
+var airEditor = renderer.create('<div class="note-editor note-airframe"></div>');
+var airEditable = renderer.create(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>', '<output class="note-status-output" role="status" aria-live="polite"></output>'].join(''));
+var buttonGroup = renderer.create('<div class="note-btn-group btn-group"></div>');
+var dropdown = renderer.create('<div class="note-dropdown-menu dropdown-menu" role="list"></div>', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    var option = summernote_bs4_typeof(item) === 'object' ? item.option : undefined;
+    var dataValue = 'data-value="' + value + '"';
+    var dataOption = option !== undefined ? ' data-option="' + option + '"' : '';
+    return '<a class="dropdown-item" href="#" ' + (dataValue + dataOption) + ' role="listitem" aria-label="' + value + '">' + content + '</a>';
+  }).join('') : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+
+var dropdownButtonContents = function dropdownButtonContents(contents) {
+  return contents;
+};
+
+var dropdownCheck = renderer.create('<div class="note-dropdown-menu dropdown-menu note-check" role="list"></div>', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    return '<a class="dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + item + '">' + icon(options.checkClassName) + ' ' + content + '</a>';
+  }).join('') : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+var dialog = renderer.create('<div class="modal note-modal" aria-hidden="false" tabindex="-1" role="dialog"></div>', function ($node, options) {
+  if (options.fade) {
+    $node.addClass('fade');
+  }
+
+  $node.attr({
+    'aria-label': options.title
+  });
+  $node.html(['<div class="modal-dialog">', '<div class="modal-content">', options.title ? '<div class="modal-header">' + '<h4 class="modal-title">' + options.title + '</h4>' + '<button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">&times;</button>' + '</div>' : '', '<div class="modal-body">' + options.body + '</div>', options.footer ? '<div class="modal-footer">' + options.footer + '</div>' : '', '</div>', '</div>'].join(''));
+});
+var popover = renderer.create(['<div class="note-popover popover in">', '<div class="arrow"></div>', '<div class="popover-content note-children-container"></div>', '</div>'].join(''), function ($node, options) {
+  var direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';
+  $node.addClass(direction);
+
+  if (options.hideArrow) {
+    $node.find('.arrow').hide();
+  }
+});
+var summernote_bs4_checkbox = renderer.create('<div class="form-check"></div>', function ($node, options) {
+  $node.html(['<label class="form-check-label"' + (options.id ? ' for="note-' + options.id + '"' : '') + '>', '<input type="checkbox" class="form-check-input"' + (options.id ? ' id="note-' + options.id + '"' : ''), options.checked ? ' checked' : '', ' aria-label="' + (options.text ? options.text : '') + '"', ' aria-checked="' + (options.checked ? 'true' : 'false') + '"/>', ' ' + (options.text ? options.text : '') + '</label>'].join(''));
+});
+
+var icon = function icon(iconClassName, tagName) {
+  if (iconClassName.match(/^</)) {
+    return iconClassName;
+  }
+
+  tagName = tagName || 'i';
+  return '<' + tagName + ' class="' + iconClassName + '"></' + tagName + '>';
+};
+
+var ui = function ui(editorOptions) {
+  return {
+    editor: editor,
+    toolbar: toolbar,
+    editingArea: editingArea,
+    codable: codable,
+    editable: editable,
+    statusbar: statusbar,
+    airEditor: airEditor,
+    airEditable: airEditable,
+    buttonGroup: buttonGroup,
+    dropdown: dropdown,
+    dropdownButtonContents: dropdownButtonContents,
+    dropdownCheck: dropdownCheck,
+    dialog: dialog,
+    popover: popover,
+    icon: icon,
+    checkbox: summernote_bs4_checkbox,
+    options: editorOptions,
+    palette: function palette($node, options) {
+      return renderer.create('<div class="note-color-palette"></div>', function ($node, options) {
+        var contents = [];
+
+        for (var row = 0, rowSize = options.colors.length; row < rowSize; row++) {
+          var eventName = options.eventName;
+          var colors = options.colors[row];
+          var colorsName = options.colorsName[row];
+          var buttons = [];
+
+          for (var col = 0, colSize = colors.length; col < colSize; col++) {
+            var color = colors[col];
+            var colorName = colorsName[col];
+            buttons.push(['<button type="button" class="note-color-btn"', 'style="background-color:', color, '" ', 'data-event="', eventName, '" ', 'data-value="', color, '" ', 'title="', colorName, '" ', 'aria-label="', colorName, '" ', 'data-toggle="button" tabindex="-1"></button>'].join(''));
+          }
+
+          contents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
+        }
+
+        $node.html(contents.join(''));
+
+        if (options.tooltip) {
+          $node.find('.note-color-btn').tooltip({
+            container: options.container || editorOptions.container,
+            trigger: 'hover',
+            placement: 'bottom'
+          });
+        }
+      })($node, options);
+    },
+    button: function button($node, options) {
+      return renderer.create('<button type="button" class="note-btn btn btn-light btn-sm" tabindex="-1"></button>', function ($node, options) {
+        if (options && options.tooltip) {
+          $node.attr({
+            title: options.tooltip,
+            'aria-label': options.tooltip
+          }).tooltip({
+            container: options.container || editorOptions.container,
+            trigger: 'hover',
+            placement: 'bottom'
+          }).on('click', function (e) {
+            external_jQuery_default()(e.currentTarget).tooltip('hide');
+          });
+        }
+
+        if (options && options.codeviewButton) {
+          $node.addClass('note-codeview-keep');
+        }
+      })($node, options);
+    },
+    toggleBtn: function toggleBtn($btn, isEnable) {
+      $btn.toggleClass('disabled', !isEnable);
+      $btn.attr('disabled', !isEnable);
+    },
+    toggleBtnActive: function toggleBtnActive($btn, isActive) {
+      $btn.toggleClass('active', isActive);
+    },
+    onDialogShown: function onDialogShown($dialog, handler) {
+      $dialog.one('shown.bs.modal', handler);
+    },
+    onDialogHidden: function onDialogHidden($dialog, handler) {
+      $dialog.one('hidden.bs.modal', handler);
+    },
+    showDialog: function showDialog($dialog) {
+      $dialog.modal('show');
+    },
+    hideDialog: function hideDialog($dialog) {
+      $dialog.modal('hide');
+    },
+    createLayout: function createLayout($note) {
+      var $editor = (editorOptions.airMode ? airEditor([editingArea([codable(), airEditable()])]) : editorOptions.toolbarPosition === 'bottom' ? editor([editingArea([codable(), editable()]), toolbar(), statusbar()]) : editor([toolbar(), editingArea([codable(), editable()]), statusbar()])).render();
+      $editor.insertAfter($note);
+      return {
+        note: $note,
+        editor: $editor,
+        toolbar: $editor.find('.note-toolbar'),
+        editingArea: $editor.find('.note-editing-area'),
+        editable: $editor.find('.note-editable'),
+        codable: $editor.find('.note-codable'),
+        statusbar: $editor.find('.note-statusbar')
+      };
+    },
+    removeLayout: function removeLayout($note, layoutInfo) {
+      $note.html(layoutInfo.editable.html());
+      layoutInfo.editor.remove();
+      $note.show();
+    }
+  };
+};
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  ui_template: ui,
+  "interface": 'bs4'
+});
+(external_jQuery_default()).summernote.options.styleTags = ['p', {
+  title: 'Blockquote',
+  tag: 'blockquote',
+  className: 'blockquote',
+  value: 'blockquote'
+}, 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
+})();
+
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-bs4.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js.map
new file mode 100644
index 0000000..8b15186
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote-bs4.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-en-US.js","webpack:///external umd \"jQuery\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/js/core/env.js","webpack:///./src/js/core/func.js","webpack:///./src/js/core/lists.js","webpack:///./src/js/core/dom.js","webpack:///./src/js/Context.js","webpack:///./src/js/summernote.js","webpack:///./src/js/core/range.js","webpack:///./src/js/core/key.js","webpack:///./src/js/core/async.js","webpack:///./src/js/editing/History.js","webpack:///./src/js/editing/Style.js","webpack:///./src/js/editing/Bullet.js","webpack:///./src/js/editing/Typing.js","webpack:///./src/js/editing/Table.js","webpack:///./src/js/module/Editor.js","webpack:///./src/js/module/Clipboard.js","webpack:///./src/js/module/Dropzone.js","webpack:///./src/js/module/Codeview.js","webpack:///./src/js/module/Statusbar.js","webpack:///./src/js/module/Fullscreen.js","webpack:///./src/js/module/Handle.js","webpack:///./src/js/module/AutoLink.js","webpack:///./src/js/module/AutoSync.js","webpack:///./src/js/module/AutoReplace.js","webpack:///./src/js/module/Placeholder.js","webpack:///./src/js/module/Buttons.js","webpack:///./src/js/module/Toolbar.js","webpack:///./src/js/module/LinkDialog.js","webpack:///./src/js/module/LinkPopover.js","webpack:///./src/js/module/ImageDialog.js","webpack:///./src/js/module/ImagePopover.js","webpack:///./src/js/module/TablePopover.js","webpack:///./src/js/module/VideoDialog.js","webpack:///./src/js/module/HelpDialog.js","webpack:///./src/js/module/AirPopover.js","webpack:///./src/js/module/HintPopover.js","webpack:///./src/js/settings.js","webpack:///./src/js/renderer.js","webpack:///./src/styles/bs4/summernote-bs4.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jQuery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jQuery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jQuery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {\nreturn ","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from 'jquery';\n\n/**\n * returns whether font is installed or not.\n *\n * @param {String} fontName\n * @return {Boolean}\n */\nconst genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];\n\nfunction validFontName(fontName) {\n  return ($.inArray(fontName.toLowerCase(), genericFontFamilies) === -1) ? `'${fontName}'` : fontName;\n}\n\nfunction isFontInstalled(fontName) {\n  const testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';\n  const testText = 'mmmmmmmmmmwwwww';\n  const testSize = '200px';\n\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n\n  context.font = testSize + \" '\" + testFontName + \"'\";\n  const originalWidth = context.measureText(testText).width;\n\n  context.font = testSize + ' ' + validFontName(fontName) + ', \"' + testFontName + '\"';\n  const width = context.measureText(testText).width;\n\n  return originalWidth !== width;\n}\n\nconst userAgent = navigator.userAgent;\nconst isMSIE = /MSIE|Trident/i.test(userAgent);\nlet browserVersion;\nif (isMSIE) {\n  let matches = /MSIE (\\d+[.]\\d+)/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n  matches = /Trident\\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n}\n\nconst isEdge = /Edge\\/\\d+/.test(userAgent);\n\nconst isSupportTouch =\n  (('ontouchstart' in window) ||\n   (navigator.MaxTouchPoints > 0) ||\n   (navigator.msMaxTouchPoints > 0));\n\n// [workaround] IE doesn't have input events for contentEditable\n// - see: https://goo.gl/4bfIvA\nconst inputEventName = (isMSIE) ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';\n\n/**\n * @class core.env\n *\n * Object which check platform and agent\n *\n * @singleton\n * @alternateClassName env\n */\nexport default {\n  isMac: navigator.appVersion.indexOf('Mac') > -1,\n  isMSIE,\n  isEdge,\n  isFF: !isEdge && /firefox/i.test(userAgent),\n  isPhantom: /PhantomJS/i.test(userAgent),\n  isWebkit: !isEdge && /webkit/i.test(userAgent),\n  isChrome: !isEdge && /chrome/i.test(userAgent),\n  isSafari: !isEdge && /safari/i.test(userAgent) && (!/chrome/i.test(userAgent)),\n  browserVersion,\n  isSupportTouch,\n  isFontInstalled,\n  isW3CRangeSupport: !!document.createRange,\n  inputEventName,\n  genericFontFamilies,\n  validFontName,\n};\n","import $ from 'jquery';\n\n/**\n * @class core.func\n *\n * func utils (for high-order func's arg)\n *\n * @singleton\n * @alternateClassName func\n */\nfunction eq(itemA) {\n  return function(itemB) {\n    return itemA === itemB;\n  };\n}\n\nfunction eq2(itemA, itemB) {\n  return itemA === itemB;\n}\n\nfunction peq2(propName) {\n  return function(itemA, itemB) {\n    return itemA[propName] === itemB[propName];\n  };\n}\n\nfunction ok() {\n  return true;\n}\n\nfunction fail() {\n  return false;\n}\n\nfunction not(f) {\n  return function() {\n    return !f.apply(f, arguments);\n  };\n}\n\nfunction and(fA, fB) {\n  return function(item) {\n    return fA(item) && fB(item);\n  };\n}\n\nfunction self(a) {\n  return a;\n}\n\nfunction invoke(obj, method) {\n  return function() {\n    return obj[method].apply(obj, arguments);\n  };\n}\n\nlet idCounter = 0;\n\n/**\n * reset globally-unique id\n *\n */\nfunction resetUniqueId() {\n  idCounter = 0;\n}\n\n/**\n * generate a globally-unique id\n *\n * @param {String} [prefix]\n */\nfunction uniqueId(prefix) {\n  const id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n/**\n * returns bnd (bounds) from rect\n *\n * - IE Compatibility Issue: http://goo.gl/sRLOAo\n * - Scroll Issue: http://goo.gl/sNjUc\n *\n * @param {Rect} rect\n * @return {Object} bounds\n * @return {Number} bounds.top\n * @return {Number} bounds.left\n * @return {Number} bounds.width\n * @return {Number} bounds.height\n */\nfunction rect2bnd(rect) {\n  const $document = $(document);\n  return {\n    top: rect.top + $document.scrollTop(),\n    left: rect.left + $document.scrollLeft(),\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n}\n\n/**\n * returns a copy of the object where the keys have become the values and the values the keys.\n * @param {Object} obj\n * @return {Object}\n */\nfunction invertObject(obj) {\n  const inverted = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      inverted[obj[key]] = key;\n    }\n  }\n  return inverted;\n}\n\n/**\n * @param {String} namespace\n * @param {String} [prefix]\n * @return {String}\n */\nfunction namespaceToCamel(namespace, prefix) {\n  prefix = prefix || '';\n  return prefix + namespace.split('.').map(function(name) {\n    return name.substring(0, 1).toUpperCase() + name.substring(1);\n  }).join('');\n}\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param {Function} func\n * @param {Number} wait\n * @param {Boolean} immediate\n * @return {Function}\n */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function() {\n    const context = this;\n    const args = arguments;\n    const later = () => {\n      timeout = null;\n      if (!immediate) {\n        func.apply(context, args);\n      }\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) {\n      func.apply(context, args);\n    }\n  };\n}\n\n/**\n *\n * @param {String} url\n * @return {Boolean}\n */\nfunction isValidUrl(url) {\n  const expression = /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/gi;\n  return expression.test(url);\n}\n\nexport default {\n  eq,\n  eq2,\n  peq2,\n  ok,\n  fail,\n  self,\n  not,\n  and,\n  invoke,\n  resetUniqueId,\n  uniqueId,\n  rect2bnd,\n  invertObject,\n  namespaceToCamel,\n  debounce,\n  isValidUrl,\n};\n","import func from './func';\n\n/**\n * returns the first item of an array.\n *\n * @param {Array} array\n */\nfunction head(array) {\n  return array[0];\n}\n\n/**\n * returns the last item of an array.\n *\n * @param {Array} array\n */\nfunction last(array) {\n  return array[array.length - 1];\n}\n\n/**\n * returns everything but the last entry of the array.\n *\n * @param {Array} array\n */\nfunction initial(array) {\n  return array.slice(0, array.length - 1);\n}\n\n/**\n * returns the rest of the items in an array.\n *\n * @param {Array} array\n */\nfunction tail(array) {\n  return array.slice(1);\n}\n\n/**\n * returns item of array\n */\nfunction find(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    const item = array[idx];\n    if (pred(item)) {\n      return item;\n    }\n  }\n}\n\n/**\n * returns true if all of the values in the array pass the predicate truth test.\n */\nfunction all(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!pred(array[idx])) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * returns true if the value is present in the list.\n */\nfunction contains(array, item) {\n  if (array && array.length && item) {\n    if (array.indexOf) {\n      return array.indexOf(item) !== -1;\n    } else if (array.contains) {\n      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`\n      return array.contains(item);\n    }\n  }\n  return false;\n}\n\n/**\n * get sum from a list\n *\n * @param {Array} array - array\n * @param {Function} fn - iterator\n */\nfunction sum(array, fn) {\n  fn = fn || func.self;\n  return array.reduce(function(memo, v) {\n    return memo + fn(v);\n  }, 0);\n}\n\n/**\n * returns a copy of the collection with array type.\n * @param {Collection} collection - collection eg) node.childNodes, ...\n */\nfunction from(collection) {\n  const result = [];\n  const length = collection.length;\n  let idx = -1;\n  while (++idx < length) {\n    result[idx] = collection[idx];\n  }\n  return result;\n}\n\n/**\n * returns whether list is empty or not\n */\nfunction isEmpty(array) {\n  return !array || !array.length;\n}\n\n/**\n * cluster elements by predicate function.\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n * @param {Array[]}\n */\nfunction clusterBy(array, fn) {\n  if (!array.length) { return []; }\n  const aTail = tail(array);\n  return aTail.reduce(function(memo, v) {\n    const aLast = last(memo);\n    if (fn(last(aLast), v)) {\n      aLast[aLast.length] = v;\n    } else {\n      memo[memo.length] = [v];\n    }\n    return memo;\n  }, [[head(array)]]);\n}\n\n/**\n * returns a copy of the array with all false values removed\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n */\nfunction compact(array) {\n  const aResult = [];\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (array[idx]) { aResult.push(array[idx]); }\n  }\n  return aResult;\n}\n\n/**\n * produces a duplicate-free version of the array\n *\n * @param {Array} array\n */\nfunction unique(array) {\n  const results = [];\n\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!contains(results, array[idx])) {\n      results.push(array[idx]);\n    }\n  }\n\n  return results;\n}\n\n/**\n * returns next item.\n * @param {Array} array\n */\nfunction next(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx + 1];\n  }\n  return null;\n}\n\n/**\n * returns prev item.\n * @param {Array} array\n */\nfunction prev(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx - 1];\n  }\n  return null;\n}\n\n/**\n * @class core.list\n *\n * list utils\n *\n * @singleton\n * @alternateClassName list\n */\nexport default {\n  head,\n  last,\n  initial,\n  tail,\n  prev,\n  next,\n  find,\n  contains,\n  all,\n  sum,\n  from,\n  isEmpty,\n  clusterBy,\n  compact,\n  unique,\n};\n","import $ from 'jquery';\nimport func from './func';\nimport lists from './lists';\nimport env from './env';\n\nconst NBSP_CHAR = String.fromCharCode(160);\nconst ZERO_WIDTH_NBSP_CHAR = '\\ufeff';\n\n/**\n * @method isEditable\n *\n * returns whether node is `note-editable` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEditable(node) {\n  return node && $(node).hasClass('note-editable');\n}\n\n/**\n * @method isControlSizing\n *\n * returns whether node is `note-control-sizing` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isControlSizing(node) {\n  return node && $(node).hasClass('note-control-sizing');\n}\n\n/**\n * @method makePredByNodeName\n *\n * returns predicate which judge whether nodeName is same\n *\n * @param {String} nodeName\n * @return {Function}\n */\nfunction makePredByNodeName(nodeName) {\n  nodeName = nodeName.toUpperCase();\n  return function(node) {\n    return node && node.nodeName.toUpperCase() === nodeName;\n  };\n}\n\n/**\n * @method isText\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is text(3)\n */\nfunction isText(node) {\n  return node && node.nodeType === 3;\n}\n\n/**\n * @method isElement\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is element(1)\n */\nfunction isElement(node) {\n  return node && node.nodeType === 1;\n}\n\n/**\n * ex) br, col, embed, hr, img, input, ...\n * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n */\nfunction isVoid(node) {\n  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());\n}\n\nfunction isPara(node) {\n  if (isEditable(node)) {\n    return false;\n  }\n\n  // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph\n  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nfunction isHeading(node) {\n  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nconst isPre = makePredByNodeName('PRE');\n\nconst isLi = makePredByNodeName('LI');\n\nfunction isPurePara(node) {\n  return isPara(node) && !isLi(node);\n}\n\nconst isTable = makePredByNodeName('TABLE');\n\nconst isData = makePredByNodeName('DATA');\n\nfunction isInline(node) {\n  return !isBodyContainer(node) &&\n         !isList(node) &&\n         !isHr(node) &&\n         !isPara(node) &&\n         !isTable(node) &&\n         !isBlockquote(node) &&\n         !isData(node);\n}\n\nfunction isList(node) {\n  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());\n}\n\nconst isHr = makePredByNodeName('HR');\n\nfunction isCell(node) {\n  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());\n}\n\nconst isBlockquote = makePredByNodeName('BLOCKQUOTE');\n\nfunction isBodyContainer(node) {\n  return isCell(node) || isBlockquote(node) || isEditable(node);\n}\n\nconst isAnchor = makePredByNodeName('A');\n\nfunction isParaInline(node) {\n  return isInline(node) && !!ancestor(node, isPara);\n}\n\nfunction isBodyInline(node) {\n  return isInline(node) && !ancestor(node, isPara);\n}\n\nconst isBody = makePredByNodeName('BODY');\n\n/**\n * returns whether nodeB is closest sibling of nodeA\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @return {Boolean}\n */\nfunction isClosestSibling(nodeA, nodeB) {\n  return nodeA.nextSibling === nodeB ||\n         nodeA.previousSibling === nodeB;\n}\n\n/**\n * returns array of closest siblings with node\n *\n * @param {Node} node\n * @param {function} [pred] - predicate function\n * @return {Node[]}\n */\nfunction withClosestSiblings(node, pred) {\n  pred = pred || func.ok;\n\n  const siblings = [];\n  if (node.previousSibling && pred(node.previousSibling)) {\n    siblings.push(node.previousSibling);\n  }\n  siblings.push(node);\n  if (node.nextSibling && pred(node.nextSibling)) {\n    siblings.push(node.nextSibling);\n  }\n  return siblings;\n}\n\n/**\n * blank HTML for cursor position\n * - [workaround] old IE only works with &nbsp;\n * - [workaround] IE11 and other browser works with bogus br\n */\nconst blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';\n\n/**\n * @method nodeLength\n *\n * returns #text's text size or element's childNodes size\n *\n * @param {Node} node\n */\nfunction nodeLength(node) {\n  if (isText(node)) {\n    return node.nodeValue.length;\n  }\n\n  if (node) {\n    return node.childNodes.length;\n  }\n\n  return 0;\n}\n\n/**\n * returns whether deepest child node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction deepestChildIsEmpty(node) {\n  do {\n    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;\n  } while ((node = node.firstElementChild));\n\n  return isEmpty(node);\n}\n\n/**\n * returns whether node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEmpty(node) {\n  const len = nodeLength(node);\n\n  if (len === 0) {\n    return true;\n  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {\n    // ex) <p><br></p>, <span><br></span>\n    return true;\n  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {\n    // ex) <p></p>, <span></span>\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * padding blankHTML if node is empty (for cursor position)\n */\nfunction paddingBlankHTML(node) {\n  if (!isVoid(node) && !nodeLength(node)) {\n    node.innerHTML = blankHTML;\n  }\n}\n\n/**\n * find nearest ancestor predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction ancestor(node, pred) {\n  while (node) {\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * find nearest ancestor only single child blood line and predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction singleChildAncestor(node, pred) {\n  node = node.parentNode;\n\n  while (node) {\n    if (nodeLength(node) !== 1) { break; }\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * returns new array of ancestor nodes (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listAncestor(node, pred) {\n  pred = pred || func.fail;\n\n  const ancestors = [];\n  ancestor(node, function(el) {\n    if (!isEditable(el)) {\n      ancestors.push(el);\n    }\n\n    return pred(el);\n  });\n  return ancestors;\n}\n\n/**\n * find farthest ancestor predicate hit\n */\nfunction lastAncestor(node, pred) {\n  const ancestors = listAncestor(node);\n  return lists.last(ancestors.filter(pred));\n}\n\n/**\n * returns common ancestor node between two nodes.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n */\nfunction commonAncestor(nodeA, nodeB) {\n  const ancestors = listAncestor(nodeA);\n  for (let n = nodeB; n; n = n.parentNode) {\n    if (ancestors.indexOf(n) > -1) return n;\n  }\n  return null; // difference document area\n}\n\n/**\n * listing all previous siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listPrev(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.previousSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing next siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listNext(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.nextSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing descendant nodes\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listDescendant(node, pred) {\n  const descendants = [];\n  pred = pred || func.ok;\n\n  // start DFS(depth first search) with node\n  (function fnWalk(current) {\n    if (node !== current && pred(current)) {\n      descendants.push(current);\n    }\n    for (let idx = 0, len = current.childNodes.length; idx < len; idx++) {\n      fnWalk(current.childNodes[idx]);\n    }\n  })(node);\n\n  return descendants;\n}\n\n/**\n * wrap node with new tag.\n *\n * @param {Node} node\n * @param {Node} tagName of wrapper\n * @return {Node} - wrapper\n */\nfunction wrap(node, wrapperName) {\n  const parent = node.parentNode;\n  const wrapper = $('<' + wrapperName + '>')[0];\n\n  parent.insertBefore(wrapper, node);\n  wrapper.appendChild(node);\n\n  return wrapper;\n}\n\n/**\n * insert node after preceding\n *\n * @param {Node} node\n * @param {Node} preceding - predicate function\n */\nfunction insertAfter(node, preceding) {\n  const next = preceding.nextSibling;\n  let parent = preceding.parentNode;\n  if (next) {\n    parent.insertBefore(node, next);\n  } else {\n    parent.appendChild(node);\n  }\n  return node;\n}\n\n/**\n * append elements.\n *\n * @param {Node} node\n * @param {Collection} aChild\n */\nfunction appendChildNodes(node, aChild) {\n  $.each(aChild, function(idx, child) {\n    node.appendChild(child);\n  });\n  return node;\n}\n\n/**\n * returns whether boundaryPoint is left edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isLeftEdgePoint(point) {\n  return point.offset === 0;\n}\n\n/**\n * returns whether boundaryPoint is right edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isRightEdgePoint(point) {\n  return point.offset === nodeLength(point.node);\n}\n\n/**\n * returns whether boundaryPoint is edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isEdgePoint(point) {\n  return isLeftEdgePoint(point) || isRightEdgePoint(point);\n}\n\n/**\n * returns whether node is left edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgeOf(node, ancestor) {\n  while (node && node !== ancestor) {\n    if (position(node) !== 0) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether node is right edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgeOf(node, ancestor) {\n  if (!ancestor) {\n    return false;\n  }\n  while (node && node !== ancestor) {\n    if (position(node) !== nodeLength(node.parentNode) - 1) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether point is left edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgePointOf(point, ancestor) {\n  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns whether point is right edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgePointOf(point, ancestor) {\n  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns offset from parent.\n *\n * @param {Node} node\n */\nfunction position(node) {\n  let offset = 0;\n  while ((node = node.previousSibling)) {\n    offset += 1;\n  }\n  return offset;\n}\n\nfunction hasChildren(node) {\n  return !!(node && node.childNodes && node.childNodes.length);\n}\n\n/**\n * returns previous boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction prevPoint(point, isSkipInnerOffset) {\n  let node;\n  let offset;\n\n  if (point.offset === 0) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node);\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset - 1];\n    offset = nodeLength(node);\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? 0 : point.offset - 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPoint(point, isSkipInnerOffset) {\n  let node, offset;\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint with empty node\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPointWithEmptyNode(point, isSkipInnerOffset) {\n  let node, offset = 0;\n\n  // if node is empty string node, return current node's sibling.\n  if (isEmpty(point.node)) {\n    if(point.node === null){\n      return null;\n    }\n\n    node = point.node.nextSibling;\n    offset = 0;\n\n    return {\n      node: node,\n      offset: offset,\n    };\n  }\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node) + 1;\n\n    // if next node is editable ,  return current node's sibling node.\n    if (isEditable(node)) {\n      node = point.node.nextSibling;\n      offset = 0;\n    }\n\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n    if (isEmpty(node)) {\n      if (!isEmpty(point.node.nextSibling)) {\n        return {\n          node: point.node.nextSibling,\n          offset: offset,\n        };\n      }\n      return null;\n    }\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n\n    if (isEmpty(node)) {\n      return null;\n    }\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/*\n* returns the next Text node index or 0 if not found.\n*/\nfunction getNextTextNode(actual) {\n  if(!actual.nextSibling) return undefined;\n  if(actual.parent !== actual.nextSibling.parent) return undefined;\n\n  if(isText(actual.nextSibling) ) return actual.nextSibling;\n  else return getNextTextNode(actual.nextSibling);\n}\n\n/**\n * returns whether pointA and pointB is same or not.\n *\n * @param {BoundaryPoint} pointA\n * @param {BoundaryPoint} pointB\n * @return {Boolean}\n */\nfunction isSamePoint(pointA, pointB) {\n  return pointA.node === pointB.node && pointA.offset === pointB.offset;\n}\n\n/**\n * returns whether point is visible (can set cursor) or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isVisiblePoint(point) {\n  if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {\n    return true;\n  }\n\n  const leftNode = point.node.childNodes[point.offset - 1];\n  const rightNode = point.node.childNodes[point.offset];\n  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * @method prevPointUtil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction prevPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = prevPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * @method nextPointUntil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction nextPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = nextPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * returns whether point has character or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isCharPoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch && (ch !== ' ' && ch !== NBSP_CHAR);\n}\n\n/**\n * returns whether point has space or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isSpacePoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch === ' ' || ch === NBSP_CHAR;\n}\n\n/**\n * @method walkPoint\n *\n * @param {BoundaryPoint} startPoint\n * @param {BoundaryPoint} endPoint\n * @param {Function} handler\n * @param {Boolean} isSkipInnerOffset\n */\nfunction walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {\n  let point = startPoint;\n\n  while (point) {\n    handler(point);\n\n    if (isSamePoint(point, endPoint)) {\n      break;\n    }\n\n    const isSkipOffset = isSkipInnerOffset &&\n                       startPoint.node !== point.node &&\n                       endPoint.node !== point.node;\n    point = nextPointWithEmptyNode(point, isSkipOffset);\n  }\n}\n\n/**\n * @method makeOffsetPath\n *\n * return offsetPath(array of offset) from ancestor\n *\n * @param {Node} ancestor - ancestor node\n * @param {Node} node\n */\nfunction makeOffsetPath(ancestor, node) {\n  const ancestors = listAncestor(node, func.eq(ancestor));\n  return ancestors.map(position).reverse();\n}\n\n/**\n * @method fromOffsetPath\n *\n * return element from offsetPath(array of offset)\n *\n * @param {Node} ancestor - ancestor node\n * @param {array} offsets - offsetPath\n */\nfunction fromOffsetPath(ancestor, offsets) {\n  let current = ancestor;\n  for (let i = 0, len = offsets.length; i < len; i++) {\n    if (current.childNodes.length <= offsets[i]) {\n      current = current.childNodes[current.childNodes.length - 1];\n    } else {\n      current = current.childNodes[offsets[i]];\n    }\n  }\n  return current;\n}\n\n/**\n * @method splitNode\n *\n * split element or #text\n *\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @param {Boolean} [options.isDiscardEmptySplits] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitNode(point, options) {\n  let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;\n  const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;\n  const isDiscardEmptySplits = options && options.isDiscardEmptySplits;\n\n  if (isDiscardEmptySplits) {\n    isSkipPaddingBlankHTML = true;\n  }\n\n  // edge case\n  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {\n    if (isLeftEdgePoint(point)) {\n      return point.node;\n    } else if (isRightEdgePoint(point)) {\n      return point.node.nextSibling;\n    }\n  }\n\n  // split #text\n  if (isText(point.node)) {\n    return point.node.splitText(point.offset);\n  } else {\n    const childNode = point.node.childNodes[point.offset];\n    const clone = insertAfter(point.node.cloneNode(false), point.node);\n    appendChildNodes(clone, listNext(childNode));\n\n    if (!isSkipPaddingBlankHTML) {\n      paddingBlankHTML(point.node);\n      paddingBlankHTML(clone);\n    }\n\n    if (isDiscardEmptySplits) {\n      if (isEmpty(point.node)) {\n        remove(point.node);\n      }\n      if (isEmpty(clone)) {\n        remove(clone);\n        return point.node.nextSibling;\n      }\n    }\n\n    return clone;\n  }\n}\n\n/**\n * @method splitTree\n *\n * split tree by point\n *\n * @param {Node} root - split root\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitTree(root, point, options) {\n  // ex) [#text, <span>, <p>]\n  const ancestors = listAncestor(point.node, func.eq(root));\n\n  if (!ancestors.length) {\n    return null;\n  } else if (ancestors.length === 1) {\n    return splitNode(point, options);\n  }\n\n  return ancestors.reduce(function(node, parent) {\n    if (node === point.node) {\n      node = splitNode(point, options);\n    }\n\n    return splitNode({\n      node: parent,\n      offset: node ? position(node) : nodeLength(parent),\n    }, options);\n  });\n}\n\n/**\n * split point\n *\n * @param {Point} point\n * @param {Boolean} isInline\n * @return {Object}\n */\nfunction splitPoint(point, isInline) {\n  // find splitRoot, container\n  //  - inline: splitRoot is a child of paragraph\n  //  - block: splitRoot is a child of bodyContainer\n  const pred = isInline ? isPara : isBodyContainer;\n  const ancestors = listAncestor(point.node, pred);\n  const topAncestor = lists.last(ancestors) || point.node;\n\n  let splitRoot, container;\n  if (pred(topAncestor)) {\n    splitRoot = ancestors[ancestors.length - 2];\n    container = topAncestor;\n  } else {\n    splitRoot = topAncestor;\n    container = splitRoot.parentNode;\n  }\n\n  // if splitRoot is exists, split with splitTree\n  let pivot = splitRoot && splitTree(splitRoot, point, {\n    isSkipPaddingBlankHTML: isInline,\n    isNotSplitEdgePoint: isInline,\n  });\n\n  // if container is point.node, find pivot with point.offset\n  if (!pivot && container === point.node) {\n    pivot = point.node.childNodes[point.offset];\n  }\n\n  return {\n    rightNode: pivot,\n    container: container,\n  };\n}\n\nfunction create(nodeName) {\n  return document.createElement(nodeName);\n}\n\nfunction createText(text) {\n  return document.createTextNode(text);\n}\n\n/**\n * @method remove\n *\n * remove node, (isRemoveChild: remove child or not)\n *\n * @param {Node} node\n * @param {Boolean} isRemoveChild\n */\nfunction remove(node, isRemoveChild) {\n  if (!node || !node.parentNode) { return; }\n  if (node.removeNode) { return node.removeNode(isRemoveChild); }\n\n  const parent = node.parentNode;\n  if (!isRemoveChild) {\n    const nodes = [];\n    for (let i = 0, len = node.childNodes.length; i < len; i++) {\n      nodes.push(node.childNodes[i]);\n    }\n\n    for (let i = 0, len = nodes.length; i < len; i++) {\n      parent.insertBefore(nodes[i], node);\n    }\n  }\n\n  parent.removeChild(node);\n}\n\n/**\n * @method removeWhile\n *\n * @param {Node} node\n * @param {Function} pred\n */\nfunction removeWhile(node, pred) {\n  while (node) {\n    if (isEditable(node) || !pred(node)) {\n      break;\n    }\n\n    const parent = node.parentNode;\n    remove(node);\n    node = parent;\n  }\n}\n\n/**\n * @method replace\n *\n * replace node with provided nodeName\n *\n * @param {Node} node\n * @param {String} nodeName\n * @return {Node} - new node\n */\nfunction replace(node, nodeName) {\n  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {\n    return node;\n  }\n\n  const newNode = create(nodeName);\n\n  if (node.style.cssText) {\n    newNode.style.cssText = node.style.cssText;\n  }\n\n  appendChildNodes(newNode, lists.from(node.childNodes));\n  insertAfter(newNode, node);\n  remove(node);\n\n  return newNode;\n}\n\nconst isTextarea = makePredByNodeName('TEXTAREA');\n\n/**\n * @param {jQuery} $node\n * @param {Boolean} [stripLinebreaks] - default: false\n */\nfunction value($node, stripLinebreaks) {\n  const val = isTextarea($node[0]) ? $node.val() : $node.html();\n  if (stripLinebreaks) {\n    return val.replace(/[\\n\\r]/g, '');\n  }\n  return val;\n}\n\n/**\n * @method html\n *\n * get the HTML contents of node\n *\n * @param {jQuery} $node\n * @param {Boolean} [isNewlineOnBlock]\n */\nfunction html($node, isNewlineOnBlock) {\n  let markup = value($node);\n\n  if (isNewlineOnBlock) {\n    const regexTag = /<(\\/?)(\\b(?!!)[^>\\s]*)(.*?)(\\s*\\/?>)/g;\n    markup = markup.replace(regexTag, function(match, endSlash, name) {\n      name = name.toUpperCase();\n      const isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&\n                                   !!endSlash;\n      const isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);\n\n      return match + ((isEndOfInlineContainer || isBlockNode) ? '\\n' : '');\n    });\n    markup = markup.trim();\n  }\n\n  return markup;\n}\n\nfunction posFromPlaceholder(placeholder) {\n  const $placeholder = $(placeholder);\n  const pos = $placeholder.offset();\n  const height = $placeholder.outerHeight(true); // include margin\n\n  return {\n    left: pos.left,\n    top: pos.top + height,\n  };\n}\n\nfunction attachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.on(key, events[key]);\n  });\n}\n\nfunction detachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.off(key, events[key]);\n  });\n}\n\n/**\n * @method isCustomStyleTag\n *\n * assert if a node contains a \"note-styletag\" class,\n * which implies that's a custom-made style tag node\n *\n * @param {Node} an HTML DOM node\n */\nfunction isCustomStyleTag(node) {\n  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');\n}\n\nexport default {\n  /** @property {String} NBSP_CHAR */\n  NBSP_CHAR,\n  /** @property {String} ZERO_WIDTH_NBSP_CHAR */\n  ZERO_WIDTH_NBSP_CHAR,\n  /** @property {String} blank */\n  blank: blankHTML,\n  /** @property {String} emptyPara */\n  emptyPara: `<p>${blankHTML}</p>`,\n  makePredByNodeName,\n  isEditable,\n  isControlSizing,\n  isText,\n  isElement,\n  isVoid,\n  isPara,\n  isPurePara,\n  isHeading,\n  isInline,\n  isBlock: func.not(isInline),\n  isBodyInline,\n  isBody,\n  isParaInline,\n  isPre,\n  isList,\n  isTable,\n  isData,\n  isCell,\n  isBlockquote,\n  isBodyContainer,\n  isAnchor,\n  isDiv: makePredByNodeName('DIV'),\n  isLi,\n  isBR: makePredByNodeName('BR'),\n  isSpan: makePredByNodeName('SPAN'),\n  isB: makePredByNodeName('B'),\n  isU: makePredByNodeName('U'),\n  isS: makePredByNodeName('S'),\n  isI: makePredByNodeName('I'),\n  isImg: makePredByNodeName('IMG'),\n  isTextarea,\n  deepestChildIsEmpty,\n  isEmpty,\n  isEmptyAnchor: func.and(isAnchor, isEmpty),\n  isClosestSibling,\n  withClosestSiblings,\n  nodeLength,\n  isLeftEdgePoint,\n  isRightEdgePoint,\n  isEdgePoint,\n  isLeftEdgeOf,\n  isRightEdgeOf,\n  isLeftEdgePointOf,\n  isRightEdgePointOf,\n  prevPoint,\n  nextPoint,\n  nextPointWithEmptyNode,\n  isSamePoint,\n  isVisiblePoint,\n  prevPointUntil,\n  nextPointUntil,\n  isCharPoint,\n  isSpacePoint,\n  walkPoint,\n  ancestor,\n  singleChildAncestor,\n  listAncestor,\n  lastAncestor,\n  listNext,\n  listPrev,\n  listDescendant,\n  commonAncestor,\n  wrap,\n  insertAfter,\n  appendChildNodes,\n  position,\n  hasChildren,\n  makeOffsetPath,\n  fromOffsetPath,\n  splitTree,\n  splitPoint,\n  create,\n  createText,\n  remove,\n  removeWhile,\n  replace,\n  html,\n  value,\n  posFromPlaceholder,\n  attachEvents,\n  detachEvents,\n  isCustomStyleTag,\n};\n","import $ from 'jquery';\nimport func from './core/func';\nimport lists from './core/lists';\nimport dom from './core/dom';\n\nexport default class Context {\n  /**\n   * @param {jQuery} $note\n   * @param {Object} options\n   */\n  constructor($note, options) {\n    this.$note = $note;\n\n    this.memos = {};\n    this.modules = {};\n    this.layoutInfo = {};\n    this.options = $.extend(true, {}, options);\n\n    // init ui with options\n    $.summernote.ui = $.summernote.ui_template(this.options);\n    this.ui = $.summernote.ui;\n\n    this.initialize();\n  }\n\n  /**\n   * create layout and initialize modules and other resources\n   */\n  initialize() {\n    this.layoutInfo = this.ui.createLayout(this.$note);\n    this._initialize();\n    this.$note.hide();\n    return this;\n  }\n\n  /**\n   * destroy modules and other resources and remove layout\n   */\n  destroy() {\n    this._destroy();\n    this.$note.removeData('summernote');\n    this.ui.removeLayout(this.$note, this.layoutInfo);\n  }\n\n  /**\n   * destory modules and other resources and initialize it again\n   */\n  reset() {\n    const disabled = this.isDisabled();\n    this.code(dom.emptyPara);\n    this._destroy();\n    this._initialize();\n\n    if (disabled) {\n      this.disable();\n    }\n  }\n\n  _initialize() {\n    // set own id\n    this.options.id = func.uniqueId($.now());\n    // set default container for tooltips, popovers, and dialogs\n    this.options.container = this.options.container || this.layoutInfo.editor;\n\n    // add optional buttons\n    const buttons = $.extend({}, this.options.buttons);\n    Object.keys(buttons).forEach((key) => {\n      this.memo('button.' + key, buttons[key]);\n    });\n\n    const modules = $.extend({}, this.options.modules, $.summernote.plugins || {});\n\n    // add and initialize modules\n    Object.keys(modules).forEach((key) => {\n      this.module(key, modules[key], true);\n    });\n\n    Object.keys(this.modules).forEach((key) => {\n      this.initializeModule(key);\n    });\n  }\n\n  _destroy() {\n    // destroy modules with reversed order\n    Object.keys(this.modules).reverse().forEach((key) => {\n      this.removeModule(key);\n    });\n\n    Object.keys(this.memos).forEach((key) => {\n      this.removeMemo(key);\n    });\n    // trigger custom onDestroy callback\n    this.triggerEvent('destroy', this);\n  }\n\n  code(html) {\n    const isActivated = this.invoke('codeview.isActivated');\n\n    if (html === undefined) {\n      this.invoke('codeview.sync');\n      return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();\n    } else {\n      if (isActivated) {\n        this.invoke('codeview.sync', html);\n      } else {\n        this.layoutInfo.editable.html(html);\n      }\n      this.$note.val(html);\n      this.triggerEvent('change', html, this.layoutInfo.editable);\n    }\n  }\n\n  isDisabled() {\n    return this.layoutInfo.editable.attr('contenteditable') === 'false';\n  }\n\n  enable() {\n    this.layoutInfo.editable.attr('contenteditable', true);\n    this.invoke('toolbar.activate', true);\n    this.triggerEvent('disable', false);\n    this.options.editing = true;\n  }\n\n  disable() {\n    // close codeview if codeview is opend\n    if (this.invoke('codeview.isActivated')) {\n      this.invoke('codeview.deactivate');\n    }\n    this.layoutInfo.editable.attr('contenteditable', false);\n    this.options.editing = false;\n    this.invoke('toolbar.deactivate', true);\n\n    this.triggerEvent('disable', true);\n  }\n\n  triggerEvent() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];\n    if (callback) {\n      callback.apply(this.$note[0], args);\n    }\n    this.$note.trigger('summernote.' + namespace, args);\n  }\n\n  initializeModule(key) {\n    const module = this.modules[key];\n    module.shouldInitialize = module.shouldInitialize || func.ok;\n    if (!module.shouldInitialize()) {\n      return;\n    }\n\n    // initialize module\n    if (module.initialize) {\n      module.initialize();\n    }\n\n    // attach events\n    if (module.events) {\n      dom.attachEvents(this.$note, module.events);\n    }\n  }\n\n  module(key, ModuleClass, withoutIntialize) {\n    if (arguments.length === 1) {\n      return this.modules[key];\n    }\n\n    this.modules[key] = new ModuleClass(this);\n\n    if (!withoutIntialize) {\n      this.initializeModule(key);\n    }\n  }\n\n  removeModule(key) {\n    const module = this.modules[key];\n    if (module.shouldInitialize()) {\n      if (module.events) {\n        dom.detachEvents(this.$note, module.events);\n      }\n\n      if (module.destroy) {\n        module.destroy();\n      }\n    }\n\n    delete this.modules[key];\n  }\n\n  memo(key, obj) {\n    if (arguments.length === 1) {\n      return this.memos[key];\n    }\n    this.memos[key] = obj;\n  }\n\n  removeMemo(key) {\n    if (this.memos[key] && this.memos[key].destroy) {\n      this.memos[key].destroy();\n    }\n\n    delete this.memos[key];\n  }\n\n  /**\n   * Some buttons need to change their visual style immediately once they get pressed\n   */\n  createInvokeHandlerAndUpdateState(namespace, value) {\n    return (event) => {\n      this.createInvokeHandler(namespace, value)(event);\n      this.invoke('buttons.updateCurrentStyle');\n    };\n  }\n\n  createInvokeHandler(namespace, value) {\n    return (event) => {\n      event.preventDefault();\n      const $target = $(event.target);\n      this.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);\n    };\n  }\n\n  invoke() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const splits = namespace.split('.');\n    const hasSeparator = splits.length > 1;\n    const moduleName = hasSeparator && lists.head(splits);\n    const methodName = hasSeparator ? lists.last(splits) : lists.head(splits);\n\n    const module = this.modules[moduleName || 'editor'];\n    if (!moduleName && this[methodName]) {\n      return this[methodName].apply(this, args);\n    } else if (module && module[methodName] && module.shouldInitialize()) {\n      return module[methodName].apply(module, args);\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from './core/env';\nimport lists from './core/lists';\nimport Context from './Context';\n\n$.fn.extend({\n  /**\n   * Summernote API\n   *\n   * @param {Object|String}\n   * @return {this}\n   */\n  summernote: function() {\n    const type = $.type(lists.head(arguments));\n    const isExternalAPICalled = type === 'string';\n    const hasInitOptions = type === 'object';\n\n    const options = $.extend({}, $.summernote.options, hasInitOptions ? lists.head(arguments) : {});\n\n    // Update options\n    options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);\n    options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons);\n    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;\n\n    this.each((idx, note) => {\n      const $note = $(note);\n      if (!$note.data('summernote')) {\n        const context = new Context($note, options);\n        $note.data('summernote', context);\n        $note.data('summernote').triggerEvent('init', context.layoutInfo);\n      }\n    });\n\n    const $note = this.first();\n    if ($note.length) {\n      const context = $note.data('summernote');\n      if (isExternalAPICalled) {\n        return context.invoke.apply(context, lists.from(arguments));\n      } else if (options.focus) {\n        context.invoke('editor.focus');\n      }\n    }\n\n    return this;\n  },\n});\n","import $ from 'jquery';\nimport env from './env';\nimport func from './func';\nimport lists from './lists';\nimport dom from './dom';\n\n/**\n * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js\n *\n * @param {TextRange} textRange\n * @param {Boolean} isStart\n * @return {BoundaryPoint}\n *\n * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx\n */\nfunction textRangeToPoint(textRange, isStart) {\n  let container = textRange.parentElement();\n  let offset;\n\n  const tester = document.body.createTextRange();\n  let prevContainer;\n  const childNodes = lists.from(container.childNodes);\n  for (offset = 0; offset < childNodes.length; offset++) {\n    if (dom.isText(childNodes[offset])) {\n      continue;\n    }\n    tester.moveToElementText(childNodes[offset]);\n    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {\n      break;\n    }\n    prevContainer = childNodes[offset];\n  }\n\n  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {\n    const textRangeStart = document.body.createTextRange();\n    let curTextNode = null;\n    textRangeStart.moveToElementText(prevContainer || container);\n    textRangeStart.collapse(!prevContainer);\n    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;\n\n    const pointTester = textRange.duplicate();\n    pointTester.setEndPoint('StartToStart', textRangeStart);\n    let textCount = pointTester.text.replace(/[\\r\\n]/g, '').length;\n\n    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    // [workaround] enforce IE to re-reference curTextNode, hack\n    const dummy = curTextNode.nodeValue; // eslint-disable-line\n\n    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&\n      textCount === curTextNode.nodeValue.length) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    container = curTextNode;\n    offset = textCount;\n  }\n\n  return {\n    cont: container,\n    offset: offset,\n  };\n}\n\n/**\n * return TextRange from boundary point (inspired by google closure-library)\n * @param {BoundaryPoint} point\n * @return {TextRange}\n */\nfunction pointToTextRange(point) {\n  const textRangeInfo = function(container, offset) {\n    let node, isCollapseToStart;\n\n    if (dom.isText(container)) {\n      const prevTextNodes = dom.listPrev(container, func.not(dom.isText));\n      const prevContainer = lists.last(prevTextNodes).previousSibling;\n      node = prevContainer || container.parentNode;\n      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);\n      isCollapseToStart = !prevContainer;\n    } else {\n      node = container.childNodes[offset] || container;\n      if (dom.isText(node)) {\n        return textRangeInfo(node, 0);\n      }\n\n      offset = 0;\n      isCollapseToStart = false;\n    }\n\n    return {\n      node: node,\n      collapseToStart: isCollapseToStart,\n      offset: offset,\n    };\n  };\n\n  const textRange = document.body.createTextRange();\n  const info = textRangeInfo(point.node, point.offset);\n\n  textRange.moveToElementText(info.node);\n  textRange.collapse(info.collapseToStart);\n  textRange.moveStart('character', info.offset);\n  return textRange;\n}\n\n/**\n   * Wrapped Range\n   *\n   * @constructor\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   */\nclass WrappedRange {\n  constructor(sc, so, ec, eo) {\n    this.sc = sc;\n    this.so = so;\n    this.ec = ec;\n    this.eo = eo;\n\n    // isOnEditable: judge whether range is on editable or not\n    this.isOnEditable = this.makeIsOn(dom.isEditable);\n    // isOnList: judge whether range is on list node or not\n    this.isOnList = this.makeIsOn(dom.isList);\n    // isOnAnchor: judge whether range is on anchor node or not\n    this.isOnAnchor = this.makeIsOn(dom.isAnchor);\n    // isOnCell: judge whether range is on cell node or not\n    this.isOnCell = this.makeIsOn(dom.isCell);\n    // isOnData: judge whether range is on data node or not\n    this.isOnData = this.makeIsOn(dom.isData);\n  }\n\n  // nativeRange: get nativeRange from sc, so, ec, eo\n  nativeRange() {\n    if (env.isW3CRangeSupport) {\n      const w3cRange = document.createRange();\n      w3cRange.setStart(this.sc, this.so);\n      w3cRange.setEnd(this.ec, this.eo);\n\n      return w3cRange;\n    } else {\n      const textRange = pointToTextRange({\n        node: this.sc,\n        offset: this.so,\n      });\n\n      textRange.setEndPoint('EndToEnd', pointToTextRange({\n        node: this.ec,\n        offset: this.eo,\n      }));\n\n      return textRange;\n    }\n  }\n\n  getPoints() {\n    return {\n      sc: this.sc,\n      so: this.so,\n      ec: this.ec,\n      eo: this.eo,\n    };\n  }\n\n  getStartPoint() {\n    return {\n      node: this.sc,\n      offset: this.so,\n    };\n  }\n\n  getEndPoint() {\n    return {\n      node: this.ec,\n      offset: this.eo,\n    };\n  }\n\n  /**\n   * select update visible range\n   */\n  select() {\n    const nativeRng = this.nativeRange();\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (selection.rangeCount > 0) {\n        selection.removeAllRanges();\n      }\n      selection.addRange(nativeRng);\n    } else {\n      nativeRng.select();\n    }\n\n    return this;\n  }\n\n  /**\n   * Moves the scrollbar to start container(sc) of current range\n   *\n   * @return {WrappedRange}\n   */\n  scrollIntoView(container) {\n    const height = $(container).height();\n    if (container.scrollTop + height < this.sc.offsetTop) {\n      container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);\n    }\n\n    return this;\n  }\n\n  /**\n   * @return {WrappedRange}\n   */\n  normalize() {\n    /**\n     * @param {BoundaryPoint} point\n     * @param {Boolean} isLeftToRight - true: prefer to choose right node\n     *                                - false: prefer to choose left node\n     * @return {BoundaryPoint}\n     */\n    const getVisiblePoint = function(point, isLeftToRight) {\n      if (!point) {\n        return point;\n      }\n\n      // Just use the given point [XXX:Adhoc]\n      //  - case 01. if the point is on the middle of the node\n      //  - case 02. if the point is on the right edge and prefer to choose left node\n      //  - case 03. if the point is on the left edge and prefer to choose right node\n      //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void\n      //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void\n      //  - case 06. if the point is on the block node and there is no children\n      if (dom.isVisiblePoint(point)) {\n        if (!dom.isEdgePoint(point) ||\n            (dom.isRightEdgePoint(point) && !isLeftToRight) ||\n            (dom.isLeftEdgePoint(point) && isLeftToRight) ||\n            (dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling)) ||\n            (dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling)) ||\n            (dom.isBlock(point.node) && dom.isEmpty(point.node))) {\n          return point;\n        }\n      }\n\n      // point on block's edge\n      const block = dom.ancestor(point.node, dom.isBlock);\n      let hasRightNode = false;\n\n      if (!hasRightNode) {\n        const prevPoint = dom.prevPoint(point) || { node: null };\n        hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;\n      }\n\n      let hasLeftNode = false;\n      if (!hasLeftNode) {\n        const nextPoint = dom.nextPoint(point) || { node: null };\n        hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(nextPoint.node)) && isLeftToRight;\n      }\n\n      if (hasRightNode || hasLeftNode) {\n        // returns point already on visible point\n        if (dom.isVisiblePoint(point)) {\n          return point;\n        }\n        // reverse direction\n        isLeftToRight = !isLeftToRight;\n      }\n\n      const nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint)\n        : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);\n      return nextPoint || point;\n    };\n\n    const endPoint = getVisiblePoint(this.getEndPoint(), false);\n    const startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns matched nodes on range\n   *\n   * @param {Function} [pred] - predicate function\n   * @param {Object} [options]\n   * @param {Boolean} [options.includeAncestor]\n   * @param {Boolean} [options.fullyContains]\n   * @return {Node[]}\n   */\n  nodes(pred, options) {\n    pred = pred || func.ok;\n\n    const includeAncestor = options && options.includeAncestor;\n    const fullyContains = options && options.fullyContains;\n\n    // TODO compare points and sort\n    const startPoint = this.getStartPoint();\n    const endPoint = this.getEndPoint();\n\n    const nodes = [];\n    const leftEdgeNodes = [];\n\n    dom.walkPoint(startPoint, endPoint, function(point) {\n      if (dom.isEditable(point.node)) {\n        return;\n      }\n\n      let node;\n      if (fullyContains) {\n        if (dom.isLeftEdgePoint(point)) {\n          leftEdgeNodes.push(point.node);\n        }\n        if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {\n          node = point.node;\n        }\n      } else if (includeAncestor) {\n        node = dom.ancestor(point.node, pred);\n      } else {\n        node = point.node;\n      }\n\n      if (node && pred(node)) {\n        nodes.push(node);\n      }\n    }, true);\n\n    return lists.unique(nodes);\n  }\n\n  /**\n   * returns commonAncestor of range\n   * @return {Element} - commonAncestor\n   */\n  commonAncestor() {\n    return dom.commonAncestor(this.sc, this.ec);\n  }\n\n  /**\n   * returns expanded range by pred\n   *\n   * @param {Function} pred - predicate function\n   * @return {WrappedRange}\n   */\n  expand(pred) {\n    const startAncestor = dom.ancestor(this.sc, pred);\n    const endAncestor = dom.ancestor(this.ec, pred);\n\n    if (!startAncestor && !endAncestor) {\n      return new WrappedRange(this.sc, this.so, this.ec, this.eo);\n    }\n\n    const boundaryPoints = this.getPoints();\n\n    if (startAncestor) {\n      boundaryPoints.sc = startAncestor;\n      boundaryPoints.so = 0;\n    }\n\n    if (endAncestor) {\n      boundaryPoints.ec = endAncestor;\n      boundaryPoints.eo = dom.nodeLength(endAncestor);\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * @param {Boolean} isCollapseToStart\n   * @return {WrappedRange}\n   */\n  collapse(isCollapseToStart) {\n    if (isCollapseToStart) {\n      return new WrappedRange(this.sc, this.so, this.sc, this.so);\n    } else {\n      return new WrappedRange(this.ec, this.eo, this.ec, this.eo);\n    }\n  }\n\n  /**\n   * splitText on range\n   */\n  splitText() {\n    const isSameContainer = this.sc === this.ec;\n    const boundaryPoints = this.getPoints();\n\n    if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {\n      this.ec.splitText(this.eo);\n    }\n\n    if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {\n      boundaryPoints.sc = this.sc.splitText(this.so);\n      boundaryPoints.so = 0;\n\n      if (isSameContainer) {\n        boundaryPoints.ec = boundaryPoints.sc;\n        boundaryPoints.eo = this.eo - this.so;\n      }\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * delete contents on range\n   * @return {WrappedRange}\n   */\n  deleteContents() {\n    if (this.isCollapsed()) {\n      return this;\n    }\n\n    const rng = this.splitText();\n    const nodes = rng.nodes(null, {\n      fullyContains: true,\n    });\n\n    // find new cursor point\n    const point = dom.prevPointUntil(rng.getStartPoint(), function(point) {\n      return !lists.contains(nodes, point.node);\n    });\n\n    const emptyParents = [];\n    $.each(nodes, function(idx, node) {\n      // find empty parents\n      const parent = node.parentNode;\n      if (point.node !== parent && dom.nodeLength(parent) === 1) {\n        emptyParents.push(parent);\n      }\n      dom.remove(node, false);\n    });\n\n    // remove empty parents\n    $.each(emptyParents, function(idx, node) {\n      dom.remove(node, false);\n    });\n\n    return new WrappedRange(\n      point.node,\n      point.offset,\n      point.node,\n      point.offset\n    ).normalize();\n  }\n\n  /**\n   * makeIsOn: return isOn(pred) function\n   */\n  makeIsOn(pred) {\n    return function() {\n      const ancestor = dom.ancestor(this.sc, pred);\n      return !!ancestor && (ancestor === dom.ancestor(this.ec, pred));\n    };\n  }\n\n  /**\n   * @param {Function} pred\n   * @return {Boolean}\n   */\n  isLeftEdgeOf(pred) {\n    if (!dom.isLeftEdgePoint(this.getStartPoint())) {\n      return false;\n    }\n\n    const node = dom.ancestor(this.sc, pred);\n    return node && dom.isLeftEdgeOf(this.sc, node);\n  }\n\n  /**\n   * returns whether range was collapsed or not\n   */\n  isCollapsed() {\n    return this.sc === this.ec && this.so === this.eo;\n  }\n\n  /**\n   * wrap inline nodes which children of body with paragraph\n   *\n   * @return {WrappedRange}\n   */\n  wrapBodyInlineWithPara() {\n    if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {\n      this.sc.innerHTML = dom.emptyPara;\n      return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);\n    }\n\n    /**\n     * [workaround] firefox often create range on not visible point. so normalize here.\n     *  - firefox: |<p>text</p>|\n     *  - chrome: <p>|text|</p>\n     */\n    const rng = this.normalize();\n    if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {\n      return rng;\n    }\n\n    // find inline top ancestor\n    let topAncestor;\n    if (dom.isInline(rng.sc)) {\n      const ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));\n      topAncestor = lists.last(ancestors);\n      if (!dom.isInline(topAncestor)) {\n        topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];\n      }\n    } else {\n      topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];\n    }\n\n    if (topAncestor) {\n      // siblings not in paragraph\n      let inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();\n      inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));\n\n      // wrap with paragraph\n      if (inlineSiblings.length) {\n        const para = dom.wrap(lists.head(inlineSiblings), 'p');\n        dom.appendChildNodes(para, lists.tail(inlineSiblings));\n      }\n    }\n\n    return this.normalize();\n  }\n\n  /**\n   * insert node at current cursor\n   *\n   * @param {Node} node\n   * @return {Node}\n   */\n  insertNode(node) {\n    let rng = this;\n\n    if (dom.isText(node) || dom.isInline(node)) {\n      rng = this.wrapBodyInlineWithPara().deleteContents();\n    }\n\n    const info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));\n    if (info.rightNode) {\n      info.rightNode.parentNode.insertBefore(node, info.rightNode);\n      if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {\n        info.rightNode.parentNode.removeChild(info.rightNode);\n      }\n    } else {\n      info.container.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * insert html at current cursor\n   */\n  pasteHTML(markup) {\n    markup = $.trim(markup);\n\n    const contentsContainer = $('<div></div>').html(markup)[0];\n    let childNodes = lists.from(contentsContainer.childNodes);\n\n    // const rng = this.wrapBodyInlineWithPara().deleteContents();\n    const rng = this;\n    let reversed = false;\n\n    if (rng.so >= 0) {\n      childNodes = childNodes.reverse();\n      reversed = true;\n    }\n\n    childNodes = childNodes.map(function(childNode) {\n      return rng.insertNode(childNode);\n    });\n\n    if (reversed) {\n      childNodes = childNodes.reverse();\n    }\n    return childNodes;\n  }\n\n  /**\n   * returns text in range\n   *\n   * @return {String}\n   */\n  toString() {\n    const nativeRng = this.nativeRange();\n    return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;\n  }\n\n  /**\n   * returns range for word before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordRange(findAfter) {\n    let endPoint = this.getEndPoint();\n\n    if (!dom.isCharPoint(endPoint)) {\n      return this;\n    }\n\n    const startPoint = dom.prevPointUntil(endPoint, function(point) {\n      return !dom.isCharPoint(point);\n    });\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, function(point) {\n        return !dom.isCharPoint(point);\n      });\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordsRange(findAfter) {\n    var endPoint = this.getEndPoint();\n\n    var isNotTextPoint = function(point) {\n      return !dom.isCharPoint(point) && !dom.isSpacePoint(point);\n    };\n\n    if (isNotTextPoint(endPoint)) {\n      return this;\n    }\n\n    var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor that match with a Regex\n   *\n   * example:\n   *  range: 'hi @Peter Pan'\n   *  regex: '/@[a-z ]+/i'\n   *  return range: '@Peter Pan'\n   *\n   * @param {RegExp} [regex]\n   * @return {WrappedRange|null}\n   */\n  getWordsMatchRange(regex) {\n    var endPoint = this.getEndPoint();\n\n    var startPoint = dom.prevPointUntil(endPoint, function(point) {\n      if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {\n        return true;\n      }\n      var rng = new WrappedRange(\n        point.node,\n        point.offset,\n        endPoint.node,\n        endPoint.offset\n      );\n      var result = regex.exec(rng.toString());\n      return result && result.index === 0;\n    });\n\n    var rng = new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n\n    var text = rng.toString();\n    var result = regex.exec(text);\n\n    if (result && result[0].length === text.length) {\n      return rng;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * create offsetPath bookmark\n   *\n   * @param {Node} editable\n   */\n  bookmark(editable) {\n    return {\n      s: {\n        path: dom.makeOffsetPath(editable, this.sc),\n        offset: this.so,\n      },\n      e: {\n        path: dom.makeOffsetPath(editable, this.ec),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * create offsetPath bookmark base on paragraph\n   *\n   * @param {Node[]} paras\n   */\n  paraBookmark(paras) {\n    return {\n      s: {\n        path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),\n        offset: this.so,\n      },\n      e: {\n        path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * getClientRects\n   * @return {Rect[]}\n   */\n  getClientRects() {\n    const nativeRng = this.nativeRange();\n    return nativeRng.getClientRects();\n  }\n}\n\n/**\n * Data structure\n *  * BoundaryPoint: a point of dom tree\n *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range\n *\n * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position\n */\nexport default {\n  /**\n   * create Range Object From arguments or Browser Selection\n   *\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   * @return {WrappedRange}\n   */\n  create: function(sc, so, ec, eo) {\n    if (arguments.length === 4) {\n      return new WrappedRange(sc, so, ec, eo);\n    } else if (arguments.length === 2) { // collapsed\n      ec = sc;\n      eo = so;\n      return new WrappedRange(sc, so, ec, eo);\n    } else {\n      let wrappedRange = this.createFromSelection();\n\n      if (!wrappedRange && arguments.length === 1) {\n        let bodyElement = arguments[0];\n        if (dom.isEditable(bodyElement)) {\n          bodyElement = bodyElement.lastChild;\n        }\n        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);\n      }\n      return wrappedRange;\n    }\n  },\n\n  createFromBodyElement: function(bodyElement, isCollapseToStart = false) {\n    var wrappedRange = this.createFromNode(bodyElement);\n    return wrappedRange.collapse(isCollapseToStart);\n  },\n\n  createFromSelection: function() {\n    let sc, so, ec, eo;\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (!selection || selection.rangeCount === 0) {\n        return null;\n      } else if (dom.isBody(selection.anchorNode)) {\n        // Firefox: returns entire body as range on initialization.\n        // We won't never need it.\n        return null;\n      }\n\n      const nativeRng = selection.getRangeAt(0);\n      sc = nativeRng.startContainer;\n      so = nativeRng.startOffset;\n      ec = nativeRng.endContainer;\n      eo = nativeRng.endOffset;\n    } else { // IE8: TextRange\n      const textRange = document.selection.createRange();\n      const textRangeEnd = textRange.duplicate();\n      textRangeEnd.collapse(false);\n      const textRangeStart = textRange;\n      textRangeStart.collapse(true);\n\n      let startPoint = textRangeToPoint(textRangeStart, true);\n      let endPoint = textRangeToPoint(textRangeEnd, false);\n\n      // same visible point case: range was collapsed.\n      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&\n        dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&\n        endPoint.node.nextSibling === startPoint.node) {\n        startPoint = endPoint;\n      }\n\n      sc = startPoint.cont;\n      so = startPoint.offset;\n      ec = endPoint.cont;\n      eo = endPoint.offset;\n    }\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from node\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNode: function(node) {\n    let sc = node;\n    let so = 0;\n    let ec = node;\n    let eo = dom.nodeLength(ec);\n\n    // browsers can't target a picture or void node\n    if (dom.isVoid(sc)) {\n      so = dom.listPrev(sc).length - 1;\n      sc = sc.parentNode;\n    }\n    if (dom.isBR(ec)) {\n      eo = dom.listPrev(ec).length - 1;\n      ec = ec.parentNode;\n    } else if (dom.isVoid(ec)) {\n      eo = dom.listPrev(ec).length;\n      ec = ec.parentNode;\n    }\n\n    return this.create(sc, so, ec, eo);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeBefore: function(node) {\n    return this.createFromNode(node).collapse(true);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeAfter: function(node) {\n    return this.createFromNode(node).collapse();\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from bookmark\n   *\n   * @param {Node} editable\n   * @param {Object} bookmark\n   * @return {WrappedRange}\n   */\n  createFromBookmark: function(editable, bookmark) {\n    const sc = dom.fromOffsetPath(editable, bookmark.s.path);\n    const so = bookmark.s.offset;\n    const ec = dom.fromOffsetPath(editable, bookmark.e.path);\n    const eo = bookmark.e.offset;\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from paraBookmark\n   *\n   * @param {Object} bookmark\n   * @param {Node[]} paras\n   * @return {WrappedRange}\n   */\n  createFromParaBookmark: function(bookmark, paras) {\n    const so = bookmark.s.offset;\n    const eo = bookmark.e.offset;\n    const sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);\n    const ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n};\n","import lists from './lists';\nimport func from './func';\n\nconst KEY_MAP = {\n  'BACKSPACE': 8,\n  'TAB': 9,\n  'ENTER': 13,\n  'ESCAPE': 27,\n  'SPACE': 32,\n  'DELETE': 46,\n\n  // Arrow\n  'LEFT': 37,\n  'UP': 38,\n  'RIGHT': 39,\n  'DOWN': 40,\n\n  // Number: 0-9\n  'NUM0': 48,\n  'NUM1': 49,\n  'NUM2': 50,\n  'NUM3': 51,\n  'NUM4': 52,\n  'NUM5': 53,\n  'NUM6': 54,\n  'NUM7': 55,\n  'NUM8': 56,\n\n  // Alphabet: a-z\n  'B': 66,\n  'E': 69,\n  'I': 73,\n  'J': 74,\n  'K': 75,\n  'L': 76,\n  'R': 82,\n  'S': 83,\n  'U': 85,\n  'V': 86,\n  'Y': 89,\n  'Z': 90,\n\n  'SLASH': 191,\n  'LEFTBRACKET': 219,\n  'BACKSLASH': 220,\n  'RIGHTBRACKET': 221,\n\n  // Navigation\n  'HOME': 36,\n  'END': 35,\n  'PAGEUP': 33,\n  'PAGEDOWN': 34,\n};\n\n/**\n * @class core.key\n *\n * Object for keycodes.\n *\n * @singleton\n * @alternateClassName key\n */\nexport default {\n  /**\n   * @method isEdit\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isEdit: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.BACKSPACE,\n      KEY_MAP.TAB,\n      KEY_MAP.ENTER,\n      KEY_MAP.SPACE,\n      KEY_MAP.DELETE,\n    ], keyCode);\n  },\n  /**\n   * @method isMove\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isMove: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.LEFT,\n      KEY_MAP.UP,\n      KEY_MAP.RIGHT,\n      KEY_MAP.DOWN,\n    ], keyCode);\n  },\n  /**\n   * @method isNavigation\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isNavigation: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.HOME,\n      KEY_MAP.END,\n      KEY_MAP.PAGEUP,\n      KEY_MAP.PAGEDOWN,\n    ], keyCode);\n  },\n  /**\n   * @property {Object} nameFromCode\n   * @property {String} nameFromCode.8 \"BACKSPACE\"\n   */\n  nameFromCode: func.invertObject(KEY_MAP),\n  code: KEY_MAP,\n};\n","import $ from 'jquery';\n\n/**\n * @method readFileAsDataURL\n *\n * read contents of file as representing URL\n *\n * @param {File} file\n * @return {Promise} - then: dataUrl\n */\nexport function readFileAsDataURL(file) {\n  return $.Deferred((deferred) => {\n    $.extend(new FileReader(), {\n      onload: (e) => {\n        const dataURL = e.target.result;\n        deferred.resolve(dataURL);\n      },\n      onerror: (err) => {\n        deferred.reject(err);\n      },\n    }).readAsDataURL(file);\n  }).promise();\n}\n\n/**\n * @method createImage\n *\n * create `<image>` from url string\n *\n * @param {String} url\n * @return {Promise} - then: $image\n */\nexport function createImage(url) {\n  return $.Deferred((deferred) => {\n    const $img = $('<img>');\n\n    $img.one('load', () => {\n      $img.off('error abort');\n      deferred.resolve($img);\n    }).one('error abort', () => {\n      $img.off('load').detach();\n      deferred.reject($img);\n    }).css({\n      display: 'none',\n    }).appendTo(document.body).attr('src', url);\n  }).promise();\n}\n","import range from '../core/range';\n\nexport default class History {\n  constructor(context) {\n    this.stack = [];\n    this.stackOffset = -1;\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n    this.editable = this.$editable[0];\n  }\n\n  makeSnapshot() {\n    const rng = range.create(this.editable);\n    const emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };\n\n    return {\n      contents: this.$editable.html(),\n      bookmark: ((rng && rng.isOnEditable()) ? rng.bookmark(this.editable) : emptyBookmark),\n    };\n  }\n\n  applySnapshot(snapshot) {\n    if (snapshot.contents !== null) {\n      this.$editable.html(snapshot.contents);\n    }\n    if (snapshot.bookmark !== null) {\n      range.createFromBookmark(this.editable, snapshot.bookmark).select();\n    }\n  }\n\n  /**\n  * @method rewind\n  * Rewinds the history stack back to the first snapshot taken.\n  * Leaves the stack intact, so that \"Redo\" can still be used.\n  */\n  rewind() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    // Return to the first available snapshot.\n    this.stackOffset = 0;\n\n    // Apply that snapshot.\n    this.applySnapshot(this.stack[this.stackOffset]);\n  }\n\n  /**\n  *  @method commit\n  *  Resets history stack, but keeps current editor's content.\n  */\n  commit() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n  * @method reset\n  * Resets the history stack completely; reverting to an empty editor.\n  */\n  reset() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Clear the editable area.\n    this.$editable.html('');\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    if (this.stackOffset > 0) {\n      this.stackOffset--;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    if (this.stack.length - 1 > this.stackOffset) {\n      this.stackOffset++;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * recorded undo\n   */\n  recordUndo() {\n    this.stackOffset++;\n\n    // Wash out stack after stackOffset\n    if (this.stack.length > this.stackOffset) {\n      this.stack = this.stack.slice(0, this.stackOffset);\n    }\n\n    // Create new snapshot and push it to the end\n    this.stack.push(this.makeSnapshot());\n\n    // If the stack size reachs to the limit, then slice it\n    if (this.stack.length > this.context.options.historyLimit) {\n      this.stack.shift();\n      this.stackOffset -= 1;\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class Style {\n  /**\n   * @method jQueryCSS\n   *\n   * [workaround] for old jQuery\n   * passing an array of style properties to .css()\n   * will result in an object of property-value pairs.\n   * (compability with version < 1.9)\n   *\n   * @private\n   * @param  {jQuery} $obj\n   * @param  {Array} propertyNames - An array of one or more CSS properties.\n   * @return {Object}\n   */\n  jQueryCSS($obj, propertyNames) {\n    const result = {};\n    $.each(propertyNames, (idx, propertyName) => {\n      result[propertyName] = $obj.css(propertyName);\n    });\n    return result;\n  }\n\n  /**\n   * returns style object from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  fromNode($node) {\n    const properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];\n    const styleInfo = this.jQueryCSS($node, properties) || {};\n\n    const fontSize = $node[0].style.fontSize || styleInfo['font-size'];\n\n    styleInfo['font-size'] = parseInt(fontSize, 10);\n    styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);\n\n    return styleInfo;\n  }\n\n  /**\n   * paragraph level style\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} styleInfo\n   */\n  stylePara(rng, styleInfo) {\n    $.each(rng.nodes(dom.isPara, {\n      includeAncestor: true,\n    }), (idx, para) => {\n      $(para).css(styleInfo);\n    });\n  }\n\n  /**\n   * insert and returns styleNodes on range.\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} [options] - options for styleNodes\n   * @param {String} [options.nodeName] - default: `SPAN`\n   * @param {Boolean} [options.expandClosestSibling] - default: `false`\n   * @param {Boolean} [options.onlyPartialContains] - default: `false`\n   * @return {Node[]}\n   */\n  styleNodes(rng, options) {\n    rng = rng.splitText();\n\n    const nodeName = (options && options.nodeName) || 'SPAN';\n    const expandClosestSibling = !!(options && options.expandClosestSibling);\n    const onlyPartialContains = !!(options && options.onlyPartialContains);\n\n    if (rng.isCollapsed()) {\n      return [rng.insertNode(dom.create(nodeName))];\n    }\n\n    let pred = dom.makePredByNodeName(nodeName);\n    const nodes = rng.nodes(dom.isText, {\n      fullyContains: true,\n    }).map((text) => {\n      return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);\n    });\n\n    if (expandClosestSibling) {\n      if (onlyPartialContains) {\n        const nodesInRange = rng.nodes();\n        // compose with partial contains predication\n        pred = func.and(pred, (node) => {\n          return lists.contains(nodesInRange, node);\n        });\n      }\n\n      return nodes.map((node) => {\n        const siblings = dom.withClosestSiblings(node, pred);\n        const head = lists.head(siblings);\n        const tails = lists.tail(siblings);\n        $.each(tails, (idx, elem) => {\n          dom.appendChildNodes(head, elem.childNodes);\n          dom.remove(elem);\n        });\n        return lists.head(siblings);\n      });\n    } else {\n      return nodes;\n    }\n  }\n\n  /**\n   * get current style on cursor\n   *\n   * @param {WrappedRange} rng\n   * @return {Object} - object contains style properties.\n   */\n  current(rng) {\n    const $cont = $(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);\n    let styleInfo = this.fromNode($cont);\n\n    // document.queryCommandState for toggle state\n    // [workaround] prevent Firefox nsresult: \"0x80004005 (NS_ERROR_FAILURE)\"\n    try {\n      styleInfo = $.extend(styleInfo, {\n        'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',\n        'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',\n        'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',\n        'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',\n        'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',\n        'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',\n        'font-family': document.queryCommandValue('fontname') || styleInfo['font-family'],\n      });\n    } catch (e) {\n      // eslint-disable-next-line\n    }\n\n    // list-style-type to list-style(unordered, ordered)\n    if (!rng.isOnList()) {\n      styleInfo['list-style'] = 'none';\n    } else {\n      const orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];\n      const isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;\n      styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';\n    }\n\n    const para = dom.ancestor(rng.sc, dom.isPara);\n    if (para && para.style['line-height']) {\n      styleInfo['line-height'] = para.style.lineHeight;\n    } else {\n      const lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);\n      styleInfo['line-height'] = lineHeight.toFixed(1);\n    }\n\n    styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);\n    styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);\n    styleInfo.range = rng;\n\n    return styleInfo;\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport func from '../core/func';\nimport dom from '../core/dom';\nimport range from '../core/range';\n\nexport default class Bullet {\n  /**\n   * toggle ordered list\n   */\n  insertOrderedList(editable) {\n    this.toggleList('OL', editable);\n  }\n\n  /**\n   * toggle unordered list\n   */\n  insertUnorderedList(editable) {\n    this.toggleList('UL', editable);\n  }\n\n  /**\n   * indent\n   */\n  indent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        const previousList = this.findList(head.previousSibling);\n        if (previousList) {\n          paras\n            .map(para => previousList.appendChild(para));\n        } else {\n          this.wrapList(paras, head.parentNode.nodeName);\n          paras\n            .map((para) => para.parentNode)\n            .map((para) => this.appendToPrevious(para));\n        }\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            return (parseInt(val, 10) || 0) + 25;\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * outdent\n   */\n  outdent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        this.releaseList([paras]);\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            val = (parseInt(val, 10) || 0);\n            return val > 25 ? val - 25 : '';\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * toggle list\n   *\n   * @param {String} listName - OL or UL\n   */\n  toggleList(listName, editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    let paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const bookmark = rng.paraBookmark(paras);\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    // paragraph to list\n    if (lists.find(paras, dom.isPurePara)) {\n      let wrappedParas = [];\n      $.each(clustereds, (idx, paras) => {\n        wrappedParas = wrappedParas.concat(this.wrapList(paras, listName));\n      });\n      paras = wrappedParas;\n    // list to paragraph or change list style\n    } else {\n      const diffLists = rng.nodes(dom.isList, {\n        includeAncestor: true,\n      }).filter((listNode) => {\n        return !$.nodeName(listNode, listName);\n      });\n\n      if (diffLists.length) {\n        $.each(diffLists, (idx, listNode) => {\n          dom.replace(listNode, listName);\n        });\n      } else {\n        paras = this.releaseList(clustereds, true);\n      }\n    }\n\n    range.createFromParaBookmark(bookmark, paras).select();\n  }\n\n  /**\n   * @param {Node[]} paras\n   * @param {String} listName\n   * @return {Node[]}\n   */\n  wrapList(paras, listName) {\n    const head = lists.head(paras);\n    const last = lists.last(paras);\n\n    const prevList = dom.isList(head.previousSibling) && head.previousSibling;\n    const nextList = dom.isList(last.nextSibling) && last.nextSibling;\n\n    const listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);\n\n    // P to LI\n    paras = paras.map((para) => {\n      return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;\n    });\n\n    // append to list(<ul>, <ol>)\n    dom.appendChildNodes(listNode, paras);\n\n    if (nextList) {\n      dom.appendChildNodes(listNode, lists.from(nextList.childNodes));\n      dom.remove(nextList);\n    }\n\n    return paras;\n  }\n\n  /**\n   * @method releaseList\n   *\n   * @param {Array[]} clustereds\n   * @param {Boolean} isEscapseToBody\n   * @return {Node[]}\n   */\n  releaseList(clustereds, isEscapseToBody) {\n    let releasedParas = [];\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      const last = lists.last(paras);\n\n      const headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;\n      const parentItem = headList.parentNode;\n\n      if (headList.parentNode.nodeName === 'LI') {\n        paras.map(para => {\n          const newList = this.findNextSiblings(para);\n\n          if (parentItem.nextSibling) {\n            parentItem.parentNode.insertBefore(\n              para,\n              parentItem.nextSibling\n            );\n          } else {\n            parentItem.parentNode.appendChild(para);\n          }\n\n          if (newList.length) {\n            this.wrapList(newList, headList.nodeName);\n            para.appendChild(newList[0].parentNode);\n          }\n        });\n\n        if (headList.children.length === 0) {\n          parentItem.removeChild(headList);\n        }\n\n        if (parentItem.childNodes.length === 0) {\n          parentItem.parentNode.removeChild(parentItem);\n        }\n      } else {\n        const lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {\n          node: last.parentNode,\n          offset: dom.position(last) + 1,\n        }, {\n          isSkipPaddingBlankHTML: true,\n        }) : null;\n\n        const middleList = dom.splitTree(headList, {\n          node: head.parentNode,\n          offset: dom.position(head),\n        }, {\n          isSkipPaddingBlankHTML: true,\n        });\n\n        paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi)\n          : lists.from(middleList.childNodes).filter(dom.isLi);\n\n        // LI to P\n        if (isEscapseToBody || !dom.isList(headList.parentNode)) {\n          paras = paras.map((para) => {\n            return dom.replace(para, 'P');\n          });\n        }\n\n        $.each(lists.from(paras).reverse(), (idx, para) => {\n          dom.insertAfter(para, headList);\n        });\n\n        // remove empty lists\n        const rootLists = lists.compact([headList, middleList, lastList]);\n        $.each(rootLists, (idx, rootList) => {\n          const listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));\n          $.each(listNodes.reverse(), (idx, listNode) => {\n            if (!dom.nodeLength(listNode)) {\n              dom.remove(listNode, true);\n            }\n          });\n        });\n      }\n\n      releasedParas = releasedParas.concat(paras);\n    });\n\n    return releasedParas;\n  }\n\n  /**\n   * @method appendToPrevious\n   *\n   * Appends list to previous list item, if\n   * none exist it wraps the list in a new list item.\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  appendToPrevious(node) {\n    return node.previousSibling\n      ? dom.appendChildNodes(node.previousSibling, [node])\n      : this.wrapList([node], 'LI');\n  }\n\n  /**\n   * @method findList\n   *\n   * Finds an existing list in list item\n   *\n   * @param {HTMLNode} ListItem\n   * @return {Array[]}\n   */\n  findList(node) {\n    return node\n      ? lists.find(node.children, child => ['OL', 'UL'].indexOf(child.nodeName) > -1)\n      : null;\n  }\n\n  /**\n   * @method findNextSiblings\n   *\n   * Finds all list item siblings that follow it\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  findNextSiblings(node) {\n    const siblings = [];\n    while (node.nextSibling) {\n      siblings.push(node.nextSibling);\n      node = node.nextSibling;\n    }\n    return siblings;\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport Bullet from '../editing/Bullet';\n\n/**\n * @class editing.Typing\n *\n * Typing\n *\n */\nexport default class Typing {\n  constructor(context) {\n    // a Bullet instance to toggle lists off\n    this.bullet = new Bullet();\n    this.options = context.options;\n  }\n\n  /**\n   * insert tab\n   *\n   * @param {WrappedRange} rng\n   * @param {Number} tabsize\n   */\n  insertTab(rng, tabsize) {\n    const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));\n    rng = rng.deleteContents();\n    rng.insertNode(tab, true);\n\n    rng = range.create(tab, tabsize);\n    rng.select();\n  }\n\n  /**\n   * insert paragraph\n   *\n   * @param {jQuery} $editable\n   * @param {WrappedRange} rng Can be used in unit tests to \"mock\" the range\n   *\n   * blockquoteBreakingLevel\n   *   0 - No break, the new paragraph remains inside the quote\n   *   1 - Break the first blockquote in the ancestors list\n   *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)\n   */\n  insertParagraph(editable, rng) {\n    rng = rng || range.create(editable);\n\n    // deleteContents on range.\n    rng = rng.deleteContents();\n\n    // Wrap range if it needs to be wrapped by paragraph\n    rng = rng.wrapBodyInlineWithPara();\n\n    // finding paragraph\n    const splitRoot = dom.ancestor(rng.sc, dom.isPara);\n\n    let nextPara;\n    // on paragraph: split paragraph\n    if (splitRoot) {\n      // if it is an empty line with li\n      if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {\n        // toggle UL/OL and escape\n        this.bullet.toggleList(splitRoot.parentNode.nodeName);\n        return;\n      } else {\n        let blockquote = null;\n        if (this.options.blockquoteBreakingLevel === 1) {\n          blockquote = dom.ancestor(splitRoot, dom.isBlockquote);\n        } else if (this.options.blockquoteBreakingLevel === 2) {\n          blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);\n        }\n\n        if (blockquote) {\n          // We're inside a blockquote and options ask us to break it\n          nextPara = $(dom.emptyPara)[0];\n          // If the split is right before a <br>, remove it so that there's no \"empty line\"\n          // after the split in the new blockquote created\n          if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {\n            $(rng.sc.nextSibling).remove();\n          }\n          const split = dom.splitTree(blockquote, rng.getStartPoint(), { isDiscardEmptySplits: true });\n          if (split) {\n            split.parentNode.insertBefore(nextPara, split);\n          } else {\n            dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote\n          }\n        } else {\n          nextPara = dom.splitTree(splitRoot, rng.getStartPoint());\n\n          // not a blockquote, just insert the paragraph\n          let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);\n          emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));\n\n          $.each(emptyAnchors, (idx, anchor) => {\n            dom.remove(anchor);\n          });\n\n          // replace empty heading, pre or custom-made styleTag with P tag\n          if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {\n            nextPara = dom.replace(nextPara, 'p');\n          }\n        }\n      }\n    // no paragraph: insert empty paragraph\n    } else {\n      const next = rng.sc.childNodes[rng.so];\n      nextPara = $(dom.emptyPara)[0];\n      if (next) {\n        rng.sc.insertBefore(nextPara, next);\n      } else {\n        rng.sc.appendChild(nextPara);\n      }\n    }\n\n    range.create(nextPara, 0).normalize().select().scrollIntoView(editable);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport lists from '../core/lists';\n\n/**\n * @class Create a virtual table to create what actions to do in change.\n * @param {object} startPoint Cell selected to apply change.\n * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where\n * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction\n * @param {object} domTable Dom element of table to make changes.\n */\nconst TableResultAction = function(startPoint, where, action, domTable) {\n  const _startPoint = { 'colPos': 0, 'rowPos': 0 };\n  const _virtualTable = [];\n  const _actionCellList = [];\n\n  /// ///////////////////////////////////////////\n  // Private functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Set the startPoint of action.\n   */\n  function setStartPoint() {\n    if (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {\n      // Impossible to identify start Cell point\n      return;\n    }\n    _startPoint.colPos = startPoint.cellIndex;\n    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {\n      // Impossible to identify start Row point\n      return;\n    }\n    _startPoint.rowPos = startPoint.parentElement.rowIndex;\n  }\n\n  /**\n   * Define virtual table position info object.\n   *\n   * @param {int} rowIndex Index position in line of virtual table.\n   * @param {int} cellIndex Index position in column of virtual table.\n   * @param {object} baseRow Row affected by this position.\n   * @param {object} baseCell Cell affected by this position.\n   * @param {bool} isSpan Inform if it is an span cell/row.\n   */\n  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {\n    const objPosition = {\n      'baseRow': baseRow,\n      'baseCell': baseCell,\n      'isRowSpan': isRowSpan,\n      'isColSpan': isColSpan,\n      'isVirtual': isVirtualCell,\n    };\n    if (!_virtualTable[rowIndex]) {\n      _virtualTable[rowIndex] = [];\n    }\n    _virtualTable[rowIndex][cellIndex] = objPosition;\n  }\n\n  /**\n   * Create action cell object.\n   *\n   * @param {object} virtualTableCellObj Object of specific position on virtual table.\n   * @param {enum} resultAction Action to be applied in that item.\n   */\n  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {\n    return {\n      'baseCell': virtualTableCellObj.baseCell,\n      'action': resultAction,\n      'virtualTable': {\n        'rowIndex': virtualRowPosition,\n        'cellIndex': virtualColPosition,\n      },\n    };\n  }\n\n  /**\n   * Recover free index of row to append Cell.\n   *\n   * @param {int} rowIndex Index of row to find free space.\n   * @param {int} cellIndex Index of cell to find free space in table.\n   */\n  function recoverCellIndex(rowIndex, cellIndex) {\n    if (!_virtualTable[rowIndex]) {\n      return cellIndex;\n    }\n    if (!_virtualTable[rowIndex][cellIndex]) {\n      return cellIndex;\n    }\n\n    let newCellIndex = cellIndex;\n    while (_virtualTable[rowIndex][newCellIndex]) {\n      newCellIndex++;\n      if (!_virtualTable[rowIndex][newCellIndex]) {\n        return newCellIndex;\n      }\n    }\n  }\n\n  /**\n   * Recover info about row and cell and add information to virtual table.\n   *\n   * @param {object} row Row to recover information.\n   * @param {object} cell Cell to recover information.\n   */\n  function addCellInfoToVirtual(row, cell) {\n    const cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);\n    const cellHasColspan = (cell.colSpan > 1);\n    const cellHasRowspan = (cell.rowSpan > 1);\n    const isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);\n    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);\n\n    // Add span rows to virtual Table.\n    const rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;\n    if (rowspanNumber > 1) {\n      for (let rp = 1; rp < rowspanNumber; rp++) {\n        const rowspanIndex = row.rowIndex + rp;\n        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);\n      }\n    }\n\n    // Add span cols to virtual table.\n    const colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;\n    if (colspanNumber > 1) {\n      for (let cp = 1; cp < colspanNumber; cp++) {\n        const cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));\n        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);\n      }\n    }\n  }\n\n  /**\n   * Process validation and adjust of start point if needed\n   *\n   * @param {int} rowIndex\n   * @param {int} cellIndex\n   * @param {object} cell\n   * @param {bool} isSelectedCell\n   */\n  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {\n    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {\n      _startPoint.colPos++;\n    }\n  }\n\n  /**\n   * Create virtual table of cells with all cells, including span cells.\n   */\n  function createVirtualTable() {\n    const rows = domTable.rows;\n    for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      const cells = rows[rowIndex].cells;\n      for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);\n      }\n    }\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getDeleteResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (!cell.isVirtual && cell.isRowSpan) {\n          return TableResultAction.resultAction.AddCell;\n        } else if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.RemoveCell;\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getAddResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isRowSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isColSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.AddCell;\n  }\n\n  function init() {\n    setStartPoint();\n    createVirtualTable();\n  }\n\n  /// ///////////////////////////////////////////\n  // Public functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Recover array os what to do in table.\n   */\n  this.getActionList = function() {\n    const fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;\n    const fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;\n\n    let actualPosition = 0;\n    let canContinue = true;\n    while (canContinue) {\n      const rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;\n      const colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;\n      const row = _virtualTable[rowPosition];\n      if (!row) {\n        canContinue = false;\n        return _actionCellList;\n      }\n      const cell = row[colPosition];\n      if (!cell) {\n        canContinue = false;\n        return _actionCellList;\n      }\n\n      // Define action to be applied in this cell\n      let resultAction = TableResultAction.resultAction.Ignore;\n      switch (action) {\n        case TableResultAction.requestAction.Add:\n          resultAction = getAddResultActionToCell(cell);\n          break;\n        case TableResultAction.requestAction.Delete:\n          resultAction = getDeleteResultActionToCell(cell);\n          break;\n      }\n      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));\n      actualPosition++;\n    }\n\n    return _actionCellList;\n  };\n\n  init();\n};\n/**\n*\n* Where action occours enum.\n*/\nTableResultAction.where = { 'Row': 0, 'Column': 1 };\n/**\n*\n* Requested action to apply enum.\n*/\nTableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };\n/**\n*\n* Result action to be executed enum.\n*/\nTableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };\n\n/**\n *\n * @class editing.Table\n *\n * Table\n *\n */\nexport default class Table {\n  /**\n   * handle tab key\n   *\n   * @param {WrappedRange} rng\n   * @param {Boolean} isShift\n   */\n  tab(rng, isShift) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const table = dom.ancestor(cell, dom.isTable);\n    const cells = dom.listDescendant(table, dom.isCell);\n\n    const nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);\n    if (nextCell) {\n      range.create(nextCell, 0).select();\n    }\n  }\n\n  /**\n   * Add a new row\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (top/bottom)\n   * @return {Node}\n   */\n  addRow(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n\n    const currentTr = $(cell).closest('tr');\n    const trAttributes = this.recoverAttributes(currentTr);\n    const html = $('<tr' + trAttributes + '></tr>');\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Add, $(currentTr).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let idCell = 0; idCell < actions.length; idCell++) {\n      const currentCell = actions[idCell];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          {\n            if (position === 'top') {\n              const baseCellTr = currentCell.baseCell.parent;\n              const isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;\n              if (isTopFromRowSpan) {\n                const newTd = $('<div></div>').append($('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();\n                html.append(newTd);\n                break;\n              }\n            }\n            let rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);\n            rowspanNumber++;\n            currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);\n          }\n          break;\n      }\n    }\n\n    if (position === 'top') {\n      currentTr.before(html);\n    } else {\n      const cellHasRowspan = (cell.rowSpan > 1);\n      if (cellHasRowspan) {\n        const lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);\n        $($(currentTr).parent().find('tr')[lastTrIndex]).after($(html));\n        return;\n      }\n      currentTr.after(html);\n    }\n  }\n\n  /**\n   * Add a new col\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (left/right)\n   * @return {Node}\n   */\n  addCol(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const rowsGroup = $(row).siblings();\n    rowsGroup.push(row);\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Add, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      const currentCell = actions[actionIndex];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          if (position === 'right') {\n            $(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          if (position === 'right') {\n            let colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);\n            colspanNumber++;\n            currentCell.baseCell.setAttribute('colSpan', colspanNumber);\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n      }\n    }\n  }\n\n  /*\n  * Copy attributes from element.\n  *\n  * @param {object} Element to recover attributes.\n  * @return {string} Copied string elements.\n  */\n  recoverAttributes(el) {\n    let resultStr = '';\n\n    if (!el) {\n      return resultStr;\n    }\n\n    const attrList = el.attributes || [];\n\n    for (let i = 0; i < attrList.length; i++) {\n      if (attrList[i].name.toLowerCase() === 'id') {\n        continue;\n      }\n\n      if (attrList[i].specified) {\n        resultStr += ' ' + attrList[i].name + '=\\'' + attrList[i].value + '\\'';\n      }\n    }\n\n    return resultStr;\n  }\n\n  /**\n   * Delete current row\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteRow(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n    const rowPos = row[0].rowIndex;\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n\n      const baseCell = actions[actionIndex].baseCell;\n      const virtualPosition = actions[actionIndex].virtualTable;\n      const hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);\n      let rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.AddCell:\n          {\n            const nextRow = row.next('tr')[0];\n            if (!nextRow) { continue; }\n            const cloneRow = row[0].cells[cellPos];\n            if (hasRowspan) {\n              if (rowspanNumber > 2) {\n                rowspanNumber--;\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);\n                nextRow.cells[cellPos].innerHTML = '';\n              } else if (rowspanNumber === 2) {\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].removeAttribute('rowSpan');\n                nextRow.cells[cellPos].innerHTML = '';\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          if (hasRowspan) {\n            if (rowspanNumber > 2) {\n              rowspanNumber--;\n              baseCell.setAttribute('rowSpan', rowspanNumber);\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            } else if (rowspanNumber === 2) {\n              baseCell.removeAttribute('rowSpan');\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          // Do not need remove cell because row will be deleted.\n          continue;\n      }\n    }\n    row.remove();\n  }\n\n  /**\n   * Delete current col\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteCol(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          {\n            const baseCell = actions[actionIndex].baseCell;\n            const hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);\n            if (hasColspan) {\n              let colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;\n              if (colspanNumber > 2) {\n                colspanNumber--;\n                baseCell.setAttribute('colSpan', colspanNumber);\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              } else if (colspanNumber === 2) {\n                baseCell.removeAttribute('colSpan');\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          dom.remove(actions[actionIndex].baseCell, true);\n          continue;\n      }\n    }\n  }\n\n  /**\n   * create empty table element\n   *\n   * @param {Number} rowCount\n   * @param {Number} colCount\n   * @return {Node}\n   */\n  createTable(colCount, rowCount, options) {\n    const tds = [];\n    let tdHTML;\n    for (let idxCol = 0; idxCol < colCount; idxCol++) {\n      tds.push('<td>' + dom.blank + '</td>');\n    }\n    tdHTML = tds.join('');\n\n    const trs = [];\n    let trHTML;\n    for (let idxRow = 0; idxRow < rowCount; idxRow++) {\n      trs.push('<tr>' + tdHTML + '</tr>');\n    }\n    trHTML = trs.join('');\n    const $table = $('<table>' + trHTML + '</table>');\n    if (options && options.tableClassName) {\n      $table.addClass(options.tableClassName);\n    }\n\n    return $table[0];\n  }\n\n  /**\n   * Delete current table\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteTable(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    $(cell).closest('table').remove();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport { readFileAsDataURL, createImage } from '../core/async';\nimport History from '../editing/History';\nimport Style from '../editing/Style';\nimport Typing from '../editing/Typing';\nimport Table from '../editing/Table';\nimport Bullet from '../editing/Bullet';\n\nconst KEY_BOGUS = 'bogus';\n\n/**\n * @class Editor\n */\nexport default class Editor {\n  constructor(context) {\n    this.context = context;\n\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.editable = this.$editable[0];\n    this.lastRange = null;\n    this.snapshot = null;\n\n    this.style = new Style();\n    this.table = new Table();\n    this.typing = new Typing(context);\n    this.bullet = new Bullet();\n    this.history = new History(context);\n\n    this.context.memo('help.escape', this.lang.help.escape);\n    this.context.memo('help.undo', this.lang.help.undo);\n    this.context.memo('help.redo', this.lang.help.redo);\n    this.context.memo('help.tab', this.lang.help.tab);\n    this.context.memo('help.untab', this.lang.help.untab);\n    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);\n    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);\n    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);\n    this.context.memo('help.indent', this.lang.help.indent);\n    this.context.memo('help.outdent', this.lang.help.outdent);\n    this.context.memo('help.formatPara', this.lang.help.formatPara);\n    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);\n    this.context.memo('help.fontName', this.lang.help.fontName);\n\n    // native commands(with execCommand), generate function for execCommand\n    const commands = [\n      'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',\n      'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n      'formatBlock', 'removeFormat', 'backColor',\n    ];\n\n    for (let idx = 0, len = commands.length; idx < len; idx++) {\n      this[commands[idx]] = ((sCmd) => {\n        return (value) => {\n          this.beforeCommand();\n          document.execCommand(sCmd, false, value);\n          this.afterCommand(true);\n        };\n      })(commands[idx]);\n      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);\n    }\n\n    this.fontName = this.wrapCommand((value) => {\n      return this.fontStyling('font-family', env.validFontName(value));\n    });\n\n    this.fontSize = this.wrapCommand((value) => {\n      const unit = this.currentStyle()['font-size-unit'];\n      return this.fontStyling('font-size', value + unit);\n    });\n\n    this.fontSizeUnit = this.wrapCommand((value) => {\n      const size = this.currentStyle()['font-size'];\n      return this.fontStyling('font-size', size + value);\n    });\n\n    for (let idx = 1; idx <= 6; idx++) {\n      this['formatH' + idx] = ((idx) => {\n        return () => {\n          this.formatBlock('H' + idx);\n        };\n      })(idx);\n      this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);\n    }\n\n    this.insertParagraph = this.wrapCommand(() => {\n      this.typing.insertParagraph(this.editable);\n    });\n\n    this.insertOrderedList = this.wrapCommand(() => {\n      this.bullet.insertOrderedList(this.editable);\n    });\n\n    this.insertUnorderedList = this.wrapCommand(() => {\n      this.bullet.insertUnorderedList(this.editable);\n    });\n\n    this.indent = this.wrapCommand(() => {\n      this.bullet.indent(this.editable);\n    });\n\n    this.outdent = this.wrapCommand(() => {\n      this.bullet.outdent(this.editable);\n    });\n\n    /**\n     * insertNode\n     * insert node\n     * @param {Node} node\n     */\n    this.insertNode = this.wrapCommand((node) => {\n      if (this.isLimited($(node).text().length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      rng.insertNode(node);\n      this.setLastRange(range.createFromNodeAfter(node).select());\n    });\n\n    /**\n     * insert text\n     * @param {String} text\n     */\n    this.insertText = this.wrapCommand((text) => {\n      if (this.isLimited(text.length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      const textNode = rng.insertNode(dom.createText(text));\n      this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());\n    });\n\n    /**\n     * paste HTML\n     * @param {String} markup\n     */\n    this.pasteHTML = this.wrapCommand((markup) => {\n      if (this.isLimited(markup.length)) {\n        return;\n      }\n      markup = this.context.invoke('codeview.purify', markup);\n      const contents = this.getLastRange().pasteHTML(markup);\n      this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());\n    });\n\n    /**\n     * formatBlock\n     *\n     * @param {String} tagName\n     */\n    this.formatBlock = this.wrapCommand((tagName, $target) => {\n      const onApplyCustomStyle = this.options.callbacks.onApplyCustomStyle;\n      if (onApplyCustomStyle) {\n        onApplyCustomStyle.call(this, $target, this.context, this.onFormatBlock);\n      } else {\n        this.onFormatBlock(tagName, $target);\n      }\n    });\n\n    /**\n     * insert horizontal rule\n     */\n    this.insertHorizontalRule = this.wrapCommand(() => {\n      const hrNode = this.getLastRange().insertNode(dom.create('HR'));\n      if (hrNode.nextSibling) {\n        this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());\n      }\n    });\n\n    /**\n     * lineHeight\n     * @param {String} value\n     */\n    this.lineHeight = this.wrapCommand((value) => {\n      this.style.stylePara(this.getLastRange(), {\n        lineHeight: value,\n      });\n    });\n\n    /**\n     * create link (command)\n     *\n     * @param {Object} linkInfo\n     */\n    this.createLink = this.wrapCommand((linkInfo) => {\n      let linkUrl = linkInfo.url;\n      const linkText = linkInfo.text;\n      const isNewWindow = linkInfo.isNewWindow;\n      const checkProtocol = linkInfo.checkProtocol;\n      let rng = linkInfo.range || this.getLastRange();\n      const additionalTextLength = linkText.length - rng.toString().length;\n      if (additionalTextLength > 0 && this.isLimited(additionalTextLength)) {\n        return;\n      }\n      const isTextChanged = rng.toString() !== linkText;\n\n      // handle spaced urls from input\n      if (typeof linkUrl === 'string') {\n        linkUrl = linkUrl.trim();\n      }\n\n      if (this.options.onCreateLink) {\n        linkUrl = this.options.onCreateLink(linkUrl);\n      } else if (checkProtocol) {\n        // if url doesn't have any protocol and not even a relative or a label, use http:// as default\n        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\\:|#|\\/)/.test(linkUrl)\n          ? linkUrl : this.options.defaultProtocol + linkUrl;\n      }\n\n      let anchors = [];\n      if (isTextChanged) {\n        rng = rng.deleteContents();\n        const anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);\n        anchors.push(anchor);\n      } else {\n        anchors = this.style.styleNodes(rng, {\n          nodeName: 'A',\n          expandClosestSibling: true,\n          onlyPartialContains: true,\n        });\n      }\n\n      $.each(anchors, (idx, anchor) => {\n        $(anchor).attr('href', linkUrl);\n        if (isNewWindow) {\n          $(anchor).attr('target', '_blank');\n        } else {\n          $(anchor).removeAttr('target');\n        }\n      });\n\n      this.setLastRange(\n        this.createRangeFromList(anchors).select()\n      );\n    });\n\n    /**\n     * setting color\n     *\n     * @param {Object} sObjColor  color code\n     * @param {String} sObjColor.foreColor foreground color\n     * @param {String} sObjColor.backColor background color\n     */\n    this.color = this.wrapCommand((colorInfo) => {\n      const foreColor = colorInfo.foreColor;\n      const backColor = colorInfo.backColor;\n\n      if (foreColor) { document.execCommand('foreColor', false, foreColor); }\n      if (backColor) { document.execCommand('backColor', false, backColor); }\n    });\n\n    /**\n     * Set foreground color\n     *\n     * @param {String} colorCode foreground color code\n     */\n    this.foreColor = this.wrapCommand((colorInfo) => {\n      document.execCommand('foreColor', false, colorInfo);\n    });\n\n    /**\n     * insert Table\n     *\n     * @param {String} dimension of table (ex : \"5x5\")\n     */\n    this.insertTable = this.wrapCommand((dim) => {\n      const dimension = dim.split('x');\n\n      const rng = this.getLastRange().deleteContents();\n      rng.insertNode(this.table.createTable(dimension[0], dimension[1], this.options));\n    });\n\n    /**\n     * remove media object and Figure Elements if media object is img with Figure.\n     */\n    this.removeMedia = this.wrapCommand(() => {\n      let $target = $(this.restoreTarget()).parent();\n      if ($target.closest('figure').length) {\n        $target.closest('figure').remove();\n      } else {\n        $target = $(this.restoreTarget()).detach();\n      }\n      this.context.triggerEvent('media.delete', $target, this.$editable);\n    });\n\n    /**\n     * float me\n     *\n     * @param {String} value\n     */\n    this.floatMe = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      $target.toggleClass('note-float-left', value === 'left');\n      $target.toggleClass('note-float-right', value === 'right');\n      $target.css('float', (value === 'none' ? '' : value));\n    });\n\n    /**\n     * resize overlay element\n     * @param {String} value\n     */\n    this.resize = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      value = parseFloat(value);\n      if (value === 0) {\n        $target.css('width', '');\n      } else {\n        $target.css({\n          width: value * 100 + '%',\n          height: '',\n        });\n      }\n    });\n  }\n\n  initialize() {\n    // bind custom events\n    this.$editable.on('keydown', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        this.context.triggerEvent('enter', event);\n      }\n      this.context.triggerEvent('keydown', event);\n\n      // keep a snapshot to limit text on input event\n      this.snapshot = this.history.makeSnapshot();\n      this.hasKeyShortCut = false;\n      if (!event.isDefaultPrevented()) {\n        if (this.options.shortcuts) {\n          this.hasKeyShortCut = this.handleKeyMap(event);\n        } else {\n          this.preventDefaultEditableShortCuts(event);\n        }\n      }\n      if (this.isLimited(1, event)) {\n        const lastRange = this.getLastRange();\n        if (lastRange.eo - lastRange.so === 0) {\n          return false;\n        }\n      }\n      this.setLastRange();\n\n      // record undo in the key event except keyMap.\n      if (this.options.recordEveryKeystroke) {\n        if (this.hasKeyShortCut === false) {\n          this.history.recordUndo();\n        }\n      }\n    }).on('keyup', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('keyup', event);\n    }).on('focus', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('focus', event);\n    }).on('blur', (event) => {\n      this.context.triggerEvent('blur', event);\n    }).on('mousedown', (event) => {\n      this.context.triggerEvent('mousedown', event);\n    }).on('mouseup', (event) => {\n      this.setLastRange();\n      this.history.recordUndo();\n      this.context.triggerEvent('mouseup', event);\n    }).on('scroll', (event) => {\n      this.context.triggerEvent('scroll', event);\n    }).on('paste', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('paste', event);\n    }).on('input', () => {\n      // To limit composition characters (e.g. Korean)\n      if (this.isLimited(0) && this.snapshot) {\n        this.history.applySnapshot(this.snapshot);\n      }\n    });\n\n    this.$editable.attr('spellcheck', this.options.spellCheck);\n\n    this.$editable.attr('autocorrect', this.options.spellCheck);\n\n    if (this.options.disableGrammar) {\n      this.$editable.attr('data-gramm', false);\n    }\n\n    // init content before set event\n    this.$editable.html(dom.html(this.$note) || dom.emptyPara);\n\n    this.$editable.on(env.inputEventName, func.debounce(() => {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }, 10));\n\n    this.$editable.on('focusin', (event) => {\n      this.context.triggerEvent('focusin', event);\n    }).on('focusout', (event) => {\n      this.context.triggerEvent('focusout', event);\n    });\n\n    if (this.options.airMode) {\n      if (this.options.overrideContextMenu) {\n        this.$editor.on('contextmenu', (event) => {\n          this.context.triggerEvent('contextmenu', event);\n          return false;\n        });\n      }\n    } else {\n      if (this.options.width) {\n        this.$editor.outerWidth(this.options.width);\n      }\n      if (this.options.height) {\n        this.$editable.outerHeight(this.options.height);\n      }\n      if (this.options.maxHeight) {\n        this.$editable.css('max-height', this.options.maxHeight);\n      }\n      if (this.options.minHeight) {\n        this.$editable.css('min-height', this.options.minHeight);\n      }\n    }\n\n    this.history.recordUndo();\n    this.setLastRange();\n  }\n\n  destroy() {\n    this.$editable.off();\n  }\n\n  handleKeyMap(event) {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    const keys = [];\n\n    if (event.metaKey) { keys.push('CMD'); }\n    if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }\n    if (event.shiftKey) { keys.push('SHIFT'); }\n\n    const keyName = key.nameFromCode[event.keyCode];\n    if (keyName) {\n      keys.push(keyName);\n    }\n\n    const eventName = keyMap[keys.join('+')];\n\n    if (keyName === 'TAB' && !this.options.tabDisable) {\n      this.afterCommand();\n    } else if (eventName) {\n      if (this.context.invoke(eventName) !== false) {\n        event.preventDefault();\n        // if keyMap action was invoked\n        return true;\n      }\n    } else if (key.isEdit(event.keyCode)) {\n      this.afterCommand();\n    }\n    return false;\n  }\n\n  preventDefaultEditableShortCuts(event) {\n    // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)\n    if ((event.ctrlKey || event.metaKey) &&\n      lists.contains([66, 73, 85], event.keyCode)) {\n      event.preventDefault();\n    }\n  }\n\n  isLimited(pad, event) {\n    pad = pad || 0;\n\n    if (typeof event !== 'undefined') {\n      if (key.isMove(event.keyCode) ||\n          key.isNavigation(event.keyCode) ||\n          (event.ctrlKey || event.metaKey) ||\n          lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {\n        return false;\n      }\n    }\n\n    if (this.options.maxTextLength > 0) {\n      if ((this.$editable.text().length + pad) > this.options.maxTextLength) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * create range\n   * @return {WrappedRange}\n   */\n  createRange() {\n    this.focus();\n    this.setLastRange();\n    return this.getLastRange();\n  }\n\n  /**\n   * create a new range from the list of elements\n   *\n   * @param {list} dom element list\n   * @return {WrappedRange}\n   */\n  createRangeFromList(lst) {\n    const startRange = range.createFromNodeBefore(lists.head(lst));\n    const startPoint = startRange.getStartPoint();\n    const endRange = range.createFromNodeAfter(lists.last(lst));\n    const endPoint = endRange.getEndPoint();\n\n    return range.create(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * set the last range\n   *\n   * if given rng is exist, set rng as the last range\n   * or create a new range at the end of the document\n   *\n   * @param {WrappedRange} rng\n   */\n  setLastRange(rng) {\n    if (rng) {\n      this.lastRange = rng;\n    } else {\n      this.lastRange = range.create(this.editable);\n\n      if ($(this.lastRange.sc).closest('.note-editable').length === 0) {\n        this.lastRange = range.createFromBodyElement(this.editable);\n      }\n    }\n  }\n\n  /**\n   * get the last range\n   *\n   * if there is a saved last range, return it\n   * or create a new range and return it\n   *\n   * @return {WrappedRange}\n   */\n  getLastRange() {\n    if (!this.lastRange) {\n      this.setLastRange();\n    }\n    return this.lastRange;\n  }\n\n  /**\n   * saveRange\n   *\n   * save current range\n   *\n   * @param {Boolean} [thenCollapse=false]\n   */\n  saveRange(thenCollapse) {\n    if (thenCollapse) {\n      this.getLastRange().collapse().select();\n    }\n  }\n\n  /**\n   * restoreRange\n   *\n   * restore lately range\n   */\n  restoreRange() {\n    if (this.lastRange) {\n      this.lastRange.select();\n      this.focus();\n    }\n  }\n\n  saveTarget(node) {\n    this.$editable.data('target', node);\n  }\n\n  clearTarget() {\n    this.$editable.removeData('target');\n  }\n\n  restoreTarget() {\n    return this.$editable.data('target');\n  }\n\n  /**\n   * currentStyle\n   *\n   * current style\n   * @return {Object|Boolean} unfocus\n   */\n  currentStyle() {\n    let rng = range.create();\n    if (rng) {\n      rng = rng.normalize();\n    }\n    return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);\n  }\n\n  /**\n   * style from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  styleFromNode($node) {\n    return this.style.fromNode($node);\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.undo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /*\n  * commit\n  */\n  commit() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.commit();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.redo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * before command\n   */\n  beforeCommand() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n\n    // Set styleWithCSS before run a command\n    document.execCommand('styleWithCSS', false, this.options.styleWithCSS);\n\n    // keep focus on editable before command execution\n    this.focus();\n  }\n\n  /**\n   * after command\n   * @param {Boolean} isPreventTrigger\n   */\n  afterCommand(isPreventTrigger) {\n    this.normalizeContent();\n    this.history.recordUndo();\n    if (!isPreventTrigger) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  /**\n   * handle tab key\n   */\n  tab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n\n      if (!this.isLimited(this.options.tabSize)) {\n        this.beforeCommand();\n        this.typing.insertTab(rng, this.options.tabSize);\n        this.afterCommand();\n      }\n    }\n  }\n\n  /**\n   * handle shift+tab key\n   */\n  untab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng, true);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * run given function between beforeCommand and afterCommand\n   */\n  wrapCommand(fn) {\n    return function() {\n      this.beforeCommand();\n      fn.apply(this, arguments);\n      this.afterCommand();\n    };\n  }\n\n  /**\n   * insert image\n   *\n   * @param {String} src\n   * @param {String|Function} param\n   * @return {Promise}\n   */\n  insertImage(src, param) {\n    return createImage(src, param).then(($image) => {\n      this.beforeCommand();\n\n      if (typeof param === 'function') {\n        param($image);\n      } else {\n        if (typeof param === 'string') {\n          $image.attr('data-filename', param);\n        }\n        $image.css('width', Math.min(this.$editable.width(), $image.width()));\n      }\n\n      $image.show();\n      this.getLastRange().insertNode($image[0]);\n      this.setLastRange(range.createFromNodeAfter($image[0]).select());\n      this.afterCommand();\n    }).fail((e) => {\n      this.context.triggerEvent('image.upload.error', e);\n    });\n  }\n\n  /**\n   * insertImages\n   * @param {File[]} files\n   */\n  insertImagesAsDataURL(files) {\n    $.each(files, (idx, file) => {\n      const filename = file.name;\n      if (this.options.maximumImageFileSize && this.options.maximumImageFileSize < file.size) {\n        this.context.triggerEvent('image.upload.error', this.lang.image.maximumFileSizeError);\n      } else {\n        readFileAsDataURL(file).then((dataURL) => {\n          return this.insertImage(dataURL, filename);\n        }).fail(() => {\n          this.context.triggerEvent('image.upload.error');\n        });\n      }\n    });\n  }\n\n  /**\n   * insertImagesOrCallback\n   * @param {File[]} files\n   */\n  insertImagesOrCallback(files) {\n    const callbacks = this.options.callbacks;\n    // If onImageUpload set,\n    if (callbacks.onImageUpload) {\n      this.context.triggerEvent('image.upload', files);\n      // else insert Image as dataURL\n    } else {\n      this.insertImagesAsDataURL(files);\n    }\n  }\n\n  /**\n   * return selected plain text\n   * @return {String} text\n   */\n  getSelectedText() {\n    let rng = this.getLastRange();\n\n    // if range on anchor, expand range with anchor\n    if (rng.isOnAnchor()) {\n      rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));\n    }\n\n    return rng.toString();\n  }\n\n  onFormatBlock(tagName, $target) {\n    // [workaround] for MSIE, IE need `<`\n    document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName);\n\n    // support custom class\n    if ($target && $target.length) {\n      // find the exact element has given tagName\n      if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {\n        $target = $target.find(tagName);\n      }\n\n      if ($target && $target.length) {\n        const currentRange = this.createRange();\n        const $parent = $([currentRange.sc, currentRange.ec]).closest(tagName);\n        // remove class added for current block\n        $parent.removeClass();\n        const className = $target[0].className || '';\n        if (className) {\n          $parent.addClass(className);\n        }\n      }\n    }\n  }\n\n  formatPara() {\n    this.formatBlock('P');\n  }\n\n  fontStyling(target, value) {\n    const rng = this.getLastRange();\n\n    if (rng !== '') {\n      const spans = this.style.styleNodes(rng);\n      this.$editor.find('.note-status-output').html('');\n      $(spans).css(target, value);\n\n      // [workaround] added styled bogus span for style\n      //  - also bogus character needed for cursor position\n      if (rng.isCollapsed()) {\n        const firstSpan = lists.head(spans);\n        if (firstSpan && !dom.nodeLength(firstSpan)) {\n          firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;\n          range.createFromNode(firstSpan.firstChild).select();\n          this.setLastRange();\n          this.$editable.data(KEY_BOGUS, firstSpan);\n        }\n      } else {\n        this.setLastRange(\n          this.createRangeFromList(spans).select()\n        );\n      }\n    } else {\n      const noteStatusOutput = $.now();\n      this.$editor.find('.note-status-output').html('<div id=\"note-status-output-' + noteStatusOutput + '\" class=\"alert alert-info\">' + this.lang.output.noSelection + '</div>');\n      setTimeout(function() { $('#note-status-output-' + noteStatusOutput).remove(); }, 5000);\n    }\n  }\n\n  /**\n   * unlink\n   *\n   * @type command\n   */\n  unlink() {\n    let rng = this.getLastRange();\n    if (rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      rng = range.createFromNode(anchor);\n      rng.select();\n      this.setLastRange();\n\n      this.beforeCommand();\n      document.execCommand('unlink');\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * returns link info\n   *\n   * @return {Object}\n   * @return {WrappedRange} return.range\n   * @return {String} return.text\n   * @return {Boolean} [return.isNewWindow=true]\n   * @return {String} [return.url=\"\"]\n   */\n  getLinkInfo() {\n    const rng = this.getLastRange().expand(dom.isAnchor);\n    // Get the first anchor on range(for edit).\n    const $anchor = $(lists.head(rng.nodes(dom.isAnchor)));\n    const linkInfo = {\n      range: rng,\n      text: rng.toString(),\n      url: $anchor.length ? $anchor.attr('href') : '',\n    };\n\n    // When anchor exists,\n    if ($anchor.length) {\n      // Set isNewWindow by checking its target.\n      linkInfo.isNewWindow = $anchor.attr('target') === '_blank';\n    }\n\n    return linkInfo;\n  }\n\n  addRow(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addRow(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  addCol(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addCol(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  deleteRow() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteRow(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteCol() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteCol(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteTable() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteTable(rng);\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * @param {Position} pos\n   * @param {jQuery} $target - target element\n   * @param {Boolean} [bKeepRatio] - keep ratio\n   */\n  resizeTo(pos, $target, bKeepRatio) {\n    let imageSize;\n    if (bKeepRatio) {\n      const newRatio = pos.y / pos.x;\n      const ratio = $target.data('ratio');\n      imageSize = {\n        width: ratio > newRatio ? pos.x : pos.y / ratio,\n        height: ratio > newRatio ? pos.x * ratio : pos.y,\n      };\n    } else {\n      imageSize = {\n        width: pos.x,\n        height: pos.y,\n      };\n    }\n\n    $target.css(imageSize);\n  }\n\n  /**\n   * returns whether editable area has focus or not.\n   */\n  hasFocus() {\n    return this.$editable.is(':focus');\n  }\n\n  /**\n   * set focus\n   */\n  focus() {\n    // [workaround] Screen will move when page is scolled in IE.\n    //  - do focus when not focused\n    if (!this.hasFocus()) {\n      this.$editable.focus();\n    }\n  }\n\n  /**\n   * returns whether contents is empty or not.\n   * @return {Boolean}\n   */\n  isEmpty() {\n    return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();\n  }\n\n  /**\n   * Removes all contents and restores the editable instance to an _emptyPara_.\n   */\n  empty() {\n    this.context.invoke('code', dom.emptyPara);\n  }\n\n  /**\n   * normalize content\n   */\n  normalizeContent() {\n    this.$editable[0].normalize();\n  }\n}\n","import lists from '../core/lists';\n\nexport default class Clipboard {\n  constructor(context) {\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n  }\n\n  initialize() {\n    this.$editable.on('paste', this.pasteByEvent.bind(this));\n  }\n\n  /**\n   * paste by clipboard event\n   *\n   * @param {Event} event\n   */\n  pasteByEvent(event) {\n    const clipboardData = event.originalEvent.clipboardData;\n\n    if (clipboardData && clipboardData.items && clipboardData.items.length) {\n      const item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);\n      if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {\n        // paste img file\n        this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);\n        event.preventDefault();\n      } else if (item.kind === 'string') {\n        // paste text with maxTextLength check\n        if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {\n          event.preventDefault();\n        }\n      }\n    } else if (window.clipboardData) {\n      // for IE\n      let text = window.clipboardData.getData('text');\n      if (this.context.invoke('editor.isLimited', text.length)) {\n        event.preventDefault();\n      }\n    }\n    // Call editor.afterCommand after proceeding default event handler\n    setTimeout(() => {\n      this.context.invoke('editor.afterCommand');\n    }, 10);\n  }\n}\n","import $ from 'jquery';\n\nexport default class Dropzone {\n  constructor(context) {\n    this.context = context;\n    this.$eventListener = $(document);\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.documentEventHandlers = {};\n\n    this.$dropzone = $([\n      '<div class=\"note-dropzone\">',\n        '<div class=\"note-dropzone-message\"></div>',\n      '</div>',\n    ].join('')).prependTo(this.$editor);\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  initialize() {\n    if (this.options.disableDragAndDrop) {\n      // prevent default drop event\n      this.documentEventHandlers.onDrop = (e) => {\n        e.preventDefault();\n      };\n      // do not consider outside of dropzone\n      this.$eventListener = this.$dropzone;\n      this.$eventListener.on('drop', this.documentEventHandlers.onDrop);\n    } else {\n      this.attachDragAndDropEvent();\n    }\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  attachDragAndDropEvent() {\n    let collection = $();\n    const $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');\n\n    this.documentEventHandlers.onDragenter = (e) => {\n      const isCodeview = this.context.invoke('codeview.isActivated');\n      const hasEditorSize = this.$editor.width() > 0 && this.$editor.height() > 0;\n      if (!isCodeview && !collection.length && hasEditorSize) {\n        this.$editor.addClass('dragover');\n        this.$dropzone.width(this.$editor.width());\n        this.$dropzone.height(this.$editor.height());\n        $dropzoneMessage.text(this.lang.image.dragImageHere);\n      }\n      collection = collection.add(e.target);\n    };\n\n    this.documentEventHandlers.onDragleave = (e) => {\n      collection = collection.not(e.target);\n\n      // If nodeName is BODY, then just make it over (fix for IE)\n      if (!collection.length || e.target.nodeName === 'BODY') {\n        collection = $();\n        this.$editor.removeClass('dragover');\n      }\n    };\n\n    this.documentEventHandlers.onDrop = () => {\n      collection = $();\n      this.$editor.removeClass('dragover');\n    };\n\n    // show dropzone on dragenter when dragging a object to document\n    // -but only if the editor is visible, i.e. has a positive width and height\n    this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter)\n      .on('dragleave', this.documentEventHandlers.onDragleave)\n      .on('drop', this.documentEventHandlers.onDrop);\n\n    // change dropzone's message on hover.\n    this.$dropzone.on('dragenter', () => {\n      this.$dropzone.addClass('hover');\n      $dropzoneMessage.text(this.lang.image.dropImage);\n    }).on('dragleave', () => {\n      this.$dropzone.removeClass('hover');\n      $dropzoneMessage.text(this.lang.image.dragImageHere);\n    });\n\n    // attach dropImage\n    this.$dropzone.on('drop', (event) => {\n      const dataTransfer = event.originalEvent.dataTransfer;\n\n      // stop the browser from opening the dropped content\n      event.preventDefault();\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        this.$editable.focus();\n        this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);\n      } else {\n        $.each(dataTransfer.types, (idx, type) => {\n          // skip moz-specific types\n          if (type.toLowerCase().indexOf('_moz_') > -1) {\n            return;\n          }\n          const content = dataTransfer.getData(type);\n\n          if (type.toLowerCase().indexOf('text') > -1) {\n            this.context.invoke('editor.pasteHTML', content);\n          } else {\n            $(content).each((idx, item) => {\n              this.context.invoke('editor.insertNode', item);\n            });\n          }\n        });\n      }\n    }).on('dragover', false); // prevent default dragover event\n  }\n\n  destroy() {\n    Object.keys(this.documentEventHandlers).forEach((key) => {\n      this.$eventListener.off(key.substr(2).toLowerCase(), this.documentEventHandlers[key]);\n    });\n    this.documentEventHandlers = {};\n  }\n}\n","import dom from '../core/dom';\nimport key from '../core/key';\n\n/**\n * @class Codeview\n */\nexport default class CodeView {\n  constructor(context) {\n    this.context = context;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n    this.CodeMirrorConstructor = window.CodeMirror;\n\n    if (this.options.codemirror.CodeMirrorConstructor) {\n      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;\n    }\n  }\n\n  sync(html) {\n    const isCodeview = this.isActivated();\n    const CodeMirror = this.CodeMirrorConstructor;\n\n    if (isCodeview) {\n      if (html) {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').getDoc().setValue(html);\n        } else {\n          this.$codable.val(html);\n        }\n      } else {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').save();\n        }\n      }\n    }\n  }\n\n  initialize() {\n    this.$codable.on('keyup', (event) => {\n      if (event.keyCode === key.code.ESCAPE) {\n        this.deactivate();\n      }\n    });\n  }\n\n  /**\n   * @return {Boolean}\n   */\n  isActivated() {\n    return this.$editor.hasClass('codeview');\n  }\n\n  /**\n   * toggle codeview\n   */\n  toggle() {\n    if (this.isActivated()) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n    this.context.triggerEvent('codeview.toggled');\n  }\n\n  /**\n   * purify input value\n   * @param value\n   * @returns {*}\n   */\n  purify(value) {\n    if (this.options.codeviewFilter) {\n      // filter code view regex\n      value = value.replace(this.options.codeviewFilterRegex, '');\n      // allow specific iframe tag\n      if (this.options.codeviewIframeFilter) {\n        const whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);\n        value = value.replace(/(<iframe.*?>.*?(?:<\\/iframe>)?)/gi, function(tag) {\n          // remove if src attribute is duplicated\n          if (/<.+src(?==?('|\"|\\s)?)[\\s\\S]+src(?=('|\"|\\s)?)[^>]*?>/i.test(tag)) {\n            return '';\n          }\n          for (const src of whitelist) {\n            // pass if src is trusted\n            if ((new RegExp('src=\"(https?:)?\\/\\/' + src.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '\\/(.+)\"')).test(tag)) {\n              return tag;\n            }\n          }\n          return '';\n        });\n      }\n    }\n    return value;\n  }\n\n  /**\n   * activate code view\n   */\n  activate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));\n    this.$codable.height(this.$editable.height());\n\n    this.context.invoke('toolbar.updateCodeview', true);\n    this.context.invoke('airPopover.updateCodeview', true);\n\n    this.$editor.addClass('codeview');\n    this.$codable.focus();\n\n    // activate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror);\n\n      // CodeMirror TernServer\n      if (this.options.codemirror.tern) {\n        const server = new CodeMirror.TernServer(this.options.codemirror.tern);\n        cmEditor.ternServer = server;\n        cmEditor.on('cursorActivity', (cm) => {\n          server.updateArgHints(cm);\n        });\n      }\n\n      cmEditor.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);\n      });\n      cmEditor.on('change', () => {\n        this.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);\n      });\n\n      // CodeMirror hasn't Padding.\n      cmEditor.setSize(null, this.$editable.outerHeight());\n      this.$codable.data('cmEditor', cmEditor);\n    } else {\n      this.$codable.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', this.$codable.val(), event);\n      });\n      this.$codable.on('input', () => {\n        this.context.triggerEvent('change.codeview', this.$codable.val(), this.$codable);\n      });\n    }\n  }\n\n  /**\n   * deactivate code view\n   */\n  deactivate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    // deactivate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = this.$codable.data('cmEditor');\n      this.$codable.val(cmEditor.getValue());\n      cmEditor.toTextArea();\n    }\n\n    const value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);\n    const isChange = this.$editable.html() !== value;\n\n    this.$editable.html(value);\n    this.$editable.height(this.options.height ? this.$codable.height() : 'auto');\n    this.$editor.removeClass('codeview');\n\n    if (isChange) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n\n    this.$editable.focus();\n\n    this.context.invoke('toolbar.updateCodeview', false);\n    this.context.invoke('airPopover.updateCodeview', false);\n  }\n\n  destroy() {\n    if (this.isActivated()) {\n      this.deactivate();\n    }\n  }\n}\n","import $ from 'jquery';\nconst EDITABLE_PADDING = 24;\n\nexport default class Statusbar {\n  constructor(context) {\n    this.$document = $(document);\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n  }\n\n  initialize() {\n    if (this.options.airMode || this.options.disableResizeEditor) {\n      this.destroy();\n      return;\n    }\n\n    this.$statusbar.on('mousedown', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const editableTop = this.$editable.offset().top - this.$document.scrollTop();\n      const editableCodeTop = this.$codable.offset().top - this.$document.scrollTop();\n\n      const onMouseMove = (event) => {\n        let height = event.clientY - (editableTop + EDITABLE_PADDING);\n        let heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);\n\n        height = (this.options.minheight > 0) ? Math.max(height, this.options.minheight) : height;\n        height = (this.options.maxHeight > 0) ? Math.min(height, this.options.maxHeight) : height;\n        heightCode = (this.options.minheight > 0) ? Math.max(heightCode, this.options.minheight) : heightCode;\n        heightCode = (this.options.maxHeight > 0) ? Math.min(heightCode, this.options.maxHeight) : heightCode;\n\n\n        this.$editable.height(height);\n        this.$codable.height(heightCode);\n      };\n\n      this.$document.on('mousemove', onMouseMove).one('mouseup', () => {\n        this.$document.off('mousemove', onMouseMove);\n      });\n    });\n  }\n\n  destroy() {\n    this.$statusbar.off();\n    this.$statusbar.addClass('locked');\n  }\n}\n","import $ from 'jquery';\n\nexport default class Fullscreen {\n  constructor(context) {\n    this.context = context;\n\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n\n    this.$window = $(window);\n    this.$scrollbar = $('html, body');\n    this.scrollbarClassName = 'note-fullscreen-body';\n\n    this.onResize = () => {\n      this.resizeTo({\n        h: this.$window.height() - this.$toolbar.outerHeight(),\n      });\n    };\n  }\n\n  resizeTo(size) {\n    this.$editable.css('height', size.h);\n    this.$codable.css('height', size.h);\n    if (this.$codable.data('cmeditor')) {\n      this.$codable.data('cmeditor').setsize(null, size.h);\n    }\n  }\n\n  /**\n   * toggle fullscreen\n   */\n  toggle() {\n    this.$editor.toggleClass('fullscreen');\n    const isFullscreen = this.isFullscreen();\n    this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);\n    if (isFullscreen) {\n      this.$editable.data('orgHeight', this.$editable.css('height'));\n      this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));\n      this.$editable.css('maxHeight', '');\n      this.$window.on('resize', this.onResize).trigger('resize');\n    } else {\n      this.$window.off('resize', this.onResize);\n      this.resizeTo({ h: this.$editable.data('orgHeight') });\n      this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));\n    }\n\n    this.context.invoke('toolbar.updateFullscreen', isFullscreen);\n  }\n\n  isFullscreen() {\n    return this.$editor.hasClass('fullscreen');\n  }\n\n  destroy() {\n    this.$scrollbar.removeClass(this.scrollbarClassName);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\n\nexport default class Handle {\n  constructor(context) {\n    this.context = context;\n    this.$document = $(document);\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        if (this.update(e.target, e)) {\n          e.preventDefault();\n        }\n      },\n      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  initialize() {\n    this.$handle = $([\n      '<div class=\"note-handle\">',\n        '<div class=\"note-control-selection\">',\n          '<div class=\"note-control-selection-bg\"></div>',\n          '<div class=\"note-control-holder note-control-nw\"></div>',\n          '<div class=\"note-control-holder note-control-ne\"></div>',\n          '<div class=\"note-control-holder note-control-sw\"></div>',\n          '<div class=\"',\n            (this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),\n          ' note-control-se\"></div>',\n          (this.options.disableResizeImage ? '' : '<div class=\"note-control-selection-info\"></div>'),\n        '</div>',\n      '</div>',\n    ].join('')).prependTo(this.$editingArea);\n\n    this.$handle.on('mousedown', (event) => {\n      if (dom.isControlSizing(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const $target = this.$handle.find('.note-control-selection').data('target');\n        const posStart = $target.offset();\n        const scrollTop = this.$document.scrollTop();\n\n        const onMouseMove = (event) => {\n          this.context.invoke('editor.resizeTo', {\n            x: event.clientX - posStart.left,\n            y: event.clientY - (posStart.top - scrollTop),\n          }, $target, !event.shiftKey);\n\n          this.update($target[0], event);\n        };\n\n        this.$document\n          .on('mousemove', onMouseMove)\n          .one('mouseup', (e) => {\n            e.preventDefault();\n            this.$document.off('mousemove', onMouseMove);\n            this.context.invoke('editor.afterCommand');\n          });\n\n        if (!$target.data('ratio')) { // original ratio.\n          $target.data('ratio', $target.height() / $target.width());\n        }\n      }\n    });\n\n    // Listen for scrolling on the handle overlay.\n    this.$handle.on('wheel', (e) => {\n      e.preventDefault();\n      this.update();\n    });\n  }\n\n  destroy() {\n    this.$handle.remove();\n  }\n\n  update(target, event) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isImage = dom.isImg(target);\n    const $selection = this.$handle.find('.note-control-selection');\n\n    this.context.invoke('imagePopover.update', target, event);\n\n    if (isImage) {\n      const $image = $(target);\n      const position = $image.position();\n      const pos = {\n        left: position.left + parseInt($image.css('marginLeft'), 10),\n        top: position.top + parseInt($image.css('marginTop'), 10),\n      };\n\n      // exclude margin\n      const imageSize = {\n        w: $image.outerWidth(false),\n        h: $image.outerHeight(false),\n      };\n\n      $selection.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n        width: imageSize.w,\n        height: imageSize.h,\n      }).data('target', $image); // save current image element.\n\n      const origImageObj = new Image();\n      origImageObj.src = $image.attr('src');\n\n      const sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';\n      $selection.find('.note-control-selection-info').text(sizingText);\n      this.context.invoke('editor.saveTarget', target);\n    } else {\n      this.hide();\n    }\n\n    return isImage;\n  }\n\n  /**\n   * hide\n   *\n   * @param {jQuery} $handle\n   */\n  hide() {\n    this.context.invoke('editor.clearTarget');\n    this.$handle.children().hide();\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport key from '../core/key';\n\nconst defaultScheme = 'http://';\nconst linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\\:[\\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\\.)?(.+)$/i;\n\nexport default class AutoLink {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n  }\n\n  destroy() {\n    this.lastWordRange = null;\n  }\n\n  replace() {\n    if (!this.lastWordRange) {\n      return;\n    }\n\n    const keyword = this.lastWordRange.toString();\n    const match = keyword.match(linkPattern);\n\n    if (match && (match[1] || match[2])) {\n      const link = match[1] ? keyword : defaultScheme + keyword;\n      const urlText = this.options.showDomainOnlyForAutolink ?\n        keyword.replace(/^(?:https?:\\/\\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\\.)?/i, '').split('/')[0]\n        : keyword;\n      const node = $('<a></a>').html(urlText).attr('href', link)[0];\n      if (this.context.options.linkTargetBlank) {\n        $(node).attr('target', '_blank');\n      }\n\n      this.lastWordRange.insertNode(node);\n      this.lastWordRange = null;\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  handleKeydown(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWordRange = wordRange;\n    }\n  }\n\n  handleKeyup(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import dom from '../core/dom';\n\n/**\n * textarea auto sync.\n */\nexport default class AutoSync {\n  constructor(context) {\n    this.$note = context.layoutInfo.note;\n    this.events = {\n      'summernote.change': () => {\n        this.$note.val(context.invoke('code'));\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return dom.isTextarea(this.$note[0]);\n  }\n}\n","import lists from '../core/lists';\nimport dom from '../core/dom';\nimport key from '../core/key';\n\nexport default class AutoReplace {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options.replace || {};\n\n    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];\n    this.previousKeydownCode = null;\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.match;\n  }\n\n  initialize() {\n    this.lastWord = null;\n  }\n\n  destroy() {\n    this.lastWord = null;\n  }\n\n  replace() {\n    if (!this.lastWord) {\n      return;\n    }\n\n    const self = this;\n    const keyword = this.lastWord.toString();\n    this.options.match(keyword, function(match) {\n      if (match) {\n        let node = '';\n\n        if (typeof match === 'string') {\n          node = dom.createText(match);\n        } else if (match instanceof jQuery) {\n          node = match[0];\n        } else if (match instanceof Node) {\n          node = match;\n        }\n\n        if (!node) return;\n        self.lastWord.insertNode(node);\n        self.lastWord = null;\n        self.context.invoke('editor.focus');\n      }\n    });\n  }\n\n  handleKeydown(e) {\n    // this forces it to remember the last whole word, even if multiple termination keys are pressed\n    // before the previous key is let go.\n    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {\n      this.previousKeydownCode = e.keyCode;\n      return;\n    }\n\n    if (lists.contains(this.keys, e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWord = wordRange;\n    }\n    this.previousKeydownCode = e.keyCode;\n  }\n\n  handleKeyup(e) {\n    if (lists.contains(this.keys, e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import $ from 'jquery';\nexport default class Placeholder {\n  constructor(context) {\n    this.context = context;\n\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n\n    if (this.options.inheritPlaceholder === true) {\n      // get placeholder value from the original element\n      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;\n    }\n\n    this.events = {\n      'summernote.init summernote.change': () => {\n        this.update();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.placeholder;\n  }\n\n  initialize() {\n    this.$placeholder = $('<div class=\"note-placeholder\"></div>');\n    this.$placeholder.on('click', () => {\n      this.context.invoke('focus');\n    }).html(this.options.placeholder).prependTo(this.$editingArea);\n\n    this.update();\n  }\n\n  destroy() {\n    this.$placeholder.remove();\n  }\n\n  update() {\n    const isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');\n    this.$placeholder.toggle(isShow);\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport env from '../core/env';\n\nexport default class Buttons {\n  constructor(context) {\n    this.ui = $.summernote.ui;\n    this.context = context;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.invertedKeyMap = func.invertObject(\n      this.options.keyMap[env.isMac ? 'mac' : 'pc']\n    );\n  }\n\n  representShortcut(editorMethod) {\n    let shortcut = this.invertedKeyMap[editorMethod];\n    if (!this.options.shortcuts || !shortcut) {\n      return '';\n    }\n\n    if (env.isMac) {\n      shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');\n    }\n\n    shortcut = shortcut.replace('BACKSLASH', '\\\\')\n      .replace('SLASH', '/')\n      .replace('LEFTBRACKET', '[')\n      .replace('RIGHTBRACKET', ']');\n\n    return ' (' + shortcut + ')';\n  }\n\n  button(o) {\n    if (!this.options.tooltip && o.tooltip) {\n      delete o.tooltip;\n    }\n    o.container = this.options.container;\n    return this.ui.button(o);\n  }\n\n  initialize() {\n    this.addToolbarButtons();\n    this.addImagePopoverButtons();\n    this.addLinkPopoverButtons();\n    this.addTablePopoverButtons();\n    this.fontInstalledMap = {};\n  }\n\n  destroy() {\n    delete this.fontInstalledMap;\n  }\n\n  isFontInstalled(name) {\n    if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {\n      this.fontInstalledMap[name] = env.isFontInstalled(name) ||\n        lists.contains(this.options.fontNamesIgnoreCheck, name);\n    }\n    return this.fontInstalledMap[name];\n  }\n\n  isFontDeservedToAdd(name) {\n    name = name.toLowerCase();\n    return (name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1);\n  }\n\n  colorPalette(className, tooltip, backColor, foreColor) {\n    return this.ui.buttonGroup({\n      className: 'note-color ' + className,\n      children: [\n        this.button({\n          className: 'note-current-color-button',\n          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),\n          tooltip: tooltip,\n          click: (e) => {\n            const $button = $(e.currentTarget);\n            if (backColor && foreColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n                foreColor: $button.attr('data-foreColor'),\n              });\n            } else if (backColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n              });\n            } else if (foreColor) {\n              this.context.invoke('editor.color', {\n                foreColor: $button.attr('data-foreColor'),\n              });\n            }\n          },\n          callback: ($button) => {\n            const $recentColor = $button.find('.note-recent-color');\n            if (backColor) {\n              $recentColor.css('background-color', this.options.colorButton.backColor);\n              $button.attr('data-backColor', this.options.colorButton.backColor);\n            }\n            if (foreColor) {\n              $recentColor.css('color', this.options.colorButton.foreColor);\n              $button.attr('data-foreColor', this.options.colorButton.foreColor);\n            } else {\n              $recentColor.css('color', 'transparent');\n            }\n          },\n        }),\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('', this.options),\n          tooltip: this.lang.color.more,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          items: (backColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.background + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"backColor\" data-value=\"transparent\">',\n                  this.lang.color.transparent,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"backColor\"><!-- back colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"backColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"backColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.backColor + '\" data-event=\"backColorPalette-'+this.options.id+'\">',\n              '</div>',\n              '<div class=\"note-holder-custom\" id=\"backColorPalette-'+this.options.id+'\" data-event=\"backColor\"></div>',\n            '</div>',\n          ].join('') : '') +\n          (foreColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.foreground + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                  this.lang.color.resetToDefault,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"foreColor\"><!-- fore colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"foreColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"foreColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.foreColor + '\" data-event=\"foreColorPalette-'+this.options.id+'\">',\n              '</div>', // Fix missing Div, Commented to find easily if it's wrong\n              '<div class=\"note-holder-custom\" id=\"foreColorPalette-'+this.options.id+'\" data-event=\"foreColor\"></div>',\n            '</div>',\n          ].join('') : ''),\n          callback: ($dropdown) => {\n            $dropdown.find('.note-holder').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: this.options.colors,\n                colorsName: this.options.colorsName,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            /* TODO: do we have to record recent custom colors within cookies? */\n            var customColors = [\n              ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF'],\n            ];\n            $dropdown.find('.note-holder-custom').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: customColors,\n                colorsName: customColors,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            $dropdown.find('input[type=color]').each((idx, item) => {\n              $(item).change(function() {\n                const $chip = $dropdown.find('#' + $(this).data('event')).find('.note-color-btn').first();\n                const color = this.value.toUpperCase();\n                $chip.css('background-color', color)\n                  .attr('aria-label', color)\n                  .attr('data-value', color)\n                  .attr('data-original-title', color);\n                $chip.click();\n              });\n            });\n          },\n          click: (event) => {\n            event.stopPropagation();\n\n            const $parent = $('.' + className).find('.note-dropdown-menu');\n            const $button = $(event.target);\n            const eventName = $button.data('event');\n            const value = $button.attr('data-value');\n\n            if (eventName === 'openPalette') {\n              const $picker = $parent.find('#' + value);\n              const $palette = $($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]);\n\n              // Shift palette chips\n              const $chip = $palette.find('.note-color-btn').last().detach();\n\n              // Set chip attributes\n              const color = $picker.val();\n              $chip.css('background-color', color)\n                .attr('aria-label', color)\n                .attr('data-value', color)\n                .attr('data-original-title', color);\n              $palette.prepend($chip);\n              $picker.click();\n            } else {\n              if (lists.contains(['backColor', 'foreColor'], eventName)) {\n                const key = eventName === 'backColor' ? 'background-color' : 'color';\n                const $color = $button.closest('.note-color').find('.note-recent-color');\n                const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n                $color.css(key, value);\n                $currentButton.attr('data-' + eventName, value);\n              }\n              this.context.invoke('editor.' + eventName, value);\n            }\n          },\n        }),\n      ],\n    }).render();\n  }\n\n  addToolbarButtons() {\n    this.context.memo('button.style', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            this.ui.icon(this.options.icons.magic), this.options\n          ),\n          tooltip: this.lang.style.style,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          className: 'dropdown-style',\n          items: this.options.styleTags,\n          title: this.lang.style.style,\n          template: (item) => {\n            // TBD: need to be simplified\n            if (typeof item === 'string') {\n              item = {\n                tag: item,\n                title: (Object.prototype.hasOwnProperty.call(this.lang.style, item) ? this.lang.style[item] : item),\n              };\n            }\n\n            const tag = item.tag;\n            const title = item.title;\n            const style = item.style ? ' style=\"' + item.style + '\" ' : '';\n            const className = item.className ? ' class=\"' + item.className + '\"' : '';\n\n            return '<' + tag + style + className + '>' + title + '</' + tag + '>';\n          },\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }),\n      ]).render();\n    });\n\n    for (let styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {\n      const item = this.options.styleTags[styleIdx];\n\n      this.context.memo('button.style.' + item, () => {\n        return this.button({\n          className: 'note-btn-style-' + item,\n          contents: '<div data-value=\"' + item + '\">' + item.toUpperCase() + '</div>',\n          tooltip: this.lang.style[item],\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }).render();\n      });\n    }\n\n    this.context.memo('button.bold', () => {\n      return this.button({\n        className: 'note-btn-bold',\n        contents: this.ui.icon(this.options.icons.bold),\n        tooltip: this.lang.font.bold + this.representShortcut('bold'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.bold'),\n      }).render();\n    });\n\n    this.context.memo('button.italic', () => {\n      return this.button({\n        className: 'note-btn-italic',\n        contents: this.ui.icon(this.options.icons.italic),\n        tooltip: this.lang.font.italic + this.representShortcut('italic'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.italic'),\n      }).render();\n    });\n\n    this.context.memo('button.underline', () => {\n      return this.button({\n        className: 'note-btn-underline',\n        contents: this.ui.icon(this.options.icons.underline),\n        tooltip: this.lang.font.underline + this.representShortcut('underline'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.underline'),\n      }).render();\n    });\n\n    this.context.memo('button.clear', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.eraser),\n        tooltip: this.lang.font.clear + this.representShortcut('removeFormat'),\n        click: this.context.createInvokeHandler('editor.removeFormat'),\n      }).render();\n    });\n\n    this.context.memo('button.strikethrough', () => {\n      return this.button({\n        className: 'note-btn-strikethrough',\n        contents: this.ui.icon(this.options.icons.strikethrough),\n        tooltip: this.lang.font.strikethrough + this.representShortcut('strikethrough'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.strikethrough'),\n      }).render();\n    });\n\n    this.context.memo('button.superscript', () => {\n      return this.button({\n        className: 'note-btn-superscript',\n        contents: this.ui.icon(this.options.icons.superscript),\n        tooltip: this.lang.font.superscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.superscript'),\n      }).render();\n    });\n\n    this.context.memo('button.subscript', () => {\n      return this.button({\n        className: 'note-btn-subscript',\n        contents: this.ui.icon(this.options.icons.subscript),\n        tooltip: this.lang.font.subscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.subscript'),\n      }).render();\n    });\n\n    this.context.memo('button.fontname', () => {\n      const styleInfo = this.context.invoke('editor.currentStyle');\n\n      if (this.options.addDefaultFonts) {\n        // Add 'default' fonts into the fontnames array if not exist\n        $.each(styleInfo['font-family'].split(','), (idx, fontname) => {\n          fontname = fontname.trim().replace(/['\"]+/g, '');\n          if (this.isFontDeservedToAdd(fontname)) {\n            if (this.options.fontNames.indexOf(fontname) === -1) {\n              this.options.fontNames.push(fontname);\n            }\n          }\n        });\n      }\n\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            '<span class=\"note-current-fontname\"></span>', this.options\n          ),\n          tooltip: this.lang.font.name,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontname',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontNames.filter(this.isFontInstalled.bind(this)),\n          title: this.lang.font.name,\n          template: (item) => {\n            return '<span style=\"font-family: ' + env.validFontName(item) + '\">' + item + '</span>';\n          },\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontName'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsize', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsize\"></span>', this.options),\n          tooltip: this.lang.font.size,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsize',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizes,\n          title: this.lang.font.size,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSize'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsizeunit', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsizeunit\"></span>', this.options),\n          tooltip: this.lang.font.sizeunit,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsizeunit',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizeUnits,\n          title: this.lang.font.sizeunit,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.color', () => {\n      return this.colorPalette('note-color-all', this.lang.color.recent, true, true);\n    });\n\n    this.context.memo('button.forecolor', () => {\n      return this.colorPalette('note-color-fore', this.lang.color.foreground, false, true);\n    });\n\n    this.context.memo('button.backcolor', () => {\n      return this.colorPalette('note-color-back', this.lang.color.background, true, false);\n    });\n\n    this.context.memo('button.ul', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unorderedlist),\n        tooltip: this.lang.lists.unordered + this.representShortcut('insertUnorderedList'),\n        click: this.context.createInvokeHandler('editor.insertUnorderedList'),\n      }).render();\n    });\n\n    this.context.memo('button.ol', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.orderedlist),\n        tooltip: this.lang.lists.ordered + this.representShortcut('insertOrderedList'),\n        click: this.context.createInvokeHandler('editor.insertOrderedList'),\n      }).render();\n    });\n\n    const justifyLeft = this.button({\n      contents: this.ui.icon(this.options.icons.alignLeft),\n      tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),\n      click: this.context.createInvokeHandler('editor.justifyLeft'),\n    });\n\n    const justifyCenter = this.button({\n      contents: this.ui.icon(this.options.icons.alignCenter),\n      tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),\n      click: this.context.createInvokeHandler('editor.justifyCenter'),\n    });\n\n    const justifyRight = this.button({\n      contents: this.ui.icon(this.options.icons.alignRight),\n      tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),\n      click: this.context.createInvokeHandler('editor.justifyRight'),\n    });\n\n    const justifyFull = this.button({\n      contents: this.ui.icon(this.options.icons.alignJustify),\n      tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),\n      click: this.context.createInvokeHandler('editor.justifyFull'),\n    });\n\n    const outdent = this.button({\n      contents: this.ui.icon(this.options.icons.outdent),\n      tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),\n      click: this.context.createInvokeHandler('editor.outdent'),\n    });\n\n    const indent = this.button({\n      contents: this.ui.icon(this.options.icons.indent),\n      tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),\n      click: this.context.createInvokeHandler('editor.indent'),\n    });\n\n    this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));\n    this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));\n    this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));\n    this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));\n    this.context.memo('button.outdent', func.invoke(outdent, 'render'));\n    this.context.memo('button.indent', func.invoke(indent, 'render'));\n\n    this.context.memo('button.paragraph', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.alignLeft), this.options),\n          tooltip: this.lang.paragraph.paragraph,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown([\n          this.ui.buttonGroup({\n            className: 'note-align',\n            children: [justifyLeft, justifyCenter, justifyRight, justifyFull],\n          }),\n          this.ui.buttonGroup({\n            className: 'note-list',\n            children: [outdent, indent],\n          }),\n        ]),\n      ]).render();\n    });\n\n    this.context.memo('button.height', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.textHeight), this.options),\n          tooltip: this.lang.font.height,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          items: this.options.lineHeights,\n          checkClassName: this.options.icons.menuCheck,\n          className: 'dropdown-line-height',\n          title: this.lang.font.height,\n          click: this.context.createInvokeHandler('editor.lineHeight'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.table', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.table), this.options),\n          tooltip: this.lang.table.table,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          title: this.lang.table.table,\n          className: 'note-table',\n          items: [\n            '<div class=\"note-dimension-picker\">',\n              '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n              '<div class=\"note-dimension-picker-highlighted\"></div>',\n              '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n            '</div>',\n            '<div class=\"note-dimension-display\">1 x 1</div>',\n          ].join(''),\n        }),\n      ], {\n        callback: ($node) => {\n          const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n          $catcher.css({\n            width: this.options.insertTableMaxSize.col + 'em',\n            height: this.options.insertTableMaxSize.row + 'em',\n          }).mouseup(this.context.createInvokeHandler('editor.insertTable'))\n            .on('mousemove', this.tableMoveHandler.bind(this));\n        },\n      }).render();\n    });\n\n    this.context.memo('button.link', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.link + this.representShortcut('linkDialog.show'),\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.picture', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.picture),\n        tooltip: this.lang.image.image,\n        click: this.context.createInvokeHandler('imageDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.video', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.video),\n        tooltip: this.lang.video.video,\n        click: this.context.createInvokeHandler('videoDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.hr', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.minus),\n        tooltip: this.lang.hr.insert + this.representShortcut('insertHorizontalRule'),\n        click: this.context.createInvokeHandler('editor.insertHorizontalRule'),\n      }).render();\n    });\n\n    this.context.memo('button.fullscreen', () => {\n      return this.button({\n        className: 'btn-fullscreen note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.arrowsAlt),\n        tooltip: this.lang.options.fullscreen,\n        click: this.context.createInvokeHandler('fullscreen.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.codeview', () => {\n      return this.button({\n        className: 'btn-codeview note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.code),\n        tooltip: this.lang.options.codeview,\n        click: this.context.createInvokeHandler('codeview.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.redo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.redo),\n        tooltip: this.lang.history.redo + this.representShortcut('redo'),\n        click: this.context.createInvokeHandler('editor.redo'),\n      }).render();\n    });\n\n    this.context.memo('button.undo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.undo),\n        tooltip: this.lang.history.undo + this.representShortcut('undo'),\n        click: this.context.createInvokeHandler('editor.undo'),\n      }).render();\n    });\n\n    this.context.memo('button.help', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.question),\n        tooltip: this.lang.options.help,\n        click: this.context.createInvokeHandler('helpDialog.show'),\n      }).render();\n    });\n  }\n\n  /**\n   * image: [\n   *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n   *   ['float', ['floatLeft', 'floatRight', 'floatNone']],\n   *   ['remove', ['removeMedia']],\n   * ],\n   */\n  addImagePopoverButtons() {\n    // Image Size Buttons\n    this.context.memo('button.resizeFull', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">100%</span>',\n        tooltip: this.lang.image.resizeFull,\n        click: this.context.createInvokeHandler('editor.resize', '1'),\n      }).render();\n    });\n    this.context.memo('button.resizeHalf', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">50%</span>',\n        tooltip: this.lang.image.resizeHalf,\n        click: this.context.createInvokeHandler('editor.resize', '0.5'),\n      }).render();\n    });\n    this.context.memo('button.resizeQuarter', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">25%</span>',\n        tooltip: this.lang.image.resizeQuarter,\n        click: this.context.createInvokeHandler('editor.resize', '0.25'),\n      }).render();\n    });\n    this.context.memo('button.resizeNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.resizeNone,\n        click: this.context.createInvokeHandler('editor.resize', '0'),\n      }).render();\n    });\n\n    // Float Buttons\n    this.context.memo('button.floatLeft', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatLeft),\n        tooltip: this.lang.image.floatLeft,\n        click: this.context.createInvokeHandler('editor.floatMe', 'left'),\n      }).render();\n    });\n\n    this.context.memo('button.floatRight', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatRight),\n        tooltip: this.lang.image.floatRight,\n        click: this.context.createInvokeHandler('editor.floatMe', 'right'),\n      }).render();\n    });\n\n    this.context.memo('button.floatNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.floatNone,\n        click: this.context.createInvokeHandler('editor.floatMe', 'none'),\n      }).render();\n    });\n\n    // Remove Buttons\n    this.context.memo('button.removeMedia', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.image.remove,\n        click: this.context.createInvokeHandler('editor.removeMedia'),\n      }).render();\n    });\n  }\n\n  addLinkPopoverButtons() {\n    this.context.memo('button.linkDialogShow', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.edit,\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.unlink', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unlink),\n        tooltip: this.lang.link.unlink,\n        click: this.context.createInvokeHandler('editor.unlink'),\n      }).render();\n    });\n  }\n\n  /**\n   * table : [\n   *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n   *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]\n   * ],\n   */\n  addTablePopoverButtons() {\n    this.context.memo('button.addRowUp', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowAbove),\n        tooltip: this.lang.table.addRowAbove,\n        click: this.context.createInvokeHandler('editor.addRow', 'top'),\n      }).render();\n    });\n    this.context.memo('button.addRowDown', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowBelow),\n        tooltip: this.lang.table.addRowBelow,\n        click: this.context.createInvokeHandler('editor.addRow', 'bottom'),\n      }).render();\n    });\n    this.context.memo('button.addColLeft', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colBefore),\n        tooltip: this.lang.table.addColLeft,\n        click: this.context.createInvokeHandler('editor.addCol', 'left'),\n      }).render();\n    });\n    this.context.memo('button.addColRight', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colAfter),\n        tooltip: this.lang.table.addColRight,\n        click: this.context.createInvokeHandler('editor.addCol', 'right'),\n      }).render();\n    });\n    this.context.memo('button.deleteRow', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowRemove),\n        tooltip: this.lang.table.delRow,\n        click: this.context.createInvokeHandler('editor.deleteRow'),\n      }).render();\n    });\n    this.context.memo('button.deleteCol', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colRemove),\n        tooltip: this.lang.table.delCol,\n        click: this.context.createInvokeHandler('editor.deleteCol'),\n      }).render();\n    });\n    this.context.memo('button.deleteTable', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.table.delTable,\n        click: this.context.createInvokeHandler('editor.deleteTable'),\n      }).render();\n    });\n  }\n\n  build($container, groups) {\n    for (let groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {\n      const group = groups[groupIdx];\n      const groupName = Array.isArray(group) ? group[0] : group;\n      const buttons = Array.isArray(group) ? ((group.length === 1) ? [group[0]] : group[1]) : [group];\n\n      const $group = this.ui.buttonGroup({\n        className: 'note-' + groupName,\n      }).render();\n\n      for (let idx = 0, len = buttons.length; idx < len; idx++) {\n        const btn = this.context.memo('button.' + buttons[idx]);\n        if (btn) {\n          $group.append(typeof btn === 'function' ? btn(this.context) : btn);\n        }\n      }\n      $group.appendTo($container);\n    }\n  }\n\n  /**\n   * @param {jQuery} [$container]\n   */\n  updateCurrentStyle($container) {\n    const $cont = $container || this.$toolbar;\n\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    this.updateBtnStates($cont, {\n      '.note-btn-bold': () => {\n        return styleInfo['font-bold'] === 'bold';\n      },\n      '.note-btn-italic': () => {\n        return styleInfo['font-italic'] === 'italic';\n      },\n      '.note-btn-underline': () => {\n        return styleInfo['font-underline'] === 'underline';\n      },\n      '.note-btn-subscript': () => {\n        return styleInfo['font-subscript'] === 'subscript';\n      },\n      '.note-btn-superscript': () => {\n        return styleInfo['font-superscript'] === 'superscript';\n      },\n      '.note-btn-strikethrough': () => {\n        return styleInfo['font-strikethrough'] === 'strikethrough';\n      },\n    });\n\n    if (styleInfo['font-family']) {\n      const fontNames = styleInfo['font-family'].split(',').map((name) => {\n        return name.replace(/[\\'\\\"]/g, '')\n          .replace(/\\s+$/, '')\n          .replace(/^\\s+/, '');\n      });\n      const fontName = lists.find(fontNames, this.isFontInstalled.bind(this));\n\n      $cont.find('.dropdown-fontname a').each((idx, item) => {\n        const $item = $(item);\n        // always compare string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontName + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);\n    }\n\n    if (styleInfo['font-size']) {\n      const fontSize = styleInfo['font-size'];\n      $cont.find('.dropdown-fontsize a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontSize + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsize').text(fontSize);\n\n      const fontSizeUnit = styleInfo['font-size-unit'];\n      $cont.find('.dropdown-fontsizeunit a').each((idx, item) => {\n        const $item = $(item);\n        const isChecked = ($item.data('value') + '') === (fontSizeUnit + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);\n    }\n\n    if (styleInfo['line-height']) {\n      const lineHeight = styleInfo['line-height'];\n      $cont.find('.dropdown-line-height a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($(item).data('value') + '') === (lineHeight + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-line-height').text(lineHeight);\n    }\n  }\n\n  updateBtnStates($container, infos) {\n    $.each(infos, (selector, pred) => {\n      this.ui.toggleBtnActive($container.find(selector), pred());\n    });\n  }\n\n  tableMoveHandler(event) {\n    const PX_PER_EM = 18;\n    const $picker = $(event.target.parentNode); // target is mousecatcher\n    const $dimensionDisplay = $picker.next();\n    const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n    const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n    const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n    let posOffset;\n    // HTML5 with jQuery - e.offsetX is undefined in Firefox\n    if (event.offsetX === undefined) {\n      const posCatcher = $(event.target).offset();\n      posOffset = {\n        x: event.pageX - posCatcher.left,\n        y: event.pageY - posCatcher.top,\n      };\n    } else {\n      posOffset = {\n        x: event.offsetX,\n        y: event.offsetY,\n      };\n    }\n\n    const dim = {\n      c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n      r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n    };\n\n    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n    $catcher.data('value', dim.c + 'x' + dim.r);\n\n    if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {\n      $unhighlighted.css({ width: dim.c + 1 + 'em' });\n    }\n\n    if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {\n      $unhighlighted.css({ height: dim.r + 1 + 'em' });\n    }\n\n    $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n  }\n}\n","import $ from 'jquery';\nexport default class Toolbar {\n  constructor(context) {\n    this.context = context;\n\n    this.$window = $(window);\n    this.$document = $(document);\n\n    this.ui = $.summernote.ui;\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.options = context.options;\n\n    this.isFollowing = false;\n    this.followScroll = this.followScroll.bind(this);\n  }\n\n  shouldInitialize() {\n    return !this.options.airMode;\n  }\n\n  initialize() {\n    this.options.toolbar = this.options.toolbar || [];\n\n    if (!this.options.toolbar.length) {\n      this.$toolbar.hide();\n    } else {\n      this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);\n    }\n\n    if (this.options.toolbarContainer) {\n      this.$toolbar.appendTo(this.options.toolbarContainer);\n    }\n\n    this.changeContainer(false);\n\n    this.$note.on('summernote.keyup summernote.mouseup summernote.change', () => {\n      this.context.invoke('buttons.updateCurrentStyle');\n    });\n\n    this.context.invoke('buttons.updateCurrentStyle');\n    if (this.options.followingToolbar) {\n      this.$window.on('scroll resize', this.followScroll);\n    }\n  }\n\n  destroy() {\n    this.$toolbar.children().remove();\n\n    if (this.options.followingToolbar) {\n      this.$window.off('scroll resize', this.followScroll);\n    }\n  }\n\n  followScroll() {\n    if (this.$editor.hasClass('fullscreen')) {\n      return false;\n    }\n\n    const editorHeight = this.$editor.outerHeight();\n    const editorWidth = this.$editor.width();\n    const toolbarHeight = this.$toolbar.height();\n    const statusbarHeight = this.$statusbar.height();\n\n    // check if the web app is currently using another static bar\n    let otherBarHeight = 0;\n    if (this.options.otherStaticBar) {\n      otherBarHeight = $(this.options.otherStaticBar).outerHeight();\n    }\n\n    const currentOffset = this.$document.scrollTop();\n    const editorOffsetTop = this.$editor.offset().top;\n    const editorOffsetBottom = editorOffsetTop + editorHeight;\n    const activateOffset = editorOffsetTop - otherBarHeight;\n    const deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;\n\n    if (!this.isFollowing &&\n      (currentOffset > activateOffset) && (currentOffset < deactivateOffsetBottom - toolbarHeight)) {\n      this.isFollowing = true;\n      this.$editable.css({\n        marginTop: this.$toolbar.outerHeight(),\n      });\n      this.$toolbar.css({\n        position: 'fixed',\n        top: otherBarHeight,\n        width: editorWidth,\n        zIndex: 1000,\n      });\n    } else if (this.isFollowing &&\n      ((currentOffset < activateOffset) || (currentOffset > deactivateOffsetBottom))) {\n      this.isFollowing = false;\n      this.$toolbar.css({\n        position: 'relative',\n        top: 0,\n        width: '100%',\n        zIndex: 'auto',\n      });\n      this.$editable.css({\n        marginTop: '',\n      });\n    }\n  }\n\n  changeContainer(isFullscreen) {\n    if (isFullscreen) {\n      this.$toolbar.prependTo(this.$editor);\n    } else {\n      if (this.options.toolbarContainer) {\n        this.$toolbar.appendTo(this.options.toolbarContainer);\n      }\n    }\n    if (this.options.followingToolbar) {\n      this.followScroll();\n    }\n  }\n\n  updateFullscreen(isFullscreen) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);\n\n    this.changeContainer(isFullscreen);\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  }\n\n  activate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, true);\n  }\n\n  deactivate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, false);\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\n\nexport default class LinkDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-txt-${this.options.id}\" class=\"note-form-label\">${this.lang.link.textToDisplay}</label>`,\n        `<input id=\"note-dialog-link-txt-${this.options.id}\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-url-${this.options.id}\" class=\"note-form-label\">${this.lang.link.url}</label>`,\n        `<input id=\"note-dialog-link-url-${this.options.id}\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>`,\n      '</div>',\n      !this.options.disableLinkTarget\n        ? $('<div></div>').append(this.ui.checkbox({\n          className: 'sn-checkbox-open-in-new-window',\n          text: this.lang.link.openInNewWindow,\n          checked: true,\n        }).render()).html()\n        : '',\n      $('<div></div>').append(this.ui.checkbox({\n        className: 'sn-checkbox-use-protocol',\n        text: this.lang.link.useProtocol,\n        checked: true,\n      }).render()).html(),\n    ].join('');\n\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.link.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      className: 'link-dialog',\n      title: this.lang.link.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  /**\n   * toggle update button\n   */\n  toggleLinkBtn($linkBtn, $linkText, $linkUrl) {\n    this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());\n  }\n\n  /**\n   * Show link dialog and set event handlers on dialog controls.\n   *\n   * @param {Object} linkInfo\n   * @return {Promise}\n   */\n  showLinkDialog(linkInfo) {\n    return $.Deferred((deferred) => {\n      const $linkText = this.$dialog.find('.note-link-text');\n      const $linkUrl = this.$dialog.find('.note-link-url');\n      const $linkBtn = this.$dialog.find('.note-link-btn');\n      const $openInNewWindow = this.$dialog\n        .find('.sn-checkbox-open-in-new-window input[type=checkbox]');\n      const $useProtocol = this.$dialog\n        .find('.sn-checkbox-use-protocol input[type=checkbox]');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // If no url was given and given text is valid URL then copy that into URL Field\n        if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {\n          linkInfo.url = linkInfo.text;\n        }\n\n        $linkText.on('input paste propertychange', () => {\n          // If linktext was modified by input events,\n          // cloning text from linkUrl will be stopped.\n          linkInfo.text = $linkText.val();\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.text);\n\n        $linkUrl.on('input paste propertychange', () => {\n          // Display same text on `Text to display` as default\n          // when linktext has no text\n          if (!linkInfo.text) {\n            $linkText.val($linkUrl.val());\n          }\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.url);\n\n        if (!env.isSupportTouch) {\n          $linkUrl.trigger('focus');\n        }\n\n        this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        this.bindEnterKey($linkUrl, $linkBtn);\n        this.bindEnterKey($linkText, $linkBtn);\n\n        const isNewWindowChecked = linkInfo.isNewWindow !== undefined\n          ? linkInfo.isNewWindow : this.context.options.linkTargetBlank;\n\n        $openInNewWindow.prop('checked', isNewWindowChecked);\n\n        const useProtocolChecked = linkInfo.url\n          ? false : this.context.options.useProtocol;\n\n        $useProtocol.prop('checked', useProtocolChecked);\n\n        $linkBtn.one('click', (event) => {\n          event.preventDefault();\n\n          deferred.resolve({\n            range: linkInfo.range,\n            url: $linkUrl.val(),\n            text: $linkText.val(),\n            isNewWindow: $openInNewWindow.is(':checked'),\n            checkProtocol: $useProtocol.is(':checked'),\n          });\n          this.ui.hideDialog(this.$dialog);\n        });\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        // detach events\n        $linkText.off();\n        $linkUrl.off();\n        $linkBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  /**\n   * @param {Object} layoutInfo\n   */\n  show() {\n    const linkInfo = this.context.invoke('editor.getLinkInfo');\n\n    this.context.invoke('editor.saveRange');\n    this.showLinkDialog(linkInfo).then((linkInfo) => {\n      this.context.invoke('editor.restoreRange');\n      this.context.invoke('editor.createLink', linkInfo);\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class LinkPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.link);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-link-popover',\n      callback: ($node) => {\n        const $content = $node.find('.popover-content,.note-popover-content');\n        $content.prepend('<span><a target=\"_blank\"></a>&nbsp;</span>');\n      },\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.link);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update() {\n    // Prevent focusing on editable when invoke('code') is executed\n    if (!this.context.invoke('editor.hasFocus')) {\n      this.hide();\n      return;\n    }\n\n    const rng = this.context.invoke('editor.getLastRange');\n    if (rng.isCollapsed() && rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      const href = $(anchor).attr('href');\n      this.$popover.find('a').attr('href', href).text(href);\n\n      const pos = dom.posFromPlaceholder(anchor);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class ImageDialog {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    let imageLimitation = '';\n    if (this.options.maximumImageFileSize) {\n      const unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));\n      const readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +\n                         ' ' + ' KMGTP'[unit] + 'B';\n      imageLimitation = `<small>${this.lang.image.maximumFileSize + ' : ' + readableSize}</small>`;\n    }\n\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group note-group-select-from-files\">',\n        '<label for=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.selectFromFiles + '</label>',\n        '<input id=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-image-input form-control-file note-form-control note-input\" ',\n        ' type=\"file\" name=\"files\" accept=\"'+this.options.acceptImageFileTypes+'\" multiple=\"multiple\"/>',\n        imageLimitation,\n      '</div>',\n      '<div class=\"form-group note-group-image-url\">',\n        '<label for=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.url + '</label>',\n        '<input id=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-image-url form-control note-form-control note-input\" type=\"text\"/>',\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.image.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.image.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showImageDialog().then((data) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      if (typeof data === 'string') { // image url\n        // If onImageLinkInsert set,\n        if (this.options.callbacks.onImageLinkInsert) {\n          this.context.triggerEvent('image.link.insert', data);\n        } else {\n          this.context.invoke('editor.insertImage', data);\n        }\n      } else { // array of files\n        this.context.invoke('editor.insertImagesOrCallback', data);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show image dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showImageDialog() {\n    return $.Deferred((deferred) => {\n      const $imageInput = this.$dialog.find('.note-image-input');\n      const $imageUrl = this.$dialog.find('.note-image-url');\n      const $imageBtn = this.$dialog.find('.note-image-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // Cloning imageInput to clear element.\n        $imageInput.replaceWith($imageInput.clone().on('change', (event) => {\n          deferred.resolve(event.target.files || event.target.value);\n        }).val(''));\n\n        $imageUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($imageBtn, $imageUrl.val());\n        }).val('');\n\n        if (!env.isSupportTouch) {\n          $imageUrl.trigger('focus');\n        }\n\n        $imageBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($imageUrl.val());\n        });\n\n        this.bindEnterKey($imageUrl, $imageBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $imageInput.off();\n        $imageUrl.off();\n        $imageBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\n/**\n * Image popover module\n *  mouse events that show/hide popover will be handled by Handle.js.\n *  Handle.js will receive the events and invoke 'imagePopover.update'.\n */\nexport default class ImagePopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n\n    this.editable = context.layoutInfo.editable[0];\n    this.options = context.options;\n\n    this.events = {\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.image);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-image-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n    this.context.invoke('buttons.build', $content, this.options.popover.image);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target, event) {\n    if (dom.isImg(target)) {\n      const position = $(target).offset();\n      const containerOffset = $(this.options.container).offset();\n      let pos = {};\n      if (this.options.popatmouse) {\n        pos.left = event.pageX - 20;\n        pos.top = event.pageY;\n      } else {\n        pos = position;\n      }\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class TablePopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        this.update(e.target);\n      },\n      'summernote.keyup summernote.scroll summernote.change': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.table);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-table-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.table);\n\n    // [workaround] Disable Firefox's default table editor\n    if (env.isFF) {\n      document.execCommand('enableInlineTableEditing', false, false);\n    }\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isCell = dom.isCell(target) || dom.isCell(target?.parentElement);\n\n    if (isCell) {\n      const pos = dom.posFromPlaceholder(target);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n\n    return isCell;\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class VideoDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group row-fluid\">',\n        `<label for=\"note-dialog-video-url-${this.options.id}\" class=\"note-form-label\">${this.lang.video.url} <small class=\"text-muted\">${this.lang.video.providers}</small></label>`,\n        `<input id=\"note-dialog-video-url-${this.options.id}\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.video.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.video.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  createVideoNode(url) {\n    // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)\n    const ytRegExp = /\\/\\/(?:(?:www|m)\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))([\\w|-]{11})(?:(?:[\\?&]t=)(\\S+))?$/;\n    const ytRegExpForStart = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n    const ytMatch = url.match(ytRegExp);\n\n    const gdRegExp = /(?:\\.|\\/\\/)drive\\.google\\.com\\/file\\/d\\/(.[a-zA-Z0-9_-]*)\\/view/;\n    const gdMatch = url.match(gdRegExp);\n\n    const igRegExp = /(?:www\\.|\\/\\/)instagram\\.com\\/p\\/(.[a-zA-Z0-9_-]*)/;\n    const igMatch = url.match(igRegExp);\n\n    const vRegExp = /\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9]+)/;\n    const vMatch = url.match(vRegExp);\n\n    const vimRegExp = /\\/\\/(player\\.)?vimeo\\.com\\/([a-z]*\\/)*(\\d+)[?]?.*/;\n    const vimMatch = url.match(vimRegExp);\n\n    const dmRegExp = /.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?/;\n    const dmMatch = url.match(dmRegExp);\n\n    const youkuRegExp = /\\/\\/v\\.youku\\.com\\/v_show\\/id_(\\w+)=*\\.html/;\n    const youkuMatch = url.match(youkuRegExp);\n\n    const peerTubeRegExp =/\\/\\/(.*)\\/videos\\/watch\\/([^?]*)(?:\\?(?:start=(\\w*))?(?:&stop=(\\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/; \n    const peerTubeMatch = url.match(peerTubeRegExp);\n\n    const qqRegExp = /\\/\\/v\\.qq\\.com.*?vid=(.+)/;\n    const qqMatch = url.match(qqRegExp);\n\n    const qqRegExp2 = /\\/\\/v\\.qq\\.com\\/x?\\/?(page|cover).*?\\/([^\\/]+)\\.html\\??.*/;\n    const qqMatch2 = url.match(qqRegExp2);\n\n    const mp4RegExp = /^.+.(mp4|m4v)$/;\n    const mp4Match = url.match(mp4RegExp);\n\n    const oggRegExp = /^.+.(ogg|ogv)$/;\n    const oggMatch = url.match(oggRegExp);\n\n    const webmRegExp = /^.+.(webm)$/;\n    const webmMatch = url.match(webmRegExp);\n\n    const fbRegExp = /(?:www\\.|\\/\\/)facebook\\.com\\/([^\\/]+)\\/videos\\/([0-9]+)/;\n    const fbMatch = url.match(fbRegExp);\n\n    let $video;\n    if (ytMatch && ytMatch[1].length === 11) {\n      const youtubeId = ytMatch[1];\n      var start = 0;\n      if (typeof ytMatch[2] !== 'undefined') {\n        const ytMatchForStart = ytMatch[2].match(ytRegExpForStart);\n        if (ytMatchForStart) {\n          for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {\n            start += (typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0);\n          }\n        }\n      }\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : ''))\n        .attr('width', '640').attr('height', '360');\n    } else if (gdMatch && gdMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview')\n        .attr('width', '640').attr('height', '480');\n    } else if (igMatch && igMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/')\n        .attr('width', '612').attr('height', '710')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else if (vMatch && vMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', vMatch[0] + '/embed/simple')\n        .attr('width', '600').attr('height', '600')\n        .attr('class', 'vine-embed');\n    } else if (vimMatch && vimMatch[3].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('src', '//player.vimeo.com/video/' + vimMatch[3])\n        .attr('width', '640').attr('height', '360');\n    } else if (dmMatch && dmMatch[2].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2])\n        .attr('width', '640').attr('height', '360');\n    } else if (youkuMatch && youkuMatch[1].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '498')\n        .attr('width', '510')\n        .attr('src', '//player.youku.com/embed/' + youkuMatch[1]);\n    } else if (peerTubeMatch && peerTubeMatch[0].length){\n      var begin = 0;\n      if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];\n      var end =0;\n      if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];\n      var loop = 0;\n      if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];\n      var autoplay = 0;\n      if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];\n      var muted = 0;\n      if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];\n      $video = $('<iframe allowfullscreen sandbox=\"allow-same-origin allow-scripts allow-popups\">')\n        .attr('frameborder', 0)\n        .attr('src', '//'+ peerTubeMatch[1] +'/videos/embed/' + peerTubeMatch[2]+\"?loop=\"+loop\n      +\"&autoplay=\"+autoplay+\"&muted=\"+muted +(begin > 0 ? '&start=' + begin : '')+(end > 0 ? '&end=' + start : ''))\n        .attr('width', '560')\n        .attr('height', '315');\n    }else if ((qqMatch && qqMatch[1].length) || (qqMatch2 && qqMatch2[2].length)) {\n      const vid = ((qqMatch && qqMatch[1].length) ? qqMatch[1] : qqMatch2[2]);\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '310')\n        .attr('width', '500')\n        .attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');\n    } else if (mp4Match || oggMatch || webmMatch) {\n      $video = $('<video controls>')\n        .attr('src', url)\n        .attr('width', '640').attr('height', '360');\n    } else if (fbMatch && fbMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560')\n        .attr('width', '560').attr('height', '301')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else {\n      // this is not a known video link. Now what, Cat? Now what?\n      return false;\n    }\n\n    $video.addClass('note-video-clip');\n\n    return $video[0];\n  }\n\n  show() {\n    const text = this.context.invoke('editor.getSelectedText');\n    this.context.invoke('editor.saveRange');\n    this.showVideoDialog(text).then((url) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      // build node\n      const $node = this.createVideoNode(url);\n\n      if ($node) {\n        // insert video node\n        this.context.invoke('editor.insertNode', $node);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show video dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showVideoDialog(/* text */) {\n    return $.Deferred((deferred) => {\n      const $videoUrl = this.$dialog.find('.note-video-url');\n      const $videoBtn = this.$dialog.find('.note-video-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        $videoUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($videoBtn, $videoUrl.val());\n        });\n\n        if (!env.isSupportTouch) {\n          $videoUrl.trigger('focus');\n        }\n\n        $videoBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($videoUrl.val());\n        });\n\n        this.bindEnterKey($videoUrl, $videoBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $videoUrl.off();\n        $videoBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\n\nexport default class HelpDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<p class=\"text-center\">',\n        '<a href=\"http://summernote.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Summernote @@VERSION@@</a> · ',\n        '<a href=\"https://github.com/summernote/summernote\" target=\"_blank\" rel=\"noopener noreferrer\">Project</a> · ',\n        '<a href=\"https://github.com/summernote/summernote/issues\" target=\"_blank\" rel=\"noopener noreferrer\">Issues</a>',\n      '</p>',\n    ].join('');\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.options.help,\n      fade: this.options.dialogsFade,\n      body: this.createShortcutList(),\n      footer: body,\n      callback: ($node) => {\n        $node.find('.modal-body,.note-modal-body').css({\n          'max-height': 300,\n          'overflow': 'scroll',\n        });\n      },\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  createShortcutList() {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    return Object.keys(keyMap).map((key) => {\n      const command = keyMap[key];\n      const $row = $('<div><div class=\"help-list-item\"></div></div>');\n      $row.append($('<label><kbd>' + key + '</kdb></label>').css({\n        'width': 180,\n        'margin-right': 10,\n      })).append($('<span></span>').html(this.context.memo('help.' + command) || command));\n      return $row.html();\n    }).join('');\n  }\n\n  /**\n   * show help dialog\n   *\n   * @return {Promise}\n   */\n  showHelpDialog() {\n    return $.Deferred((deferred) => {\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n        deferred.resolve();\n      });\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showHelpDialog().then(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\n\nconst AIRMODE_POPOVER_X_OFFSET = -5;\nconst AIRMODE_POPOVER_Y_OFFSET = 5;\n\nexport default class AirPopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n\n    this.hidable = true;\n    this.onContextmenu = false;\n    this.pageX = null;\n    this.pageY = null;\n\n    this.events = {\n      'summernote.contextmenu': (e) => {\n        if (this.options.editing) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.onContextmenu = true;\n          this.update(true);\n        }\n      },\n      'summernote.mousedown': (we, e) => {\n        this.pageX = e.pageX;\n        this.pageY = e.pageY;\n      },\n      'summernote.keyup summernote.mouseup summernote.scroll': (we, e) => {\n        if (this.options.editing && !this.onContextmenu) {\n          this.pageX = e.pageX;\n          this.pageY = e.pageY;\n          this.update();\n        }\n        this.onContextmenu = false;\n      },\n      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.focusout': () => {\n        if (!this.$popover.is(':active,:focus')) {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.options.airMode && !lists.isEmpty(this.options.popover.air);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-air-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.air);\n\n    // disable hiding this popover preemptively by 'summernote.blur' event.\n    this.$popover.on('mousedown', () => { this.hidable = false; });\n    // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).\n    this.$popover.on('mouseup', () => { this.hidable = true; });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(forcelyOpen) {\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {\n      let rect = {\n        left: this.pageX,\n        top: this.pageY,\n      };\n\n      const containerOffset = $(this.options.container).offset();\n      rect.top -= containerOffset.top;\n      rect.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,\n        top: rect.top + AIRMODE_POPOVER_Y_OFFSET,\n      });\n      this.context.invoke('buttons.updateCurrentStyle', this.$popover);\n    } else {\n      this.hide();\n    }\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.hide();\n    } \n  }\n\n  hide() {\n    if (this.hidable) {\n      this.$popover.hide();\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport key from '../core/key';\n\nconst POPOVER_DIST = 5;\n\nexport default class HintPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.hint = this.options.hint || [];\n    this.direction = this.options.hintDirection || 'bottom';\n    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.hints.length > 0;\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n    this.matchingWord = null;\n    this.$popover = this.ui.popover({\n      className: 'note-hint-popover',\n      hideArrow: true,\n      direction: '',\n    }).render().appendTo(this.options.container);\n\n    this.$popover.hide();\n    this.$content = this.$popover.find('.popover-content,.note-popover-content');\n    this.$content.on('click', '.note-hint-item', (e) => {\n      this.$content.find('.active').removeClass('active');\n      $(e.currentTarget).addClass('active');\n      this.replace();\n    });\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  selectItem($item) {\n    this.$content.find('.active').removeClass('active');\n    $item.addClass('active');\n\n    this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);\n  }\n\n  moveDown() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $next = $current.next();\n\n    if ($next.length) {\n      this.selectItem($next);\n    } else {\n      let $nextGroup = $current.parent().next();\n\n      if (!$nextGroup.length) {\n        $nextGroup = this.$content.find('.note-hint-group').first();\n      }\n\n      this.selectItem($nextGroup.find('.note-hint-item').first());\n    }\n  }\n\n  moveUp() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $prev = $current.prev();\n\n    if ($prev.length) {\n      this.selectItem($prev);\n    } else {\n      let $prevGroup = $current.parent().prev();\n\n      if (!$prevGroup.length) {\n        $prevGroup = this.$content.find('.note-hint-group').last();\n      }\n\n      this.selectItem($prevGroup.find('.note-hint-item').last());\n    }\n  }\n\n  replace() {\n    const $item = this.$content.find('.note-hint-item.active');\n\n    if ($item.length) {\n      var node = this.nodeFromItem($item);\n      // If matchingWord length = 0 -> capture OK / open hint / but as mention capture \"\" (\\w*)\n      if (this.matchingWord !== null && this.matchingWord.length === 0) {\n        this.lastWordRange.so = this.lastWordRange.eo;\n      // Else si > 0 and normal case -> adjust range \"before\" for correct position of insertion\n      } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {\n        let rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;\n        if (rangeCompute > 0) {\n          this.lastWordRange.so += rangeCompute;\n        }\n      }\n      this.lastWordRange.insertNode(node);\n\n      if (this.options.hintSelect === 'next') {\n        var blank = document.createTextNode('');\n        $(node).after(blank);\n        range.createFromNodeBefore(blank).select();\n      } else {\n        range.createFromNodeAfter(node).select();\n      }\n\n      this.lastWordRange = null;\n      this.hide();\n      this.context.invoke('editor.focus');\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  nodeFromItem($item) {\n    const hint = this.hints[$item.data('index')];\n    const item = $item.data('item');\n    let node = hint.content ? hint.content(item) : item;\n    if (typeof node === 'string') {\n      node = dom.createText(node);\n    }\n    return node;\n  }\n\n  createItemTemplates(hintIdx, items) {\n    const hint = this.hints[hintIdx];\n    return items.map((item /*, idx */) => {\n      const $item = $('<div class=\"note-hint-item\"></div>');\n      $item.append(hint.template ? hint.template(item) : item + '');\n      $item.data({\n        'index': hintIdx,\n        'item': item,\n      });\n      return $item;\n    });\n  }\n\n  handleKeydown(e) {\n    if (!this.$popover.is(':visible')) {\n      return;\n    }\n\n    if (e.keyCode === key.code.ENTER) {\n      e.preventDefault();\n      this.replace();\n    } else if (e.keyCode === key.code.UP) {\n      e.preventDefault();\n      this.moveUp();\n    } else if (e.keyCode === key.code.DOWN) {\n      e.preventDefault();\n      this.moveDown();\n    }\n  }\n\n  searchKeyword(index, keyword, callback) {\n    const hint = this.hints[index];\n    if (hint && hint.match.test(keyword) && hint.search) {\n      const matches = hint.match.exec(keyword);\n      this.matchingWord = matches[0];\n      hint.search(matches[1], callback);\n    } else {\n      callback();\n    }\n  }\n\n  createGroup(idx, keyword) {\n    const $group = $('<div class=\"note-hint-group note-hint-group-' + idx + '\"></div>');\n    this.searchKeyword(idx, keyword, (items) => {\n      items = items || [];\n      if (items.length) {\n        $group.html(this.createItemTemplates(idx, items));\n        this.show();\n      }\n    });\n\n    return $group;\n  }\n\n  handleKeyup(e) {\n    if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {\n      let range = this.context.invoke('editor.getLastRange');\n      let wordRange, keyword;\n      if (this.options.hintMode === 'words') {\n        wordRange = range.getWordsRange(range);\n        keyword = wordRange.toString();\n\n        this.hints.forEach((hint) => {\n          if (hint.match.test(keyword)) {\n            wordRange = range.getWordsMatchRange(hint.match);\n            return false;\n          }\n        });\n\n        if (!wordRange) {\n          this.hide();\n          return;\n        }\n\n        keyword = wordRange.toString();\n      } else {\n        wordRange = range.getWordRange();\n        keyword = wordRange.toString();\n      }\n\n      if (this.hints.length && keyword) {\n        this.$content.empty();\n\n        const bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));\n        const containerOffset = $(this.options.container).offset();\n        if (bnd) {\n          bnd.top -= containerOffset.top;\n          bnd.left -= containerOffset.left;\n\n          this.$popover.hide();\n          this.lastWordRange = wordRange;\n          this.hints.forEach((hint, idx) => {\n            if (hint.match.test(keyword)) {\n              this.createGroup(idx, keyword).appendTo(this.$content);\n            }\n          });\n          // select first .note-hint-item\n          this.$content.find('.note-hint-item:first').addClass('active');\n\n          // set position for popover after group is created\n          if (this.direction === 'top') {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST,\n            });\n          } else {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top + bnd.height + POPOVER_DIST,\n            });\n          }\n        }\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  show() {\n    this.$popover.show();\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport '../lang/summernote-en-US';\nimport './summernote';\nimport dom from './core/dom';\nimport range from './core/range';\nimport lists from './core/lists';\nimport Editor from './module/Editor';\nimport Clipboard from './module/Clipboard';\nimport Dropzone from './module/Dropzone';\nimport Codeview from './module/Codeview';\nimport Statusbar from './module/Statusbar';\nimport Fullscreen from './module/Fullscreen';\nimport Handle from './module/Handle';\nimport AutoLink from './module/AutoLink';\nimport AutoSync from './module/AutoSync';\nimport AutoReplace from './module/AutoReplace';\nimport Placeholder from './module/Placeholder';\nimport Buttons from './module/Buttons';\nimport Toolbar from './module/Toolbar';\nimport LinkDialog from './module/LinkDialog';\nimport LinkPopover from './module/LinkPopover';\nimport ImageDialog from './module/ImageDialog';\nimport ImagePopover from './module/ImagePopover';\nimport TablePopover from './module/TablePopover';\nimport VideoDialog from './module/VideoDialog';\nimport HelpDialog from './module/HelpDialog';\nimport AirPopover from './module/AirPopover';\nimport HintPopover from './module/HintPopover';\n\n$.summernote = $.extend($.summernote, {\n  version: '@@VERSION@@',\n  plugins: {},\n\n  dom: dom,\n  range: range,\n  lists: lists,\n\n  options: {\n    langInfo: $.summernote.lang['en-US'],\n    editing: true,\n    modules: {\n      'editor': Editor,\n      'clipboard': Clipboard,\n      'dropzone': Dropzone,\n      'codeview': Codeview,\n      'statusbar': Statusbar,\n      'fullscreen': Fullscreen,\n      'handle': Handle,\n      // FIXME: HintPopover must be front of autolink\n      //  - Script error about range when Enter key is pressed on hint popover\n      'hintPopover': HintPopover,\n      'autoLink': AutoLink,\n      'autoSync': AutoSync,\n      'autoReplace': AutoReplace,\n      'placeholder': Placeholder,\n      'buttons': Buttons,\n      'toolbar': Toolbar,\n      'linkDialog': LinkDialog,\n      'linkPopover': LinkPopover,\n      'imageDialog': ImageDialog,\n      'imagePopover': ImagePopover,\n      'tablePopover': TablePopover,\n      'videoDialog': VideoDialog,\n      'helpDialog': HelpDialog,\n      'airPopover': AirPopover,\n    },\n\n    buttons: {},\n\n    lang: 'en-US',\n\n    followingToolbar: false,\n    toolbarPosition: 'top',\n    otherStaticBar: '',\n\n    // toolbar\n    codeviewKeepButton: false,\n    toolbar: [\n      ['style', ['style']],\n      ['font', ['bold', 'underline', 'clear']],\n      ['fontname', ['fontname']],\n      ['color', ['color']],\n      ['para', ['ul', 'ol', 'paragraph']],\n      ['table', ['table']],\n      ['insert', ['link', 'picture', 'video']],\n      ['view', ['fullscreen', 'codeview', 'help']],\n    ],\n\n    // popover\n    popatmouse: true,\n    popover: {\n      image: [\n        ['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n        ['float', ['floatLeft', 'floatRight', 'floatNone']],\n        ['remove', ['removeMedia']],\n      ],\n      link: [\n        ['link', ['linkDialogShow', 'unlink']],\n      ],\n      table: [\n        ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n        ['delete', ['deleteRow', 'deleteCol', 'deleteTable']],\n      ],\n      air: [\n        ['color', ['color']],\n        ['font', ['bold', 'underline', 'clear']],\n        ['para', ['ul', 'paragraph']],\n        ['table', ['table']],\n        ['insert', ['link', 'picture']],\n        ['view', ['fullscreen', 'codeview']],\n      ],\n    },\n\n    // air mode: inline editor\n    airMode: false,\n    overrideContextMenu: false, // TBD\n\n    width: null,\n    height: null,\n    linkTargetBlank: true,\n    useProtocol: true,\n    defaultProtocol: 'http://',\n\n    focus: false,\n    tabDisabled: false,\n    tabSize: 4,\n    styleWithCSS: false,\n    shortcuts: true,\n    textareaAutoSync: true,\n    tooltip: 'auto',\n    container: null,\n    maxTextLength: 0,\n    blockquoteBreakingLevel: 2,\n    spellCheck: true,\n    disableGrammar: false,\n    placeholder: null,\n    inheritPlaceholder: false,\n    // TODO: need to be documented\n    recordEveryKeystroke: false,\n    historyLimit: 200,\n\n    // TODO: need to be documented\n    showDomainOnlyForAutolink: false,\n\n    // TODO: need to be documented\n    hintMode: 'word',\n    hintSelect: 'after',\n    hintDirection: 'bottom',\n\n    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n\n    fontNames: [\n      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',\n      'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',\n      'Tahoma', 'Times New Roman', 'Verdana',\n    ],\n    fontNamesIgnoreCheck: [],\n    addDefaultFonts: true,\n\n    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],\n\n    fontSizeUnits: ['px', 'pt'],\n\n    // pallete colors(n x n)\n    colors: [\n      ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],\n      ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],\n      ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],\n      ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],\n      ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],\n      ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],\n      ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],\n      ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'],\n    ],\n\n    // http://chir.ag/projects/name-that-color/\n    colorsName: [\n      ['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'],\n      ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'],\n      ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'],\n      ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'],\n      ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'],\n      ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'],\n      ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'],\n      ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou'],\n    ],\n\n    colorButton: {\n      foreColor: '#000000',\n      backColor: '#FFFF00',\n    },\n\n    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],\n\n    tableClassName: 'table table-bordered',\n\n    insertTableMaxSize: {\n      col: 10,\n      row: 10,\n    },\n\n    // By default, dialogs are attached in container.\n    dialogsInBody: false,\n    dialogsFade: false,\n\n    maximumImageFileSize: null,\n    acceptImageFileTypes: \"image/*\",\n\n    callbacks: {\n      onBeforeCommand: null,\n      onBlur: null,\n      onBlurCodeview: null,\n      onChange: null,\n      onChangeCodeview: null,\n      onDialogShown: null,\n      onEnter: null,\n      onFocus: null,\n      onImageLinkInsert: null,\n      onImageUpload: null,\n      onImageUploadError: null,\n      onInit: null,\n      onKeydown: null,\n      onKeyup: null,\n      onMousedown: null,\n      onMouseup: null,\n      onPaste: null,\n      onScroll: null,\n    },\n\n    codemirror: {\n      mode: 'text/html',\n      htmlMode: true,\n      lineNumbers: true,\n    },\n\n    codeviewFilter: true,\n    codeviewFilterRegex: /<\\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,\n    codeviewIframeFilter: true,\n    codeviewIframeWhitelistSrc: [],\n    codeviewIframeWhitelistSrcBase: [\n      'www.youtube.com',\n      'www.youtube-nocookie.com',\n      'www.facebook.com',\n      'vine.co',\n      'instagram.com',\n      'player.vimeo.com',\n      'www.dailymotion.com',\n      'player.youku.com',\n      'jumpingbean.tv',\n      'v.qq.com',\n    ],\n\n    keyMap: {\n      pc: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CTRL+Z': 'undo',\n        'CTRL+Y': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CTRL+B': 'bold',\n        'CTRL+I': 'italic',\n        'CTRL+U': 'underline',\n        'CTRL+SHIFT+S': 'strikethrough',\n        'CTRL+BACKSLASH': 'removeFormat',\n        'CTRL+SHIFT+L': 'justifyLeft',\n        'CTRL+SHIFT+E': 'justifyCenter',\n        'CTRL+SHIFT+R': 'justifyRight',\n        'CTRL+SHIFT+J': 'justifyFull',\n        'CTRL+SHIFT+NUM7': 'insertUnorderedList',\n        'CTRL+SHIFT+NUM8': 'insertOrderedList',\n        'CTRL+LEFTBRACKET': 'outdent',\n        'CTRL+RIGHTBRACKET': 'indent',\n        'CTRL+NUM0': 'formatPara',\n        'CTRL+NUM1': 'formatH1',\n        'CTRL+NUM2': 'formatH2',\n        'CTRL+NUM3': 'formatH3',\n        'CTRL+NUM4': 'formatH4',\n        'CTRL+NUM5': 'formatH5',\n        'CTRL+NUM6': 'formatH6',\n        'CTRL+ENTER': 'insertHorizontalRule',\n        'CTRL+K': 'linkDialog.show',\n      },\n\n      mac: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CMD+Z': 'undo',\n        'CMD+SHIFT+Z': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CMD+B': 'bold',\n        'CMD+I': 'italic',\n        'CMD+U': 'underline',\n        'CMD+SHIFT+S': 'strikethrough',\n        'CMD+BACKSLASH': 'removeFormat',\n        'CMD+SHIFT+L': 'justifyLeft',\n        'CMD+SHIFT+E': 'justifyCenter',\n        'CMD+SHIFT+R': 'justifyRight',\n        'CMD+SHIFT+J': 'justifyFull',\n        'CMD+SHIFT+NUM7': 'insertUnorderedList',\n        'CMD+SHIFT+NUM8': 'insertOrderedList',\n        'CMD+LEFTBRACKET': 'outdent',\n        'CMD+RIGHTBRACKET': 'indent',\n        'CMD+NUM0': 'formatPara',\n        'CMD+NUM1': 'formatH1',\n        'CMD+NUM2': 'formatH2',\n        'CMD+NUM3': 'formatH3',\n        'CMD+NUM4': 'formatH4',\n        'CMD+NUM5': 'formatH5',\n        'CMD+NUM6': 'formatH6',\n        'CMD+ENTER': 'insertHorizontalRule',\n        'CMD+K': 'linkDialog.show',\n      },\n    },\n    icons: {\n      'align': 'note-icon-align',\n      'alignCenter': 'note-icon-align-center',\n      'alignJustify': 'note-icon-align-justify',\n      'alignLeft': 'note-icon-align-left',\n      'alignRight': 'note-icon-align-right',\n      'rowBelow': 'note-icon-row-below',\n      'colBefore': 'note-icon-col-before',\n      'colAfter': 'note-icon-col-after',\n      'rowAbove': 'note-icon-row-above',\n      'rowRemove': 'note-icon-row-remove',\n      'colRemove': 'note-icon-col-remove',\n      'indent': 'note-icon-align-indent',\n      'outdent': 'note-icon-align-outdent',\n      'arrowsAlt': 'note-icon-arrows-alt',\n      'bold': 'note-icon-bold',\n      'caret': 'note-icon-caret',\n      'circle': 'note-icon-circle',\n      'close': 'note-icon-close',\n      'code': 'note-icon-code',\n      'eraser': 'note-icon-eraser',\n      'floatLeft': 'note-icon-float-left',\n      'floatRight': 'note-icon-float-right',\n      'font': 'note-icon-font',\n      'frame': 'note-icon-frame',\n      'italic': 'note-icon-italic',\n      'link': 'note-icon-link',\n      'unlink': 'note-icon-chain-broken',\n      'magic': 'note-icon-magic',\n      'menuCheck': 'note-icon-menu-check',\n      'minus': 'note-icon-minus',\n      'orderedlist': 'note-icon-orderedlist',\n      'pencil': 'note-icon-pencil',\n      'picture': 'note-icon-picture',\n      'question': 'note-icon-question',\n      'redo': 'note-icon-redo',\n      'rollback': 'note-icon-rollback',\n      'square': 'note-icon-square',\n      'strikethrough': 'note-icon-strikethrough',\n      'subscript': 'note-icon-subscript',\n      'superscript': 'note-icon-superscript',\n      'table': 'note-icon-table',\n      'textHeight': 'note-icon-text-height',\n      'trash': 'note-icon-trash',\n      'underline': 'note-icon-underline',\n      'undo': 'note-icon-undo',\n      'unorderedlist': 'note-icon-unorderedlist',\n      'video': 'note-icon-video',\n    },\n  },\n});\n","import $ from 'jquery';\n\nclass Renderer {\n  constructor(markup, children, options, callback) {\n    this.markup = markup;\n    this.children = children;\n    this.options = options;\n    this.callback = callback;\n  }\n\n  render($parent) {\n    const $node = $(this.markup);\n\n    if (this.options && this.options.contents) {\n      $node.html(this.options.contents);\n    }\n\n    if (this.options && this.options.className) {\n      $node.addClass(this.options.className);\n    }\n\n    if (this.options && this.options.data) {\n      $.each(this.options.data, (k, v) => {\n        $node.attr('data-' + k, v);\n      });\n    }\n\n    if (this.options && this.options.click) {\n      $node.on('click', this.options.click);\n    }\n\n    if (this.children) {\n      const $container = $node.find('.note-children-container');\n      this.children.forEach((child) => {\n        child.render($container.length ? $container : $node);\n      });\n    }\n\n    if (this.callback) {\n      this.callback($node, this.options);\n    }\n\n    if (this.options && this.options.callback) {\n      this.options.callback($node);\n    }\n\n    if ($parent) {\n      $parent.append($node);\n    }\n\n    return $node;\n  }\n}\n\nexport default {\n  create: (markup, callback) => {\n    return function() {\n      const options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];\n      let children = Array.isArray(arguments[0]) ? arguments[0] : [];\n      if (options && options.children) {\n        children = options.children;\n      }\n      return new Renderer(markup, children, options, callback);\n    };\n  },\n};\n","import $ from 'jquery';\nimport '/js/settings.js';\nimport renderer from '/js/renderer';\nimport './summernote-bs4.scss';\n\nconst editor = renderer.create('<div class=\"note-editor note-frame card\"></div>');\nconst toolbar = renderer.create('<div class=\"note-toolbar card-header\" role=\"toolbar\"></div>');\nconst editingArea = renderer.create('<div class=\"note-editing-area\"></div>');\nconst codable = renderer.create('<textarea class=\"note-codable\" aria-multiline=\"true\"></textarea>');\nconst editable = renderer.create('<div class=\"note-editable card-block\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>');\nconst statusbar = renderer.create([\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n  '<div class=\"note-statusbar\" role=\"status\">',\n    '<div class=\"note-resizebar\" aria-label=\"Resize\">',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n    '</div>',\n  '</div>',\n].join(''));\n\nconst airEditor = renderer.create('<div class=\"note-editor note-airframe\"></div>');\nconst airEditable = renderer.create([\n  '<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>',\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n].join(''));\n\nconst buttonGroup = renderer.create('<div class=\"note-btn-group btn-group\"></div>');\n\nconst dropdown = renderer.create('<div class=\"note-dropdown-menu dropdown-menu\" role=\"list\"></div>', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    const option = (typeof item === 'object') ? item.option : undefined;\n\n    const dataValue = 'data-value=\"' + value + '\"';\n    const dataOption = (option !== undefined) ? ' data-option=\"' + option + '\"' : '';\n    return '<a class=\"dropdown-item\" href=\"#\" ' + (dataValue + dataOption) + ' role=\"listitem\" aria-label=\"' + value + '\">' + content + '</a>';\n  }).join('') : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownButtonContents = function(contents) {\n  return contents;\n};\n\nconst dropdownCheck = renderer.create('<div class=\"note-dropdown-menu dropdown-menu note-check\" role=\"list\"></div>', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    return '<a class=\"dropdown-item\" href=\"#\" data-value=\"' + value + '\" role=\"listitem\" aria-label=\"' + item + '\">' + icon(options.checkClassName) + ' ' + content + '</a>';\n  }).join('') : options.items;\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dialog = renderer.create('<div class=\"modal note-modal\" aria-hidden=\"false\" tabindex=\"-1\" role=\"dialog\"></div>', function($node, options) {\n  if (options.fade) {\n    $node.addClass('fade');\n  }\n  $node.attr({\n    'aria-label': options.title,\n  });\n  $node.html([\n    '<div class=\"modal-dialog\">',\n      '<div class=\"modal-content\">',\n        (options.title ? '<div class=\"modal-header\">' +\n          '<h4 class=\"modal-title\">' + options.title + '</h4>' +\n          '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\" aria-hidden=\"true\">&times;</button>' +\n        '</div>' : ''),\n        '<div class=\"modal-body\">' + options.body + '</div>',\n        (options.footer ? '<div class=\"modal-footer\">' + options.footer + '</div>' : ''),\n      '</div>',\n    '</div>',\n  ].join(''));\n});\n\nconst popover = renderer.create([\n  '<div class=\"note-popover popover in\">',\n    '<div class=\"arrow\"></div>',\n    '<div class=\"popover-content note-children-container\"></div>',\n  '</div>',\n].join(''), function($node, options) {\n  const direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';\n\n  $node.addClass(direction);\n\n  if (options.hideArrow) {\n    $node.find('.arrow').hide();\n  }\n});\n\nconst checkbox = renderer.create('<div class=\"form-check\"></div>', function($node, options) {\n  $node.html([\n    '<label class=\"form-check-label\"' + (options.id ? ' for=\"note-' + options.id + '\"' : '') + '>',\n      '<input type=\"checkbox\" class=\"form-check-input\"' + (options.id ? ' id=\"note-' + options.id + '\"' : ''),\n        (options.checked ? ' checked' : ''),\n        ' aria-label=\"' + (options.text ? options.text : '') + '\"',\n        ' aria-checked=\"' + (options.checked ? 'true' : 'false') + '\"/>',\n      ' ' + (options.text ? options.text : '') +\n    '</label>',\n  ].join(''));\n});\n\nconst icon = function(iconClassName, tagName) {\n  if (iconClassName.match(/^</)) {\n    return iconClassName;\n  }\n  tagName = tagName || 'i';\n  return '<' + tagName + ' class=\"' + iconClassName + '\"></' + tagName+'>';\n};\n\nconst ui = function(editorOptions) {\n  return {\n    editor: editor,\n    toolbar: toolbar,\n    editingArea: editingArea,\n    codable: codable,\n    editable: editable,\n    statusbar: statusbar,\n    airEditor: airEditor,\n    airEditable: airEditable,\n    buttonGroup: buttonGroup,\n    dropdown: dropdown,\n    dropdownButtonContents: dropdownButtonContents,\n    dropdownCheck: dropdownCheck,\n    dialog: dialog,\n    popover: popover,\n    icon: icon,\n    checkbox: checkbox,\n    options: editorOptions,\n\n    palette: function($node, options) {\n      return renderer.create('<div class=\"note-color-palette\"></div>', function($node, options) {\n        const contents = [];\n        for (let row = 0, rowSize = options.colors.length; row < rowSize; row++) {\n          const eventName = options.eventName;\n          const colors = options.colors[row];\n          const colorsName = options.colorsName[row];\n          const buttons = [];\n          for (let col = 0, colSize = colors.length; col < colSize; col++) {\n            const color = colors[col];\n            const colorName = colorsName[col];\n            buttons.push([\n              '<button type=\"button\" class=\"note-color-btn\"',\n              'style=\"background-color:', color, '\" ',\n              'data-event=\"', eventName, '\" ',\n              'data-value=\"', color, '\" ',\n              'title=\"', colorName, '\" ',\n              'aria-label=\"', colorName, '\" ',\n              'data-toggle=\"button\" tabindex=\"-1\"></button>',\n            ].join(''));\n          }\n          contents.push('<div class=\"note-color-row\">' + buttons.join('') + '</div>');\n        }\n        $node.html(contents.join(''));\n\n        if (options.tooltip) {\n          $node.find('.note-color-btn').tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          });\n        }\n      })($node, options);\n    },\n\n    button: function($node, options) {\n      return renderer.create('<button type=\"button\" class=\"note-btn btn btn-light btn-sm\" tabindex=\"-1\"></button>', function($node, options) {\n        if (options && options.tooltip) {\n          $node.attr({\n            title: options.tooltip,\n            'aria-label': options.tooltip,\n          }).tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          }).on('click', (e) => {\n            $(e.currentTarget).tooltip('hide');\n          });\n        }\n        if (options && options.codeviewButton) {\n          $node.addClass('note-codeview-keep');\n        }\n      })($node, options);\n    },\n\n    toggleBtn: function($btn, isEnable) {\n      $btn.toggleClass('disabled', !isEnable);\n      $btn.attr('disabled', !isEnable);\n    },\n\n    toggleBtnActive: function($btn, isActive) {\n      $btn.toggleClass('active', isActive);\n    },\n\n    onDialogShown: function($dialog, handler) {\n      $dialog.one('shown.bs.modal', handler);\n    },\n\n    onDialogHidden: function($dialog, handler) {\n      $dialog.one('hidden.bs.modal', handler);\n    },\n\n    showDialog: function($dialog) {\n      $dialog.modal('show');\n    },\n\n    hideDialog: function($dialog) {\n      $dialog.modal('hide');\n    },\n\n    createLayout: function($note) {\n      const $editor = (editorOptions.airMode ? airEditor([\n        editingArea([\n          codable(),\n          airEditable(),\n        ]),\n      ]) : (editorOptions.toolbarPosition === 'bottom'\n        ? editor([\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          toolbar(),\n          statusbar(),\n        ])\n        : editor([\n          toolbar(),\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          statusbar(),\n        ])\n      )).render();\n\n      $editor.insertAfter($note);\n\n      return {\n        note: $note,\n        editor: $editor,\n        toolbar: $editor.find('.note-toolbar'),\n        editingArea: $editor.find('.note-editing-area'),\n        editable: $editor.find('.note-editable'),\n        codable: $editor.find('.note-codable'),\n        statusbar: $editor.find('.note-statusbar'),\n      };\n    },\n\n    removeLayout: function($note, layoutInfo) {\n      $note.html(layoutInfo.editable.html());\n      layoutInfo.editor.remove();\n      $note.show();\n    },\n  };\n};\n\n$.summernote = $.extend($.summernote, {\n  ui_template: ui,\n  interface: 'bs4',\n});\n\n$.summernote.options.styleTags = [\n  'p',\n  { title: 'Blockquote', tag: 'blockquote', className: 'blockquote', value: 'blockquote' },\n  'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n];\n"],"names":["$","summernote","lang","extend","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","genericFontFamilies","validFontName","fontName","inArray","toLowerCase","isFontInstalled","testFontName","testText","testSize","canvas","document","createElement","context","getContext","originalWidth","measureText","width","userAgent","navigator","isMSIE","test","browserVersion","matches","exec","parseFloat","isEdge","isSupportTouch","window","MaxTouchPoints","msMaxTouchPoints","inputEventName","isMac","appVersion","indexOf","isFF","isPhantom","isWebkit","isChrome","isSafari","isW3CRangeSupport","createRange","eq","itemA","itemB","eq2","peq2","propName","ok","fail","not","f","apply","arguments","and","fA","fB","item","self","a","invoke","obj","method","idCounter","resetUniqueId","uniqueId","prefix","id","rect2bnd","rect","$document","top","scrollTop","scrollLeft","bottom","invertObject","inverted","key","Object","prototype","hasOwnProperty","call","namespaceToCamel","namespace","split","map","substring","toUpperCase","join","debounce","func","wait","immediate","timeout","args","later","callNow","clearTimeout","setTimeout","isValidUrl","expression","head","array","last","length","initial","slice","tail","find","pred","idx","len","all","contains","sum","fn","reduce","memo","v","from","collection","result","isEmpty","clusterBy","aTail","aLast","compact","aResult","push","unique","results","next","prev","env","NBSP_CHAR","String","fromCharCode","ZERO_WIDTH_NBSP_CHAR","isEditable","node","hasClass","isControlSizing","makePredByNodeName","nodeName","isText","nodeType","isElement","isVoid","isPara","isHeading","isPre","isLi","isPurePara","isTable","isData","isInline","isBodyContainer","isList","isHr","isBlockquote","isCell","isAnchor","isParaInline","ancestor","isBodyInline","isBody","isClosestSibling","nodeA","nodeB","nextSibling","previousSibling","withClosestSiblings","siblings","blankHTML","nodeLength","nodeValue","childNodes","deepestChildIsEmpty","firstElementChild","innerHTML","paddingBlankHTML","parentNode","singleChildAncestor","listAncestor","ancestors","el","lastAncestor","filter","commonAncestor","n","listPrev","nodes","listNext","listDescendant","descendants","fnWalk","current","wrap","wrapperName","parent","wrapper","insertBefore","appendChild","insertAfter","preceding","appendChildNodes","aChild","each","child","isLeftEdgePoint","point","offset","isRightEdgePoint","isEdgePoint","isLeftEdgeOf","position","isRightEdgeOf","isLeftEdgePointOf","isRightEdgePointOf","hasChildren","prevPoint","isSkipInnerOffset","nextPoint","nextTextNode","getNextTextNode","nextPointWithEmptyNode","actual","undefined","isSamePoint","pointA","pointB","isVisiblePoint","leftNode","rightNode","prevPointUntil","nextPointUntil","isCharPoint","ch","charAt","isSpacePoint","walkPoint","startPoint","endPoint","handler","isSkipOffset","makeOffsetPath","reverse","fromOffsetPath","offsets","i","splitNode","isSkipPaddingBlankHTML","isNotSplitEdgePoint","isDiscardEmptySplits","splitText","childNode","clone","cloneNode","splitTree","root","splitPoint","topAncestor","splitRoot","container","pivot","create","createText","text","createTextNode","isRemoveChild","removeNode","removeChild","removeWhile","replace","newNode","cssText","isTextarea","value","$node","stripLinebreaks","val","html","isNewlineOnBlock","markup","regexTag","match","endSlash","isEndOfInlineContainer","isBlockNode","trim","posFromPlaceholder","placeholder","$placeholder","pos","outerHeight","attachEvents","events","keys","forEach","on","detachEvents","off","isCustomStyleTag","classList","blank","emptyPara","isBlock","isDiv","isBR","isSpan","isB","isU","isS","isI","isImg","isEmptyAnchor","dom","Context","$note","memos","modules","layoutInfo","ui","ui_template","initialize","createLayout","_initialize","hide","_destroy","removeData","removeLayout","disabled","isDisabled","code","disable","now","editor","buttons","plugins","module","initializeModule","removeModule","removeMemo","triggerEvent","isActivated","codable","editable","attr","editing","callback","callbacks","trigger","shouldInitialize","ModuleClass","withoutIntialize","destroy","event","createInvokeHandler","preventDefault","$target","target","closest","data","splits","hasSeparator","moduleName","methodName","type","isExternalAPICalled","hasInitOptions","langInfo","icons","tooltip","note","first","focus","textRangeToPoint","textRange","isStart","parentElement","tester","body","createTextRange","prevContainer","moveToElementText","compareEndPoints","textRangeStart","curTextNode","collapse","firstChild","pointTester","duplicate","setEndPoint","textCount","dummy","cont","pointToTextRange","textRangeInfo","isCollapseToStart","prevTextNodes","collapseToStart","info","moveStart","WrappedRange","sc","so","ec","eo","isOnEditable","makeIsOn","isOnList","isOnAnchor","isOnCell","isOnData","w3cRange","setStart","setEnd","nativeRng","nativeRange","selection","getSelection","rangeCount","removeAllRanges","addRange","offsetTop","Math","abs","getVisiblePoint","isLeftToRight","block","hasRightNode","hasLeftNode","getEndPoint","isCollapsed","getStartPoint","includeAncestor","fullyContains","leftEdgeNodes","startAncestor","endAncestor","boundaryPoints","getPoints","isSameContainer","rng","emptyParents","normalize","inlineSiblings","concat","para","wrapBodyInlineWithPara","deleteContents","contentsContainer","reversed","insertNode","toString","findAfter","isNotTextPoint","regex","index","s","path","e","paras","getClientRects","wrappedRange","createFromSelection","bodyElement","lastChild","createFromBodyElement","createFromNode","anchorNode","getRangeAt","startContainer","startOffset","endContainer","endOffset","textRangeEnd","isTextNode","createFromNodeBefore","createFromNodeAfter","createFromBookmark","bookmark","createFromParaBookmark","KEY_MAP","isEdit","keyCode","BACKSPACE","TAB","ENTER","SPACE","DELETE","isMove","LEFT","UP","RIGHT","DOWN","isNavigation","HOME","END","PAGEUP","PAGEDOWN","nameFromCode","readFileAsDataURL","file","Deferred","deferred","FileReader","onload","dataURL","resolve","onerror","err","reject","readAsDataURL","promise","createImage","$img","one","detach","css","display","appendTo","range","History","stack","stackOffset","$editable","emptyBookmark","contents","snapshot","recordUndo","applySnapshot","makeSnapshot","historyLimit","shift","Style","$obj","propertyNames","propertyName","properties","styleInfo","jQueryCSS","fontSize","parseInt","expandClosestSibling","onlyPartialContains","nodesInRange","tails","elem","$cont","fromNode","queryCommandState","queryCommandValue","orderedTypes","isUnordered","lineHeight","toFixed","anchor","Bullet","toggleList","clustereds","previousList","findList","wrapList","appendToPrevious","releaseList","listName","paraBookmark","wrappedParas","diffLists","listNode","prevList","nextList","isEscapseToBody","releasedParas","headList","parentItem","newList","findNextSiblings","children","lastList","middleList","rootLists","rootList","listNodes","Typing","bullet","tabsize","tab","Array","nextPara","blockquoteBreakingLevel","emptyAnchors","scrollIntoView","TableResultAction","where","domTable","_startPoint","_virtualTable","_actionCellList","setStartPoint","tagName","colPos","cellIndex","rowPos","rowIndex","setVirtualTablePosition","baseRow","baseCell","isRowSpan","isColSpan","isVirtualCell","objPosition","getActionCell","virtualTableCellObj","resultAction","virtualRowPosition","virtualColPosition","recoverCellIndex","newCellIndex","addCellInfoToVirtual","row","cell","cellHasColspan","colSpan","cellHasRowspan","rowSpan","isThisSelectedCell","rowspanNumber","attributes","rp","rowspanIndex","adjustStartPoint","colspanNumber","cp","cellspanIndex","isSelectedCell","createVirtualTable","rows","cells","getDeleteResultActionToCell","Column","SubtractSpanCount","Row","isVirtual","AddCell","RemoveCell","getAddResultActionToCell","SumSpanCount","Ignore","init","getActionList","fixedRow","fixedCol","actualPosition","canContinue","rowPosition","colPosition","requestAction","Add","Delete","Table","isShift","nextCell","currentTr","trAttributes","recoverAttributes","vTable","actions","idCell","currentCell","tdAttributes","append","baseCellTr","isTopFromRowSpan","newTd","removeAttr","setAttribute","before","lastTrIndex","after","rowsGroup","actionIndex","resultStr","attrList","specified","cellPos","virtualPosition","virtualTable","hasRowspan","nextRow","cloneRow","removeAttribute","hasColspan","colCount","rowCount","tds","tdHTML","idxCol","trs","trHTML","idxRow","$table","tableClassName","addClass","KEY_BOGUS","Editor","$editor","lastRange","typing","escape","untab","insertParagraph","insertOrderedList","insertUnorderedList","formatPara","insertHorizontalRule","commands","sCmd","beforeCommand","execCommand","afterCommand","wrapCommand","fontStyling","unit","currentStyle","fontSizeUnit","formatBlock","isLimited","getLastRange","setLastRange","insertText","textNode","pasteHTML","onApplyCustomStyle","onFormatBlock","hrNode","stylePara","createLink","linkInfo","linkUrl","linkText","isNewWindow","checkProtocol","additionalTextLength","isTextChanged","onCreateLink","defaultProtocol","anchors","styleNodes","createRangeFromList","colorInfo","foreColor","backColor","insertTable","dim","dimension","createTable","removeMedia","restoreTarget","floatMe","toggleClass","resize","hasKeyShortCut","isDefaultPrevented","handleKeyMap","preventDefaultEditableShortCuts","recordEveryKeystroke","spellCheck","disableGrammar","airMode","overrideContextMenu","outerWidth","maxHeight","minHeight","keyMap","metaKey","ctrlKey","altKey","shiftKey","keyName","eventName","tabDisable","pad","maxTextLength","lst","startRange","endRange","thenCollapse","commit","styleWithCSS","isPreventTrigger","normalizeContent","tabSize","insertTab","src","param","then","$image","min","show","files","filename","maximumImageFileSize","insertImage","onImageUpload","insertImagesAsDataURL","currentRange","$parent","removeClass","className","spans","firstSpan","noteStatusOutput","expand","$anchor","addRow","addCol","deleteRow","deleteCol","deleteTable","bKeepRatio","imageSize","newRatio","y","x","ratio","is","hasFocus","Clipboard","pasteByEvent","bind","clipboardData","originalEvent","items","kind","getAsFile","getData","Dropzone","$eventListener","documentEventHandlers","$dropzone","prependTo","disableDragAndDrop","onDrop","attachDragAndDropEvent","$dropzoneMessage","onDragenter","isCodeview","hasEditorSize","add","onDragleave","dataTransfer","types","content","substr","CodeView","$codable","CodeMirrorConstructor","CodeMirror","codemirror","getDoc","setValue","save","ESCAPE","deactivate","activate","codeviewFilter","codeviewFilterRegex","codeviewIframeFilter","whitelist","codeviewIframeWhitelistSrc","codeviewIframeWhitelistSrcBase","tag","RegExp","prettifyHtml","cmEditor","fromTextArea","tern","server","TernServer","ternServer","cm","updateArgHints","getValue","setSize","toTextArea","purify","isChange","EDITABLE_PADDING","Statusbar","$statusbar","statusbar","disableResizeEditor","stopPropagation","editableTop","editableCodeTop","onMouseMove","clientY","heightCode","minheight","max","Fullscreen","$toolbar","toolbar","$window","$scrollbar","scrollbarClassName","onResize","resizeTo","h","setsize","isFullscreen","Handle","$editingArea","editingArea","we","update","$handle","disableResizeImage","posStart","clientX","isImage","$selection","w","origImageObj","Image","sizingText","defaultScheme","linkPattern","AutoLink","handleKeyup","handleKeydown","lastWordRange","keyword","urlText","showDomainOnlyForAutolink","linkTargetBlank","wordRange","getWordRange","AutoSync","AutoReplace","PERIOD","COMMA","SEMICOLON","SLASH","previousKeydownCode","lastWord","jQuery","Node","Placeholder","inheritPlaceholder","isShow","toggle","Buttons","invertedKeyMap","editorMethod","o","button","addToolbarButtons","addImagePopoverButtons","addLinkPopoverButtons","addTablePopoverButtons","fontInstalledMap","fontNamesIgnoreCheck","buttonGroup","icon","click","$button","currentTarget","$recentColor","colorButton","dropdownButtonContents","dropdown","$dropdown","$holder","palette","colors","colorsName","render","customColors","change","$chip","$picker","$palette","prepend","$color","$currentButton","magic","styleTags","title","template","styleIdx","styleLen","representShortcut","createInvokeHandlerAndUpdateState","eraser","addDefaultFonts","fontname","isFontDeservedToAdd","fontNames","dropdownCheck","checkClassName","menuCheck","fontSizes","fontSizeUnits","colorPalette","unorderedlist","orderedlist","justifyLeft","alignLeft","justifyCenter","alignCenter","justifyRight","alignRight","justifyFull","alignJustify","textHeight","lineHeights","$catcher","insertTableMaxSize","col","mouseup","tableMoveHandler","picture","minus","arrowsAlt","question","rollback","trash","rowAbove","rowBelow","colBefore","colAfter","rowRemove","colRemove","$container","groups","groupIdx","groupLen","group","groupName","isArray","$group","btn","updateBtnStates","$item","isChecked","infos","selector","toggleBtnActive","PX_PER_EM","$dimensionDisplay","$highlighted","$unhighlighted","posOffset","offsetX","posCatcher","pageX","pageY","offsetY","c","ceil","r","Toolbar","isFollowing","followScroll","toolbarContainer","changeContainer","followingToolbar","editorHeight","editorWidth","toolbarHeight","statusbarHeight","otherBarHeight","otherStaticBar","currentOffset","editorOffsetTop","editorOffsetBottom","activateOffset","deactivateOffsetBottom","marginTop","zIndex","isIncludeCodeview","$btn","toggleBtn","LinkDialog","$body","dialogsInBody","disableLinkTarget","checkbox","checked","buttonClass","footer","$dialog","dialog","fade","dialogsFade","hideDialog","$input","$linkBtn","$linkText","$linkUrl","$openInNewWindow","$useProtocol","onDialogShown","toggleLinkBtn","bindEnterKey","isNewWindowChecked","prop","useProtocolChecked","onDialogHidden","state","showDialog","showLinkDialog","LinkPopover","relatedTarget","$popover","popover","$content","href","containerOffset","ImageDialog","imageLimitation","floor","log","readableSize","pow","acceptImageFileTypes","showImageDialog","onImageLinkInsert","$imageInput","$imageUrl","$imageBtn","replaceWith","ImagePopover","popatmouse","TablePopover","VideoDialog","ytRegExp","ytRegExpForStart","ytMatch","gdRegExp","gdMatch","igRegExp","igMatch","vRegExp","vMatch","vimRegExp","vimMatch","dmRegExp","dmMatch","youkuRegExp","youkuMatch","peerTubeRegExp","peerTubeMatch","qqRegExp","qqMatch","qqRegExp2","qqMatch2","mp4RegExp","mp4Match","oggRegExp","oggMatch","webmRegExp","webmMatch","fbRegExp","fbMatch","$video","youtubeId","start","ytMatchForStart","begin","end","loop","autoplay","muted","vid","encodeURIComponent","showVideoDialog","createVideoNode","$videoUrl","$videoBtn","HelpDialog","createShortcutList","command","$row","showHelpDialog","AIRMODE_POPOVER_X_OFFSET","AIRMODE_POPOVER_Y_OFFSET","AirPopover","hidable","onContextmenu","air","forcelyOpen","POPOVER_DIST","HintPopover","hint","direction","hintDirection","hints","matchingWord","hideArrow","innerHeight","$current","$next","selectItem","$nextGroup","$prev","$prevGroup","nodeFromItem","rangeCompute","hintSelect","hintIdx","moveUp","moveDown","search","searchKeyword","createItemTemplates","hintMode","getWordsRange","getWordsMatchRange","empty","bnd","createGroup","Codeview","version","toolbarPosition","codeviewKeepButton","tabDisabled","textareaAutoSync","onBeforeCommand","onBlur","onBlurCodeview","onChange","onChangeCodeview","onEnter","onFocus","onImageUploadError","onInit","onKeydown","onKeyup","onMousedown","onMouseup","onPaste","onScroll","mode","htmlMode","lineNumbers","pc","mac","Renderer","k","renderer","airEditor","airEditable","option","dataValue","dataOption","iconClassName","editorOptions","rowSize","colSize","colorName","placement","codeviewButton","isEnable","isActive","modal"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.css b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.css
new file mode 100644
index 0000000..b7fd037
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.css
@@ -0,0 +1 @@
+@font-face{font-display:auto;font-family:summernote;font-style:normal;font-weight:400;src:url(font/summernote.eot?#iefix) format("embedded-opentype"),url(font/summernote.woff2) format("woff2"),url(font/summernote.woff) format("woff"),url(font/summernote.ttf) format("truetype")}[class*=" note-icon"]:before,[class^=note-icon]:before{text-rendering:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;speak:none;display:inline-block;font-family:summernote;font-size:inherit;font-style:normal;text-decoration:inherit;text-transform:none;vertical-align:middle}.note-icon-fw{text-align:center;width:1.25em}.note-icon-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.note-icon-pull-left{float:left}.note-icon-pull-right{float:right}.note-icon.note-icon-pull-left{margin-right:.3em}.note-icon.note-icon-pull-right{margin-left:.3em}.note-icon-align:before{content:"\ea01"}.note-icon-align-center:before{content:"\ea02"}.note-icon-align-indent:before{content:"\ea03"}.note-icon-align-justify:before{content:"\ea04"}.note-icon-align-left:before{content:"\ea05"}.note-icon-align-outdent:before{content:"\ea06"}.note-icon-align-right:before{content:"\ea07"}.note-icon-arrow-circle-down:before{content:"\ea08"}.note-icon-arrow-circle-left:before{content:"\ea09"}.note-icon-arrow-circle-right:before{content:"\ea0a"}.note-icon-arrow-circle-up:before{content:"\ea0b"}.note-icon-arrows-alt:before{content:"\ea0c"}.note-icon-arrows-h:before{content:"\ea0d"}.note-icon-arrows-v:before{content:"\ea0e"}.note-icon-bold:before{content:"\ea0f"}.note-icon-caret:before{content:"\ea10"}.note-icon-chain-broken:before{content:"\ea11"}.note-icon-circle:before{content:"\ea12"}.note-icon-close:before{content:"\ea13"}.note-icon-code:before{content:"\ea14"}.note-icon-col-after:before{content:"\ea15"}.note-icon-col-before:before{content:"\ea16"}.note-icon-col-remove:before{content:"\ea17"}.note-icon-eraser:before{content:"\ea18"}.note-icon-float-left:before{content:"\ea19"}.note-icon-float-none:before{content:"\ea1a"}.note-icon-float-right:before{content:"\ea1b"}.note-icon-font:before{content:"\ea1c"}.note-icon-frame:before{content:"\ea1d"}.note-icon-italic:before{content:"\ea1e"}.note-icon-link:before{content:"\ea1f"}.note-icon-magic:before{content:"\ea20"}.note-icon-menu-check:before{content:"\ea21"}.note-icon-minus:before{content:"\ea22"}.note-icon-orderedlist:before{content:"\ea23"}.note-icon-pencil:before{content:"\ea24"}.note-icon-picture:before{content:"\ea25"}.note-icon-question:before{content:"\ea26"}.note-icon-redo:before{content:"\ea27"}.note-icon-rollback:before{content:"\ea28"}.note-icon-row-above:before{content:"\ea29"}.note-icon-row-below:before{content:"\ea2a"}.note-icon-row-remove:before{content:"\ea2b"}.note-icon-special-character:before{content:"\ea2c"}.note-icon-square:before{content:"\ea2d"}.note-icon-strikethrough:before{content:"\ea2e"}.note-icon-subscript:before{content:"\ea2f"}.note-icon-summernote:before{content:"\ea30"}.note-icon-superscript:before{content:"\ea31"}.note-icon-table:before{content:"\ea32"}.note-icon-text-height:before{content:"\ea33"}.note-icon-trash:before{content:"\ea34"}.note-icon-underline:before{content:"\ea35"}.note-icon-undo:before{content:"\ea36"}.note-icon-unorderedlist:before{content:"\ea37"}.note-icon-video:before{content:"\ea38"}.note-editor{position:relative}.note-editor .note-dropzone{background-color:#fff;color:#87cefa;display:none;opacity:.95;position:absolute;z-index:100}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-airframe,.note-editor.note-frame{border:1px solid #00000032}.note-editor.note-airframe.codeview .note-editing-area .note-editable,.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-airframe.codeview .note-editing-area .note-codable,.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-airframe .note-editing-area,.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-airframe .note-editing-area .note-editable,.note-editor.note-frame .note-editing-area .note-editable{word-wrap:break-word;overflow:auto;padding:10px}.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false],.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false]{background-color:#8080801d}.note-editor.note-airframe .note-editing-area .note-codable,.note-editor.note-frame .note-editing-area .note-codable{background-color:#222;border:none;border-radius:0;box-shadow:none;-ms-box-sizing:border-box;box-sizing:border-box;color:#ccc;display:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;margin-bottom:0;outline:none;padding:10px;resize:none;width:100%}.note-editor.note-airframe.fullscreen,.note-editor.note-frame.fullscreen{left:0;position:fixed;top:0;width:100%!important;z-index:1050}.note-editor.note-airframe.fullscreen .note-resizebar,.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-airframe .note-status-output,.note-editor.note-frame .note-status-output{border:0;border-top:1px solid #e2e2e2;color:#000;display:block;font-size:14px;height:20px;line-height:1.42857143;margin-bottom:0;width:100%}.note-editor.note-airframe .note-status-output:empty,.note-editor.note-frame .note-status-output:empty{border-top:0 solid transparent;height:0}.note-editor.note-airframe .note-status-output .pull-right,.note-editor.note-frame .note-status-output .pull-right{float:right!important}.note-editor.note-airframe .note-status-output .text-muted,.note-editor.note-frame .note-status-output .text-muted{color:#777}.note-editor.note-airframe .note-status-output .text-primary,.note-editor.note-frame .note-status-output .text-primary{color:#286090}.note-editor.note-airframe .note-status-output .text-success,.note-editor.note-frame .note-status-output .text-success{color:#3c763d}.note-editor.note-airframe .note-status-output .text-info,.note-editor.note-frame .note-status-output .text-info{color:#31708f}.note-editor.note-airframe .note-status-output .text-warning,.note-editor.note-frame .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-airframe .note-status-output .text-danger,.note-editor.note-frame .note-status-output .text-danger{color:#a94442}.note-editor.note-airframe .note-status-output .alert,.note-editor.note-frame .note-status-output .alert{background-color:#f5f5f5;border-radius:0;color:#000;margin:-7px 0 0;padding:7px 10px 2px}.note-editor.note-airframe .note-status-output .alert .note-icon,.note-editor.note-frame .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-airframe .note-status-output .alert-success,.note-editor.note-frame .note-status-output .alert-success{background-color:#dff0d8!important;color:#3c763d!important}.note-editor.note-airframe .note-status-output .alert-info,.note-editor.note-frame .note-status-output .alert-info{background-color:#d9edf7!important;color:#31708f!important}.note-editor.note-airframe .note-status-output .alert-warning,.note-editor.note-frame .note-status-output .alert-warning{background-color:#fcf8e3!important;color:#8a6d3b!important}.note-editor.note-airframe .note-status-output .alert-danger,.note-editor.note-frame .note-status-output .alert-danger{background-color:#f2dede!important;color:#a94442!important}.note-editor.note-airframe .note-statusbar,.note-editor.note-frame .note-statusbar{background-color:#8080801d;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #00000032}.note-editor.note-airframe .note-statusbar .note-resizebar,.note-editor.note-frame .note-statusbar .note-resizebar{cursor:ns-resize;height:9px;padding-top:1px;width:100%}.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{border-top:1px solid #00000032;margin:1px auto;width:20px}.note-editor.note-airframe .note-statusbar.locked .note-resizebar,.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-airframe .note-placeholder,.note-editor.note-frame .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.note-popover.popover .arrow{left:20px!important}.note-toolbar{position:relative}.note-editor .note-toolbar,.note-popover .popover-content{margin:0;padding:0 0 5px 5px}.note-editor .note-toolbar>.note-btn-group,.note-popover .popover-content>.note-btn-group{margin-left:0;margin-right:5px;margin-top:5px}.note-editor .note-toolbar .note-btn-group .note-table,.note-popover .popover-content .note-btn-group .note-table{min-width:0;padding:5px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{cursor:pointer;height:10em;position:absolute!important;width:10em;z-index:3}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:5em;position:relative!important;width:5em;z-index:1}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:1em;position:absolute!important;width:1em;z-index:2}.note-editor .note-toolbar .note-style .dropdown-style blockquote,.note-editor .note-toolbar .note-style .dropdown-style pre,.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre{margin:0;padding:5px 10px}.note-editor .note-toolbar .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h4,.note-editor .note-toolbar .note-style .dropdown-style h5,.note-editor .note-toolbar .note-style .dropdown-style h6,.note-editor .note-toolbar .note-style .dropdown-style p,.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p{margin:0;padding:0}.note-editor .note-toolbar .note-color-all .note-dropdown-menu,.note-popover .popover-content .note-color-all .note-dropdown-menu{min-width:337px}.note-editor .note-toolbar .note-color .dropdown-toggle,.note-popover .popover-content .note-color .dropdown-toggle{padding-left:5px;width:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:160px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child{margin:0 5px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title{border-bottom:1px solid #eee;font-size:12px;margin:2px 7px;text-align:center}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select{border-radius:5px;cursor:pointer;font-size:11px;margin:3px;padding:0 3px;width:100%}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover{background:#eee}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row{height:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-editor .note-toolbar .note-para .note-dropdown-menu,.note-popover .popover-content .note-para .note-dropdown-menu{min-width:228px;padding:5px}.note-editor .note-toolbar .note-para .note-dropdown-menu>div+div,.note-popover .popover-content .note-para .note-dropdown-menu>div+div{margin-left:5px}.note-editor .note-toolbar .note-dropdown-menu,.note-popover .popover-content .note-dropdown-menu{min-width:160px}.note-editor .note-toolbar .note-dropdown-menu.right,.note-popover .popover-content .note-dropdown-menu.right{left:auto;right:0}.note-editor .note-toolbar .note-dropdown-menu.right:before,.note-popover .popover-content .note-dropdown-menu.right:before{left:auto!important;right:9px}.note-editor .note-toolbar .note-dropdown-menu.right:after,.note-popover .popover-content .note-dropdown-menu.right:after{left:auto!important;right:10px}.note-editor .note-toolbar .note-dropdown-menu.note-check a i,.note-popover .popover-content .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i,.note-popover .popover-content .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-editor .note-toolbar .note-fontsize-10,.note-popover .popover-content .note-fontsize-10{font-size:10px}.note-editor .note-toolbar .note-color-palette,.note-popover .popover-content .note-color-palette{line-height:1}.note-editor .note-toolbar .note-color-palette div .note-color-btn,.note-popover .popover-content .note-color-palette div .note-color-btn{border:0;border-radius:0;height:20px;margin:0;padding:0;width:20px}.note-editor .note-toolbar .note-color-palette div .note-color-btn:hover,.note-popover .popover-content .note-color-palette div .note-color-btn:hover{transform:scale(1.2);transition:all .2s}.note-modal .modal-dialog{border-radius:5px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{border:4px dashed #d3d3d3;color:#d3d3d3;font-size:30px;line-height:4;margin-bottom:10px;min-height:100px;text-align:center}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.note-placeholder{color:gray;display:none;position:absolute}.note-handle .note-control-selection{border:1px solid #000;display:none;position:absolute}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{background-color:#000;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30);height:100%;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;width:100%}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-holder,.note-handle .note-control-selection .note-control-sizing{border:1px solid #000;height:7px;width:7px}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{border-bottom:none;border-right:none;left:-5px;top:-5px}.note-handle .note-control-selection .note-control-ne{border-bottom:none;border-left:none;right:-5px;top:-5px}.note-handle .note-control-selection .note-control-sw{border-right:none;border-top:none;bottom:-5px;left:-5px}.note-handle .note-control-selection .note-control-se{bottom:-5px;cursor:se-resize;right:-5px}.note-handle .note-control-selection .note-control-se.note-control-holder{border-left:none;border-top:none;cursor:default}.note-handle .note-control-selection .note-control-selection-info{background-color:#000;border-radius:5px;bottom:0;color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70);font-size:12px;margin:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;padding:5px;right:0}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;overflow:auto;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{background-color:#428bca;clear:both;color:#fff;cursor:pointer;display:block;font-weight:400;line-height:1.4;outline:0;text-decoration:none;white-space:nowrap}body .note-fullscreen-body,html .note-fullscreen-body{overflow:hidden!important}.note-toolbar{background:#8080801d}.note-btn-group .note-btn{border-color:#00000032;font-size:13px;padding:.28rem .65rem}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js
new file mode 100644
index 0000000..da3ca82
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("jQuery"));else if("function"==typeof define&&define.amd)define(["jQuery"],e);else{var n="object"==typeof exports?e(require("jQuery")):e(t.jQuery);for(var o in n)("object"==typeof exports?exports:t)[o]=n[o]}}(self,(function(t){return(()=>{"use strict";var e={9770:(t,e,n)=>{var o=n(1145),i=n.n(o);i().summernote=i().summernote||{lang:{}},i().extend(i().summernote.lang,{"en-US":{font:{bold:"Bold",italic:"Italic",underline:"Underline",clear:"Remove Font Style",height:"Line Height",name:"Font Family",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript",size:"Font Size",sizeunit:"Font Size Unit"},image:{image:"Picture",insert:"Insert Image",resizeFull:"Resize full",resizeHalf:"Resize half",resizeQuarter:"Resize quarter",resizeNone:"Original size",floatLeft:"Float Left",floatRight:"Float Right",floatNone:"Remove float",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Drag image or text here",dropImage:"Drop image or Text",selectFromFiles:"Select from files",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Image URL",remove:"Remove Image",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Insert Video",url:"Video URL",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)"},link:{link:"Link",insert:"Insert Link",unlink:"Unlink",edit:"Edit",textToDisplay:"Text to display",url:"To what URL should this link go?",openInNewWindow:"Open in new window",useProtocol:"Use default protocol"},table:{table:"Table",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Insert Horizontal Rule"},style:{style:"Style",p:"Normal",blockquote:"Quote",pre:"Code",h1:"Header 1",h2:"Header 2",h3:"Header 3",h4:"Header 4",h5:"Header 5",h6:"Header 6"},lists:{unordered:"Unordered list",ordered:"Ordered list"},options:{help:"Help",fullscreen:"Full Screen",codeview:"Code View"},paragraph:{paragraph:"Paragraph",outdent:"Outdent",indent:"Indent",left:"Align left",center:"Align center",right:"Align right",justify:"Justify full"},color:{recent:"Recent Color",more:"More Color",background:"Background Color",foreground:"Text Color",transparent:"Transparent",setTransparent:"Set transparent",reset:"Reset",resetToDefault:"Reset to default",cpSelect:"Select"},shortcut:{shortcuts:"Keyboard shortcuts",close:"Close",textFormatting:"Text formatting",action:"Action",paragraphFormatting:"Paragraph formatting",documentStyle:"Document Style",extraKeys:"Extra keys"},help:{escape:"Escape",insertParagraph:"Insert Paragraph",undo:"Undo the last command",redo:"Redo the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Undo",redo:"Redo"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"},output:{noSelection:"No Selection Made!"}}})},1145:e=>{e.exports=t}},n={};function o(t){var i=n[t];if(void 0!==i)return i.exports;var r=n[t]={exports:{}};return e[t](r,r.exports,o),r.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};return(()=>{o.r(i);var t=o(1145),e=o.n(t),n=(o(9770),["sans-serif","serif","monospace","cursive","fantasy"]);function r(t){return-1===e().inArray(t.toLowerCase(),n)?"'".concat(t,"'"):t}var a,s=navigator.userAgent,l=/MSIE|Trident/i.test(s);if(l){var c=/MSIE (\d+[.]\d+)/.exec(s);c&&(a=parseFloat(c[1])),(c=/Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(s))&&(a=parseFloat(c[1]))}var u=/Edge\/\d+/.test(s),d="ontouchstart"in window||navigator.MaxTouchPoints>0||navigator.msMaxTouchPoints>0,h=l?"DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted":"input";const f={isMac:navigator.appVersion.indexOf("Mac")>-1,isMSIE:l,isEdge:u,isFF:!u&&/firefox/i.test(s),isPhantom:/PhantomJS/i.test(s),isWebkit:!u&&/webkit/i.test(s),isChrome:!u&&/chrome/i.test(s),isSafari:!u&&/safari/i.test(s)&&!/chrome/i.test(s),browserVersion:a,isSupportTouch:d,isFontInstalled:function(t){var e="Comic Sans MS"===t?"Courier New":"Comic Sans MS",n="mmmmmmmmmmwwwww",o=document.createElement("canvas").getContext("2d");o.font="200px '"+e+"'";var i=o.measureText(n).width;return o.font="200px "+r(t)+', "'+e+'"',i!==o.measureText(n).width},isW3CRangeSupport:!!document.createRange,inputEventName:h,genericFontFamilies:n,validFontName:r};var p=0;const m={eq:function(t){return function(e){return t===e}},eq2:function(t,e){return t===e},peq2:function(t){return function(e,n){return e[t]===n[t]}},ok:function(){return!0},fail:function(){return!1},self:function(t){return t},not:function(t){return function(){return!t.apply(t,arguments)}},and:function(t,e){return function(n){return t(n)&&e(n)}},invoke:function(t,e){return function(){return t[e].apply(t,arguments)}},resetUniqueId:function(){p=0},uniqueId:function(t){var e=++p+"";return t?t+e:e},rect2bnd:function(t){var n=e()(document);return{top:t.top+n.scrollTop(),left:t.left+n.scrollLeft(),width:t.right-t.left,height:t.bottom-t.top}},invertObject:function(t){var e={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[t[n]]=n);return e},namespaceToCamel:function(t,e){return(e=e||"")+t.split(".").map((function(t){return t.substring(0,1).toUpperCase()+t.substring(1)})).join("")},debounce:function(t,e,n){var o;return function(){var i=this,r=arguments,a=function(){o=null,n||t.apply(i,r)},s=n&&!o;clearTimeout(o),o=setTimeout(a,e),s&&t.apply(i,r)}},isValidUrl:function(t){return/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi.test(t)}};function v(t){return t[0]}function g(t){return t[t.length-1]}function b(t){return t.slice(1)}function y(t,e){if(t&&t.length&&e){if(t.indexOf)return-1!==t.indexOf(e);if(t.contains)return t.contains(e)}return!1}const k={head:v,last:g,initial:function(t){return t.slice(0,t.length-1)},tail:b,prev:function(t,e){if(t&&t.length&&e){var n=t.indexOf(e);return-1===n?null:t[n-1]}return null},next:function(t,e){if(t&&t.length&&e){var n=t.indexOf(e);return-1===n?null:t[n+1]}return null},find:function(t,e){for(var n=0,o=t.length;n<o;n++){var i=t[n];if(e(i))return i}},contains:y,all:function(t,e){for(var n=0,o=t.length;n<o;n++)if(!e(t[n]))return!1;return!0},sum:function(t,e){return e=e||m.self,t.reduce((function(t,n){return t+e(n)}),0)},from:function(t){for(var e=[],n=t.length,o=-1;++o<n;)e[o]=t[o];return e},isEmpty:function(t){return!t||!t.length},clusterBy:function(t,e){return t.length?b(t).reduce((function(t,n){var o=g(t);return e(g(o),n)?o[o.length]=n:t[t.length]=[n],t}),[[v(t)]]):[]},compact:function(t){for(var e=[],n=0,o=t.length;n<o;n++)t[n]&&e.push(t[n]);return e},unique:function(t){for(var e=[],n=0,o=t.length;n<o;n++)y(e,t[n])||e.push(t[n]);return e}};var w=String.fromCharCode(160);function C(t){return t&&e()(t).hasClass("note-editable")}function x(t){return t=t.toUpperCase(),function(e){return e&&e.nodeName.toUpperCase()===t}}function S(t){return t&&3===t.nodeType}function T(t){return t&&/^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(t.nodeName.toUpperCase())}function E(t){return!C(t)&&(t&&/^DIV|^P|^LI|^H[1-7]/.test(t.nodeName.toUpperCase()))}var I=x("PRE"),$=x("LI");var N=x("TABLE"),P=x("DATA");function R(t){return!(H(t)||L(t)||A(t)||E(t)||N(t)||D(t)||P(t))}function L(t){return t&&/^UL|^OL/.test(t.nodeName.toUpperCase())}var A=x("HR");function F(t){return t&&/^TD|^TH/.test(t.nodeName.toUpperCase())}var D=x("BLOCKQUOTE");function H(t){return F(t)||D(t)||C(t)}var z=x("A");var B=x("BODY");var M=f.isMSIE&&f.browserVersion<11?"&nbsp;":"<br>";function O(t){return S(t)?t.nodeValue.length:t?t.childNodes.length:0}function U(t){var e=O(t);return 0===e||(!S(t)&&1===e&&t.innerHTML===M||!(!k.all(t.childNodes,S)||""!==t.innerHTML))}function j(t){T(t)||O(t)||(t.innerHTML=M)}function W(t,e){for(;t;){if(e(t))return t;if(C(t))break;t=t.parentNode}return null}function K(t,e){e=e||m.fail;var n=[];return W(t,(function(t){return C(t)||n.push(t),e(t)})),n}function V(t,e){e=e||m.fail;for(var n=[];t&&!e(t);)n.push(t),t=t.nextSibling;return n}function q(t,e){var n=e.nextSibling,o=e.parentNode;return n?o.insertBefore(t,n):o.appendChild(t),t}function _(t,n){return e().each(n,(function(e,n){t.appendChild(n)})),t}function G(t){return 0===t.offset}function Y(t){return t.offset===O(t.node)}function Z(t){return G(t)||Y(t)}function Q(t,e){for(;t&&t!==e;){if(0!==J(t))return!1;t=t.parentNode}return!0}function X(t,e){if(!e)return!1;for(;t&&t!==e;){if(J(t)!==O(t.parentNode)-1)return!1;t=t.parentNode}return!0}function J(t){for(var e=0;t=t.previousSibling;)e+=1;return e}function tt(t){return!!(t&&t.childNodes&&t.childNodes.length)}function et(t,e){var n,o;if(0===t.offset){if(C(t.node))return null;n=t.node.parentNode,o=J(t.node)}else tt(t.node)?o=O(n=t.node.childNodes[t.offset-1]):(n=t.node,o=e?0:t.offset-1);return{node:n,offset:o}}function nt(t,e){var n,o;if(O(t.node)===t.offset){if(C(t.node))return null;var i=it(t.node);i?(n=i,o=0):(n=t.node.parentNode,o=J(t.node)+1)}else tt(t.node)?(n=t.node.childNodes[t.offset],o=0):(n=t.node,o=e?O(t.node):t.offset+1);return{node:n,offset:o}}function ot(t,e){var n,o=0;if(U(t.node))return null===t.node?null:{node:n=t.node.nextSibling,offset:o=0};if(O(t.node)===t.offset){if(C(t.node))return null;n=t.node.parentNode,o=J(t.node)+1,C(n)&&(n=t.node.nextSibling,o=0)}else if(tt(t.node)){if(o=0,U(n=t.node.childNodes[t.offset]))return U(t.node.nextSibling)?null:{node:t.node.nextSibling,offset:o}}else if(n=t.node,o=e?O(t.node):t.offset+1,U(n))return null;return{node:n,offset:o}}function it(t){if(t.nextSibling&&t.parent===t.nextSibling.parent)return S(t.nextSibling)?t.nextSibling:it(t.nextSibling)}function rt(t,e){return t.node===e.node&&t.offset===e.offset}function at(t,e){var n=e&&e.isSkipPaddingBlankHTML,o=e&&e.isNotSplitEdgePoint,i=e&&e.isDiscardEmptySplits;if(i&&(n=!0),Z(t)&&(S(t.node)||o)){if(G(t))return t.node;if(Y(t))return t.node.nextSibling}if(S(t.node))return t.node.splitText(t.offset);var r=t.node.childNodes[t.offset],a=q(t.node.cloneNode(!1),t.node);return _(a,V(r)),n||(j(t.node),j(a)),i&&(U(t.node)&&ct(t.node),U(a))?(ct(a),t.node.nextSibling):a}function st(t,e,n){var o=K(e.node,m.eq(t));return o.length?1===o.length?at(e,n):o.reduce((function(t,o){return t===e.node&&(t=at(e,n)),at({node:o,offset:t?J(t):O(o)},n)})):null}function lt(t){return document.createElement(t)}function ct(t,e){if(t&&t.parentNode){if(t.removeNode)return t.removeNode(e);var n=t.parentNode;if(!e){for(var o=[],i=0,r=t.childNodes.length;i<r;i++)o.push(t.childNodes[i]);for(var a=0,s=o.length;a<s;a++)n.insertBefore(o[a],t)}n.removeChild(t)}}var ut=x("TEXTAREA");function dt(t,e){var n=ut(t[0])?t.val():t.html();return e?n.replace(/[\n\r]/g,""):n}const ht={NBSP_CHAR:w,ZERO_WIDTH_NBSP_CHAR:"\ufeff",blank:M,emptyPara:"<p>".concat(M,"</p>"),makePredByNodeName:x,isEditable:C,isControlSizing:function(t){return t&&e()(t).hasClass("note-control-sizing")},isText:S,isElement:function(t){return t&&1===t.nodeType},isVoid:T,isPara:E,isPurePara:function(t){return E(t)&&!$(t)},isHeading:function(t){return t&&/^H[1-7]/.test(t.nodeName.toUpperCase())},isInline:R,isBlock:m.not(R),isBodyInline:function(t){return R(t)&&!W(t,E)},isBody:B,isParaInline:function(t){return R(t)&&!!W(t,E)},isPre:I,isList:L,isTable:N,isData:P,isCell:F,isBlockquote:D,isBodyContainer:H,isAnchor:z,isDiv:x("DIV"),isLi:$,isBR:x("BR"),isSpan:x("SPAN"),isB:x("B"),isU:x("U"),isS:x("S"),isI:x("I"),isImg:x("IMG"),isTextarea:ut,deepestChildIsEmpty:function(t){do{if(null===t.firstElementChild||""===t.firstElementChild.innerHTML)break}while(t=t.firstElementChild);return U(t)},isEmpty:U,isEmptyAnchor:m.and(z,U),isClosestSibling:function(t,e){return t.nextSibling===e||t.previousSibling===e},withClosestSiblings:function(t,e){e=e||m.ok;var n=[];return t.previousSibling&&e(t.previousSibling)&&n.push(t.previousSibling),n.push(t),t.nextSibling&&e(t.nextSibling)&&n.push(t.nextSibling),n},nodeLength:O,isLeftEdgePoint:G,isRightEdgePoint:Y,isEdgePoint:Z,isLeftEdgeOf:Q,isRightEdgeOf:X,isLeftEdgePointOf:function(t,e){return G(t)&&Q(t.node,e)},isRightEdgePointOf:function(t,e){return Y(t)&&X(t.node,e)},prevPoint:et,nextPoint:nt,nextPointWithEmptyNode:ot,isSamePoint:rt,isVisiblePoint:function(t){if(S(t.node)||!tt(t.node)||U(t.node))return!0;var e=t.node.childNodes[t.offset-1],n=t.node.childNodes[t.offset];return!((e&&!T(e)||n&&!T(n))&&!N(n))},prevPointUntil:function(t,e){for(;t;){if(e(t))return t;t=et(t)}return null},nextPointUntil:function(t,e){for(;t;){if(e(t))return t;t=nt(t)}return null},isCharPoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return e&&" "!==e&&e!==w},isSpacePoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return" "===e||e===w},walkPoint:function(t,e,n,o){for(var i=t;i&&(n(i),!rt(i,e));){i=ot(i,o&&t.node!==i.node&&e.node!==i.node)}},ancestor:W,singleChildAncestor:function(t,e){for(t=t.parentNode;t&&1===O(t);){if(e(t))return t;if(C(t))break;t=t.parentNode}return null},listAncestor:K,lastAncestor:function(t,e){var n=K(t);return k.last(n.filter(e))},listNext:V,listPrev:function(t,e){e=e||m.fail;for(var n=[];t&&!e(t);)n.push(t),t=t.previousSibling;return n},listDescendant:function(t,e){var n=[];return e=e||m.ok,function o(i){t!==i&&e(i)&&n.push(i);for(var r=0,a=i.childNodes.length;r<a;r++)o(i.childNodes[r])}(t),n},commonAncestor:function(t,e){for(var n=K(t),o=e;o;o=o.parentNode)if(n.indexOf(o)>-1)return o;return null},wrap:function(t,n){var o=t.parentNode,i=e()("<"+n+">")[0];return o.insertBefore(i,t),i.appendChild(t),i},insertAfter:q,appendChildNodes:_,position:J,hasChildren:tt,makeOffsetPath:function(t,e){return K(e,m.eq(t)).map(J).reverse()},fromOffsetPath:function(t,e){for(var n=t,o=0,i=e.length;o<i;o++)n=n.childNodes.length<=e[o]?n.childNodes[n.childNodes.length-1]:n.childNodes[e[o]];return n},splitTree:st,splitPoint:function(t,e){var n,o,i=e?E:H,r=K(t.node,i),a=k.last(r)||t.node;i(a)?(n=r[r.length-2],o=a):o=(n=a).parentNode;var s=n&&st(n,t,{isSkipPaddingBlankHTML:e,isNotSplitEdgePoint:e});return s||o!==t.node||(s=t.node.childNodes[t.offset]),{rightNode:s,container:o}},create:lt,createText:function(t){return document.createTextNode(t)},remove:ct,removeWhile:function(t,e){for(;t&&!C(t)&&e(t);){var n=t.parentNode;ct(t),t=n}},replace:function(t,e){if(t.nodeName.toUpperCase()===e.toUpperCase())return t;var n=lt(e);return t.style.cssText&&(n.style.cssText=t.style.cssText),_(n,k.from(t.childNodes)),q(n,t),ct(t),n},html:function(t,e){var n=dt(t);if(e){n=(n=n.replace(/<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g,(function(t,e,n){n=n.toUpperCase();var o=/^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(n)&&!!e,i=/^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(n);return t+(o||i?"\n":"")}))).trim()}return n},value:dt,posFromPlaceholder:function(t){var n=e()(t),o=n.offset(),i=n.outerHeight(!0);return{left:o.left,top:o.top+i}},attachEvents:function(t,e){Object.keys(e).forEach((function(n){t.on(n,e[n])}))},detachEvents:function(t,e){Object.keys(e).forEach((function(n){t.off(n,e[n])}))},isCustomStyleTag:function(t){return t&&!S(t)&&k.contains(t.classList,"note-styletag")}};function ft(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var pt=function(){function t(n,o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=n,this.memos={},this.modules={},this.layoutInfo={},this.options=e().extend(!0,{},o),e().summernote.ui=e().summernote.ui_template(this.options),this.ui=e().summernote.ui,this.initialize()}var n,o,i;return n=t,o=[{key:"initialize",value:function(){return this.layoutInfo=this.ui.createLayout(this.$note),this._initialize(),this.$note.hide(),this}},{key:"destroy",value:function(){this._destroy(),this.$note.removeData("summernote"),this.ui.removeLayout(this.$note,this.layoutInfo)}},{key:"reset",value:function(){var t=this.isDisabled();this.code(ht.emptyPara),this._destroy(),this._initialize(),t&&this.disable()}},{key:"_initialize",value:function(){var t=this;this.options.id=m.uniqueId(e().now()),this.options.container=this.options.container||this.layoutInfo.editor;var n=e().extend({},this.options.buttons);Object.keys(n).forEach((function(e){t.memo("button."+e,n[e])}));var o=e().extend({},this.options.modules,e().summernote.plugins||{});Object.keys(o).forEach((function(e){t.module(e,o[e],!0)})),Object.keys(this.modules).forEach((function(e){t.initializeModule(e)}))}},{key:"_destroy",value:function(){var t=this;Object.keys(this.modules).reverse().forEach((function(e){t.removeModule(e)})),Object.keys(this.memos).forEach((function(e){t.removeMemo(e)})),this.triggerEvent("destroy",this)}},{key:"code",value:function(t){var e=this.invoke("codeview.isActivated");if(void 0===t)return this.invoke("codeview.sync"),e?this.layoutInfo.codable.val():this.layoutInfo.editable.html();e?this.invoke("codeview.sync",t):this.layoutInfo.editable.html(t),this.$note.val(t),this.triggerEvent("change",t,this.layoutInfo.editable)}},{key:"isDisabled",value:function(){return"false"===this.layoutInfo.editable.attr("contenteditable")}},{key:"enable",value:function(){this.layoutInfo.editable.attr("contenteditable",!0),this.invoke("toolbar.activate",!0),this.triggerEvent("disable",!1),this.options.editing=!0}},{key:"disable",value:function(){this.invoke("codeview.isActivated")&&this.invoke("codeview.deactivate"),this.layoutInfo.editable.attr("contenteditable",!1),this.options.editing=!1,this.invoke("toolbar.deactivate",!0),this.triggerEvent("disable",!0)}},{key:"triggerEvent",value:function(){var t=k.head(arguments),e=k.tail(k.from(arguments)),n=this.options.callbacks[m.namespaceToCamel(t,"on")];n&&n.apply(this.$note[0],e),this.$note.trigger("summernote."+t,e)}},{key:"initializeModule",value:function(t){var e=this.modules[t];e.shouldInitialize=e.shouldInitialize||m.ok,e.shouldInitialize()&&(e.initialize&&e.initialize(),e.events&&ht.attachEvents(this.$note,e.events))}},{key:"module",value:function(t,e,n){if(1===arguments.length)return this.modules[t];this.modules[t]=new e(this),n||this.initializeModule(t)}},{key:"removeModule",value:function(t){var e=this.modules[t];e.shouldInitialize()&&(e.events&&ht.detachEvents(this.$note,e.events),e.destroy&&e.destroy()),delete this.modules[t]}},{key:"memo",value:function(t,e){if(1===arguments.length)return this.memos[t];this.memos[t]=e}},{key:"removeMemo",value:function(t){this.memos[t]&&this.memos[t].destroy&&this.memos[t].destroy(),delete this.memos[t]}},{key:"createInvokeHandlerAndUpdateState",value:function(t,e){var n=this;return function(o){n.createInvokeHandler(t,e)(o),n.invoke("buttons.updateCurrentStyle")}}},{key:"createInvokeHandler",value:function(t,n){var o=this;return function(i){i.preventDefault();var r=e()(i.target);o.invoke(t,n||r.closest("[data-value]").data("value"),r)}}},{key:"invoke",value:function(){var t=k.head(arguments),e=k.tail(k.from(arguments)),n=t.split("."),o=n.length>1,i=o&&k.head(n),r=o?k.last(n):k.head(n),a=this.modules[i||"editor"];return!i&&this[r]?this[r].apply(this,e):a&&a[r]&&a.shouldInitialize()?a[r].apply(a,e):void 0}}],o&&ft(n.prototype,o),i&&ft(n,i),t}();function mt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function vt(t,e){var n,o,i=t.parentElement(),r=document.body.createTextRange(),a=k.from(i.childNodes);for(n=0;n<a.length;n++)if(!ht.isText(a[n])){if(r.moveToElementText(a[n]),r.compareEndPoints("StartToStart",t)>=0)break;o=a[n]}if(0!==n&&ht.isText(a[n-1])){var s=document.body.createTextRange(),l=null;s.moveToElementText(o||i),s.collapse(!o),l=o?o.nextSibling:i.firstChild;var c=t.duplicate();c.setEndPoint("StartToStart",s);for(var u=c.text.replace(/[\r\n]/g,"").length;u>l.nodeValue.length&&l.nextSibling;)u-=l.nodeValue.length,l=l.nextSibling;l.nodeValue;e&&l.nextSibling&&ht.isText(l.nextSibling)&&u===l.nodeValue.length&&(u-=l.nodeValue.length,l=l.nextSibling),i=l,n=u}return{cont:i,offset:n}}function gt(t){var e=document.body.createTextRange(),n=function t(e,n){var o,i;if(ht.isText(e)){var r=ht.listPrev(e,m.not(ht.isText)),a=k.last(r).previousSibling;o=a||e.parentNode,n+=k.sum(k.tail(r),ht.nodeLength),i=!a}else{if(o=e.childNodes[n]||e,ht.isText(o))return t(o,0);n=0,i=!1}return{node:o,collapseToStart:i,offset:n}}(t.node,t.offset);return e.moveToElementText(n.node),e.collapse(n.collapseToStart),e.moveStart("character",n.offset),e}e().fn.extend({summernote:function(){var t=e().type(k.head(arguments)),n="string"===t,o="object"===t,i=e().extend({},e().summernote.options,o?k.head(arguments):{});i.langInfo=e().extend(!0,{},e().summernote.lang["en-US"],e().summernote.lang[i.lang]),i.icons=e().extend(!0,{},e().summernote.options.icons,i.icons),i.tooltip="auto"===i.tooltip?!f.isSupportTouch:i.tooltip,this.each((function(t,n){var o=e()(n);if(!o.data("summernote")){var r=new pt(o,i);o.data("summernote",r),o.data("summernote").triggerEvent("init",r.layoutInfo)}}));var r=this.first();if(r.length){var a=r.data("summernote");if(n)return a.invoke.apply(a,k.from(arguments));i.focus&&a.invoke("editor.focus")}return this}});var bt=function(){function t(e,n,o,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sc=e,this.so=n,this.ec=o,this.eo=i,this.isOnEditable=this.makeIsOn(ht.isEditable),this.isOnList=this.makeIsOn(ht.isList),this.isOnAnchor=this.makeIsOn(ht.isAnchor),this.isOnCell=this.makeIsOn(ht.isCell),this.isOnData=this.makeIsOn(ht.isData)}var n,o,i;return n=t,o=[{key:"nativeRange",value:function(){if(f.isW3CRangeSupport){var t=document.createRange();return t.setStart(this.sc,this.so),t.setEnd(this.ec,this.eo),t}var e=gt({node:this.sc,offset:this.so});return e.setEndPoint("EndToEnd",gt({node:this.ec,offset:this.eo})),e}},{key:"getPoints",value:function(){return{sc:this.sc,so:this.so,ec:this.ec,eo:this.eo}}},{key:"getStartPoint",value:function(){return{node:this.sc,offset:this.so}}},{key:"getEndPoint",value:function(){return{node:this.ec,offset:this.eo}}},{key:"select",value:function(){var t=this.nativeRange();if(f.isW3CRangeSupport){var e=document.getSelection();e.rangeCount>0&&e.removeAllRanges(),e.addRange(t)}else t.select();return this}},{key:"scrollIntoView",value:function(t){var n=e()(t).height();return t.scrollTop+n<this.sc.offsetTop&&(t.scrollTop+=Math.abs(t.scrollTop+n-this.sc.offsetTop)),this}},{key:"normalize",value:function(){var e=function(t,e){if(!t)return t;if(ht.isVisiblePoint(t)&&(!ht.isEdgePoint(t)||ht.isRightEdgePoint(t)&&!e||ht.isLeftEdgePoint(t)&&e||ht.isRightEdgePoint(t)&&e&&ht.isVoid(t.node.nextSibling)||ht.isLeftEdgePoint(t)&&!e&&ht.isVoid(t.node.previousSibling)||ht.isBlock(t.node)&&ht.isEmpty(t.node)))return t;var n=ht.ancestor(t.node,ht.isBlock),o=!1;if(!o){var i=ht.prevPoint(t)||{node:null};o=(ht.isLeftEdgePointOf(t,n)||ht.isVoid(i.node))&&!e}var r=!1;if(!r){var a=ht.nextPoint(t)||{node:null};r=(ht.isRightEdgePointOf(t,n)||ht.isVoid(a.node))&&e}if(o||r){if(ht.isVisiblePoint(t))return t;e=!e}return(e?ht.nextPointUntil(ht.nextPoint(t),ht.isVisiblePoint):ht.prevPointUntil(ht.prevPoint(t),ht.isVisiblePoint))||t},n=e(this.getEndPoint(),!1),o=this.isCollapsed()?n:e(this.getStartPoint(),!0);return new t(o.node,o.offset,n.node,n.offset)}},{key:"nodes",value:function(t,e){t=t||m.ok;var n=e&&e.includeAncestor,o=e&&e.fullyContains,i=this.getStartPoint(),r=this.getEndPoint(),a=[],s=[];return ht.walkPoint(i,r,(function(e){var i;ht.isEditable(e.node)||(o?(ht.isLeftEdgePoint(e)&&s.push(e.node),ht.isRightEdgePoint(e)&&k.contains(s,e.node)&&(i=e.node)):i=n?ht.ancestor(e.node,t):e.node,i&&t(i)&&a.push(i))}),!0),k.unique(a)}},{key:"commonAncestor",value:function(){return ht.commonAncestor(this.sc,this.ec)}},{key:"expand",value:function(e){var n=ht.ancestor(this.sc,e),o=ht.ancestor(this.ec,e);if(!n&&!o)return new t(this.sc,this.so,this.ec,this.eo);var i=this.getPoints();return n&&(i.sc=n,i.so=0),o&&(i.ec=o,i.eo=ht.nodeLength(o)),new t(i.sc,i.so,i.ec,i.eo)}},{key:"collapse",value:function(e){return e?new t(this.sc,this.so,this.sc,this.so):new t(this.ec,this.eo,this.ec,this.eo)}},{key:"splitText",value:function(){var e=this.sc===this.ec,n=this.getPoints();return ht.isText(this.ec)&&!ht.isEdgePoint(this.getEndPoint())&&this.ec.splitText(this.eo),ht.isText(this.sc)&&!ht.isEdgePoint(this.getStartPoint())&&(n.sc=this.sc.splitText(this.so),n.so=0,e&&(n.ec=n.sc,n.eo=this.eo-this.so)),new t(n.sc,n.so,n.ec,n.eo)}},{key:"deleteContents",value:function(){if(this.isCollapsed())return this;var n=this.splitText(),o=n.nodes(null,{fullyContains:!0}),i=ht.prevPointUntil(n.getStartPoint(),(function(t){return!k.contains(o,t.node)})),r=[];return e().each(o,(function(t,e){var n=e.parentNode;i.node!==n&&1===ht.nodeLength(n)&&r.push(n),ht.remove(e,!1)})),e().each(r,(function(t,e){ht.remove(e,!1)})),new t(i.node,i.offset,i.node,i.offset).normalize()}},{key:"makeIsOn",value:function(t){return function(){var e=ht.ancestor(this.sc,t);return!!e&&e===ht.ancestor(this.ec,t)}}},{key:"isLeftEdgeOf",value:function(t){if(!ht.isLeftEdgePoint(this.getStartPoint()))return!1;var e=ht.ancestor(this.sc,t);return e&&ht.isLeftEdgeOf(this.sc,e)}},{key:"isCollapsed",value:function(){return this.sc===this.ec&&this.so===this.eo}},{key:"wrapBodyInlineWithPara",value:function(){if(ht.isBodyContainer(this.sc)&&ht.isEmpty(this.sc))return this.sc.innerHTML=ht.emptyPara,new t(this.sc.firstChild,0,this.sc.firstChild,0);var e,n=this.normalize();if(ht.isParaInline(this.sc)||ht.isPara(this.sc))return n;if(ht.isInline(n.sc)){var o=ht.listAncestor(n.sc,m.not(ht.isInline));e=k.last(o),ht.isInline(e)||(e=o[o.length-2]||n.sc.childNodes[n.so])}else e=n.sc.childNodes[n.so>0?n.so-1:0];if(e){var i=ht.listPrev(e,ht.isParaInline).reverse();if((i=i.concat(ht.listNext(e.nextSibling,ht.isParaInline))).length){var r=ht.wrap(k.head(i),"p");ht.appendChildNodes(r,k.tail(i))}}return this.normalize()}},{key:"insertNode",value:function(t){var e=this;(ht.isText(t)||ht.isInline(t))&&(e=this.wrapBodyInlineWithPara().deleteContents());var n=ht.splitPoint(e.getStartPoint(),ht.isInline(t));return n.rightNode?(n.rightNode.parentNode.insertBefore(t,n.rightNode),ht.isEmpty(n.rightNode)&&ht.isPara(t)&&n.rightNode.parentNode.removeChild(n.rightNode)):n.container.appendChild(t),t}},{key:"pasteHTML",value:function(t){t=e().trim(t);var n=e()("<div></div>").html(t)[0],o=k.from(n.childNodes),i=this,r=!1;return i.so>=0&&(o=o.reverse(),r=!0),o=o.map((function(t){return i.insertNode(t)})),r&&(o=o.reverse()),o}},{key:"toString",value:function(){var t=this.nativeRange();return f.isW3CRangeSupport?t.toString():t.text}},{key:"getWordRange",value:function(e){var n=this.getEndPoint();if(!ht.isCharPoint(n))return this;var o=ht.prevPointUntil(n,(function(t){return!ht.isCharPoint(t)}));return e&&(n=ht.nextPointUntil(n,(function(t){return!ht.isCharPoint(t)}))),new t(o.node,o.offset,n.node,n.offset)}},{key:"getWordsRange",value:function(e){var n=this.getEndPoint(),o=function(t){return!ht.isCharPoint(t)&&!ht.isSpacePoint(t)};if(o(n))return this;var i=ht.prevPointUntil(n,o);return e&&(n=ht.nextPointUntil(n,o)),new t(i.node,i.offset,n.node,n.offset)}},{key:"getWordsMatchRange",value:function(e){var n=this.getEndPoint(),o=ht.prevPointUntil(n,(function(o){if(!ht.isCharPoint(o)&&!ht.isSpacePoint(o))return!0;var i=new t(o.node,o.offset,n.node,n.offset),r=e.exec(i.toString());return r&&0===r.index})),i=new t(o.node,o.offset,n.node,n.offset),r=i.toString(),a=e.exec(r);return a&&a[0].length===r.length?i:null}},{key:"bookmark",value:function(t){return{s:{path:ht.makeOffsetPath(t,this.sc),offset:this.so},e:{path:ht.makeOffsetPath(t,this.ec),offset:this.eo}}}},{key:"paraBookmark",value:function(t){return{s:{path:k.tail(ht.makeOffsetPath(k.head(t),this.sc)),offset:this.so},e:{path:k.tail(ht.makeOffsetPath(k.last(t),this.ec)),offset:this.eo}}}},{key:"getClientRects",value:function(){return this.nativeRange().getClientRects()}}],o&&mt(n.prototype,o),i&&mt(n,i),t}();const yt={create:function(t,e,n,o){if(4===arguments.length)return new bt(t,e,n,o);if(2===arguments.length)return new bt(t,e,n=t,o=e);var i=this.createFromSelection();if(!i&&1===arguments.length){var r=arguments[0];return ht.isEditable(r)&&(r=r.lastChild),this.createFromBodyElement(r,ht.emptyPara===arguments[0].innerHTML)}return i},createFromBodyElement:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.createFromNode(t);return n.collapse(e)},createFromSelection:function(){var t,e,n,o;if(f.isW3CRangeSupport){var i=document.getSelection();if(!i||0===i.rangeCount)return null;if(ht.isBody(i.anchorNode))return null;var r=i.getRangeAt(0);t=r.startContainer,e=r.startOffset,n=r.endContainer,o=r.endOffset}else{var a=document.selection.createRange(),s=a.duplicate();s.collapse(!1);var l=a;l.collapse(!0);var c=vt(l,!0),u=vt(s,!1);ht.isText(c.node)&&ht.isLeftEdgePoint(c)&&ht.isTextNode(u.node)&&ht.isRightEdgePoint(u)&&u.node.nextSibling===c.node&&(c=u),t=c.cont,e=c.offset,n=u.cont,o=u.offset}return new bt(t,e,n,o)},createFromNode:function(t){var e=t,n=0,o=t,i=ht.nodeLength(o);return ht.isVoid(e)&&(n=ht.listPrev(e).length-1,e=e.parentNode),ht.isBR(o)?(i=ht.listPrev(o).length-1,o=o.parentNode):ht.isVoid(o)&&(i=ht.listPrev(o).length,o=o.parentNode),this.create(e,n,o,i)},createFromNodeBefore:function(t){return this.createFromNode(t).collapse(!0)},createFromNodeAfter:function(t){return this.createFromNode(t).collapse()},createFromBookmark:function(t,e){var n=ht.fromOffsetPath(t,e.s.path),o=e.s.offset,i=ht.fromOffsetPath(t,e.e.path),r=e.e.offset;return new bt(n,o,i,r)},createFromParaBookmark:function(t,e){var n=t.s.offset,o=t.e.offset,i=ht.fromOffsetPath(k.head(e),t.s.path),r=ht.fromOffsetPath(k.last(e),t.e.path);return new bt(i,n,r,o)}};var kt={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,SPACE:32,DELETE:46,LEFT:37,UP:38,RIGHT:39,DOWN:40,NUM0:48,NUM1:49,NUM2:50,NUM3:51,NUM4:52,NUM5:53,NUM6:54,NUM7:55,NUM8:56,B:66,E:69,I:73,J:74,K:75,L:76,R:82,S:83,U:85,V:86,Y:89,Z:90,SLASH:191,LEFTBRACKET:219,BACKSLASH:220,RIGHTBRACKET:221,HOME:36,END:35,PAGEUP:33,PAGEDOWN:34};const wt={isEdit:function(t){return k.contains([kt.BACKSPACE,kt.TAB,kt.ENTER,kt.SPACE,kt.DELETE],t)},isMove:function(t){return k.contains([kt.LEFT,kt.UP,kt.RIGHT,kt.DOWN],t)},isNavigation:function(t){return k.contains([kt.HOME,kt.END,kt.PAGEUP,kt.PAGEDOWN],t)},nameFromCode:m.invertObject(kt),code:kt};function Ct(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var xt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.stack=[],this.stackOffset=-1,this.context=e,this.$editable=e.layoutInfo.editable,this.editable=this.$editable[0]}var e,n,o;return e=t,(n=[{key:"makeSnapshot",value:function(){var t=yt.create(this.editable);return{contents:this.$editable.html(),bookmark:t&&t.isOnEditable()?t.bookmark(this.editable):{s:{path:[],offset:0},e:{path:[],offset:0}}}}},{key:"applySnapshot",value:function(t){null!==t.contents&&this.$editable.html(t.contents),null!==t.bookmark&&yt.createFromBookmark(this.editable,t.bookmark).select()}},{key:"rewind",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset=0,this.applySnapshot(this.stack[this.stackOffset])}},{key:"commit",value:function(){this.stack=[],this.stackOffset=-1,this.recordUndo()}},{key:"reset",value:function(){this.stack=[],this.stackOffset=-1,this.$editable.html(""),this.recordUndo()}},{key:"undo",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset>0&&(this.stackOffset--,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"redo",value:function(){this.stack.length-1>this.stackOffset&&(this.stackOffset++,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"recordUndo",value:function(){this.stackOffset++,this.stack.length>this.stackOffset&&(this.stack=this.stack.slice(0,this.stackOffset)),this.stack.push(this.makeSnapshot()),this.stack.length>this.context.options.historyLimit&&(this.stack.shift(),this.stackOffset-=1)}}])&&Ct(e.prototype,n),o&&Ct(e,o),t}();function St(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Tt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"jQueryCSS",value:function(t,n){var o={};return e().each(n,(function(e,n){o[n]=t.css(n)})),o}},{key:"fromNode",value:function(t){var e=this.jQueryCSS(t,["font-family","font-size","text-align","list-style-type","line-height"])||{},n=t[0].style.fontSize||e["font-size"];return e["font-size"]=parseInt(n,10),e["font-size-unit"]=n.match(/[a-z%]+$/),e}},{key:"stylePara",value:function(t,n){e().each(t.nodes(ht.isPara,{includeAncestor:!0}),(function(t,o){e()(o).css(n)}))}},{key:"styleNodes",value:function(t,n){t=t.splitText();var o=n&&n.nodeName||"SPAN",i=!(!n||!n.expandClosestSibling),r=!(!n||!n.onlyPartialContains);if(t.isCollapsed())return[t.insertNode(ht.create(o))];var a=ht.makePredByNodeName(o),s=t.nodes(ht.isText,{fullyContains:!0}).map((function(t){return ht.singleChildAncestor(t,a)||ht.wrap(t,o)}));if(i){if(r){var l=t.nodes();a=m.and(a,(function(t){return k.contains(l,t)}))}return s.map((function(t){var n=ht.withClosestSiblings(t,a),o=k.head(n),i=k.tail(n);return e().each(i,(function(t,e){ht.appendChildNodes(o,e.childNodes),ht.remove(e)})),k.head(n)}))}return s}},{key:"current",value:function(t){var n=e()(ht.isElement(t.sc)?t.sc:t.sc.parentNode),o=this.fromNode(n);try{o=e().extend(o,{"font-bold":document.queryCommandState("bold")?"bold":"normal","font-italic":document.queryCommandState("italic")?"italic":"normal","font-underline":document.queryCommandState("underline")?"underline":"normal","font-subscript":document.queryCommandState("subscript")?"subscript":"normal","font-superscript":document.queryCommandState("superscript")?"superscript":"normal","font-strikethrough":document.queryCommandState("strikethrough")?"strikethrough":"normal","font-family":document.queryCommandValue("fontname")||o["font-family"]})}catch(t){}if(t.isOnList()){var i=["circle","disc","disc-leading-zero","square"].indexOf(o["list-style-type"])>-1;o["list-style"]=i?"unordered":"ordered"}else o["list-style"]="none";var r=ht.ancestor(t.sc,ht.isPara);if(r&&r.style["line-height"])o["line-height"]=r.style.lineHeight;else{var a=parseInt(o["line-height"],10)/parseInt(o["font-size"],10);o["line-height"]=a.toFixed(1)}return o.anchor=t.isOnAnchor()&&ht.ancestor(t.sc,ht.isAnchor),o.ancestors=ht.listAncestor(t.sc,ht.isEditable),o.range=t,o}}],o&&St(n.prototype,o),i&&St(n,i),t}();function Et(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var It=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"insertOrderedList",value:function(t){this.toggleList("OL",t)}},{key:"insertUnorderedList",value:function(t){this.toggleList("UL",t)}},{key:"indent",value:function(t){var n=this,o=yt.create(t).wrapBodyInlineWithPara(),i=o.nodes(ht.isPara,{includeAncestor:!0}),r=k.clusterBy(i,m.peq2("parentNode"));e().each(r,(function(t,o){var i=k.head(o);if(ht.isLi(i)){var r=n.findList(i.previousSibling);r?o.map((function(t){return r.appendChild(t)})):(n.wrapList(o,i.parentNode.nodeName),o.map((function(t){return t.parentNode})).map((function(t){return n.appendToPrevious(t)})))}else e().each(o,(function(t,n){e()(n).css("marginLeft",(function(t,e){return(parseInt(e,10)||0)+25}))}))})),o.select()}},{key:"outdent",value:function(t){var n=this,o=yt.create(t).wrapBodyInlineWithPara(),i=o.nodes(ht.isPara,{includeAncestor:!0}),r=k.clusterBy(i,m.peq2("parentNode"));e().each(r,(function(t,o){var i=k.head(o);ht.isLi(i)?n.releaseList([o]):e().each(o,(function(t,n){e()(n).css("marginLeft",(function(t,e){return(e=parseInt(e,10)||0)>25?e-25:""}))}))})),o.select()}},{key:"toggleList",value:function(t,n){var o=this,i=yt.create(n).wrapBodyInlineWithPara(),r=i.nodes(ht.isPara,{includeAncestor:!0}),a=i.paraBookmark(r),s=k.clusterBy(r,m.peq2("parentNode"));if(k.find(r,ht.isPurePara)){var l=[];e().each(s,(function(e,n){l=l.concat(o.wrapList(n,t))})),r=l}else{var c=i.nodes(ht.isList,{includeAncestor:!0}).filter((function(n){return!e().nodeName(n,t)}));c.length?e().each(c,(function(e,n){ht.replace(n,t)})):r=this.releaseList(s,!0)}yt.createFromParaBookmark(a,r).select()}},{key:"wrapList",value:function(t,e){var n=k.head(t),o=k.last(t),i=ht.isList(n.previousSibling)&&n.previousSibling,r=ht.isList(o.nextSibling)&&o.nextSibling,a=i||ht.insertAfter(ht.create(e||"UL"),o);return t=t.map((function(t){return ht.isPurePara(t)?ht.replace(t,"LI"):t})),ht.appendChildNodes(a,t),r&&(ht.appendChildNodes(a,k.from(r.childNodes)),ht.remove(r)),t}},{key:"releaseList",value:function(t,n){var o=this,i=[];return e().each(t,(function(t,r){var a=k.head(r),s=k.last(r),l=n?ht.lastAncestor(a,ht.isList):a.parentNode,c=l.parentNode;if("LI"===l.parentNode.nodeName)r.map((function(t){var e=o.findNextSiblings(t);c.nextSibling?c.parentNode.insertBefore(t,c.nextSibling):c.parentNode.appendChild(t),e.length&&(o.wrapList(e,l.nodeName),t.appendChild(e[0].parentNode))})),0===l.children.length&&c.removeChild(l),0===c.childNodes.length&&c.parentNode.removeChild(c);else{var u=l.childNodes.length>1?ht.splitTree(l,{node:s.parentNode,offset:ht.position(s)+1},{isSkipPaddingBlankHTML:!0}):null,d=ht.splitTree(l,{node:a.parentNode,offset:ht.position(a)},{isSkipPaddingBlankHTML:!0});r=n?ht.listDescendant(d,ht.isLi):k.from(d.childNodes).filter(ht.isLi),!n&&ht.isList(l.parentNode)||(r=r.map((function(t){return ht.replace(t,"P")}))),e().each(k.from(r).reverse(),(function(t,e){ht.insertAfter(e,l)}));var h=k.compact([l,d,u]);e().each(h,(function(t,n){var o=[n].concat(ht.listDescendant(n,ht.isList));e().each(o.reverse(),(function(t,e){ht.nodeLength(e)||ht.remove(e,!0)}))}))}i=i.concat(r)})),i}},{key:"appendToPrevious",value:function(t){return t.previousSibling?ht.appendChildNodes(t.previousSibling,[t]):this.wrapList([t],"LI")}},{key:"findList",value:function(t){return t?k.find(t.children,(function(t){return["OL","UL"].indexOf(t.nodeName)>-1})):null}},{key:"findNextSiblings",value:function(t){for(var e=[];t.nextSibling;)e.push(t.nextSibling),t=t.nextSibling;return e}}],o&&Et(n.prototype,o),i&&Et(n,i),t}();function $t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Nt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.bullet=new It,this.options=e.options}var n,o,i;return n=t,o=[{key:"insertTab",value:function(t,e){var n=ht.createText(new Array(e+1).join(ht.NBSP_CHAR));(t=t.deleteContents()).insertNode(n,!0),(t=yt.create(n,e)).select()}},{key:"insertParagraph",value:function(t,n){n=(n=(n=n||yt.create(t)).deleteContents()).wrapBodyInlineWithPara();var o,i=ht.ancestor(n.sc,ht.isPara);if(i){if(ht.isLi(i)&&(ht.isEmpty(i)||ht.deepestChildIsEmpty(i)))return void this.bullet.toggleList(i.parentNode.nodeName);var r=null;if(1===this.options.blockquoteBreakingLevel?r=ht.ancestor(i,ht.isBlockquote):2===this.options.blockquoteBreakingLevel&&(r=ht.lastAncestor(i,ht.isBlockquote)),r){o=e()(ht.emptyPara)[0],ht.isRightEdgePoint(n.getStartPoint())&&ht.isBR(n.sc.nextSibling)&&e()(n.sc.nextSibling).remove();var a=ht.splitTree(r,n.getStartPoint(),{isDiscardEmptySplits:!0});a?a.parentNode.insertBefore(o,a):ht.insertAfter(o,r)}else{o=ht.splitTree(i,n.getStartPoint());var s=ht.listDescendant(i,ht.isEmptyAnchor);s=s.concat(ht.listDescendant(o,ht.isEmptyAnchor)),e().each(s,(function(t,e){ht.remove(e)})),(ht.isHeading(o)||ht.isPre(o)||ht.isCustomStyleTag(o))&&ht.isEmpty(o)&&(o=ht.replace(o,"p"))}}else{var l=n.sc.childNodes[n.so];o=e()(ht.emptyPara)[0],l?n.sc.insertBefore(o,l):n.sc.appendChild(o)}yt.create(o,0).normalize().select().scrollIntoView(t)}}],o&&$t(n.prototype,o),i&&$t(n,i),t}();function Pt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Rt=function t(e,n,o,i){var r={colPos:0,rowPos:0},a=[],s=[];function l(t,e,n,o,i,r,s){var l={baseRow:n,baseCell:o,isRowSpan:i,isColSpan:r,isVirtual:s};a[t]||(a[t]=[]),a[t][e]=l}function c(t,e,n,o){return{baseCell:t.baseCell,action:e,virtualTable:{rowIndex:n,cellIndex:o}}}function u(t,e){if(!a[t])return e;if(!a[t][e])return e;for(var n=e;a[t][n];)if(n++,!a[t][n])return n}function d(t,e){var n=u(t.rowIndex,e.cellIndex),o=e.colSpan>1,i=e.rowSpan>1,a=t.rowIndex===r.rowPos&&e.cellIndex===r.colPos;l(t.rowIndex,n,t,e,i,o,!1);var s=e.attributes.rowSpan?parseInt(e.attributes.rowSpan.value,10):0;if(s>1)for(var c=1;c<s;c++){var d=t.rowIndex+c;h(d,n,e,a),l(d,n,t,e,!0,o,!0)}var f=e.attributes.colSpan?parseInt(e.attributes.colSpan.value,10):0;if(f>1)for(var p=1;p<f;p++){var m=u(t.rowIndex,n+p);h(t.rowIndex,m,e,a),l(t.rowIndex,m,t,e,i,!0,!0)}}function h(t,e,n,o){t===r.rowPos&&r.colPos>=n.cellIndex&&n.cellIndex<=e&&!o&&r.colPos++}function f(e){switch(n){case t.where.Column:if(e.isColSpan)return t.resultAction.SubtractSpanCount;break;case t.where.Row:if(!e.isVirtual&&e.isRowSpan)return t.resultAction.AddCell;if(e.isRowSpan)return t.resultAction.SubtractSpanCount}return t.resultAction.RemoveCell}function p(e){switch(n){case t.where.Column:if(e.isColSpan)return t.resultAction.SumSpanCount;if(e.isRowSpan&&e.isVirtual)return t.resultAction.Ignore;break;case t.where.Row:if(e.isRowSpan)return t.resultAction.SumSpanCount;if(e.isColSpan&&e.isVirtual)return t.resultAction.Ignore}return t.resultAction.AddCell}this.getActionList=function(){for(var e=n===t.where.Row?r.rowPos:-1,i=n===t.where.Column?r.colPos:-1,l=0,u=!0;u;){var d=e>=0?e:l,h=i>=0?i:l,m=a[d];if(!m)return u=!1,s;var v=m[h];if(!v)return u=!1,s;var g=t.resultAction.Ignore;switch(o){case t.requestAction.Add:g=p(v);break;case t.requestAction.Delete:g=f(v)}s.push(c(v,g,d,h)),l++}return s},e&&e.tagName&&("td"===e.tagName.toLowerCase()||"th"===e.tagName.toLowerCase())&&(r.colPos=e.cellIndex,e.parentElement&&e.parentElement.tagName&&"tr"===e.parentElement.tagName.toLowerCase()&&(r.rowPos=e.parentElement.rowIndex)),function(){for(var t=i.rows,e=0;e<t.length;e++)for(var n=t[e].cells,o=0;o<n.length;o++)d(t[e],n[o])}()};Rt.where={Row:0,Column:1},Rt.requestAction={Add:0,Delete:1},Rt.resultAction={Ignore:0,SubtractSpanCount:1,RemoveCell:2,AddCell:3,SumSpanCount:4};var Lt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"tab",value:function(t,e){var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=ht.ancestor(n,ht.isTable),i=ht.listDescendant(o,ht.isCell),r=k[e?"prev":"next"](i,n);r&&yt.create(r,0).select()}},{key:"addRow",value:function(t,n){for(var o=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(o).closest("tr"),r=this.recoverAttributes(i),a=e()("<tr"+r+"></tr>"),s=new Rt(o,Rt.where.Row,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),l=0;l<s.length;l++){var c=s[l],u=this.recoverAttributes(c.baseCell);switch(c.action){case Rt.resultAction.AddCell:a.append("<td"+u+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("top"===n&&(c.baseCell.parent?c.baseCell.closest("tr").rowIndex:0)<=i[0].rowIndex){var d=e()("<div></div>").append(e()("<td"+u+">"+ht.blank+"</td>").removeAttr("rowspan")).html();a.append(d);break}var h=parseInt(c.baseCell.rowSpan,10);h++,c.baseCell.setAttribute("rowSpan",h)}}if("top"===n)i.before(a);else{if(o.rowSpan>1){var f=i[0].rowIndex+(o.rowSpan-2);return void e()(e()(i).parent().find("tr")[f]).after(e()(a))}i.after(a)}}},{key:"addCol",value:function(t,n){var o=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(o).closest("tr");e()(i).siblings().push(i);for(var r=new Rt(o,Rt.where.Column,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),a=0;a<r.length;a++){var s=r[a],l=this.recoverAttributes(s.baseCell);switch(s.action){case Rt.resultAction.AddCell:"right"===n?e()(s.baseCell).after("<td"+l+">"+ht.blank+"</td>"):e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("right"===n){var c=parseInt(s.baseCell.colSpan,10);c++,s.baseCell.setAttribute("colSpan",c)}else e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>")}}}},{key:"recoverAttributes",value:function(t){var e="";if(!t)return e;for(var n=t.attributes||[],o=0;o<n.length;o++)"id"!==n[o].name.toLowerCase()&&n[o].specified&&(e+=" "+n[o].name+"='"+n[o].value+"'");return e}},{key:"deleteRow",value:function(t){for(var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=e()(n).closest("tr"),i=o.children("td, th").index(e()(n)),r=o[0].rowIndex,a=new Rt(n,Rt.where.Row,Rt.requestAction.Delete,e()(o).closest("table")[0]).getActionList(),s=0;s<a.length;s++)if(a[s]){var l=a[s].baseCell,c=a[s].virtualTable,u=l.rowSpan&&l.rowSpan>1,d=u?parseInt(l.rowSpan,10):0;switch(a[s].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.AddCell:var h=o.next("tr")[0];if(!h)continue;var f=o[0].cells[i];u&&(d>2?(d--,h.insertBefore(f,h.cells[i]),h.cells[i].setAttribute("rowSpan",d),h.cells[i].innerHTML=""):2===d&&(h.insertBefore(f,h.cells[i]),h.cells[i].removeAttribute("rowSpan"),h.cells[i].innerHTML=""));continue;case Rt.resultAction.SubtractSpanCount:u&&(d>2?(d--,l.setAttribute("rowSpan",d),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")):2===d&&(l.removeAttribute("rowSpan"),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")));continue;case Rt.resultAction.RemoveCell:continue}}o.remove()}},{key:"deleteCol",value:function(t){for(var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=e()(n).closest("tr"),i=o.children("td, th").index(e()(n)),r=new Rt(n,Rt.where.Column,Rt.requestAction.Delete,e()(o).closest("table")[0]).getActionList(),a=0;a<r.length;a++)if(r[a])switch(r[a].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.SubtractSpanCount:var s=r[a].baseCell;if(s.colSpan&&s.colSpan>1){var l=s.colSpan?parseInt(s.colSpan,10):0;l>2?(l--,s.setAttribute("colSpan",l),s.cellIndex===i&&(s.innerHTML="")):2===l&&(s.removeAttribute("colSpan"),s.cellIndex===i&&(s.innerHTML=""))}continue;case Rt.resultAction.RemoveCell:ht.remove(r[a].baseCell,!0);continue}}},{key:"createTable",value:function(t,n,o){for(var i,r=[],a=0;a<t;a++)r.push("<td>"+ht.blank+"</td>");i=r.join("");for(var s,l=[],c=0;c<n;c++)l.push("<tr>"+i+"</tr>");s=l.join("");var u=e()("<table>"+s+"</table>");return o&&o.tableClassName&&u.addClass(o.tableClassName),u[0]}},{key:"deleteTable",value:function(t){var n=ht.ancestor(t.commonAncestor(),ht.isCell);e()(n).closest("table").remove()}}],o&&Pt(n.prototype,o),i&&Pt(n,i),t}();function At(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Ft=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$note=n.layoutInfo.note,this.$editor=n.layoutInfo.editor,this.$editable=n.layoutInfo.editable,this.options=n.options,this.lang=this.options.langInfo,this.editable=this.$editable[0],this.lastRange=null,this.snapshot=null,this.style=new Tt,this.table=new Lt,this.typing=new Nt(n),this.bullet=new It,this.history=new xt(n),this.context.memo("help.escape",this.lang.help.escape),this.context.memo("help.undo",this.lang.help.undo),this.context.memo("help.redo",this.lang.help.redo),this.context.memo("help.tab",this.lang.help.tab),this.context.memo("help.untab",this.lang.help.untab),this.context.memo("help.insertParagraph",this.lang.help.insertParagraph),this.context.memo("help.insertOrderedList",this.lang.help.insertOrderedList),this.context.memo("help.insertUnorderedList",this.lang.help.insertUnorderedList),this.context.memo("help.indent",this.lang.help.indent),this.context.memo("help.outdent",this.lang.help.outdent),this.context.memo("help.formatPara",this.lang.help.formatPara),this.context.memo("help.insertHorizontalRule",this.lang.help.insertHorizontalRule),this.context.memo("help.fontName",this.lang.help.fontName);for(var i=["bold","italic","underline","strikethrough","superscript","subscript","justifyLeft","justifyCenter","justifyRight","justifyFull","formatBlock","removeFormat","backColor"],r=0,a=i.length;r<a;r++)this[i[r]]=function(t){return function(e){o.beforeCommand(),document.execCommand(t,!1,e),o.afterCommand(!0)}}(i[r]),this.context.memo("help."+i[r],this.lang.help[i[r]]);this.fontName=this.wrapCommand((function(t){return o.fontStyling("font-family",f.validFontName(t))})),this.fontSize=this.wrapCommand((function(t){var e=o.currentStyle()["font-size-unit"];return o.fontStyling("font-size",t+e)})),this.fontSizeUnit=this.wrapCommand((function(t){var e=o.currentStyle()["font-size"];return o.fontStyling("font-size",e+t)}));for(var s=1;s<=6;s++)this["formatH"+s]=function(t){return function(){o.formatBlock("H"+t)}}(s),this.context.memo("help.formatH"+s,this.lang.help["formatH"+s]);this.insertParagraph=this.wrapCommand((function(){o.typing.insertParagraph(o.editable)})),this.insertOrderedList=this.wrapCommand((function(){o.bullet.insertOrderedList(o.editable)})),this.insertUnorderedList=this.wrapCommand((function(){o.bullet.insertUnorderedList(o.editable)})),this.indent=this.wrapCommand((function(){o.bullet.indent(o.editable)})),this.outdent=this.wrapCommand((function(){o.bullet.outdent(o.editable)})),this.insertNode=this.wrapCommand((function(t){o.isLimited(e()(t).text().length)||(o.getLastRange().insertNode(t),o.setLastRange(yt.createFromNodeAfter(t).select()))})),this.insertText=this.wrapCommand((function(t){if(!o.isLimited(t.length)){var e=o.getLastRange().insertNode(ht.createText(t));o.setLastRange(yt.create(e,ht.nodeLength(e)).select())}})),this.pasteHTML=this.wrapCommand((function(t){if(!o.isLimited(t.length)){t=o.context.invoke("codeview.purify",t);var e=o.getLastRange().pasteHTML(t);o.setLastRange(yt.createFromNodeAfter(k.last(e)).select())}})),this.formatBlock=this.wrapCommand((function(t,e){var n=o.options.callbacks.onApplyCustomStyle;n?n.call(o,e,o.context,o.onFormatBlock):o.onFormatBlock(t,e)})),this.insertHorizontalRule=this.wrapCommand((function(){var t=o.getLastRange().insertNode(ht.create("HR"));t.nextSibling&&o.setLastRange(yt.create(t.nextSibling,0).normalize().select())})),this.lineHeight=this.wrapCommand((function(t){o.style.stylePara(o.getLastRange(),{lineHeight:t})})),this.createLink=this.wrapCommand((function(t){var n=t.url,i=t.text,r=t.isNewWindow,a=t.checkProtocol,s=t.range||o.getLastRange(),l=i.length-s.toString().length;if(!(l>0&&o.isLimited(l))){var c=s.toString()!==i;"string"==typeof n&&(n=n.trim()),o.options.onCreateLink?n=o.options.onCreateLink(n):a&&(n=/^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(n)?n:o.options.defaultProtocol+n);var u=[];if(c){var d=(s=s.deleteContents()).insertNode(e()("<A>"+i+"</A>")[0]);u.push(d)}else u=o.style.styleNodes(s,{nodeName:"A",expandClosestSibling:!0,onlyPartialContains:!0});e().each(u,(function(t,o){e()(o).attr("href",n),r?e()(o).attr("target","_blank"):e()(o).removeAttr("target")})),o.setLastRange(o.createRangeFromList(u).select())}})),this.color=this.wrapCommand((function(t){var e=t.foreColor,n=t.backColor;e&&document.execCommand("foreColor",!1,e),n&&document.execCommand("backColor",!1,n)})),this.foreColor=this.wrapCommand((function(t){document.execCommand("foreColor",!1,t)})),this.insertTable=this.wrapCommand((function(t){var e=t.split("x");o.getLastRange().deleteContents().insertNode(o.table.createTable(e[0],e[1],o.options))})),this.removeMedia=this.wrapCommand((function(){var t=e()(o.restoreTarget()).parent();t.closest("figure").length?t.closest("figure").remove():t=e()(o.restoreTarget()).detach(),o.context.triggerEvent("media.delete",t,o.$editable)})),this.floatMe=this.wrapCommand((function(t){var n=e()(o.restoreTarget());n.toggleClass("note-float-left","left"===t),n.toggleClass("note-float-right","right"===t),n.css("float","none"===t?"":t)})),this.resize=this.wrapCommand((function(t){var n=e()(o.restoreTarget());0===(t=parseFloat(t))?n.css("width",""):n.css({width:100*t+"%",height:""})}))}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this;this.$editable.on("keydown",(function(e){if(e.keyCode===wt.code.ENTER&&t.context.triggerEvent("enter",e),t.context.triggerEvent("keydown",e),t.snapshot=t.history.makeSnapshot(),t.hasKeyShortCut=!1,e.isDefaultPrevented()||(t.options.shortcuts?t.hasKeyShortCut=t.handleKeyMap(e):t.preventDefaultEditableShortCuts(e)),t.isLimited(1,e)){var n=t.getLastRange();if(n.eo-n.so==0)return!1}t.setLastRange(),t.options.recordEveryKeystroke&&!1===t.hasKeyShortCut&&t.history.recordUndo()})).on("keyup",(function(e){t.setLastRange(),t.context.triggerEvent("keyup",e)})).on("focus",(function(e){t.setLastRange(),t.context.triggerEvent("focus",e)})).on("blur",(function(e){t.context.triggerEvent("blur",e)})).on("mousedown",(function(e){t.context.triggerEvent("mousedown",e)})).on("mouseup",(function(e){t.setLastRange(),t.history.recordUndo(),t.context.triggerEvent("mouseup",e)})).on("scroll",(function(e){t.context.triggerEvent("scroll",e)})).on("paste",(function(e){t.setLastRange(),t.context.triggerEvent("paste",e)})).on("input",(function(){t.isLimited(0)&&t.snapshot&&t.history.applySnapshot(t.snapshot)})),this.$editable.attr("spellcheck",this.options.spellCheck),this.$editable.attr("autocorrect",this.options.spellCheck),this.options.disableGrammar&&this.$editable.attr("data-gramm",!1),this.$editable.html(ht.html(this.$note)||ht.emptyPara),this.$editable.on(f.inputEventName,m.debounce((function(){t.context.triggerEvent("change",t.$editable.html(),t.$editable)}),10)),this.$editable.on("focusin",(function(e){t.context.triggerEvent("focusin",e)})).on("focusout",(function(e){t.context.triggerEvent("focusout",e)})),this.options.airMode?this.options.overrideContextMenu&&this.$editor.on("contextmenu",(function(e){return t.context.triggerEvent("contextmenu",e),!1})):(this.options.width&&this.$editor.outerWidth(this.options.width),this.options.height&&this.$editable.outerHeight(this.options.height),this.options.maxHeight&&this.$editable.css("max-height",this.options.maxHeight),this.options.minHeight&&this.$editable.css("min-height",this.options.minHeight)),this.history.recordUndo(),this.setLastRange()}},{key:"destroy",value:function(){this.$editable.off()}},{key:"handleKeyMap",value:function(t){var e=this.options.keyMap[f.isMac?"mac":"pc"],n=[];t.metaKey&&n.push("CMD"),t.ctrlKey&&!t.altKey&&n.push("CTRL"),t.shiftKey&&n.push("SHIFT");var o=wt.nameFromCode[t.keyCode];o&&n.push(o);var i=e[n.join("+")];if("TAB"!==o||this.options.tabDisable)if(i){if(!1!==this.context.invoke(i))return t.preventDefault(),!0}else wt.isEdit(t.keyCode)&&this.afterCommand();else this.afterCommand();return!1}},{key:"preventDefaultEditableShortCuts",value:function(t){(t.ctrlKey||t.metaKey)&&k.contains([66,73,85],t.keyCode)&&t.preventDefault()}},{key:"isLimited",value:function(t,e){return t=t||0,(void 0===e||!(wt.isMove(e.keyCode)||wt.isNavigation(e.keyCode)||e.ctrlKey||e.metaKey||k.contains([wt.code.BACKSPACE,wt.code.DELETE],e.keyCode)))&&this.options.maxTextLength>0&&this.$editable.text().length+t>this.options.maxTextLength}},{key:"createRange",value:function(){return this.focus(),this.setLastRange(),this.getLastRange()}},{key:"createRangeFromList",value:function(t){var e=yt.createFromNodeBefore(k.head(t)).getStartPoint(),n=yt.createFromNodeAfter(k.last(t)).getEndPoint();return yt.create(e.node,e.offset,n.node,n.offset)}},{key:"setLastRange",value:function(t){t?this.lastRange=t:(this.lastRange=yt.create(this.editable),0===e()(this.lastRange.sc).closest(".note-editable").length&&(this.lastRange=yt.createFromBodyElement(this.editable)))}},{key:"getLastRange",value:function(){return this.lastRange||this.setLastRange(),this.lastRange}},{key:"saveRange",value:function(t){t&&this.getLastRange().collapse().select()}},{key:"restoreRange",value:function(){this.lastRange&&(this.lastRange.select(),this.focus())}},{key:"saveTarget",value:function(t){this.$editable.data("target",t)}},{key:"clearTarget",value:function(){this.$editable.removeData("target")}},{key:"restoreTarget",value:function(){return this.$editable.data("target")}},{key:"currentStyle",value:function(){var t=yt.create();return t&&(t=t.normalize()),t?this.style.current(t):this.style.fromNode(this.$editable)}},{key:"styleFromNode",value:function(t){return this.style.fromNode(t)}},{key:"undo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.undo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"commit",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.commit(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"redo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.redo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"beforeCommand",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),document.execCommand("styleWithCSS",!1,this.options.styleWithCSS),this.focus()}},{key:"afterCommand",value:function(t){this.normalizeContent(),this.history.recordUndo(),t||this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"tab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t);else{if(0===this.options.tabSize)return!1;this.isLimited(this.options.tabSize)||(this.beforeCommand(),this.typing.insertTab(t,this.options.tabSize),this.afterCommand())}}},{key:"untab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t,!0);else if(0===this.options.tabSize)return!1}},{key:"wrapCommand",value:function(t){return function(){this.beforeCommand(),t.apply(this,arguments),this.afterCommand()}}},{key:"insertImage",value:function(t,n){var o,i=this;return(o=t,e().Deferred((function(t){var n=e()("<img>");n.one("load",(function(){n.off("error abort"),t.resolve(n)})).one("error abort",(function(){n.off("load").detach(),t.reject(n)})).css({display:"none"}).appendTo(document.body).attr("src",o)})).promise()).then((function(t){i.beforeCommand(),"function"==typeof n?n(t):("string"==typeof n&&t.attr("data-filename",n),t.css("width",Math.min(i.$editable.width(),t.width()))),t.show(),i.getLastRange().insertNode(t[0]),i.setLastRange(yt.createFromNodeAfter(t[0]).select()),i.afterCommand()})).fail((function(t){i.context.triggerEvent("image.upload.error",t)}))}},{key:"insertImagesAsDataURL",value:function(t){var n=this;e().each(t,(function(t,o){var i=o.name;n.options.maximumImageFileSize&&n.options.maximumImageFileSize<o.size?n.context.triggerEvent("image.upload.error",n.lang.image.maximumFileSizeError):function(t){return e().Deferred((function(n){e().extend(new FileReader,{onload:function(t){var e=t.target.result;n.resolve(e)},onerror:function(t){n.reject(t)}}).readAsDataURL(t)})).promise()}(o).then((function(t){return n.insertImage(t,i)})).fail((function(){n.context.triggerEvent("image.upload.error")}))}))}},{key:"insertImagesOrCallback",value:function(t){this.options.callbacks.onImageUpload?this.context.triggerEvent("image.upload",t):this.insertImagesAsDataURL(t)}},{key:"getSelectedText",value:function(){var t=this.getLastRange();return t.isOnAnchor()&&(t=yt.createFromNode(ht.ancestor(t.sc,ht.isAnchor))),t.toString()}},{key:"onFormatBlock",value:function(t,n){if(document.execCommand("FormatBlock",!1,f.isMSIE?"<"+t+">":t),n&&n.length&&(n[0].tagName.toUpperCase()!==t.toUpperCase()&&(n=n.find(t)),n&&n.length)){var o=this.createRange(),i=e()([o.sc,o.ec]).closest(t);i.removeClass();var r=n[0].className||"";r&&i.addClass(r)}}},{key:"formatPara",value:function(){this.formatBlock("P")}},{key:"fontStyling",value:function(t,n){var o=this.getLastRange();if(""!==o){var i=this.style.styleNodes(o);if(this.$editor.find(".note-status-output").html(""),e()(i).css(t,n),o.isCollapsed()){var r=k.head(i);r&&!ht.nodeLength(r)&&(r.innerHTML=ht.ZERO_WIDTH_NBSP_CHAR,yt.createFromNode(r.firstChild).select(),this.setLastRange(),this.$editable.data("bogus",r))}else this.setLastRange(this.createRangeFromList(i).select())}else{var a=e().now();this.$editor.find(".note-status-output").html('<div id="note-status-output-'+a+'" class="alert alert-info">'+this.lang.output.noSelection+"</div>"),setTimeout((function(){e()("#note-status-output-"+a).remove()}),5e3)}}},{key:"unlink",value:function(){var t=this.getLastRange();if(t.isOnAnchor()){var e=ht.ancestor(t.sc,ht.isAnchor);(t=yt.createFromNode(e)).select(),this.setLastRange(),this.beforeCommand(),document.execCommand("unlink"),this.afterCommand()}}},{key:"getLinkInfo",value:function(){var t=this.getLastRange().expand(ht.isAnchor),n=e()(k.head(t.nodes(ht.isAnchor))),o={range:t,text:t.toString(),url:n.length?n.attr("href"):""};return n.length&&(o.isNewWindow="_blank"===n.attr("target")),o}},{key:"addRow",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addRow(e,t),this.afterCommand())}},{key:"addCol",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addCol(e,t),this.afterCommand())}},{key:"deleteRow",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteRow(t),this.afterCommand())}},{key:"deleteCol",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteCol(t),this.afterCommand())}},{key:"deleteTable",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteTable(t),this.afterCommand())}},{key:"resizeTo",value:function(t,e,n){var o;if(n){var i=t.y/t.x,r=e.data("ratio");o={width:r>i?t.x:t.y/r,height:r>i?t.x*r:t.y}}else o={width:t.x,height:t.y};e.css(o)}},{key:"hasFocus",value:function(){return this.$editable.is(":focus")}},{key:"focus",value:function(){this.hasFocus()||this.$editable.focus()}},{key:"isEmpty",value:function(){return ht.isEmpty(this.$editable[0])||ht.emptyPara===this.$editable.html()}},{key:"empty",value:function(){this.context.invoke("code",ht.emptyPara)}},{key:"normalizeContent",value:function(){this.$editable[0].normalize()}}],o&&At(n.prototype,o),i&&At(n,i),t}();function Dt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Ht=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editable=e.layoutInfo.editable}var e,n,o;return e=t,(n=[{key:"initialize",value:function(){this.$editable.on("paste",this.pasteByEvent.bind(this))}},{key:"pasteByEvent",value:function(t){var e=this,n=t.originalEvent.clipboardData;if(n&&n.items&&n.items.length){var o=n.items.length>1?n.items[1]:k.head(n.items);"file"===o.kind&&-1!==o.type.indexOf("image/")?(this.context.invoke("editor.insertImagesOrCallback",[o.getAsFile()]),t.preventDefault()):"string"===o.kind&&this.context.invoke("editor.isLimited",n.getData("Text").length)&&t.preventDefault()}else if(window.clipboardData){var i=window.clipboardData.getData("text");this.context.invoke("editor.isLimited",i.length)&&t.preventDefault()}setTimeout((function(){e.context.invoke("editor.afterCommand")}),10)}}])&&Dt(e.prototype,n),o&&Dt(e,o),t}();function zt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Bt=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$eventListener=e()(document),this.$editor=n.layoutInfo.editor,this.$editable=n.layoutInfo.editable,this.options=n.options,this.lang=this.options.langInfo,this.documentEventHandlers={},this.$dropzone=e()(['<div class="note-dropzone">','<div class="note-dropzone-message"></div>',"</div>"].join("")).prependTo(this.$editor)}var n,o,i;return n=t,o=[{key:"initialize",value:function(){this.options.disableDragAndDrop?(this.documentEventHandlers.onDrop=function(t){t.preventDefault()},this.$eventListener=this.$dropzone,this.$eventListener.on("drop",this.documentEventHandlers.onDrop)):this.attachDragAndDropEvent()}},{key:"attachDragAndDropEvent",value:function(){var t=this,n=e()(),o=this.$dropzone.find(".note-dropzone-message");this.documentEventHandlers.onDragenter=function(e){var i=t.context.invoke("codeview.isActivated"),r=t.$editor.width()>0&&t.$editor.height()>0;i||n.length||!r||(t.$editor.addClass("dragover"),t.$dropzone.width(t.$editor.width()),t.$dropzone.height(t.$editor.height()),o.text(t.lang.image.dragImageHere)),n=n.add(e.target)},this.documentEventHandlers.onDragleave=function(o){(n=n.not(o.target)).length&&"BODY"!==o.target.nodeName||(n=e()(),t.$editor.removeClass("dragover"))},this.documentEventHandlers.onDrop=function(){n=e()(),t.$editor.removeClass("dragover")},this.$eventListener.on("dragenter",this.documentEventHandlers.onDragenter).on("dragleave",this.documentEventHandlers.onDragleave).on("drop",this.documentEventHandlers.onDrop),this.$dropzone.on("dragenter",(function(){t.$dropzone.addClass("hover"),o.text(t.lang.image.dropImage)})).on("dragleave",(function(){t.$dropzone.removeClass("hover"),o.text(t.lang.image.dragImageHere)})),this.$dropzone.on("drop",(function(n){var o=n.originalEvent.dataTransfer;n.preventDefault(),o&&o.files&&o.files.length?(t.$editable.focus(),t.context.invoke("editor.insertImagesOrCallback",o.files)):e().each(o.types,(function(n,i){if(!(i.toLowerCase().indexOf("_moz_")>-1)){var r=o.getData(i);i.toLowerCase().indexOf("text")>-1?t.context.invoke("editor.pasteHTML",r):e()(r).each((function(e,n){t.context.invoke("editor.insertNode",n)}))}}))})).on("dragover",!1)}},{key:"destroy",value:function(){var t=this;Object.keys(this.documentEventHandlers).forEach((function(e){t.$eventListener.off(e.substr(2).toLowerCase(),t.documentEventHandlers[e])})),this.documentEventHandlers={}}}],o&&zt(n.prototype,o),i&&zt(n,i),t}();function Mt(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return Ot(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ot(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,r=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw r}}}}function Ot(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n<e;n++)o[n]=t[n];return o}function Ut(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var jt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editor=e.layoutInfo.editor,this.$editable=e.layoutInfo.editable,this.$codable=e.layoutInfo.codable,this.options=e.options,this.CodeMirrorConstructor=window.CodeMirror,this.options.codemirror.CodeMirrorConstructor&&(this.CodeMirrorConstructor=this.options.codemirror.CodeMirrorConstructor)}var e,n,o;return e=t,n=[{key:"sync",value:function(t){var e=this.isActivated(),n=this.CodeMirrorConstructor;e&&(t?n?this.$codable.data("cmEditor").getDoc().setValue(t):this.$codable.val(t):n&&this.$codable.data("cmEditor").save())}},{key:"initialize",value:function(){var t=this;this.$codable.on("keyup",(function(e){e.keyCode===wt.code.ESCAPE&&t.deactivate()}))}},{key:"isActivated",value:function(){return this.$editor.hasClass("codeview")}},{key:"toggle",value:function(){this.isActivated()?this.deactivate():this.activate(),this.context.triggerEvent("codeview.toggled")}},{key:"purify",value:function(t){if(this.options.codeviewFilter&&(t=t.replace(this.options.codeviewFilterRegex,""),this.options.codeviewIframeFilter)){var e=this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);t=t.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi,(function(t){if(/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(t))return"";var n,o=Mt(e);try{for(o.s();!(n=o.n()).done;){var i=n.value;if(new RegExp('src="(https?:)?//'+i.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+'/(.+)"').test(t))return t}}catch(t){o.e(t)}finally{o.f()}return""}))}return t}},{key:"activate",value:function(){var t=this,e=this.CodeMirrorConstructor;if(this.$codable.val(ht.html(this.$editable,this.options.prettifyHtml)),this.$codable.height(this.$editable.height()),this.context.invoke("toolbar.updateCodeview",!0),this.context.invoke("airPopover.updateCodeview",!0),this.$editor.addClass("codeview"),this.$codable.focus(),e){var n=e.fromTextArea(this.$codable[0],this.options.codemirror);if(this.options.codemirror.tern){var o=new e.TernServer(this.options.codemirror.tern);n.ternServer=o,n.on("cursorActivity",(function(t){o.updateArgHints(t)}))}n.on("blur",(function(e){t.context.triggerEvent("blur.codeview",n.getValue(),e)})),n.on("change",(function(){t.context.triggerEvent("change.codeview",n.getValue(),n)})),n.setSize(null,this.$editable.outerHeight()),this.$codable.data("cmEditor",n)}else this.$codable.on("blur",(function(e){t.context.triggerEvent("blur.codeview",t.$codable.val(),e)})),this.$codable.on("input",(function(){t.context.triggerEvent("change.codeview",t.$codable.val(),t.$codable)}))}},{key:"deactivate",value:function(){if(this.CodeMirrorConstructor){var t=this.$codable.data("cmEditor");this.$codable.val(t.getValue()),t.toTextArea()}var e=this.purify(ht.value(this.$codable,this.options.prettifyHtml)||ht.emptyPara),n=this.$editable.html()!==e;this.$editable.html(e),this.$editable.height(this.options.height?this.$codable.height():"auto"),this.$editor.removeClass("codeview"),n&&this.context.triggerEvent("change",this.$editable.html(),this.$editable),this.$editable.focus(),this.context.invoke("toolbar.updateCodeview",!1),this.context.invoke("airPopover.updateCodeview",!1)}},{key:"destroy",value:function(){this.isActivated()&&this.deactivate()}}],n&&Ut(e.prototype,n),o&&Ut(e,o),t}();function Wt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Kt=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$document=e()(document),this.$statusbar=n.layoutInfo.statusbar,this.$editable=n.layoutInfo.editable,this.$codable=n.layoutInfo.codable,this.options=n.options}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this;this.options.airMode||this.options.disableResizeEditor?this.destroy():this.$statusbar.on("mousedown",(function(e){e.preventDefault(),e.stopPropagation();var n=t.$editable.offset().top-t.$document.scrollTop(),o=t.$codable.offset().top-t.$document.scrollTop(),i=function(e){var i=e.clientY-(n+24),r=e.clientY-(o+24);i=t.options.minheight>0?Math.max(i,t.options.minheight):i,i=t.options.maxHeight>0?Math.min(i,t.options.maxHeight):i,r=t.options.minheight>0?Math.max(r,t.options.minheight):r,r=t.options.maxHeight>0?Math.min(r,t.options.maxHeight):r,t.$editable.height(i),t.$codable.height(r)};t.$document.on("mousemove",i).one("mouseup",(function(){t.$document.off("mousemove",i)}))}))}},{key:"destroy",value:function(){this.$statusbar.off(),this.$statusbar.addClass("locked")}}])&&Wt(n.prototype,o),i&&Wt(n,i),t}();function Vt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var qt=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$editor=n.layoutInfo.editor,this.$toolbar=n.layoutInfo.toolbar,this.$editable=n.layoutInfo.editable,this.$codable=n.layoutInfo.codable,this.$window=e()(window),this.$scrollbar=e()("html, body"),this.scrollbarClassName="note-fullscreen-body",this.onResize=function(){o.resizeTo({h:o.$window.height()-o.$toolbar.outerHeight()})}}var n,o,i;return n=t,(o=[{key:"resizeTo",value:function(t){this.$editable.css("height",t.h),this.$codable.css("height",t.h),this.$codable.data("cmeditor")&&this.$codable.data("cmeditor").setsize(null,t.h)}},{key:"toggle",value:function(){this.$editor.toggleClass("fullscreen");var t=this.isFullscreen();this.$scrollbar.toggleClass(this.scrollbarClassName,t),t?(this.$editable.data("orgHeight",this.$editable.css("height")),this.$editable.data("orgMaxHeight",this.$editable.css("maxHeight")),this.$editable.css("maxHeight",""),this.$window.on("resize",this.onResize).trigger("resize")):(this.$window.off("resize",this.onResize),this.resizeTo({h:this.$editable.data("orgHeight")}),this.$editable.css("maxHeight",this.$editable.css("orgMaxHeight"))),this.context.invoke("toolbar.updateFullscreen",t)}},{key:"isFullscreen",value:function(){return this.$editor.hasClass("fullscreen")}},{key:"destroy",value:function(){this.$scrollbar.removeClass(this.scrollbarClassName)}}])&&Vt(n.prototype,o),i&&Vt(n,i),t}();function _t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Gt=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$document=e()(document),this.$editingArea=n.layoutInfo.editingArea,this.options=n.options,this.lang=this.options.langInfo,this.events={"summernote.mousedown":function(t,e){o.update(e.target,e)&&e.preventDefault()},"summernote.keyup summernote.scroll summernote.change summernote.dialog.shown":function(){o.update()},"summernote.disable summernote.blur":function(){o.hide()},"summernote.codeview.toggled":function(){o.update()}}}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this;this.$handle=e()(['<div class="note-handle">','<div class="note-control-selection">','<div class="note-control-selection-bg"></div>','<div class="note-control-holder note-control-nw"></div>','<div class="note-control-holder note-control-ne"></div>','<div class="note-control-holder note-control-sw"></div>','<div class="',this.options.disableResizeImage?"note-control-holder":"note-control-sizing",' note-control-se"></div>',this.options.disableResizeImage?"":'<div class="note-control-selection-info"></div>',"</div>","</div>"].join("")).prependTo(this.$editingArea),this.$handle.on("mousedown",(function(e){if(ht.isControlSizing(e.target)){e.preventDefault(),e.stopPropagation();var n=t.$handle.find(".note-control-selection").data("target"),o=n.offset(),i=t.$document.scrollTop(),r=function(e){t.context.invoke("editor.resizeTo",{x:e.clientX-o.left,y:e.clientY-(o.top-i)},n,!e.shiftKey),t.update(n[0],e)};t.$document.on("mousemove",r).one("mouseup",(function(e){e.preventDefault(),t.$document.off("mousemove",r),t.context.invoke("editor.afterCommand")})),n.data("ratio")||n.data("ratio",n.height()/n.width())}})),this.$handle.on("wheel",(function(e){e.preventDefault(),t.update()}))}},{key:"destroy",value:function(){this.$handle.remove()}},{key:"update",value:function(t,n){if(this.context.isDisabled())return!1;var o=ht.isImg(t),i=this.$handle.find(".note-control-selection");if(this.context.invoke("imagePopover.update",t,n),o){var r=e()(t),a=r.position(),s={left:a.left+parseInt(r.css("marginLeft"),10),top:a.top+parseInt(r.css("marginTop"),10)},l={w:r.outerWidth(!1),h:r.outerHeight(!1)};i.css({display:"block",left:s.left,top:s.top,width:l.w,height:l.h}).data("target",r);var c=new Image;c.src=r.attr("src");var u=l.w+"x"+l.h+" ("+this.lang.image.original+": "+c.width+"x"+c.height+")";i.find(".note-control-selection-info").text(u),this.context.invoke("editor.saveTarget",t)}else this.hide();return o}},{key:"hide",value:function(){this.context.invoke("editor.clearTarget"),this.$handle.children().hide()}}],o&&_t(n.prototype,o),i&&_t(n,i),t}();function Yt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Zt=/^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i,Qt=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||n.handleKeyup(e)},"summernote.keydown":function(t,e){n.handleKeydown(e)}}}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){this.lastWordRange=null}},{key:"destroy",value:function(){this.lastWordRange=null}},{key:"replace",value:function(){if(this.lastWordRange){var t=this.lastWordRange.toString(),n=t.match(Zt);if(n&&(n[1]||n[2])){var o=n[1]?t:"http://"+t,i=this.options.showDomainOnlyForAutolink?t.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i,"").split("/")[0]:t,r=e()("<a></a>").html(i).attr("href",o)[0];this.context.options.linkTargetBlank&&e()(r).attr("target","_blank"),this.lastWordRange.insertNode(r),this.lastWordRange=null,this.context.invoke("editor.focus")}}}},{key:"handleKeydown",value:function(t){if(k.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWordRange=e}}},{key:"handleKeyup",value:function(t){k.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)&&this.replace()}}])&&Yt(n.prototype,o),i&&Yt(n,i),t}();function Xt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Jt=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=e.layoutInfo.note,this.events={"summernote.change":function(){n.$note.val(e.invoke("code"))}}}var e,n,o;return e=t,(n=[{key:"shouldInitialize",value:function(){return ht.isTextarea(this.$note[0])}}])&&Xt(e.prototype,n),o&&Xt(e,o),t}();function te(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ee=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options.replace||{},this.keys=[wt.code.ENTER,wt.code.SPACE,wt.code.PERIOD,wt.code.COMMA,wt.code.SEMICOLON,wt.code.SLASH],this.previousKeydownCode=null,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||n.handleKeyup(e)},"summernote.keydown":function(t,e){n.handleKeydown(e)}}}var e,n,o;return e=t,(n=[{key:"shouldInitialize",value:function(){return!!this.options.match}},{key:"initialize",value:function(){this.lastWord=null}},{key:"destroy",value:function(){this.lastWord=null}},{key:"replace",value:function(){if(this.lastWord){var t=this,e=this.lastWord.toString();this.options.match(e,(function(e){if(e){var n="";if("string"==typeof e?n=ht.createText(e):e instanceof jQuery?n=e[0]:e instanceof Node&&(n=e),!n)return;t.lastWord.insertNode(n),t.lastWord=null,t.context.invoke("editor.focus")}}))}}},{key:"handleKeydown",value:function(t){if(this.previousKeydownCode&&k.contains(this.keys,this.previousKeydownCode))this.previousKeydownCode=t.keyCode;else{if(k.contains(this.keys,t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWord=e}this.previousKeydownCode=t.keyCode}}},{key:"handleKeyup",value:function(t){k.contains(this.keys,t.keyCode)&&this.replace()}}])&&te(e.prototype,n),o&&te(e,o),t}();function ne(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var oe=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editingArea=e.layoutInfo.editingArea,this.options=e.options,!0===this.options.inheritPlaceholder&&(this.options.placeholder=this.context.$note.attr("placeholder")||this.options.placeholder),this.events={"summernote.init summernote.change":function(){n.update()},"summernote.codeview.toggled":function(){n.update()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!!this.options.placeholder}},{key:"initialize",value:function(){var t=this;this.$placeholder=e()('<div class="note-placeholder"></div>'),this.$placeholder.on("click",(function(){t.context.invoke("focus")})).html(this.options.placeholder).prependTo(this.$editingArea),this.update()}},{key:"destroy",value:function(){this.$placeholder.remove()}},{key:"update",value:function(){var t=!this.context.invoke("codeview.isActivated")&&this.context.invoke("editor.isEmpty");this.$placeholder.toggle(t)}}])&&ne(n.prototype,o),i&&ne(n,i),t}();function ie(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var re=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.ui=e().summernote.ui,this.context=n,this.$toolbar=n.layoutInfo.toolbar,this.options=n.options,this.lang=this.options.langInfo,this.invertedKeyMap=m.invertObject(this.options.keyMap[f.isMac?"mac":"pc"])}var n,o,i;return n=t,o=[{key:"representShortcut",value:function(t){var e=this.invertedKeyMap[t];return this.options.shortcuts&&e?(f.isMac&&(e=e.replace("CMD","⌘").replace("SHIFT","⇧"))," ("+(e=e.replace("BACKSLASH","\\").replace("SLASH","/").replace("LEFTBRACKET","[").replace("RIGHTBRACKET","]"))+")"):""}},{key:"button",value:function(t){return!this.options.tooltip&&t.tooltip&&delete t.tooltip,t.container=this.options.container,this.ui.button(t)}},{key:"initialize",value:function(){this.addToolbarButtons(),this.addImagePopoverButtons(),this.addLinkPopoverButtons(),this.addTablePopoverButtons(),this.fontInstalledMap={}}},{key:"destroy",value:function(){delete this.fontInstalledMap}},{key:"isFontInstalled",value:function(t){return Object.prototype.hasOwnProperty.call(this.fontInstalledMap,t)||(this.fontInstalledMap[t]=f.isFontInstalled(t)||k.contains(this.options.fontNamesIgnoreCheck,t)),this.fontInstalledMap[t]}},{key:"isFontDeservedToAdd",value:function(t){return""!==(t=t.toLowerCase())&&this.isFontInstalled(t)&&-1===f.genericFontFamilies.indexOf(t)}},{key:"colorPalette",value:function(t,n,o,i){var r=this;return this.ui.buttonGroup({className:"note-color "+t,children:[this.button({className:"note-current-color-button",contents:this.ui.icon(this.options.icons.font+" note-recent-color"),tooltip:n,click:function(t){var n=e()(t.currentTarget);o&&i?r.context.invoke("editor.color",{backColor:n.attr("data-backColor"),foreColor:n.attr("data-foreColor")}):o?r.context.invoke("editor.color",{backColor:n.attr("data-backColor")}):i&&r.context.invoke("editor.color",{foreColor:n.attr("data-foreColor")})},callback:function(t){var e=t.find(".note-recent-color");o&&(e.css("background-color",r.options.colorButton.backColor),t.attr("data-backColor",r.options.colorButton.backColor)),i?(e.css("color",r.options.colorButton.foreColor),t.attr("data-foreColor",r.options.colorButton.foreColor)):e.css("color","transparent")}}),this.button({className:"dropdown-toggle",contents:this.ui.dropdownButtonContents("",this.options),tooltip:this.lang.color.more,data:{toggle:"dropdown"}}),this.ui.dropdown({items:(o?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.background+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">',this.lang.color.transparent,"</button>","</div>",'<div class="note-holder" data-event="backColor">\x3c!-- back colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="backColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.backColor+'" data-event="backColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="backColorPalette-'+this.options.id+'" data-event="backColor"></div>',"</div>"].join(""):"")+(i?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.foreground+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">',this.lang.color.resetToDefault,"</button>","</div>",'<div class="note-holder" data-event="foreColor">\x3c!-- fore colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="foreColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.foreColor+'" data-event="foreColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="foreColorPalette-'+this.options.id+'" data-event="foreColor"></div>',"</div>"].join(""):""),callback:function(t){t.find(".note-holder").each((function(t,n){var o=e()(n);o.append(r.ui.palette({colors:r.options.colors,colorsName:r.options.colorsName,eventName:o.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())}));var n=[["#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF"]];t.find(".note-holder-custom").each((function(t,o){var i=e()(o);i.append(r.ui.palette({colors:n,colorsName:n,eventName:i.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())})),t.find("input[type=color]").each((function(n,o){e()(o).change((function(){var n=t.find("#"+e()(this).data("event")).find(".note-color-btn").first(),o=this.value.toUpperCase();n.css("background-color",o).attr("aria-label",o).attr("data-value",o).attr("data-original-title",o),n.click()}))}))},click:function(n){n.stopPropagation();var o=e()("."+t).find(".note-dropdown-menu"),i=e()(n.target),a=i.data("event"),s=i.attr("data-value");if("openPalette"===a){var l=o.find("#"+s),c=e()(o.find("#"+l.data("event")).find(".note-color-row")[0]),u=c.find(".note-color-btn").last().detach(),d=l.val();u.css("background-color",d).attr("aria-label",d).attr("data-value",d).attr("data-original-title",d),c.prepend(u),l.click()}else{if(k.contains(["backColor","foreColor"],a)){var h="backColor"===a?"background-color":"color",f=i.closest(".note-color").find(".note-recent-color"),p=i.closest(".note-color").find(".note-current-color-button");f.css(h,s),p.attr("data-"+a,s)}r.context.invoke("editor."+a,s)}}})]}).render()}},{key:"addToolbarButtons",value:function(){var t=this;this.context.memo("button.style",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.magic),t.options),tooltip:t.lang.style.style,data:{toggle:"dropdown"}}),t.ui.dropdown({className:"dropdown-style",items:t.options.styleTags,title:t.lang.style.style,template:function(e){"string"==typeof e&&(e={tag:e,title:Object.prototype.hasOwnProperty.call(t.lang.style,e)?t.lang.style[e]:e});var n=e.tag,o=e.title;return"<"+n+(e.style?' style="'+e.style+'" ':"")+(e.className?' class="'+e.className+'"':"")+">"+o+"</"+n+">"},click:t.context.createInvokeHandler("editor.formatBlock")})]).render()}));for(var n=function(e,n){var o=t.options.styleTags[e];t.context.memo("button.style."+o,(function(){return t.button({className:"note-btn-style-"+o,contents:'<div data-value="'+o+'">'+o.toUpperCase()+"</div>",tooltip:t.lang.style[o],click:t.context.createInvokeHandler("editor.formatBlock")}).render()}))},o=0,i=this.options.styleTags.length;o<i;o++)n(o);this.context.memo("button.bold",(function(){return t.button({className:"note-btn-bold",contents:t.ui.icon(t.options.icons.bold),tooltip:t.lang.font.bold+t.representShortcut("bold"),click:t.context.createInvokeHandlerAndUpdateState("editor.bold")}).render()})),this.context.memo("button.italic",(function(){return t.button({className:"note-btn-italic",contents:t.ui.icon(t.options.icons.italic),tooltip:t.lang.font.italic+t.representShortcut("italic"),click:t.context.createInvokeHandlerAndUpdateState("editor.italic")}).render()})),this.context.memo("button.underline",(function(){return t.button({className:"note-btn-underline",contents:t.ui.icon(t.options.icons.underline),tooltip:t.lang.font.underline+t.representShortcut("underline"),click:t.context.createInvokeHandlerAndUpdateState("editor.underline")}).render()})),this.context.memo("button.clear",(function(){return t.button({contents:t.ui.icon(t.options.icons.eraser),tooltip:t.lang.font.clear+t.representShortcut("removeFormat"),click:t.context.createInvokeHandler("editor.removeFormat")}).render()})),this.context.memo("button.strikethrough",(function(){return t.button({className:"note-btn-strikethrough",contents:t.ui.icon(t.options.icons.strikethrough),tooltip:t.lang.font.strikethrough+t.representShortcut("strikethrough"),click:t.context.createInvokeHandlerAndUpdateState("editor.strikethrough")}).render()})),this.context.memo("button.superscript",(function(){return t.button({className:"note-btn-superscript",contents:t.ui.icon(t.options.icons.superscript),tooltip:t.lang.font.superscript,click:t.context.createInvokeHandlerAndUpdateState("editor.superscript")}).render()})),this.context.memo("button.subscript",(function(){return t.button({className:"note-btn-subscript",contents:t.ui.icon(t.options.icons.subscript),tooltip:t.lang.font.subscript,click:t.context.createInvokeHandlerAndUpdateState("editor.subscript")}).render()})),this.context.memo("button.fontname",(function(){var n=t.context.invoke("editor.currentStyle");return t.options.addDefaultFonts&&e().each(n["font-family"].split(","),(function(e,n){n=n.trim().replace(/['"]+/g,""),t.isFontDeservedToAdd(n)&&-1===t.options.fontNames.indexOf(n)&&t.options.fontNames.push(n)})),t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontname"></span>',t.options),tooltip:t.lang.font.name,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontname",checkClassName:t.options.icons.menuCheck,items:t.options.fontNames.filter(t.isFontInstalled.bind(t)),title:t.lang.font.name,template:function(t){return'<span style="font-family: '+f.validFontName(t)+'">'+t+"</span>"},click:t.context.createInvokeHandlerAndUpdateState("editor.fontName")})]).render()})),this.context.memo("button.fontsize",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>',t.options),tooltip:t.lang.font.size,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsize",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizes,title:t.lang.font.size,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSize")})]).render()})),this.context.memo("button.fontsizeunit",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>',t.options),tooltip:t.lang.font.sizeunit,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsizeunit",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizeUnits,title:t.lang.font.sizeunit,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSizeUnit")})]).render()})),this.context.memo("button.color",(function(){return t.colorPalette("note-color-all",t.lang.color.recent,!0,!0)})),this.context.memo("button.forecolor",(function(){return t.colorPalette("note-color-fore",t.lang.color.foreground,!1,!0)})),this.context.memo("button.backcolor",(function(){return t.colorPalette("note-color-back",t.lang.color.background,!0,!1)})),this.context.memo("button.ul",(function(){return t.button({contents:t.ui.icon(t.options.icons.unorderedlist),tooltip:t.lang.lists.unordered+t.representShortcut("insertUnorderedList"),click:t.context.createInvokeHandler("editor.insertUnorderedList")}).render()})),this.context.memo("button.ol",(function(){return t.button({contents:t.ui.icon(t.options.icons.orderedlist),tooltip:t.lang.lists.ordered+t.representShortcut("insertOrderedList"),click:t.context.createInvokeHandler("editor.insertOrderedList")}).render()}));var r=this.button({contents:this.ui.icon(this.options.icons.alignLeft),tooltip:this.lang.paragraph.left+this.representShortcut("justifyLeft"),click:this.context.createInvokeHandler("editor.justifyLeft")}),a=this.button({contents:this.ui.icon(this.options.icons.alignCenter),tooltip:this.lang.paragraph.center+this.representShortcut("justifyCenter"),click:this.context.createInvokeHandler("editor.justifyCenter")}),s=this.button({contents:this.ui.icon(this.options.icons.alignRight),tooltip:this.lang.paragraph.right+this.representShortcut("justifyRight"),click:this.context.createInvokeHandler("editor.justifyRight")}),l=this.button({contents:this.ui.icon(this.options.icons.alignJustify),tooltip:this.lang.paragraph.justify+this.representShortcut("justifyFull"),click:this.context.createInvokeHandler("editor.justifyFull")}),c=this.button({contents:this.ui.icon(this.options.icons.outdent),tooltip:this.lang.paragraph.outdent+this.representShortcut("outdent"),click:this.context.createInvokeHandler("editor.outdent")}),u=this.button({contents:this.ui.icon(this.options.icons.indent),tooltip:this.lang.paragraph.indent+this.representShortcut("indent"),click:this.context.createInvokeHandler("editor.indent")});this.context.memo("button.justifyLeft",m.invoke(r,"render")),this.context.memo("button.justifyCenter",m.invoke(a,"render")),this.context.memo("button.justifyRight",m.invoke(s,"render")),this.context.memo("button.justifyFull",m.invoke(l,"render")),this.context.memo("button.outdent",m.invoke(c,"render")),this.context.memo("button.indent",m.invoke(u,"render")),this.context.memo("button.paragraph",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.alignLeft),t.options),tooltip:t.lang.paragraph.paragraph,data:{toggle:"dropdown"}}),t.ui.dropdown([t.ui.buttonGroup({className:"note-align",children:[r,a,s,l]}),t.ui.buttonGroup({className:"note-list",children:[c,u]})])]).render()})),this.context.memo("button.height",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.textHeight),t.options),tooltip:t.lang.font.height,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({items:t.options.lineHeights,checkClassName:t.options.icons.menuCheck,className:"dropdown-line-height",title:t.lang.font.height,click:t.context.createInvokeHandler("editor.lineHeight")})]).render()})),this.context.memo("button.table",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.table),t.options),tooltip:t.lang.table.table,data:{toggle:"dropdown"}}),t.ui.dropdown({title:t.lang.table.table,className:"note-table",items:['<div class="note-dimension-picker">','<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>','<div class="note-dimension-picker-highlighted"></div>','<div class="note-dimension-picker-unhighlighted"></div>',"</div>",'<div class="note-dimension-display">1 x 1</div>'].join("")})],{callback:function(e){e.find(".note-dimension-picker-mousecatcher").css({width:t.options.insertTableMaxSize.col+"em",height:t.options.insertTableMaxSize.row+"em"}).mouseup(t.context.createInvokeHandler("editor.insertTable")).on("mousemove",t.tableMoveHandler.bind(t))}}).render()})),this.context.memo("button.link",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.link+t.representShortcut("linkDialog.show"),click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.picture",(function(){return t.button({contents:t.ui.icon(t.options.icons.picture),tooltip:t.lang.image.image,click:t.context.createInvokeHandler("imageDialog.show")}).render()})),this.context.memo("button.video",(function(){return t.button({contents:t.ui.icon(t.options.icons.video),tooltip:t.lang.video.video,click:t.context.createInvokeHandler("videoDialog.show")}).render()})),this.context.memo("button.hr",(function(){return t.button({contents:t.ui.icon(t.options.icons.minus),tooltip:t.lang.hr.insert+t.representShortcut("insertHorizontalRule"),click:t.context.createInvokeHandler("editor.insertHorizontalRule")}).render()})),this.context.memo("button.fullscreen",(function(){return t.button({className:"btn-fullscreen note-codeview-keep",contents:t.ui.icon(t.options.icons.arrowsAlt),tooltip:t.lang.options.fullscreen,click:t.context.createInvokeHandler("fullscreen.toggle")}).render()})),this.context.memo("button.codeview",(function(){return t.button({className:"btn-codeview note-codeview-keep",contents:t.ui.icon(t.options.icons.code),tooltip:t.lang.options.codeview,click:t.context.createInvokeHandler("codeview.toggle")}).render()})),this.context.memo("button.redo",(function(){return t.button({contents:t.ui.icon(t.options.icons.redo),tooltip:t.lang.history.redo+t.representShortcut("redo"),click:t.context.createInvokeHandler("editor.redo")}).render()})),this.context.memo("button.undo",(function(){return t.button({contents:t.ui.icon(t.options.icons.undo),tooltip:t.lang.history.undo+t.representShortcut("undo"),click:t.context.createInvokeHandler("editor.undo")}).render()})),this.context.memo("button.help",(function(){return t.button({contents:t.ui.icon(t.options.icons.question),tooltip:t.lang.options.help,click:t.context.createInvokeHandler("helpDialog.show")}).render()}))}},{key:"addImagePopoverButtons",value:function(){var t=this;this.context.memo("button.resizeFull",(function(){return t.button({contents:'<span class="note-fontsize-10">100%</span>',tooltip:t.lang.image.resizeFull,click:t.context.createInvokeHandler("editor.resize","1")}).render()})),this.context.memo("button.resizeHalf",(function(){return t.button({contents:'<span class="note-fontsize-10">50%</span>',tooltip:t.lang.image.resizeHalf,click:t.context.createInvokeHandler("editor.resize","0.5")}).render()})),this.context.memo("button.resizeQuarter",(function(){return t.button({contents:'<span class="note-fontsize-10">25%</span>',tooltip:t.lang.image.resizeQuarter,click:t.context.createInvokeHandler("editor.resize","0.25")}).render()})),this.context.memo("button.resizeNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.resizeNone,click:t.context.createInvokeHandler("editor.resize","0")}).render()})),this.context.memo("button.floatLeft",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatLeft),tooltip:t.lang.image.floatLeft,click:t.context.createInvokeHandler("editor.floatMe","left")}).render()})),this.context.memo("button.floatRight",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatRight),tooltip:t.lang.image.floatRight,click:t.context.createInvokeHandler("editor.floatMe","right")}).render()})),this.context.memo("button.floatNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.floatNone,click:t.context.createInvokeHandler("editor.floatMe","none")}).render()})),this.context.memo("button.removeMedia",(function(){return t.button({contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.image.remove,click:t.context.createInvokeHandler("editor.removeMedia")}).render()}))}},{key:"addLinkPopoverButtons",value:function(){var t=this;this.context.memo("button.linkDialogShow",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.edit,click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.unlink",(function(){return t.button({contents:t.ui.icon(t.options.icons.unlink),tooltip:t.lang.link.unlink,click:t.context.createInvokeHandler("editor.unlink")}).render()}))}},{key:"addTablePopoverButtons",value:function(){var t=this;this.context.memo("button.addRowUp",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowAbove),tooltip:t.lang.table.addRowAbove,click:t.context.createInvokeHandler("editor.addRow","top")}).render()})),this.context.memo("button.addRowDown",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowBelow),tooltip:t.lang.table.addRowBelow,click:t.context.createInvokeHandler("editor.addRow","bottom")}).render()})),this.context.memo("button.addColLeft",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colBefore),tooltip:t.lang.table.addColLeft,click:t.context.createInvokeHandler("editor.addCol","left")}).render()})),this.context.memo("button.addColRight",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colAfter),tooltip:t.lang.table.addColRight,click:t.context.createInvokeHandler("editor.addCol","right")}).render()})),this.context.memo("button.deleteRow",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowRemove),tooltip:t.lang.table.delRow,click:t.context.createInvokeHandler("editor.deleteRow")}).render()})),this.context.memo("button.deleteCol",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colRemove),tooltip:t.lang.table.delCol,click:t.context.createInvokeHandler("editor.deleteCol")}).render()})),this.context.memo("button.deleteTable",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.table.delTable,click:t.context.createInvokeHandler("editor.deleteTable")}).render()}))}},{key:"build",value:function(t,e){for(var n=0,o=e.length;n<o;n++){for(var i=e[n],r=Array.isArray(i)?i[0]:i,a=Array.isArray(i)?1===i.length?[i[0]]:i[1]:[i],s=this.ui.buttonGroup({className:"note-"+r}).render(),l=0,c=a.length;l<c;l++){var u=this.context.memo("button."+a[l]);u&&s.append("function"==typeof u?u(this.context):u)}s.appendTo(t)}}},{key:"updateCurrentStyle",value:function(t){var n=t||this.$toolbar,o=this.context.invoke("editor.currentStyle");if(this.updateBtnStates(n,{".note-btn-bold":function(){return"bold"===o["font-bold"]},".note-btn-italic":function(){return"italic"===o["font-italic"]},".note-btn-underline":function(){return"underline"===o["font-underline"]},".note-btn-subscript":function(){return"subscript"===o["font-subscript"]},".note-btn-superscript":function(){return"superscript"===o["font-superscript"]},".note-btn-strikethrough":function(){return"strikethrough"===o["font-strikethrough"]}}),o["font-family"]){var i=o["font-family"].split(",").map((function(t){return t.replace(/[\'\"]/g,"").replace(/\s+$/,"").replace(/^\s+/,"")})),r=k.find(i,this.isFontInstalled.bind(this));n.find(".dropdown-fontname a").each((function(t,n){var o=e()(n),i=o.data("value")+""==r+"";o.toggleClass("checked",i)})),n.find(".note-current-fontname").text(r).css("font-family",r)}if(o["font-size"]){var a=o["font-size"];n.find(".dropdown-fontsize a").each((function(t,n){var o=e()(n),i=o.data("value")+""==a+"";o.toggleClass("checked",i)})),n.find(".note-current-fontsize").text(a);var s=o["font-size-unit"];n.find(".dropdown-fontsizeunit a").each((function(t,n){var o=e()(n),i=o.data("value")+""==s+"";o.toggleClass("checked",i)})),n.find(".note-current-fontsizeunit").text(s)}if(o["line-height"]){var l=o["line-height"];n.find(".dropdown-line-height a").each((function(t,n){var o=e()(n),i=e()(n).data("value")+""==l+"";o.toggleClass("checked",i)})),n.find(".note-current-line-height").text(l)}}},{key:"updateBtnStates",value:function(t,n){var o=this;e().each(n,(function(e,n){o.ui.toggleBtnActive(t.find(e),n())}))}},{key:"tableMoveHandler",value:function(t){var n,o=e()(t.target.parentNode),i=o.next(),r=o.find(".note-dimension-picker-mousecatcher"),a=o.find(".note-dimension-picker-highlighted"),s=o.find(".note-dimension-picker-unhighlighted");if(void 0===t.offsetX){var l=e()(t.target).offset();n={x:t.pageX-l.left,y:t.pageY-l.top}}else n={x:t.offsetX,y:t.offsetY};var c=Math.ceil(n.x/18)||1,u=Math.ceil(n.y/18)||1;a.css({width:c+"em",height:u+"em"}),r.data("value",c+"x"+u),c>3&&c<this.options.insertTableMaxSize.col&&s.css({width:c+1+"em"}),u>3&&u<this.options.insertTableMaxSize.row&&s.css({height:u+1+"em"}),i.html(c+" x "+u)}}],o&&ie(n.prototype,o),i&&ie(n,i),t}();function ae(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var se=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$window=e()(window),this.$document=e()(document),this.ui=e().summernote.ui,this.$note=n.layoutInfo.note,this.$editor=n.layoutInfo.editor,this.$toolbar=n.layoutInfo.toolbar,this.$editable=n.layoutInfo.editable,this.$statusbar=n.layoutInfo.statusbar,this.options=n.options,this.isFollowing=!1,this.followScroll=this.followScroll.bind(this)}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!this.options.airMode}},{key:"initialize",value:function(){var t=this;this.options.toolbar=this.options.toolbar||[],this.options.toolbar.length?this.context.invoke("buttons.build",this.$toolbar,this.options.toolbar):this.$toolbar.hide(),this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.changeContainer(!1),this.$note.on("summernote.keyup summernote.mouseup summernote.change",(function(){t.context.invoke("buttons.updateCurrentStyle")})),this.context.invoke("buttons.updateCurrentStyle"),this.options.followingToolbar&&this.$window.on("scroll resize",this.followScroll)}},{key:"destroy",value:function(){this.$toolbar.children().remove(),this.options.followingToolbar&&this.$window.off("scroll resize",this.followScroll)}},{key:"followScroll",value:function(){if(this.$editor.hasClass("fullscreen"))return!1;var t=this.$editor.outerHeight(),n=this.$editor.width(),o=this.$toolbar.height(),i=this.$statusbar.height(),r=0;this.options.otherStaticBar&&(r=e()(this.options.otherStaticBar).outerHeight());var a=this.$document.scrollTop(),s=this.$editor.offset().top,l=s-r,c=s+t-r-o-i;!this.isFollowing&&a>l&&a<c-o?(this.isFollowing=!0,this.$editable.css({marginTop:this.$toolbar.outerHeight()}),this.$toolbar.css({position:"fixed",top:r,width:n,zIndex:1e3})):this.isFollowing&&(a<l||a>c)&&(this.isFollowing=!1,this.$toolbar.css({position:"relative",top:0,width:"100%",zIndex:"auto"}),this.$editable.css({marginTop:""}))}},{key:"changeContainer",value:function(t){t?this.$toolbar.prependTo(this.$editor):this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.options.followingToolbar&&this.followScroll()}},{key:"updateFullscreen",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-fullscreen"),t),this.changeContainer(t)}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-codeview"),t),t?this.deactivate():this.activate()}},{key:"activate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!0)}},{key:"deactivate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!1)}}])&&ae(n.prototype,o),i&&ae(n,i),t}();function le(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ce=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo,n.memo("help.linkDialog.show",this.options.langInfo.help["linkDialog.show"])}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,n=['<div class="form-group note-form-group">','<label for="note-dialog-link-txt-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.textToDisplay,"</label>"),'<input id="note-dialog-link-txt-'.concat(this.options.id,'" class="note-link-text form-control note-form-control note-input" type="text"/>'),"</div>",'<div class="form-group note-form-group">','<label for="note-dialog-link-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.url,"</label>"),'<input id="note-dialog-link-url-'.concat(this.options.id,'" class="note-link-url form-control note-form-control note-input" type="text" value="http://"/>'),"</div>",this.options.disableLinkTarget?"":e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-open-in-new-window",text:this.lang.link.openInNewWindow,checked:!0}).render()).html(),e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-use-protocol",text:this.lang.link.useProtocol,checked:!0}).render()).html()].join(""),o='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-link-btn",'" value="').concat(this.lang.link.insert,'" disabled>');this.$dialog=this.ui.dialog({className:"link-dialog",title:this.lang.link.insert,fade:this.options.dialogsFade,body:n,footer:o}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"toggleLinkBtn",value:function(t,e,n){this.ui.toggleBtn(t,e.val()&&n.val())}},{key:"showLinkDialog",value:function(t){var n=this;return e().Deferred((function(e){var o=n.$dialog.find(".note-link-text"),i=n.$dialog.find(".note-link-url"),r=n.$dialog.find(".note-link-btn"),a=n.$dialog.find(".sn-checkbox-open-in-new-window input[type=checkbox]"),s=n.$dialog.find(".sn-checkbox-use-protocol input[type=checkbox]");n.ui.onDialogShown(n.$dialog,(function(){n.context.triggerEvent("dialog.shown"),!t.url&&m.isValidUrl(t.text)&&(t.url=t.text),o.on("input paste propertychange",(function(){t.text=o.val(),n.toggleLinkBtn(r,o,i)})).val(t.text),i.on("input paste propertychange",(function(){t.text||o.val(i.val()),n.toggleLinkBtn(r,o,i)})).val(t.url),f.isSupportTouch||i.trigger("focus"),n.toggleLinkBtn(r,o,i),n.bindEnterKey(i,r),n.bindEnterKey(o,r);var l=void 0!==t.isNewWindow?t.isNewWindow:n.context.options.linkTargetBlank;a.prop("checked",l);var c=!t.url&&n.context.options.useProtocol;s.prop("checked",c),r.one("click",(function(r){r.preventDefault(),e.resolve({range:t.range,url:i.val(),text:o.val(),isNewWindow:a.is(":checked"),checkProtocol:s.is(":checked")}),n.ui.hideDialog(n.$dialog)}))})),n.ui.onDialogHidden(n.$dialog,(function(){o.off(),i.off(),r.off(),"pending"===e.state()&&e.reject()})),n.ui.showDialog(n.$dialog)})).promise()}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getLinkInfo");this.context.invoke("editor.saveRange"),this.showLinkDialog(e).then((function(e){t.context.invoke("editor.restoreRange"),t.context.invoke("editor.createLink",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}}])&&le(n.prototype,o),i&&le(n,i),t}();function ue(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var de=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.events={"summernote.keyup summernote.mouseup summernote.change summernote.scroll":function(){o.update()},"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.link)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-link-popover",callback:function(t){t.find(".popover-content,.note-popover-content").prepend('<span><a target="_blank"></a>&nbsp;</span>')}}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.link),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(){if(this.context.invoke("editor.hasFocus")){var t=this.context.invoke("editor.getLastRange");if(t.isCollapsed()&&t.isOnAnchor()){var n=ht.ancestor(t.sc,ht.isAnchor),o=e()(n).attr("href");this.$popover.find("a").attr("href",o).text(o);var i=ht.posFromPlaceholder(n),r=e()(this.options.container).offset();i.top-=r.top,i.left-=r.left,this.$popover.css({display:"block",left:i.left,top:i.top})}else this.hide()}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}])&&ue(n.prototype,o),i&&ue(n,i),t}();function he(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var fe=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t="";if(this.options.maximumImageFileSize){var e=Math.floor(Math.log(this.options.maximumImageFileSize)/Math.log(1024)),n=1*(this.options.maximumImageFileSize/Math.pow(1024,e)).toFixed(2)+" "+" KMGTP"[e]+"B";t="<small>".concat(this.lang.image.maximumFileSize+" : "+n,"</small>")}var o=this.options.dialogsInBody?this.$body:this.options.container,i=['<div class="form-group note-form-group note-group-select-from-files">','<label for="note-dialog-image-file-'+this.options.id+'" class="note-form-label">'+this.lang.image.selectFromFiles+"</label>",'<input id="note-dialog-image-file-'+this.options.id+'" class="note-image-input form-control-file note-form-control note-input" ',' type="file" name="files" accept="'+this.options.acceptImageFileTypes+'" multiple="multiple"/>',t,"</div>",'<div class="form-group note-group-image-url">','<label for="note-dialog-image-url-'+this.options.id+'" class="note-form-label">'+this.lang.image.url+"</label>",'<input id="note-dialog-image-url-'+this.options.id+'" class="note-image-url form-control note-form-control note-input" type="text"/>',"</div>"].join(""),r='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-image-btn",'" value="').concat(this.lang.image.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.image.insert,fade:this.options.dialogsFade,body:i,footer:r}).render().appendTo(o)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showImageDialog().then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange"),"string"==typeof e?t.options.callbacks.onImageLinkInsert?t.context.triggerEvent("image.link.insert",e):t.context.invoke("editor.insertImage",e):t.context.invoke("editor.insertImagesOrCallback",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showImageDialog",value:function(){var t=this;return e().Deferred((function(e){var n=t.$dialog.find(".note-image-input"),o=t.$dialog.find(".note-image-url"),i=t.$dialog.find(".note-image-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),n.replaceWith(n.clone().on("change",(function(t){e.resolve(t.target.files||t.target.value)})).val("")),o.on("input paste propertychange",(function(){t.ui.toggleBtn(i,o.val())})).val(""),f.isSupportTouch||o.trigger("focus"),i.click((function(t){t.preventDefault(),e.resolve(o.val())})),t.bindEnterKey(o,i)})),t.ui.onDialogHidden(t.$dialog,(function(){n.off(),o.off(),i.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&he(n.prototype,o),i&&he(n,i),t}();function pe(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var me=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.editable=n.layoutInfo.editable[0],this.options=n.options,this.events={"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.image)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-image-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.image),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t,n){if(ht.isImg(t)){var o=e()(t).offset(),i=e()(this.options.container).offset(),r={};this.options.popatmouse?(r.left=n.pageX-20,r.top=n.pageY):r=o,r.top-=i.top,r.left-=i.left,this.$popover.css({display:"block",left:r.left,top:r.top})}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}],o&&pe(n.prototype,o),i&&pe(n,i),t}();function ve(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ge=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.events={"summernote.mousedown":function(t,e){o.update(e.target)},"summernote.keyup summernote.scroll summernote.change":function(){o.update()},"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.table)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-table-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.table),f.isFF&&document.execCommand("enableInlineTableEditing",!1,!1),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){if(this.context.isDisabled())return!1;var n=ht.isCell(t)||ht.isCell(null==t?void 0:t.parentElement);if(n){var o=ht.posFromPlaceholder(t),i=e()(this.options.container).offset();o.top-=i.top,o.left-=i.left,this.$popover.css({display:"block",left:o.left,top:o.top})}else this.hide();return n}},{key:"hide",value:function(){this.$popover.hide()}}],o&&ve(n.prototype,o),i&&ve(n,i),t}();function be(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ye=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<div class="form-group note-form-group row-fluid">','<label for="note-dialog-video-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.video.url,' <small class="text-muted">').concat(this.lang.video.providers,"</small></label>"),'<input id="note-dialog-video-url-'.concat(this.options.id,'" class="note-video-url form-control note-form-control note-input" type="text"/>'),"</div>"].join(""),n='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-video-btn",'" value="').concat(this.lang.video.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.video.insert,fade:this.options.dialogsFade,body:e,footer:n}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"createVideoNode",value:function(t){var n,o=t.match(/\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/),i=t.match(/(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/),r=t.match(/(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/),a=t.match(/\/\/vine\.co\/v\/([a-zA-Z0-9]+)/),s=t.match(/\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/),l=t.match(/.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/),c=t.match(/\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/),u=t.match(/\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/),d=t.match(/\/\/v\.qq\.com.*?vid=(.+)/),h=t.match(/\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/),f=t.match(/^.+.(mp4|m4v)$/),p=t.match(/^.+.(ogg|ogv)$/),m=t.match(/^.+.(webm)$/),v=t.match(/(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/);if(o&&11===o[1].length){var g=o[1],b=0;if(void 0!==o[2]){var y=o[2].match(/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/);if(y)for(var k=[3600,60,1],w=0,C=k.length;w<C;w++)b+=void 0!==y[w+1]?k[w]*parseInt(y[w+1],10):0}n=e()("<iframe>").attr("frameborder",0).attr("src","//www.youtube.com/embed/"+g+(b>0?"?start="+b:"")).attr("width","640").attr("height","360")}else if(i&&i[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src","https://drive.google.com/file/d/"+i[1]+"/preview").attr("width","640").attr("height","480");else if(r&&r[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src","https://instagram.com/p/"+r[1]+"/embed/").attr("width","612").attr("height","710").attr("scrolling","no").attr("allowtransparency","true");else if(a&&a[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src",a[0]+"/embed/simple").attr("width","600").attr("height","600").attr("class","vine-embed");else if(s&&s[3].length)n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("src","//player.vimeo.com/video/"+s[3]).attr("width","640").attr("height","360");else if(l&&l[2].length)n=e()("<iframe>").attr("frameborder",0).attr("src","//www.dailymotion.com/embed/video/"+l[2]).attr("width","640").attr("height","360");else if(c&&c[1].length)n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","498").attr("width","510").attr("src","//player.youku.com/embed/"+c[1]);else if(u&&u[0].length){var x=0;"undefined"!==u[2]&&(x=u[2]);var S=0;"undefined"!==u[3]&&(S=u[3]);var T=0;"undefined"!==u[4]&&(T=u[4]);var E=0;"undefined"!==u[5]&&(E=u[5]);var I=0;"undefined"!==u[6]&&(I=u[6]),n=e()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr("frameborder",0).attr("src","//"+u[1]+"/videos/embed/"+u[2]+"?loop="+T+"&autoplay="+E+"&muted="+I+(x>0?"&start="+x:"")+(S>0?"&end="+b:"")).attr("width","560").attr("height","315")}else if(d&&d[1].length||h&&h[2].length){var $=d&&d[1].length?d[1]:h[2];n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","310").attr("width","500").attr("src","https://v.qq.com/txp/iframe/player.html?vid="+$+"&amp;auto=0")}else if(f||p||m)n=e()("<video controls>").attr("src",t).attr("width","640").attr("height","360");else{if(!v||!v[0].length)return!1;n=e()("<iframe>").attr("frameborder",0).attr("src","https://www.facebook.com/plugins/video.php?href="+encodeURIComponent(v[0])+"&show_text=0&width=560").attr("width","560").attr("height","301").attr("scrolling","no").attr("allowtransparency","true")}return n.addClass("note-video-clip"),n[0]}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getSelectedText");this.context.invoke("editor.saveRange"),this.showVideoDialog(e).then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange");var n=t.createVideoNode(e);n&&t.context.invoke("editor.insertNode",n)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showVideoDialog",value:function(){var t=this;return e().Deferred((function(e){var n=t.$dialog.find(".note-video-url"),o=t.$dialog.find(".note-video-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),n.on("input paste propertychange",(function(){t.ui.toggleBtn(o,n.val())})),f.isSupportTouch||n.trigger("focus"),o.click((function(t){t.preventDefault(),e.resolve(n.val())})),t.bindEnterKey(n,o)})),t.ui.onDialogHidden(t.$dialog,(function(){n.off(),o.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&be(n.prototype,o),i&&be(n,i),t}();function ke(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var we=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<p class="text-center">','<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ','<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ','<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>',"</p>"].join("");this.$dialog=this.ui.dialog({title:this.lang.options.help,fade:this.options.dialogsFade,body:this.createShortcutList(),footer:e,callback:function(t){t.find(".modal-body,.note-modal-body").css({"max-height":300,overflow:"scroll"})}}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"createShortcutList",value:function(){var t=this,n=this.options.keyMap[f.isMac?"mac":"pc"];return Object.keys(n).map((function(o){var i=n[o],r=e()('<div><div class="help-list-item"></div></div>');return r.append(e()("<label><kbd>"+o+"</kdb></label>").css({width:180,"margin-right":10})).append(e()("<span></span>").html(t.context.memo("help."+i)||i)),r.html()})).join("")}},{key:"showHelpDialog",value:function(){var t=this;return e().Deferred((function(e){t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),e.resolve()})),t.ui.showDialog(t.$dialog)})).promise()}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showHelpDialog().then((function(){t.context.invoke("editor.restoreRange")}))}}],o&&ke(n.prototype,o),i&&ke(n,i),t}();function Ce(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var xe=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.hidable=!0,this.onContextmenu=!1,this.pageX=null,this.pageY=null,this.events={"summernote.contextmenu":function(t){o.options.editing&&(t.preventDefault(),t.stopPropagation(),o.onContextmenu=!0,o.update(!0))},"summernote.mousedown":function(t,e){o.pageX=e.pageX,o.pageY=e.pageY},"summernote.keyup summernote.mouseup summernote.scroll":function(t,e){o.options.editing&&!o.onContextmenu&&(o.pageX=e.pageX,o.pageY=e.pageY,o.update()),o.onContextmenu=!1},"summernote.disable summernote.change summernote.dialog.shown summernote.blur":function(){o.hide()},"summernote.focusout":function(){o.$popover.is(":active,:focus")||o.hide()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return this.options.airMode&&!k.isEmpty(this.options.popover.air)}},{key:"initialize",value:function(){var t=this;this.$popover=this.ui.popover({className:"note-air-popover"}).render().appendTo(this.options.container);var e=this.$popover.find(".popover-content");this.context.invoke("buttons.build",e,this.options.popover.air),this.$popover.on("mousedown",(function(){t.hidable=!1})),this.$popover.on("mouseup",(function(){t.hidable=!0}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){var n=this.context.invoke("editor.currentStyle");if(!n.range||n.range.isCollapsed()&&!t)this.hide();else{var o={left:this.pageX,top:this.pageY},i=e()(this.options.container).offset();o.top-=i.top,o.left-=i.left,this.$popover.css({display:"block",left:Math.max(o.left,0)+-5,top:o.top+5}),this.context.invoke("buttons.updateCurrentStyle",this.$popover)}}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$popover.find(".btn-codeview"),t),t&&this.hide()}},{key:"hide",value:function(){this.hidable&&this.$popover.hide()}}])&&Ce(n.prototype,o),i&&Ce(n,i),t}();function Se(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Te=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$editable=n.layoutInfo.editable,this.options=n.options,this.hint=this.options.hint||[],this.direction=this.options.hintDirection||"bottom",this.hints=Array.isArray(this.hint)?this.hint:[this.hint],this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||o.handleKeyup(e)},"summernote.keydown":function(t,e){o.handleKeydown(e)},"summernote.disable summernote.dialog.shown summernote.blur":function(){o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return this.hints.length>0}},{key:"initialize",value:function(){var t=this;this.lastWordRange=null,this.matchingWord=null,this.$popover=this.ui.popover({className:"note-hint-popover",hideArrow:!0,direction:""}).render().appendTo(this.options.container),this.$popover.hide(),this.$content=this.$popover.find(".popover-content,.note-popover-content"),this.$content.on("click",".note-hint-item",(function(n){t.$content.find(".active").removeClass("active"),e()(n.currentTarget).addClass("active"),t.replace()})),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"selectItem",value:function(t){this.$content.find(".active").removeClass("active"),t.addClass("active"),this.$content[0].scrollTop=t[0].offsetTop-this.$content.innerHeight()/2}},{key:"moveDown",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.next();if(e.length)this.selectItem(e);else{var n=t.parent().next();n.length||(n=this.$content.find(".note-hint-group").first()),this.selectItem(n.find(".note-hint-item").first())}}},{key:"moveUp",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.prev();if(e.length)this.selectItem(e);else{var n=t.parent().prev();n.length||(n=this.$content.find(".note-hint-group").last()),this.selectItem(n.find(".note-hint-item").last())}}},{key:"replace",value:function(){var t=this.$content.find(".note-hint-item.active");if(t.length){var n=this.nodeFromItem(t);if(null!==this.matchingWord&&0===this.matchingWord.length)this.lastWordRange.so=this.lastWordRange.eo;else if(null!==this.matchingWord&&this.matchingWord.length>0&&!this.lastWordRange.isCollapsed()){var o=this.lastWordRange.eo-this.lastWordRange.so-this.matchingWord.length;o>0&&(this.lastWordRange.so+=o)}if(this.lastWordRange.insertNode(n),"next"===this.options.hintSelect){var i=document.createTextNode("");e()(n).after(i),yt.createFromNodeBefore(i).select()}else yt.createFromNodeAfter(n).select();this.lastWordRange=null,this.hide(),this.context.invoke("editor.focus"),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}}},{key:"nodeFromItem",value:function(t){var e=this.hints[t.data("index")],n=t.data("item"),o=e.content?e.content(n):n;return"string"==typeof o&&(o=ht.createText(o)),o}},{key:"createItemTemplates",value:function(t,n){var o=this.hints[t];return n.map((function(n){var i=e()('<div class="note-hint-item"></div>');return i.append(o.template?o.template(n):n+""),i.data({index:t,item:n}),i}))}},{key:"handleKeydown",value:function(t){this.$popover.is(":visible")&&(t.keyCode===wt.code.ENTER?(t.preventDefault(),this.replace()):t.keyCode===wt.code.UP?(t.preventDefault(),this.moveUp()):t.keyCode===wt.code.DOWN&&(t.preventDefault(),this.moveDown()))}},{key:"searchKeyword",value:function(t,e,n){var o=this.hints[t];if(o&&o.match.test(e)&&o.search){var i=o.match.exec(e);this.matchingWord=i[0],o.search(i[1],n)}else n()}},{key:"createGroup",value:function(t,n){var o=this,i=e()('<div class="note-hint-group note-hint-group-'+t+'"></div>');return this.searchKeyword(t,n,(function(e){(e=e||[]).length&&(i.html(o.createItemTemplates(t,e)),o.show())})),i}},{key:"handleKeyup",value:function(t){var n=this;if(!k.contains([wt.code.ENTER,wt.code.UP,wt.code.DOWN],t.keyCode)){var o,i,r=this.context.invoke("editor.getLastRange");if("words"===this.options.hintMode){if(o=r.getWordsRange(r),i=o.toString(),this.hints.forEach((function(t){if(t.match.test(i))return o=r.getWordsMatchRange(t.match),!1})),!o)return void this.hide();i=o.toString()}else o=r.getWordRange(),i=o.toString();if(this.hints.length&&i){this.$content.empty();var a=m.rect2bnd(k.last(o.getClientRects())),s=e()(this.options.container).offset();a&&(a.top-=s.top,a.left-=s.left,this.$popover.hide(),this.lastWordRange=o,this.hints.forEach((function(t,e){t.match.test(i)&&n.createGroup(e,i).appendTo(n.$content)})),this.$content.find(".note-hint-item:first").addClass("active"),"top"===this.direction?this.$popover.css({left:a.left,top:a.top-this.$popover.outerHeight()-5}):this.$popover.css({left:a.left,top:a.top+a.height+5}))}else this.hide()}}},{key:"show",value:function(){this.$popover.show()}},{key:"hide",value:function(){this.$popover.hide()}}],o&&Se(n.prototype,o),i&&Se(n,i),t}();function Ee(t){return Ee="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ee(t)}function Ie(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}e().summernote=e().extend(e().summernote,{version:"0.8.20",plugins:{},dom:ht,range:yt,lists:k,options:{langInfo:e().summernote.lang["en-US"],editing:!0,modules:{editor:Ft,clipboard:Ht,dropzone:Bt,codeview:jt,statusbar:Kt,fullscreen:qt,handle:Gt,hintPopover:Te,autoLink:Qt,autoSync:Jt,autoReplace:ee,placeholder:oe,buttons:re,toolbar:se,linkDialog:ce,linkPopover:de,imageDialog:fe,imagePopover:me,tablePopover:ge,videoDialog:ye,helpDialog:we,airPopover:xe},buttons:{},lang:"en-US",followingToolbar:!1,toolbarPosition:"top",otherStaticBar:"",codeviewKeepButton:!1,toolbar:[["style",["style"]],["font",["bold","underline","clear"]],["fontname",["fontname"]],["color",["color"]],["para",["ul","ol","paragraph"]],["table",["table"]],["insert",["link","picture","video"]],["view",["fullscreen","codeview","help"]]],popatmouse:!0,popover:{image:[["resize",["resizeFull","resizeHalf","resizeQuarter","resizeNone"]],["float",["floatLeft","floatRight","floatNone"]],["remove",["removeMedia"]]],link:[["link",["linkDialogShow","unlink"]]],table:[["add",["addRowDown","addRowUp","addColLeft","addColRight"]],["delete",["deleteRow","deleteCol","deleteTable"]]],air:[["color",["color"]],["font",["bold","underline","clear"]],["para",["ul","paragraph"]],["table",["table"]],["insert",["link","picture"]],["view",["fullscreen","codeview"]]]},airMode:!1,overrideContextMenu:!1,width:null,height:null,linkTargetBlank:!0,useProtocol:!0,defaultProtocol:"http://",focus:!1,tabDisabled:!1,tabSize:4,styleWithCSS:!1,shortcuts:!0,textareaAutoSync:!0,tooltip:"auto",container:null,maxTextLength:0,blockquoteBreakingLevel:2,spellCheck:!0,disableGrammar:!1,placeholder:null,inheritPlaceholder:!1,recordEveryKeystroke:!1,historyLimit:200,showDomainOnlyForAutolink:!1,hintMode:"word",hintSelect:"after",hintDirection:"bottom",styleTags:["p","blockquote","pre","h1","h2","h3","h4","h5","h6"],fontNames:["Arial","Arial Black","Comic Sans MS","Courier New","Helvetica Neue","Helvetica","Impact","Lucida Grande","Tahoma","Times New Roman","Verdana"],fontNamesIgnoreCheck:[],addDefaultFonts:!0,fontSizes:["8","9","10","11","12","14","18","24","36"],fontSizeUnits:["px","pt"],colors:[["#000000","#424242","#636363","#9C9C94","#CEC6CE","#EFEFEF","#F7F7F7","#FFFFFF"],["#FF0000","#FF9C00","#FFFF00","#00FF00","#00FFFF","#0000FF","#9C00FF","#FF00FF"],["#F7C6CE","#FFE7CE","#FFEFC6","#D6EFD6","#CEDEE7","#CEE7F7","#D6D6E7","#E7D6DE"],["#E79C9C","#FFC69C","#FFE79C","#B5D6A5","#A5C6CE","#9CC6EF","#B5A5D6","#D6A5BD"],["#E76363","#F7AD6B","#FFD663","#94BD7B","#73A5AD","#6BADDE","#8C7BC6","#C67BA5"],["#CE0000","#E79439","#EFC631","#6BA54A","#4A7B8C","#3984C6","#634AA5","#A54A7B"],["#9C0000","#B56308","#BD9400","#397B21","#104A5A","#085294","#311873","#731842"],["#630000","#7B3900","#846300","#295218","#083139","#003163","#21104A","#4A1031"]],colorsName:[["Black","Tundora","Dove Gray","Star Dust","Pale Slate","Gallery","Alabaster","White"],["Red","Orange Peel","Yellow","Green","Cyan","Blue","Electric Violet","Magenta"],["Azalea","Karry","Egg White","Zanah","Botticelli","Tropical Blue","Mischka","Twilight"],["Tonys Pink","Peach Orange","Cream Brulee","Sprout","Casper","Perano","Cold Purple","Careys Pink"],["Mandy","Rajah","Dandelion","Olivine","Gulf Stream","Viking","Blue Marguerite","Puce"],["Guardsman Red","Fire Bush","Golden Dream","Chelsea Cucumber","Smalt Blue","Boston Blue","Butterfly Bush","Cadillac"],["Sangria","Mai Tai","Buddha Gold","Forest Green","Eden","Venice Blue","Meteorite","Claret"],["Rosewood","Cinnamon","Olive","Parsley","Tiber","Midnight Blue","Valentino","Loulou"]],colorButton:{foreColor:"#000000",backColor:"#FFFF00"},lineHeights:["1.0","1.2","1.4","1.5","1.6","1.8","2.0","3.0"],tableClassName:"table table-bordered",insertTableMaxSize:{col:10,row:10},dialogsInBody:!1,dialogsFade:!1,maximumImageFileSize:null,acceptImageFileTypes:"image/*",callbacks:{onBeforeCommand:null,onBlur:null,onBlurCodeview:null,onChange:null,onChangeCodeview:null,onDialogShown:null,onEnter:null,onFocus:null,onImageLinkInsert:null,onImageUpload:null,onImageUploadError:null,onInit:null,onKeydown:null,onKeyup:null,onMousedown:null,onMouseup:null,onPaste:null,onScroll:null},codemirror:{mode:"text/html",htmlMode:!0,lineNumbers:!0},codeviewFilter:!0,codeviewFilterRegex:/<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,codeviewIframeFilter:!0,codeviewIframeWhitelistSrc:[],codeviewIframeWhitelistSrcBase:["www.youtube.com","www.youtube-nocookie.com","www.facebook.com","vine.co","instagram.com","player.vimeo.com","www.dailymotion.com","player.youku.com","jumpingbean.tv","v.qq.com"],keyMap:{pc:{ESC:"escape",ENTER:"insertParagraph","CTRL+Z":"undo","CTRL+Y":"redo",TAB:"tab","SHIFT+TAB":"untab","CTRL+B":"bold","CTRL+I":"italic","CTRL+U":"underline","CTRL+SHIFT+S":"strikethrough","CTRL+BACKSLASH":"removeFormat","CTRL+SHIFT+L":"justifyLeft","CTRL+SHIFT+E":"justifyCenter","CTRL+SHIFT+R":"justifyRight","CTRL+SHIFT+J":"justifyFull","CTRL+SHIFT+NUM7":"insertUnorderedList","CTRL+SHIFT+NUM8":"insertOrderedList","CTRL+LEFTBRACKET":"outdent","CTRL+RIGHTBRACKET":"indent","CTRL+NUM0":"formatPara","CTRL+NUM1":"formatH1","CTRL+NUM2":"formatH2","CTRL+NUM3":"formatH3","CTRL+NUM4":"formatH4","CTRL+NUM5":"formatH5","CTRL+NUM6":"formatH6","CTRL+ENTER":"insertHorizontalRule","CTRL+K":"linkDialog.show"},mac:{ESC:"escape",ENTER:"insertParagraph","CMD+Z":"undo","CMD+SHIFT+Z":"redo",TAB:"tab","SHIFT+TAB":"untab","CMD+B":"bold","CMD+I":"italic","CMD+U":"underline","CMD+SHIFT+S":"strikethrough","CMD+BACKSLASH":"removeFormat","CMD+SHIFT+L":"justifyLeft","CMD+SHIFT+E":"justifyCenter","CMD+SHIFT+R":"justifyRight","CMD+SHIFT+J":"justifyFull","CMD+SHIFT+NUM7":"insertUnorderedList","CMD+SHIFT+NUM8":"insertOrderedList","CMD+LEFTBRACKET":"outdent","CMD+RIGHTBRACKET":"indent","CMD+NUM0":"formatPara","CMD+NUM1":"formatH1","CMD+NUM2":"formatH2","CMD+NUM3":"formatH3","CMD+NUM4":"formatH4","CMD+NUM5":"formatH5","CMD+NUM6":"formatH6","CMD+ENTER":"insertHorizontalRule","CMD+K":"linkDialog.show"}},icons:{align:"note-icon-align",alignCenter:"note-icon-align-center",alignJustify:"note-icon-align-justify",alignLeft:"note-icon-align-left",alignRight:"note-icon-align-right",rowBelow:"note-icon-row-below",colBefore:"note-icon-col-before",colAfter:"note-icon-col-after",rowAbove:"note-icon-row-above",rowRemove:"note-icon-row-remove",colRemove:"note-icon-col-remove",indent:"note-icon-align-indent",outdent:"note-icon-align-outdent",arrowsAlt:"note-icon-arrows-alt",bold:"note-icon-bold",caret:"note-icon-caret",circle:"note-icon-circle",close:"note-icon-close",code:"note-icon-code",eraser:"note-icon-eraser",floatLeft:"note-icon-float-left",floatRight:"note-icon-float-right",font:"note-icon-font",frame:"note-icon-frame",italic:"note-icon-italic",link:"note-icon-link",unlink:"note-icon-chain-broken",magic:"note-icon-magic",menuCheck:"note-icon-menu-check",minus:"note-icon-minus",orderedlist:"note-icon-orderedlist",pencil:"note-icon-pencil",picture:"note-icon-picture",question:"note-icon-question",redo:"note-icon-redo",rollback:"note-icon-rollback",square:"note-icon-square",strikethrough:"note-icon-strikethrough",subscript:"note-icon-subscript",superscript:"note-icon-superscript",table:"note-icon-table",textHeight:"note-icon-text-height",trash:"note-icon-trash",underline:"note-icon-underline",undo:"note-icon-undo",unorderedlist:"note-icon-unorderedlist",video:"note-icon-video"}}});var $e=function(){function t(e,n,o,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.markup=e,this.children=n,this.options=o,this.callback=i}var n,o,i;return n=t,(o=[{key:"render",value:function(t){var n=e()(this.markup);if(this.options&&this.options.contents&&n.html(this.options.contents),this.options&&this.options.className&&n.addClass(this.options.className),this.options&&this.options.data&&e().each(this.options.data,(function(t,e){n.attr("data-"+t,e)})),this.options&&this.options.click&&n.on("click",this.options.click),this.children){var o=n.find(".note-children-container");this.children.forEach((function(t){t.render(o.length?o:n)}))}return this.callback&&this.callback(n,this.options),this.options&&this.options.callback&&this.options.callback(n),t&&t.append(n),n}}])&&Ie(n.prototype,o),i&&Ie(n,i),t}();const Ne=function(t,e){return function(){var n="object"===Ee(arguments[1])?arguments[1]:arguments[0],o=Array.isArray(arguments[0])?arguments[0]:[];return n&&n.children&&(o=n.children),new $e(t,o,n,e)}};function Pe(t){return Pe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Pe(t)}var Re=Ne('<div class="note-editor note-frame card"></div>'),Le=Ne('<div class="note-toolbar card-header" role="toolbar"></div>'),Ae=Ne('<div class="note-editing-area"></div>'),Fe=Ne('<textarea class="note-codable" aria-multiline="true"></textarea>'),De=Ne('<div class="note-editable card-block" contentEditable="true" role="textbox" aria-multiline="true"></div>'),He=Ne(['<output class="note-status-output" role="status" aria-live="polite"></output>','<div class="note-statusbar" role="status">','<div class="note-resizebar" aria-label="Resize">','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>',"</div>","</div>"].join("")),ze=Ne('<div class="note-editor note-airframe"></div>'),Be=Ne(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>','<output class="note-status-output" role="status" aria-live="polite"></output>'].join("")),Me=Ne('<div class="note-btn-group btn-group"></div>'),Oe=Ne('<div class="note-dropdown-menu dropdown-menu" role="list"></div>',(function(t,e){var n=Array.isArray(e.items)?e.items.map((function(t){var n="string"==typeof t?t:t.value||"",o=e.template?e.template(t):t,i="object"===Pe(t)?t.option:void 0;return'<a class="dropdown-item" href="#" '+('data-value="'+n+'"'+(void 0!==i?' data-option="'+i+'"':""))+' role="listitem" aria-label="'+n+'">'+o+"</a>"})).join(""):e.items;t.html(n).attr({"aria-label":e.title}),e&&e.codeviewKeepButton&&t.addClass("note-codeview-keep")})),Ue=function(t){return t},je=Ne('<div class="note-dropdown-menu dropdown-menu note-check" role="list"></div>',(function(t,e){var n=Array.isArray(e.items)?e.items.map((function(t){var n="string"==typeof t?t:t.value||"",o=e.template?e.template(t):t;return'<a class="dropdown-item" href="#" data-value="'+n+'" role="listitem" aria-label="'+t+'">'+qe(e.checkClassName)+" "+o+"</a>"})).join(""):e.items;t.html(n).attr({"aria-label":e.title}),e&&e.codeviewKeepButton&&t.addClass("note-codeview-keep")})),We=Ne('<div class="modal note-modal" aria-hidden="false" tabindex="-1" role="dialog"></div>',(function(t,e){e.fade&&t.addClass("fade"),t.attr({"aria-label":e.title}),t.html(['<div class="modal-dialog">','<div class="modal-content">',e.title?'<div class="modal-header"><h4 class="modal-title">'+e.title+'</h4><button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">&times;</button></div>':"",'<div class="modal-body">'+e.body+"</div>",e.footer?'<div class="modal-footer">'+e.footer+"</div>":"","</div>","</div>"].join(""))})),Ke=Ne(['<div class="note-popover popover in">','<div class="arrow"></div>','<div class="popover-content note-children-container"></div>',"</div>"].join(""),(function(t,e){var n=void 0!==e.direction?e.direction:"bottom";t.addClass(n),e.hideArrow&&t.find(".arrow").hide()})),Ve=Ne('<div class="form-check"></div>',(function(t,e){t.html(['<label class="form-check-label"'+(e.id?' for="note-'+e.id+'"':"")+">",'<input type="checkbox" class="form-check-input"'+(e.id?' id="note-'+e.id+'"':""),e.checked?" checked":"",' aria-label="'+(e.text?e.text:"")+'"',' aria-checked="'+(e.checked?"true":"false")+'"/>'," "+(e.text?e.text:"")+"</label>"].join(""))})),qe=function(t,e){return t.match(/^</)?t:"<"+(e=e||"i")+' class="'+t+'"></'+e+">"};e().summernote=e().extend(e().summernote,{ui_template:function(t){return{editor:Re,toolbar:Le,editingArea:Ae,codable:Fe,editable:De,statusbar:He,airEditor:ze,airEditable:Be,buttonGroup:Me,dropdown:Oe,dropdownButtonContents:Ue,dropdownCheck:je,dialog:We,popover:Ke,icon:qe,checkbox:Ve,options:t,palette:function(e,n){return Ne('<div class="note-color-palette"></div>',(function(e,n){for(var o=[],i=0,r=n.colors.length;i<r;i++){for(var a=n.eventName,s=n.colors[i],l=n.colorsName[i],c=[],u=0,d=s.length;u<d;u++){var h=s[u],f=l[u];c.push(['<button type="button" class="note-color-btn"','style="background-color:',h,'" ','data-event="',a,'" ','data-value="',h,'" ','title="',f,'" ','aria-label="',f,'" ','data-toggle="button" tabindex="-1"></button>'].join(""))}o.push('<div class="note-color-row">'+c.join("")+"</div>")}e.html(o.join("")),n.tooltip&&e.find(".note-color-btn").tooltip({container:n.container||t.container,trigger:"hover",placement:"bottom"})}))(e,n)},button:function(n,o){return Ne('<button type="button" class="note-btn btn btn-light btn-sm" tabindex="-1"></button>',(function(n,o){o&&o.tooltip&&n.attr({title:o.tooltip,"aria-label":o.tooltip}).tooltip({container:o.container||t.container,trigger:"hover",placement:"bottom"}).on("click",(function(t){e()(t.currentTarget).tooltip("hide")})),o&&o.codeviewButton&&n.addClass("note-codeview-keep")}))(n,o)},toggleBtn:function(t,e){t.toggleClass("disabled",!e),t.attr("disabled",!e)},toggleBtnActive:function(t,e){t.toggleClass("active",e)},onDialogShown:function(t,e){t.one("shown.bs.modal",e)},onDialogHidden:function(t,e){t.one("hidden.bs.modal",e)},showDialog:function(t){t.modal("show")},hideDialog:function(t){t.modal("hide")},createLayout:function(e){var n=(t.airMode?ze([Ae([Fe(),Be()])]):"bottom"===t.toolbarPosition?Re([Ae([Fe(),De()]),Le(),He()]):Re([Le(),Ae([Fe(),De()]),He()])).render();return n.insertAfter(e),{note:e,editor:n,toolbar:n.find(".note-toolbar"),editingArea:n.find(".note-editing-area"),editable:n.find(".note-editable"),codable:n.find(".note-codable"),statusbar:n.find(".note-statusbar")}},removeLayout:function(t,e){t.html(e.editable.html()),e.editor.remove(),t.show()}}},interface:"bs4"}),e().summernote.options.styleTags=["p",{title:"Blockquote",tag:"blockquote",className:"blockquote",value:"blockquote"},"pre","h1","h2","h3","h4","h5","h6"]})(),i})()}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.map
new file mode 100644
index 0000000..36a8040
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs4.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///external {\"root\":\"jQuery\",\"commonjs2\":\"jquery\",\"commonjs\":\"jquery\",\"amd\":\"jquery\"}","webpack:///./src/js/base/renderer.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///./src/js/base/summernote-en-US.js","webpack:///./src/js/base/core/env.js","webpack:///./src/js/base/core/func.js","webpack:///./src/js/base/core/lists.js","webpack:///./src/js/base/core/dom.js","webpack:///./src/js/base/Context.js","webpack:///./src/js/base/core/range.js","webpack:///./src/js/summernote.js","webpack:///./src/js/base/core/key.js","webpack:///./src/js/base/editing/History.js","webpack:///./src/js/base/editing/Style.js","webpack:///./src/js/base/editing/Bullet.js","webpack:///./src/js/base/editing/Typing.js","webpack:///./src/js/base/editing/Table.js","webpack:///./src/js/base/module/Editor.js","webpack:///./src/js/base/core/async.js","webpack:///./src/js/base/module/Clipboard.js","webpack:///./src/js/base/module/Dropzone.js","webpack:///./src/js/base/module/Codeview.js","webpack:///./src/js/base/module/Statusbar.js","webpack:///./src/js/base/module/Fullscreen.js","webpack:///./src/js/base/module/Handle.js","webpack:///./src/js/base/module/AutoLink.js","webpack:///./src/js/base/module/AutoSync.js","webpack:///./src/js/base/module/AutoReplace.js","webpack:///./src/js/base/module/Placeholder.js","webpack:///./src/js/base/module/Buttons.js","webpack:///./src/js/base/module/Toolbar.js","webpack:///./src/js/base/module/LinkDialog.js","webpack:///./src/js/base/module/LinkPopover.js","webpack:///./src/js/base/module/ImageDialog.js","webpack:///./src/js/base/module/ImagePopover.js","webpack:///./src/js/base/module/TablePopover.js","webpack:///./src/js/base/module/VideoDialog.js","webpack:///./src/js/base/module/HelpDialog.js","webpack:///./src/js/base/module/AirPopover.js","webpack:///./src/js/base/module/HintPopover.js","webpack:///./src/js/base/settings.js","webpack:///./src/js/bs4/ui.js","webpack:///./src/js/bs4/settings.js"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__0__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Renderer","markup","children","options","callback","this","$parent","$node","$","contents","html","className","addClass","data","each","k","v","attr","click","on","$container","find","forEach","child","render","length","append","arguments","Array","isArray","__webpack_amd_options__","summernote","lang","extend","font","bold","italic","underline","clear","height","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","isSupportAmd","genericFontFamilies","validFontName","fontName","inArray","toLowerCase","browserVersion","userAgent","navigator","isMSIE","test","matches","exec","parseFloat","isEdge","isSupportTouch","MaxTouchPoints","msMaxTouchPoints","inputEventName","isMac","appVersion","indexOf","isFF","isPhantom","isWebkit","isChrome","isSafari","jqueryVersion","fn","jquery","isFontInstalled","testFontName","context","document","createElement","getContext","testSize","originalWidth","measureText","width","isW3CRangeSupport","createRange","idCounter","eq","itemA","itemB","eq2","peq2","propName","ok","fail","self","not","f","apply","and","fA","fB","item","invoke","obj","method","resetUniqueId","uniqueId","prefix","id","rect2bnd","rect","$document","top","scrollTop","scrollLeft","bottom","invertObject","inverted","namespaceToCamel","namespace","split","map","substring","toUpperCase","join","debounce","func","wait","immediate","timeout","args","later","callNow","clearTimeout","setTimeout","isValidUrl","head","array","last","tail","slice","contains","initial","prev","idx","next","pred","len","all","sum","reduce","memo","from","collection","result","isEmpty","clusterBy","aLast","compact","aResult","push","unique","results","NBSP_CHAR","String","fromCharCode","isEditable","node","hasClass","makePredByNodeName","nodeName","isText","nodeType","isVoid","isPara","isPre","isLi","isTable","isData","isInline","isBodyContainer","isList","isHr","isBlockquote","isCell","isAnchor","isBody","blankHTML","env","nodeLength","nodeValue","childNodes","innerHTML","paddingBlankHTML","ancestor","parentNode","listAncestor","ancestors","el","listNext","nodes","nextSibling","insertAfter","preceding","parent","insertBefore","appendChild","appendChildNodes","aChild","isLeftEdgePoint","point","offset","isRightEdgePoint","isEdgePoint","isLeftEdgeOf","position","isRightEdgeOf","previousSibling","hasChildren","prevPoint","isSkipInnerOffset","nextPoint","nextTextNode","getNextTextNode","nextPointWithEmptyNode","actual","isSamePoint","pointA","pointB","splitNode","isSkipPaddingBlankHTML","isNotSplitEdgePoint","isDiscardEmptySplits","splitText","childNode","clone","cloneNode","splitTree","isRemoveChild","removeNode","removeChild","isTextarea","stripLinebreaks","val","replace","ZERO_WIDTH_NBSP_CHAR","blank","emptyPara","isControlSizing","isElement","isPurePara","isHeading","isBlock","isBodyInline","isParaInline","isDiv","isBR","isSpan","isB","isU","isS","isI","isImg","deepestChildIsEmpty","firstElementChild","isEmptyAnchor","isClosestSibling","nodeA","nodeB","withClosestSiblings","siblings","isLeftEdgePointOf","isRightEdgePointOf","isVisiblePoint","leftNode","rightNode","prevPointUntil","nextPointUntil","isCharPoint","ch","charAt","isSpacePoint","walkPoint","startPoint","endPoint","handler","singleChildAncestor","lastAncestor","filter","listPrev","listDescendant","descendants","fnWalk","current","commonAncestor","wrap","wrapperName","wrapper","makeOffsetPath","reverse","fromOffsetPath","offsets","splitPoint","splitRoot","container","topAncestor","pivot","createText","text","createTextNode","removeWhile","newNode","cssText","isNewlineOnBlock","match","endSlash","isEndOfInlineContainer","isBlockNode","trim","posFromPlaceholder","placeholder","$placeholder","pos","outerHeight","attachEvents","events","keys","detachEvents","off","isCustomStyleTag","classList","Context","$note","memos","layoutInfo","ui","ui_template","initialize","createLayout","_initialize","hide","_destroy","removeData","removeLayout","disabled","isDisabled","code","dom","disable","now","editor","buttons","plugins","initializeModule","removeModule","removeMemo","triggerEvent","isActivated","undefined","codable","editable","editing","callbacks","trigger","shouldInitialize","ModuleClass","withoutIntialize","destroy","event","createInvokeHandler","preventDefault","$target","target","closest","splits","hasSeparator","moduleName","methodName","textRangeToPoint","textRange","isStart","prevContainer","parentElement","tester","body","createTextRange","moveToElementText","compareEndPoints","textRangeStart","curTextNode","collapse","firstChild","pointTester","duplicate","setEndPoint","textCount","cont","pointToTextRange","info","textRangeInfo","isCollapseToStart","prevTextNodes","collapseToStart","moveStart","type","isExternalAPICalled","hasInitOptions","langInfo","icons","tooltip","note","first","focus","WrappedRange","sc","so","ec","eo","isOnEditable","makeIsOn","isOnList","isOnAnchor","isOnCell","isOnData","w3cRange","setStart","setEnd","nativeRng","nativeRange","selection","getSelection","rangeCount","removeAllRanges","addRange","offsetTop","Math","abs","getVisiblePoint","isLeftToRight","block","hasRightNode","hasLeftNode","getEndPoint","isCollapsed","getStartPoint","includeAncestor","fullyContains","leftEdgeNodes","startAncestor","endAncestor","boundaryPoints","getPoints","isSameContainer","rng","emptyParents","normalize","inlineSiblings","concat","para","wrapBodyInlineWithPara","deleteContents","contentsContainer","reversed","insertNode","toString","findAfter","isNotTextPoint","regex","index","path","e","paras","getClientRects","wrappedRange","createFromSelection","bodyElement","lastChild","createFromBodyElement","createFromNode","anchorNode","getRangeAt","startContainer","startOffset","endContainer","endOffset","textRangeEnd","isTextNode","createFromNodeBefore","createFromNodeAfter","createFromBookmark","bookmark","createFromParaBookmark","KEY_MAP","isEdit","keyCode","BACKSPACE","TAB","ENTER","SPACE","DELETE","isMove","LEFT","UP","RIGHT","DOWN","isNavigation","HOME","END","PAGEUP","PAGEDOWN","nameFromCode","History","stack","stackOffset","$editable","range","snapshot","recordUndo","applySnapshot","makeSnapshot","historyLimit","shift","Style","$obj","propertyNames","propertyName","css","styleInfo","jQueryCSS","fontSize","parseInt","expandClosestSibling","onlyPartialContains","nodesInRange","tails","elem","$cont","fromNode","queryCommandState","queryCommandValue","isUnordered","lineHeight","toFixed","anchor","Bullet","toggleList","clustereds","previousList","findList","wrapList","appendToPrevious","releaseList","listName","paraBookmark","wrappedParas","diffLists","listNode","prevList","nextList","isEscapseToBody","releasedParas","headList","parentItem","newList","findNextSiblings","lastList","middleList","rootLists","rootList","listNodes","Typing","bullet","tabsize","tab","nextPara","blockquoteBreakingLevel","emptyAnchors","scrollIntoView","TableResultAction","where","domTable","_startPoint","_virtualTable","_actionCellList","setVirtualTablePosition","rowIndex","cellIndex","baseRow","baseCell","isRowSpan","isColSpan","isVirtualCell","objPosition","getActionCell","virtualTableCellObj","resultAction","virtualRowPosition","virtualColPosition","recoverCellIndex","newCellIndex","addCellInfoToVirtual","row","cell","cellHasColspan","colSpan","cellHasRowspan","rowSpan","isThisSelectedCell","rowPos","colPos","rowspanNumber","attributes","rp","rowspanIndex","adjustStartPoint","colspanNumber","cp","cellspanIndex","isSelectedCell","getDeleteResultActionToCell","Column","SubtractSpanCount","Row","isVirtual","AddCell","RemoveCell","getAddResultActionToCell","SumSpanCount","Ignore","getActionList","fixedRow","fixedCol","actualPosition","canContinue","rowPosition","colPosition","requestAction","Add","Delete","tagName","rows","cells","createVirtualTable","Table","isShift","nextCell","currentTr","trAttributes","recoverAttributes","actions","idCell","currentCell","tdAttributes","newTd","removeAttr","setAttribute","before","lastTrIndex","after","actionIndex","resultStr","attrList","specified","cellPos","virtualPosition","virtualTable","hasRowspan","nextRow","cloneRow","removeAttribute","colCount","rowCount","tdHTML","tds","idxCol","trHTML","trs","idxRow","$table","tableClassName","Editor","$editor","lastRange","typing","escape","untab","insertParagraph","insertOrderedList","insertUnorderedList","formatPara","insertHorizontalRule","commands","sCmd","beforeCommand","execCommand","afterCommand","wrapCommand","fontStyling","unit","currentStyle","fontSizeUnit","formatBlock","isLimited","getLastRange","setLastRange","insertText","textNode","pasteHTML","onApplyCustomStyle","onFormatBlock","hrNode","stylePara","createLink","linkInfo","linkUrl","linkText","isNewWindow","checkProtocol","additionalTextLength","isTextChanged","onCreateLink","defaultProtocol","anchors","styleNodes","createRangeFromList","colorInfo","foreColor","backColor","insertTable","dim","dimension","createTable","removeMedia","restoreTarget","detach","floatMe","toggleClass","resize","hasKeyShortCut","isDefaultPrevented","handleKeyMap","preventDefaultEditableShortCuts","recordEveryKeystroke","spellCheck","disableGrammar","airMode","overrideContextMenu","outerWidth","maxHeight","minHeight","keyMap","metaKey","ctrlKey","altKey","shiftKey","keyName","eventName","tabDisable","pad","maxTextLength","lst","thenCollapse","commit","styleWithCSS","isPreventTrigger","normalizeContent","tabSize","insertTab","src","param","Deferred","deferred","$img","one","resolve","reject","display","appendTo","promise","then","$image","min","show","files","file","filename","maximumImageFileSize","FileReader","onload","dataURL","onerror","err","readAsDataURL","readFileAsDataURL","insertImage","onImageUpload","insertImagesAsDataURL","currentRange","spans","firstSpan","noteStatusOutput","expand","$anchor","addRow","addCol","deleteRow","deleteCol","deleteTable","bKeepRatio","imageSize","newRatio","y","x","ratio","is","hasFocus","Clipboard","pasteByEvent","clipboardData","originalEvent","items","kind","getAsFile","getData","Dropzone","$eventListener","documentEventHandlers","$dropzone","prependTo","disableDragAndDrop","onDrop","attachDragAndDropEvent","$dropzoneMessage","onDragenter","isCodeview","hasEditorSize","add","onDragleave","removeClass","dataTransfer","types","content","substr","CodeView","$codable","CodeMirrorConstructor","CodeMirror","codemirror","getDoc","setValue","save","ESCAPE","deactivate","activate","codeviewFilter","codeviewFilterRegex","codeviewIframeFilter","whitelist","codeviewIframeWhitelistSrc","codeviewIframeWhitelistSrcBase","tag","RegExp","prettifyHtml","cmEditor","fromTextArea","tern","server","TernServer","ternServer","cm","updateArgHints","getValue","setSize","toTextArea","purify","isChange","Statusbar","$statusbar","statusbar","disableResizeEditor","stopPropagation","editableTop","onMouseMove","clientY","minheight","max","Fullscreen","$toolbar","toolbar","$window","$scrollbar","onResize","resizeTo","h","setsize","isFullscreen","Handle","$editingArea","editingArea","we","update","$handle","disableResizeImage","posStart","clientX","isImage","$selection","w","origImageObj","Image","sizingText","linkPattern","AutoLink","handleKeyup","handleKeydown","lastWordRange","keyword","urlText","showDomainOnlyForAutolink","linkTargetBlank","wordRange","getWordRange","AutoSync","AutoReplace","PERIOD","COMMA","SEMICOLON","SLASH","previousKeydownCode","lastWord","jQuery","Node","Placeholder","inheritPlaceholder","isShow","toggle","Buttons","invertedKeyMap","editorMethod","button","addToolbarButtons","addImagePopoverButtons","addLinkPopoverButtons","addTablePopoverButtons","fontInstalledMap","fontNamesIgnoreCheck","buttonGroup","icon","$button","currentTarget","$recentColor","colorButton","dropdownButtonContents","dropdown","$dropdown","$holder","palette","colors","colorsName","customColors","change","$chip","$picker","$palette","prepend","$color","$currentButton","magic","styleTags","title","template","styleIdx","styleLen","representShortcut","createInvokeHandlerAndUpdateState","eraser","addDefaultFonts","fontname","isFontDeservedToAdd","fontNames","dropdownCheck","checkClassName","menuCheck","fontSizes","fontSizeUnits","colorPalette","unorderedlist","orderedlist","justifyLeft","alignLeft","justifyCenter","alignCenter","justifyRight","alignRight","justifyFull","alignJustify","textHeight","lineHeights","insertTableMaxSize","col","mousedown","tableMoveHandler","picture","minus","arrowsAlt","question","rollback","trash","rowAbove","rowBelow","colBefore","colAfter","rowRemove","colRemove","groups","groupIdx","groupLen","group","groupName","$group","btn","updateBtnStates","$item","isChecked","infos","selector","toggleBtnActive","posOffset","$dimensionDisplay","$catcher","$highlighted","$unhighlighted","offsetX","posCatcher","pageX","pageY","offsetY","ceil","Toolbar","isFollowing","followScroll","toolbarContainer","changeContainer","followingToolbar","editorHeight","editorWidth","toolbarHeight","statusbarHeight","otherBarHeight","otherStaticBar","currentOffset","editorOffsetTop","activateOffset","deactivateOffsetBottom","marginTop","zIndex","isIncludeCodeview","$btn","toggleBtn","LinkDialog","$body","dialogsInBody","disableLinkTarget","checkbox","checked","footer","$dialog","dialog","fade","dialogsFade","hideDialog","$input","$linkBtn","$linkText","$linkUrl","$openInNewWindow","$useProtocol","onDialogShown","toggleLinkBtn","bindEnterKey","isNewWindowChecked","prop","useProtocolChecked","onDialogHidden","state","showDialog","showLinkDialog","LinkPopover","popover","$popover","$content","href","containerOffset","ImageDialog","imageLimitation","floor","log","readableSize","pow","showImageDialog","onImageLinkInsert","$imageInput","$imageUrl","$imageBtn","replaceWith","ImagePopover","popatmouse","TablePopover","VideoDialog","$video","ytMatch","igMatch","vMatch","vimMatch","dmMatch","youkuMatch","qqMatch","qqMatch2","mp4Match","oggMatch","webmMatch","fbMatch","youtubeId","start","ytMatchForStart","vid","encodeURIComponent","showVideoDialog","createVideoNode","$videoUrl","$videoBtn","HelpDialog","createShortcutList","command","$row","showHelpDialog","AirPopover","hidable","onContextmenu","air","forcelyOpen","HintPopover","hint","direction","hintDirection","hints","matchingWord","hideArrow","innerHeight","$current","$next","selectItem","$nextGroup","$prev","$prevGroup","nodeFromItem","rangeCompute","hintSelect","hintIdx","moveUp","moveDown","search","searchKeyword","createItemTemplates","hintMode","getWordsRange","getWordsMatchRange","empty","bnd","createGroup","version","Codeview","toolbarPosition","codeviewKeepButton","tabDisabled","textareaAutoSync","onBeforeCommand","onBlur","onBlurCodeview","onChange","onChangeCodeview","onEnter","onFocus","onImageUploadError","onInit","onKeydown","onKeyup","onMousedown","onMouseup","onPaste","onScroll","htmlMode","lineNumbers","pc","mac","renderer","airEditor","airEditable","option","iconClassName","editorOptions","rowSize","colSize","colorName","placement","codeviewButton","isEnable","isActive","modal","interface"],"mappings":"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","file":"summernote-bs4.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jquery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jquery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jquery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 53);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__0__;","import $ from 'jquery';\n\nclass Renderer {\n  constructor(markup, children, options, callback) {\n    this.markup = markup;\n    this.children = children;\n    this.options = options;\n    this.callback = callback;\n  }\n\n  render($parent) {\n    const $node = $(this.markup);\n\n    if (this.options && this.options.contents) {\n      $node.html(this.options.contents);\n    }\n\n    if (this.options && this.options.className) {\n      $node.addClass(this.options.className);\n    }\n\n    if (this.options && this.options.data) {\n      $.each(this.options.data, (k, v) => {\n        $node.attr('data-' + k, v);\n      });\n    }\n\n    if (this.options && this.options.click) {\n      $node.on('click', this.options.click);\n    }\n\n    if (this.children) {\n      const $container = $node.find('.note-children-container');\n      this.children.forEach((child) => {\n        child.render($container.length ? $container : $node);\n      });\n    }\n\n    if (this.callback) {\n      this.callback($node, this.options);\n    }\n\n    if (this.options && this.options.callback) {\n      this.options.callback($node);\n    }\n\n    if ($parent) {\n      $parent.append($node);\n    }\n\n    return $node;\n  }\n}\n\nexport default {\n  create: (markup, callback) => {\n    return function() {\n      const options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];\n      let children = Array.isArray(arguments[0]) ? arguments[0] : [];\n      if (options && options.children) {\n        children = options.children;\n      }\n      return new Renderer(markup, children, options, callback);\n    };\n  },\n};\n","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n","import $ from 'jquery';\nconst isSupportAmd = typeof define === 'function' && define.amd; // eslint-disable-line\n\n/**\n * returns whether font is installed or not.\n *\n * @param {String} fontName\n * @return {Boolean}\n */\nconst genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];\n\nfunction validFontName(fontName) {\n  return ($.inArray(fontName.toLowerCase(), genericFontFamilies) === -1) ? `'${fontName}'` : fontName;\n}\n\nfunction isFontInstalled(fontName) {\n  const testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';\n  const testText = 'mmmmmmmmmmwwwww';\n  const testSize = '200px';\n\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n\n  context.font = testSize + \" '\" + testFontName + \"'\";\n  const originalWidth = context.measureText(testText).width;\n\n  context.font = testSize + ' ' + validFontName(fontName) + ', \"' + testFontName + '\"';\n  const width = context.measureText(testText).width;\n\n  return originalWidth !== width;\n}\n\nconst userAgent = navigator.userAgent;\nconst isMSIE = /MSIE|Trident/i.test(userAgent);\nlet browserVersion;\nif (isMSIE) {\n  let matches = /MSIE (\\d+[.]\\d+)/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n  matches = /Trident\\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n}\n\nconst isEdge = /Edge\\/\\d+/.test(userAgent);\n\nconst isSupportTouch =\n  (('ontouchstart' in window) ||\n   (navigator.MaxTouchPoints > 0) ||\n   (navigator.msMaxTouchPoints > 0));\n\n// [workaround] IE doesn't have input events for contentEditable\n// - see: https://goo.gl/4bfIvA\nconst inputEventName = (isMSIE) ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';\n\n/**\n * @class core.env\n *\n * Object which check platform and agent\n *\n * @singleton\n * @alternateClassName env\n */\nexport default {\n  isMac: navigator.appVersion.indexOf('Mac') > -1,\n  isMSIE,\n  isEdge,\n  isFF: !isEdge && /firefox/i.test(userAgent),\n  isPhantom: /PhantomJS/i.test(userAgent),\n  isWebkit: !isEdge && /webkit/i.test(userAgent),\n  isChrome: !isEdge && /chrome/i.test(userAgent),\n  isSafari: !isEdge && /safari/i.test(userAgent) && (!/chrome/i.test(userAgent)),\n  browserVersion,\n  jqueryVersion: parseFloat($.fn.jquery),\n  isSupportAmd,\n  isSupportTouch,\n  isFontInstalled,\n  isW3CRangeSupport: !!document.createRange,\n  inputEventName,\n  genericFontFamilies,\n  validFontName,\n};\n","import $ from 'jquery';\n\n/**\n * @class core.func\n *\n * func utils (for high-order func's arg)\n *\n * @singleton\n * @alternateClassName func\n */\nfunction eq(itemA) {\n  return function(itemB) {\n    return itemA === itemB;\n  };\n}\n\nfunction eq2(itemA, itemB) {\n  return itemA === itemB;\n}\n\nfunction peq2(propName) {\n  return function(itemA, itemB) {\n    return itemA[propName] === itemB[propName];\n  };\n}\n\nfunction ok() {\n  return true;\n}\n\nfunction fail() {\n  return false;\n}\n\nfunction not(f) {\n  return function() {\n    return !f.apply(f, arguments);\n  };\n}\n\nfunction and(fA, fB) {\n  return function(item) {\n    return fA(item) && fB(item);\n  };\n}\n\nfunction self(a) {\n  return a;\n}\n\nfunction invoke(obj, method) {\n  return function() {\n    return obj[method].apply(obj, arguments);\n  };\n}\n\nlet idCounter = 0;\n\n/**\n * reset globally-unique id\n *\n */\nfunction resetUniqueId() {\n  idCounter = 0;\n}\n\n/**\n * generate a globally-unique id\n *\n * @param {String} [prefix]\n */\nfunction uniqueId(prefix) {\n  const id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n/**\n * returns bnd (bounds) from rect\n *\n * - IE Compatibility Issue: http://goo.gl/sRLOAo\n * - Scroll Issue: http://goo.gl/sNjUc\n *\n * @param {Rect} rect\n * @return {Object} bounds\n * @return {Number} bounds.top\n * @return {Number} bounds.left\n * @return {Number} bounds.width\n * @return {Number} bounds.height\n */\nfunction rect2bnd(rect) {\n  const $document = $(document);\n  return {\n    top: rect.top + $document.scrollTop(),\n    left: rect.left + $document.scrollLeft(),\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n}\n\n/**\n * returns a copy of the object where the keys have become the values and the values the keys.\n * @param {Object} obj\n * @return {Object}\n */\nfunction invertObject(obj) {\n  const inverted = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      inverted[obj[key]] = key;\n    }\n  }\n  return inverted;\n}\n\n/**\n * @param {String} namespace\n * @param {String} [prefix]\n * @return {String}\n */\nfunction namespaceToCamel(namespace, prefix) {\n  prefix = prefix || '';\n  return prefix + namespace.split('.').map(function(name) {\n    return name.substring(0, 1).toUpperCase() + name.substring(1);\n  }).join('');\n}\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param {Function} func\n * @param {Number} wait\n * @param {Boolean} immediate\n * @return {Function}\n */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function() {\n    const context = this;\n    const args = arguments;\n    const later = () => {\n      timeout = null;\n      if (!immediate) {\n        func.apply(context, args);\n      }\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) {\n      func.apply(context, args);\n    }\n  };\n}\n\n/**\n *\n * @param {String} url\n * @return {Boolean}\n */\nfunction isValidUrl(url) {\n  const expression = /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/gi;\n  return expression.test(url);\n}\n\nexport default {\n  eq,\n  eq2,\n  peq2,\n  ok,\n  fail,\n  self,\n  not,\n  and,\n  invoke,\n  resetUniqueId,\n  uniqueId,\n  rect2bnd,\n  invertObject,\n  namespaceToCamel,\n  debounce,\n  isValidUrl,\n};\n","import func from './func';\n\n/**\n * returns the first item of an array.\n *\n * @param {Array} array\n */\nfunction head(array) {\n  return array[0];\n}\n\n/**\n * returns the last item of an array.\n *\n * @param {Array} array\n */\nfunction last(array) {\n  return array[array.length - 1];\n}\n\n/**\n * returns everything but the last entry of the array.\n *\n * @param {Array} array\n */\nfunction initial(array) {\n  return array.slice(0, array.length - 1);\n}\n\n/**\n * returns the rest of the items in an array.\n *\n * @param {Array} array\n */\nfunction tail(array) {\n  return array.slice(1);\n}\n\n/**\n * returns item of array\n */\nfunction find(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    const item = array[idx];\n    if (pred(item)) {\n      return item;\n    }\n  }\n}\n\n/**\n * returns true if all of the values in the array pass the predicate truth test.\n */\nfunction all(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!pred(array[idx])) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * returns true if the value is present in the list.\n */\nfunction contains(array, item) {\n  if (array && array.length && item) {\n    if (array.indexOf) {\n      return array.indexOf(item) !== -1;\n    } else if (array.contains) {\n      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`\n      return array.contains(item);\n    }\n  }\n  return false;\n}\n\n/**\n * get sum from a list\n *\n * @param {Array} array - array\n * @param {Function} fn - iterator\n */\nfunction sum(array, fn) {\n  fn = fn || func.self;\n  return array.reduce(function(memo, v) {\n    return memo + fn(v);\n  }, 0);\n}\n\n/**\n * returns a copy of the collection with array type.\n * @param {Collection} collection - collection eg) node.childNodes, ...\n */\nfunction from(collection) {\n  const result = [];\n  const length = collection.length;\n  let idx = -1;\n  while (++idx < length) {\n    result[idx] = collection[idx];\n  }\n  return result;\n}\n\n/**\n * returns whether list is empty or not\n */\nfunction isEmpty(array) {\n  return !array || !array.length;\n}\n\n/**\n * cluster elements by predicate function.\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n * @param {Array[]}\n */\nfunction clusterBy(array, fn) {\n  if (!array.length) { return []; }\n  const aTail = tail(array);\n  return aTail.reduce(function(memo, v) {\n    const aLast = last(memo);\n    if (fn(last(aLast), v)) {\n      aLast[aLast.length] = v;\n    } else {\n      memo[memo.length] = [v];\n    }\n    return memo;\n  }, [[head(array)]]);\n}\n\n/**\n * returns a copy of the array with all false values removed\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n */\nfunction compact(array) {\n  const aResult = [];\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (array[idx]) { aResult.push(array[idx]); }\n  }\n  return aResult;\n}\n\n/**\n * produces a duplicate-free version of the array\n *\n * @param {Array} array\n */\nfunction unique(array) {\n  const results = [];\n\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!contains(results, array[idx])) {\n      results.push(array[idx]);\n    }\n  }\n\n  return results;\n}\n\n/**\n * returns next item.\n * @param {Array} array\n */\nfunction next(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx + 1];\n  }\n  return null;\n}\n\n/**\n * returns prev item.\n * @param {Array} array\n */\nfunction prev(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx - 1];\n  }\n  return null;\n}\n\n/**\n * @class core.list\n *\n * list utils\n *\n * @singleton\n * @alternateClassName list\n */\nexport default {\n  head,\n  last,\n  initial,\n  tail,\n  prev,\n  next,\n  find,\n  contains,\n  all,\n  sum,\n  from,\n  isEmpty,\n  clusterBy,\n  compact,\n  unique,\n};\n","import $ from 'jquery';\nimport func from './func';\nimport lists from './lists';\nimport env from './env';\n\nconst NBSP_CHAR = String.fromCharCode(160);\nconst ZERO_WIDTH_NBSP_CHAR = '\\ufeff';\n\n/**\n * @method isEditable\n *\n * returns whether node is `note-editable` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEditable(node) {\n  return node && $(node).hasClass('note-editable');\n}\n\n/**\n * @method isControlSizing\n *\n * returns whether node is `note-control-sizing` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isControlSizing(node) {\n  return node && $(node).hasClass('note-control-sizing');\n}\n\n/**\n * @method makePredByNodeName\n *\n * returns predicate which judge whether nodeName is same\n *\n * @param {String} nodeName\n * @return {Function}\n */\nfunction makePredByNodeName(nodeName) {\n  nodeName = nodeName.toUpperCase();\n  return function(node) {\n    return node && node.nodeName.toUpperCase() === nodeName;\n  };\n}\n\n/**\n * @method isText\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is text(3)\n */\nfunction isText(node) {\n  return node && node.nodeType === 3;\n}\n\n/**\n * @method isElement\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is element(1)\n */\nfunction isElement(node) {\n  return node && node.nodeType === 1;\n}\n\n/**\n * ex) br, col, embed, hr, img, input, ...\n * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n */\nfunction isVoid(node) {\n  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());\n}\n\nfunction isPara(node) {\n  if (isEditable(node)) {\n    return false;\n  }\n\n  // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph\n  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nfunction isHeading(node) {\n  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nconst isPre = makePredByNodeName('PRE');\n\nconst isLi = makePredByNodeName('LI');\n\nfunction isPurePara(node) {\n  return isPara(node) && !isLi(node);\n}\n\nconst isTable = makePredByNodeName('TABLE');\n\nconst isData = makePredByNodeName('DATA');\n\nfunction isInline(node) {\n  return !isBodyContainer(node) &&\n         !isList(node) &&\n         !isHr(node) &&\n         !isPara(node) &&\n         !isTable(node) &&\n         !isBlockquote(node) &&\n         !isData(node);\n}\n\nfunction isList(node) {\n  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());\n}\n\nconst isHr = makePredByNodeName('HR');\n\nfunction isCell(node) {\n  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());\n}\n\nconst isBlockquote = makePredByNodeName('BLOCKQUOTE');\n\nfunction isBodyContainer(node) {\n  return isCell(node) || isBlockquote(node) || isEditable(node);\n}\n\nconst isAnchor = makePredByNodeName('A');\n\nfunction isParaInline(node) {\n  return isInline(node) && !!ancestor(node, isPara);\n}\n\nfunction isBodyInline(node) {\n  return isInline(node) && !ancestor(node, isPara);\n}\n\nconst isBody = makePredByNodeName('BODY');\n\n/**\n * returns whether nodeB is closest sibling of nodeA\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @return {Boolean}\n */\nfunction isClosestSibling(nodeA, nodeB) {\n  return nodeA.nextSibling === nodeB ||\n         nodeA.previousSibling === nodeB;\n}\n\n/**\n * returns array of closest siblings with node\n *\n * @param {Node} node\n * @param {function} [pred] - predicate function\n * @return {Node[]}\n */\nfunction withClosestSiblings(node, pred) {\n  pred = pred || func.ok;\n\n  const siblings = [];\n  if (node.previousSibling && pred(node.previousSibling)) {\n    siblings.push(node.previousSibling);\n  }\n  siblings.push(node);\n  if (node.nextSibling && pred(node.nextSibling)) {\n    siblings.push(node.nextSibling);\n  }\n  return siblings;\n}\n\n/**\n * blank HTML for cursor position\n * - [workaround] old IE only works with &nbsp;\n * - [workaround] IE11 and other browser works with bogus br\n */\nconst blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';\n\n/**\n * @method nodeLength\n *\n * returns #text's text size or element's childNodes size\n *\n * @param {Node} node\n */\nfunction nodeLength(node) {\n  if (isText(node)) {\n    return node.nodeValue.length;\n  }\n\n  if (node) {\n    return node.childNodes.length;\n  }\n\n  return 0;\n}\n\n/**\n * returns whether deepest child node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction deepestChildIsEmpty(node) {\n  do {\n    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;\n  } while ((node = node.firstElementChild));\n\n  return isEmpty(node);\n}\n\n/**\n * returns whether node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEmpty(node) {\n  const len = nodeLength(node);\n\n  if (len === 0) {\n    return true;\n  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {\n    // ex) <p><br></p>, <span><br></span>\n    return true;\n  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {\n    // ex) <p></p>, <span></span>\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * padding blankHTML if node is empty (for cursor position)\n */\nfunction paddingBlankHTML(node) {\n  if (!isVoid(node) && !nodeLength(node)) {\n    node.innerHTML = blankHTML;\n  }\n}\n\n/**\n * find nearest ancestor predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction ancestor(node, pred) {\n  while (node) {\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * find nearest ancestor only single child blood line and predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction singleChildAncestor(node, pred) {\n  node = node.parentNode;\n\n  while (node) {\n    if (nodeLength(node) !== 1) { break; }\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * returns new array of ancestor nodes (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listAncestor(node, pred) {\n  pred = pred || func.fail;\n\n  const ancestors = [];\n  ancestor(node, function(el) {\n    if (!isEditable(el)) {\n      ancestors.push(el);\n    }\n\n    return pred(el);\n  });\n  return ancestors;\n}\n\n/**\n * find farthest ancestor predicate hit\n */\nfunction lastAncestor(node, pred) {\n  const ancestors = listAncestor(node);\n  return lists.last(ancestors.filter(pred));\n}\n\n/**\n * returns common ancestor node between two nodes.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n */\nfunction commonAncestor(nodeA, nodeB) {\n  const ancestors = listAncestor(nodeA);\n  for (let n = nodeB; n; n = n.parentNode) {\n    if (ancestors.indexOf(n) > -1) return n;\n  }\n  return null; // difference document area\n}\n\n/**\n * listing all previous siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listPrev(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.previousSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing next siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listNext(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.nextSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing descendant nodes\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listDescendant(node, pred) {\n  const descendants = [];\n  pred = pred || func.ok;\n\n  // start DFS(depth first search) with node\n  (function fnWalk(current) {\n    if (node !== current && pred(current)) {\n      descendants.push(current);\n    }\n    for (let idx = 0, len = current.childNodes.length; idx < len; idx++) {\n      fnWalk(current.childNodes[idx]);\n    }\n  })(node);\n\n  return descendants;\n}\n\n/**\n * wrap node with new tag.\n *\n * @param {Node} node\n * @param {Node} tagName of wrapper\n * @return {Node} - wrapper\n */\nfunction wrap(node, wrapperName) {\n  const parent = node.parentNode;\n  const wrapper = $('<' + wrapperName + '>')[0];\n\n  parent.insertBefore(wrapper, node);\n  wrapper.appendChild(node);\n\n  return wrapper;\n}\n\n/**\n * insert node after preceding\n *\n * @param {Node} node\n * @param {Node} preceding - predicate function\n */\nfunction insertAfter(node, preceding) {\n  const next = preceding.nextSibling;\n  let parent = preceding.parentNode;\n  if (next) {\n    parent.insertBefore(node, next);\n  } else {\n    parent.appendChild(node);\n  }\n  return node;\n}\n\n/**\n * append elements.\n *\n * @param {Node} node\n * @param {Collection} aChild\n */\nfunction appendChildNodes(node, aChild) {\n  $.each(aChild, function(idx, child) {\n    node.appendChild(child);\n  });\n  return node;\n}\n\n/**\n * returns whether boundaryPoint is left edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isLeftEdgePoint(point) {\n  return point.offset === 0;\n}\n\n/**\n * returns whether boundaryPoint is right edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isRightEdgePoint(point) {\n  return point.offset === nodeLength(point.node);\n}\n\n/**\n * returns whether boundaryPoint is edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isEdgePoint(point) {\n  return isLeftEdgePoint(point) || isRightEdgePoint(point);\n}\n\n/**\n * returns whether node is left edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgeOf(node, ancestor) {\n  while (node && node !== ancestor) {\n    if (position(node) !== 0) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether node is right edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgeOf(node, ancestor) {\n  if (!ancestor) {\n    return false;\n  }\n  while (node && node !== ancestor) {\n    if (position(node) !== nodeLength(node.parentNode) - 1) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether point is left edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgePointOf(point, ancestor) {\n  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns whether point is right edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgePointOf(point, ancestor) {\n  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns offset from parent.\n *\n * @param {Node} node\n */\nfunction position(node) {\n  let offset = 0;\n  while ((node = node.previousSibling)) {\n    offset += 1;\n  }\n  return offset;\n}\n\nfunction hasChildren(node) {\n  return !!(node && node.childNodes && node.childNodes.length);\n}\n\n/**\n * returns previous boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction prevPoint(point, isSkipInnerOffset) {\n  let node;\n  let offset;\n\n  if (point.offset === 0) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node);\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset - 1];\n    offset = nodeLength(node);\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? 0 : point.offset - 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPoint(point, isSkipInnerOffset) {\n  let node, offset;\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint with empty node\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPointWithEmptyNode(point, isSkipInnerOffset) {\n  let node, offset;\n\n  // if node is empty string node, return current node's sibling.\n  if (isEmpty(point.node)) {\n    node = point.node.nextSibling;\n    offset = 0;\n\n    return {\n      node: node,\n      offset: offset,\n    };\n  }\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n\n    // if next node is editable, return current node's sibling node.\n    if (isEditable(node)) {\n      node = point.node.nextSibling;\n      offset = 0;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n    if (isEmpty(node)) {\n      return null;\n    }\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n\n    if (isEmpty(node)) {\n      return null;\n    }\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/*\n* returns the next Text node index or 0 if not found.\n*/\nfunction getNextTextNode(actual) {\n  if (!actual.nextSibling) return undefined;\n  if (actual.parent !== actual.nextSibling.parent) return undefined;\n  if (isText(actual.nextSibling)) return actual.nextSibling;\n  return getNextTextNode(actual.nextSibling);\n}\n\n/**\n * returns whether pointA and pointB is same or not.\n *\n * @param {BoundaryPoint} pointA\n * @param {BoundaryPoint} pointB\n * @return {Boolean}\n */\nfunction isSamePoint(pointA, pointB) {\n  return pointA.node === pointB.node && pointA.offset === pointB.offset;\n}\n\n/**\n * returns whether point is visible (can set cursor) or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isVisiblePoint(point) {\n  if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {\n    return true;\n  }\n\n  const leftNode = point.node.childNodes[point.offset - 1];\n  const rightNode = point.node.childNodes[point.offset];\n  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * @method prevPointUtil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction prevPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = prevPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * @method nextPointUntil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction nextPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = nextPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * returns whether point has character or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isCharPoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch && (ch !== ' ' && ch !== NBSP_CHAR);\n}\n\n/**\n * returns whether point has space or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isSpacePoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch === ' ' || ch === NBSP_CHAR;\n}\n\n/**\n * @method walkPoint\n *\n * @param {BoundaryPoint} startPoint\n * @param {BoundaryPoint} endPoint\n * @param {Function} handler\n * @param {Boolean} isSkipInnerOffset\n */\nfunction walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {\n  let point = startPoint;\n\n  while (point) {\n    handler(point);\n\n    if (isSamePoint(point, endPoint)) {\n      break;\n    }\n\n    const isSkipOffset = isSkipInnerOffset &&\n                       startPoint.node !== point.node &&\n                       endPoint.node !== point.node;\n    point = nextPointWithEmptyNode(point, isSkipOffset);\n  }\n}\n\n/**\n * @method makeOffsetPath\n *\n * return offsetPath(array of offset) from ancestor\n *\n * @param {Node} ancestor - ancestor node\n * @param {Node} node\n */\nfunction makeOffsetPath(ancestor, node) {\n  const ancestors = listAncestor(node, func.eq(ancestor));\n  return ancestors.map(position).reverse();\n}\n\n/**\n * @method fromOffsetPath\n *\n * return element from offsetPath(array of offset)\n *\n * @param {Node} ancestor - ancestor node\n * @param {array} offsets - offsetPath\n */\nfunction fromOffsetPath(ancestor, offsets) {\n  let current = ancestor;\n  for (let i = 0, len = offsets.length; i < len; i++) {\n    if (current.childNodes.length <= offsets[i]) {\n      current = current.childNodes[current.childNodes.length - 1];\n    } else {\n      current = current.childNodes[offsets[i]];\n    }\n  }\n  return current;\n}\n\n/**\n * @method splitNode\n *\n * split element or #text\n *\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @param {Boolean} [options.isDiscardEmptySplits] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitNode(point, options) {\n  let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;\n  const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;\n  const isDiscardEmptySplits = options && options.isDiscardEmptySplits;\n\n  if (isDiscardEmptySplits) {\n    isSkipPaddingBlankHTML = true;\n  }\n\n  // edge case\n  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {\n    if (isLeftEdgePoint(point)) {\n      return point.node;\n    } else if (isRightEdgePoint(point)) {\n      return point.node.nextSibling;\n    }\n  }\n\n  // split #text\n  if (isText(point.node)) {\n    return point.node.splitText(point.offset);\n  } else {\n    const childNode = point.node.childNodes[point.offset];\n    const clone = insertAfter(point.node.cloneNode(false), point.node);\n    appendChildNodes(clone, listNext(childNode));\n\n    if (!isSkipPaddingBlankHTML) {\n      paddingBlankHTML(point.node);\n      paddingBlankHTML(clone);\n    }\n\n    if (isDiscardEmptySplits) {\n      if (isEmpty(point.node)) {\n        remove(point.node);\n      }\n      if (isEmpty(clone)) {\n        remove(clone);\n        return point.node.nextSibling;\n      }\n    }\n\n    return clone;\n  }\n}\n\n/**\n * @method splitTree\n *\n * split tree by point\n *\n * @param {Node} root - split root\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitTree(root, point, options) {\n  // ex) [#text, <span>, <p>]\n  const ancestors = listAncestor(point.node, func.eq(root));\n\n  if (!ancestors.length) {\n    return null;\n  } else if (ancestors.length === 1) {\n    return splitNode(point, options);\n  }\n\n  return ancestors.reduce(function(node, parent) {\n    if (node === point.node) {\n      node = splitNode(point, options);\n    }\n\n    return splitNode({\n      node: parent,\n      offset: node ? position(node) : nodeLength(parent),\n    }, options);\n  });\n}\n\n/**\n * split point\n *\n * @param {Point} point\n * @param {Boolean} isInline\n * @return {Object}\n */\nfunction splitPoint(point, isInline) {\n  // find splitRoot, container\n  //  - inline: splitRoot is a child of paragraph\n  //  - block: splitRoot is a child of bodyContainer\n  const pred = isInline ? isPara : isBodyContainer;\n  const ancestors = listAncestor(point.node, pred);\n  const topAncestor = lists.last(ancestors) || point.node;\n\n  let splitRoot, container;\n  if (pred(topAncestor)) {\n    splitRoot = ancestors[ancestors.length - 2];\n    container = topAncestor;\n  } else {\n    splitRoot = topAncestor;\n    container = splitRoot.parentNode;\n  }\n\n  // if splitRoot is exists, split with splitTree\n  let pivot = splitRoot && splitTree(splitRoot, point, {\n    isSkipPaddingBlankHTML: isInline,\n    isNotSplitEdgePoint: isInline,\n  });\n\n  // if container is point.node, find pivot with point.offset\n  if (!pivot && container === point.node) {\n    pivot = point.node.childNodes[point.offset];\n  }\n\n  return {\n    rightNode: pivot,\n    container: container,\n  };\n}\n\nfunction create(nodeName) {\n  return document.createElement(nodeName);\n}\n\nfunction createText(text) {\n  return document.createTextNode(text);\n}\n\n/**\n * @method remove\n *\n * remove node, (isRemoveChild: remove child or not)\n *\n * @param {Node} node\n * @param {Boolean} isRemoveChild\n */\nfunction remove(node, isRemoveChild) {\n  if (!node || !node.parentNode) { return; }\n  if (node.removeNode) { return node.removeNode(isRemoveChild); }\n\n  const parent = node.parentNode;\n  if (!isRemoveChild) {\n    const nodes = [];\n    for (let i = 0, len = node.childNodes.length; i < len; i++) {\n      nodes.push(node.childNodes[i]);\n    }\n\n    for (let i = 0, len = nodes.length; i < len; i++) {\n      parent.insertBefore(nodes[i], node);\n    }\n  }\n\n  parent.removeChild(node);\n}\n\n/**\n * @method removeWhile\n *\n * @param {Node} node\n * @param {Function} pred\n */\nfunction removeWhile(node, pred) {\n  while (node) {\n    if (isEditable(node) || !pred(node)) {\n      break;\n    }\n\n    const parent = node.parentNode;\n    remove(node);\n    node = parent;\n  }\n}\n\n/**\n * @method replace\n *\n * replace node with provided nodeName\n *\n * @param {Node} node\n * @param {String} nodeName\n * @return {Node} - new node\n */\nfunction replace(node, nodeName) {\n  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {\n    return node;\n  }\n\n  const newNode = create(nodeName);\n\n  if (node.style.cssText) {\n    newNode.style.cssText = node.style.cssText;\n  }\n\n  appendChildNodes(newNode, lists.from(node.childNodes));\n  insertAfter(newNode, node);\n  remove(node);\n\n  return newNode;\n}\n\nconst isTextarea = makePredByNodeName('TEXTAREA');\n\n/**\n * @param {jQuery} $node\n * @param {Boolean} [stripLinebreaks] - default: false\n */\nfunction value($node, stripLinebreaks) {\n  const val = isTextarea($node[0]) ? $node.val() : $node.html();\n  if (stripLinebreaks) {\n    return val.replace(/[\\n\\r]/g, '');\n  }\n  return val;\n}\n\n/**\n * @method html\n *\n * get the HTML contents of node\n *\n * @param {jQuery} $node\n * @param {Boolean} [isNewlineOnBlock]\n */\nfunction html($node, isNewlineOnBlock) {\n  let markup = value($node);\n\n  if (isNewlineOnBlock) {\n    const regexTag = /<(\\/?)(\\b(?!!)[^>\\s]*)(.*?)(\\s*\\/?>)/g;\n    markup = markup.replace(regexTag, function(match, endSlash, name) {\n      name = name.toUpperCase();\n      const isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&\n                                   !!endSlash;\n      const isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);\n\n      return match + ((isEndOfInlineContainer || isBlockNode) ? '\\n' : '');\n    });\n    markup = markup.trim();\n  }\n\n  return markup;\n}\n\nfunction posFromPlaceholder(placeholder) {\n  const $placeholder = $(placeholder);\n  const pos = $placeholder.offset();\n  const height = $placeholder.outerHeight(true); // include margin\n\n  return {\n    left: pos.left,\n    top: pos.top + height,\n  };\n}\n\nfunction attachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.on(key, events[key]);\n  });\n}\n\nfunction detachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.off(key, events[key]);\n  });\n}\n\n/**\n * @method isCustomStyleTag\n *\n * assert if a node contains a \"note-styletag\" class,\n * which implies that's a custom-made style tag node\n *\n * @param {Node} an HTML DOM node\n */\nfunction isCustomStyleTag(node) {\n  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');\n}\n\nexport default {\n  /** @property {String} NBSP_CHAR */\n  NBSP_CHAR,\n  /** @property {String} ZERO_WIDTH_NBSP_CHAR */\n  ZERO_WIDTH_NBSP_CHAR,\n  /** @property {String} blank */\n  blank: blankHTML,\n  /** @property {String} emptyPara */\n  emptyPara: `<p>${blankHTML}</p>`,\n  makePredByNodeName,\n  isEditable,\n  isControlSizing,\n  isText,\n  isElement,\n  isVoid,\n  isPara,\n  isPurePara,\n  isHeading,\n  isInline,\n  isBlock: func.not(isInline),\n  isBodyInline,\n  isBody,\n  isParaInline,\n  isPre,\n  isList,\n  isTable,\n  isData,\n  isCell,\n  isBlockquote,\n  isBodyContainer,\n  isAnchor,\n  isDiv: makePredByNodeName('DIV'),\n  isLi,\n  isBR: makePredByNodeName('BR'),\n  isSpan: makePredByNodeName('SPAN'),\n  isB: makePredByNodeName('B'),\n  isU: makePredByNodeName('U'),\n  isS: makePredByNodeName('S'),\n  isI: makePredByNodeName('I'),\n  isImg: makePredByNodeName('IMG'),\n  isTextarea,\n  deepestChildIsEmpty,\n  isEmpty,\n  isEmptyAnchor: func.and(isAnchor, isEmpty),\n  isClosestSibling,\n  withClosestSiblings,\n  nodeLength,\n  isLeftEdgePoint,\n  isRightEdgePoint,\n  isEdgePoint,\n  isLeftEdgeOf,\n  isRightEdgeOf,\n  isLeftEdgePointOf,\n  isRightEdgePointOf,\n  prevPoint,\n  nextPoint,\n  nextPointWithEmptyNode,\n  isSamePoint,\n  isVisiblePoint,\n  prevPointUntil,\n  nextPointUntil,\n  isCharPoint,\n  isSpacePoint,\n  walkPoint,\n  ancestor,\n  singleChildAncestor,\n  listAncestor,\n  lastAncestor,\n  listNext,\n  listPrev,\n  listDescendant,\n  commonAncestor,\n  wrap,\n  insertAfter,\n  appendChildNodes,\n  position,\n  hasChildren,\n  makeOffsetPath,\n  fromOffsetPath,\n  splitTree,\n  splitPoint,\n  create,\n  createText,\n  remove,\n  removeWhile,\n  replace,\n  html,\n  value,\n  posFromPlaceholder,\n  attachEvents,\n  detachEvents,\n  isCustomStyleTag,\n};\n","import $ from 'jquery';\nimport func from './core/func';\nimport lists from './core/lists';\nimport dom from './core/dom';\n\nexport default class Context {\n  /**\n   * @param {jQuery} $note\n   * @param {Object} options\n   */\n  constructor($note, options) {\n    this.$note = $note;\n\n    this.memos = {};\n    this.modules = {};\n    this.layoutInfo = {};\n    this.options = $.extend(true, {}, options);\n\n    // init ui with options\n    $.summernote.ui = $.summernote.ui_template(this.options);\n    this.ui = $.summernote.ui;\n\n    this.initialize();\n  }\n\n  /**\n   * create layout and initialize modules and other resources\n   */\n  initialize() {\n    this.layoutInfo = this.ui.createLayout(this.$note);\n    this._initialize();\n    this.$note.hide();\n    return this;\n  }\n\n  /**\n   * destroy modules and other resources and remove layout\n   */\n  destroy() {\n    this._destroy();\n    this.$note.removeData('summernote');\n    this.ui.removeLayout(this.$note, this.layoutInfo);\n  }\n\n  /**\n   * destory modules and other resources and initialize it again\n   */\n  reset() {\n    const disabled = this.isDisabled();\n    this.code(dom.emptyPara);\n    this._destroy();\n    this._initialize();\n\n    if (disabled) {\n      this.disable();\n    }\n  }\n\n  _initialize() {\n    // set own id\n    this.options.id = func.uniqueId($.now());\n    // set default container for tooltips, popovers, and dialogs\n    this.options.container = this.options.container || this.layoutInfo.editor;\n\n    // add optional buttons\n    const buttons = $.extend({}, this.options.buttons);\n    Object.keys(buttons).forEach((key) => {\n      this.memo('button.' + key, buttons[key]);\n    });\n\n    const modules = $.extend({}, this.options.modules, $.summernote.plugins || {});\n\n    // add and initialize modules\n    Object.keys(modules).forEach((key) => {\n      this.module(key, modules[key], true);\n    });\n\n    Object.keys(this.modules).forEach((key) => {\n      this.initializeModule(key);\n    });\n  }\n\n  _destroy() {\n    // destroy modules with reversed order\n    Object.keys(this.modules).reverse().forEach((key) => {\n      this.removeModule(key);\n    });\n\n    Object.keys(this.memos).forEach((key) => {\n      this.removeMemo(key);\n    });\n    // trigger custom onDestroy callback\n    this.triggerEvent('destroy', this);\n  }\n\n  code(html) {\n    const isActivated = this.invoke('codeview.isActivated');\n\n    if (html === undefined) {\n      this.invoke('codeview.sync');\n      return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();\n    } else {\n      if (isActivated) {\n        this.invoke('codeview.sync', html);\n      } else {\n        this.layoutInfo.editable.html(html);\n      }\n      this.$note.val(html);\n      this.triggerEvent('change', html, this.layoutInfo.editable);\n    }\n  }\n\n  isDisabled() {\n    return this.layoutInfo.editable.attr('contenteditable') === 'false';\n  }\n\n  enable() {\n    this.layoutInfo.editable.attr('contenteditable', true);\n    this.invoke('toolbar.activate', true);\n    this.triggerEvent('disable', false);\n    this.options.editing = true;\n  }\n\n  disable() {\n    // close codeview if codeview is opend\n    if (this.invoke('codeview.isActivated')) {\n      this.invoke('codeview.deactivate');\n    }\n    this.layoutInfo.editable.attr('contenteditable', false);\n    this.options.editing = false;\n    this.invoke('toolbar.deactivate', true);\n\n    this.triggerEvent('disable', true);\n  }\n\n  triggerEvent() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];\n    if (callback) {\n      callback.apply(this.$note[0], args);\n    }\n    this.$note.trigger('summernote.' + namespace, args);\n  }\n\n  initializeModule(key) {\n    const module = this.modules[key];\n    module.shouldInitialize = module.shouldInitialize || func.ok;\n    if (!module.shouldInitialize()) {\n      return;\n    }\n\n    // initialize module\n    if (module.initialize) {\n      module.initialize();\n    }\n\n    // attach events\n    if (module.events) {\n      dom.attachEvents(this.$note, module.events);\n    }\n  }\n\n  module(key, ModuleClass, withoutIntialize) {\n    if (arguments.length === 1) {\n      return this.modules[key];\n    }\n\n    this.modules[key] = new ModuleClass(this);\n\n    if (!withoutIntialize) {\n      this.initializeModule(key);\n    }\n  }\n\n  removeModule(key) {\n    const module = this.modules[key];\n    if (module.shouldInitialize()) {\n      if (module.events) {\n        dom.detachEvents(this.$note, module.events);\n      }\n\n      if (module.destroy) {\n        module.destroy();\n      }\n    }\n\n    delete this.modules[key];\n  }\n\n  memo(key, obj) {\n    if (arguments.length === 1) {\n      return this.memos[key];\n    }\n    this.memos[key] = obj;\n  }\n\n  removeMemo(key) {\n    if (this.memos[key] && this.memos[key].destroy) {\n      this.memos[key].destroy();\n    }\n\n    delete this.memos[key];\n  }\n\n  /**\n   * Some buttons need to change their visual style immediately once they get pressed\n   */\n  createInvokeHandlerAndUpdateState(namespace, value) {\n    return (event) => {\n      this.createInvokeHandler(namespace, value)(event);\n      this.invoke('buttons.updateCurrentStyle');\n    };\n  }\n\n  createInvokeHandler(namespace, value) {\n    return (event) => {\n      event.preventDefault();\n      const $target = $(event.target);\n      this.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);\n    };\n  }\n\n  invoke() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const splits = namespace.split('.');\n    const hasSeparator = splits.length > 1;\n    const moduleName = hasSeparator && lists.head(splits);\n    const methodName = hasSeparator ? lists.last(splits) : lists.head(splits);\n\n    const module = this.modules[moduleName || 'editor'];\n    if (!moduleName && this[methodName]) {\n      return this[methodName].apply(this, args);\n    } else if (module && module[methodName] && module.shouldInitialize()) {\n      return module[methodName].apply(module, args);\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from './env';\nimport func from './func';\nimport lists from './lists';\nimport dom from './dom';\n\n/**\n * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js\n *\n * @param {TextRange} textRange\n * @param {Boolean} isStart\n * @return {BoundaryPoint}\n *\n * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx\n */\nfunction textRangeToPoint(textRange, isStart) {\n  let container = textRange.parentElement();\n  let offset;\n\n  const tester = document.body.createTextRange();\n  let prevContainer;\n  const childNodes = lists.from(container.childNodes);\n  for (offset = 0; offset < childNodes.length; offset++) {\n    if (dom.isText(childNodes[offset])) {\n      continue;\n    }\n    tester.moveToElementText(childNodes[offset]);\n    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {\n      break;\n    }\n    prevContainer = childNodes[offset];\n  }\n\n  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {\n    const textRangeStart = document.body.createTextRange();\n    let curTextNode = null;\n    textRangeStart.moveToElementText(prevContainer || container);\n    textRangeStart.collapse(!prevContainer);\n    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;\n\n    const pointTester = textRange.duplicate();\n    pointTester.setEndPoint('StartToStart', textRangeStart);\n    let textCount = pointTester.text.replace(/[\\r\\n]/g, '').length;\n\n    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    // [workaround] enforce IE to re-reference curTextNode, hack\n    const dummy = curTextNode.nodeValue; // eslint-disable-line\n\n    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&\n      textCount === curTextNode.nodeValue.length) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    container = curTextNode;\n    offset = textCount;\n  }\n\n  return {\n    cont: container,\n    offset: offset,\n  };\n}\n\n/**\n * return TextRange from boundary point (inspired by google closure-library)\n * @param {BoundaryPoint} point\n * @return {TextRange}\n */\nfunction pointToTextRange(point) {\n  const textRangeInfo = function(container, offset) {\n    let node, isCollapseToStart;\n\n    if (dom.isText(container)) {\n      const prevTextNodes = dom.listPrev(container, func.not(dom.isText));\n      const prevContainer = lists.last(prevTextNodes).previousSibling;\n      node = prevContainer || container.parentNode;\n      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);\n      isCollapseToStart = !prevContainer;\n    } else {\n      node = container.childNodes[offset] || container;\n      if (dom.isText(node)) {\n        return textRangeInfo(node, 0);\n      }\n\n      offset = 0;\n      isCollapseToStart = false;\n    }\n\n    return {\n      node: node,\n      collapseToStart: isCollapseToStart,\n      offset: offset,\n    };\n  };\n\n  const textRange = document.body.createTextRange();\n  const info = textRangeInfo(point.node, point.offset);\n\n  textRange.moveToElementText(info.node);\n  textRange.collapse(info.collapseToStart);\n  textRange.moveStart('character', info.offset);\n  return textRange;\n}\n\n/**\n   * Wrapped Range\n   *\n   * @constructor\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   */\nclass WrappedRange {\n  constructor(sc, so, ec, eo) {\n    this.sc = sc;\n    this.so = so;\n    this.ec = ec;\n    this.eo = eo;\n\n    // isOnEditable: judge whether range is on editable or not\n    this.isOnEditable = this.makeIsOn(dom.isEditable);\n    // isOnList: judge whether range is on list node or not\n    this.isOnList = this.makeIsOn(dom.isList);\n    // isOnAnchor: judge whether range is on anchor node or not\n    this.isOnAnchor = this.makeIsOn(dom.isAnchor);\n    // isOnCell: judge whether range is on cell node or not\n    this.isOnCell = this.makeIsOn(dom.isCell);\n    // isOnData: judge whether range is on data node or not\n    this.isOnData = this.makeIsOn(dom.isData);\n  }\n\n  // nativeRange: get nativeRange from sc, so, ec, eo\n  nativeRange() {\n    if (env.isW3CRangeSupport) {\n      const w3cRange = document.createRange();\n      w3cRange.setStart(this.sc, this.so);\n      w3cRange.setEnd(this.ec, this.eo);\n\n      return w3cRange;\n    } else {\n      const textRange = pointToTextRange({\n        node: this.sc,\n        offset: this.so,\n      });\n\n      textRange.setEndPoint('EndToEnd', pointToTextRange({\n        node: this.ec,\n        offset: this.eo,\n      }));\n\n      return textRange;\n    }\n  }\n\n  getPoints() {\n    return {\n      sc: this.sc,\n      so: this.so,\n      ec: this.ec,\n      eo: this.eo,\n    };\n  }\n\n  getStartPoint() {\n    return {\n      node: this.sc,\n      offset: this.so,\n    };\n  }\n\n  getEndPoint() {\n    return {\n      node: this.ec,\n      offset: this.eo,\n    };\n  }\n\n  /**\n   * select update visible range\n   */\n  select() {\n    const nativeRng = this.nativeRange();\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (selection.rangeCount > 0) {\n        selection.removeAllRanges();\n      }\n      selection.addRange(nativeRng);\n    } else {\n      nativeRng.select();\n    }\n\n    return this;\n  }\n\n  /**\n   * Moves the scrollbar to start container(sc) of current range\n   *\n   * @return {WrappedRange}\n   */\n  scrollIntoView(container) {\n    const height = $(container).height();\n    if (container.scrollTop + height < this.sc.offsetTop) {\n      container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);\n    }\n\n    return this;\n  }\n\n  /**\n   * @return {WrappedRange}\n   */\n  normalize() {\n    /**\n     * @param {BoundaryPoint} point\n     * @param {Boolean} isLeftToRight - true: prefer to choose right node\n     *                                - false: prefer to choose left node\n     * @return {BoundaryPoint}\n     */\n    const getVisiblePoint = function(point, isLeftToRight) {\n      if (!point) {\n        return point;\n      }\n\n      // Just use the given point [XXX:Adhoc]\n      //  - case 01. if the point is on the middle of the node\n      //  - case 02. if the point is on the right edge and prefer to choose left node\n      //  - case 03. if the point is on the left edge and prefer to choose right node\n      //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void\n      //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void\n      //  - case 06. if the point is on the block node and there is no children\n      if (dom.isVisiblePoint(point)) {\n        if (!dom.isEdgePoint(point) ||\n            (dom.isRightEdgePoint(point) && !isLeftToRight) ||\n            (dom.isLeftEdgePoint(point) && isLeftToRight) ||\n            (dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling)) ||\n            (dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling)) ||\n            (dom.isBlock(point.node) && dom.isEmpty(point.node))) {\n          return point;\n        }\n      }\n\n      // point on block's edge\n      const block = dom.ancestor(point.node, dom.isBlock);\n      let hasRightNode = false;\n\n      if (!hasRightNode) {\n        const prevPoint = dom.prevPoint(point) || { node: null };\n        hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;\n      }\n\n      let hasLeftNode = false;\n      if (!hasLeftNode) {\n        const nextPoint = dom.nextPoint(point) || { node: null };\n        hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(nextPoint.node)) && isLeftToRight;\n      }\n\n      if (hasRightNode || hasLeftNode) {\n        // returns point already on visible point\n        if (dom.isVisiblePoint(point)) {\n          return point;\n        }\n        // reverse direction\n        isLeftToRight = !isLeftToRight;\n      }\n\n      const nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint)\n        : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);\n      return nextPoint || point;\n    };\n\n    const endPoint = getVisiblePoint(this.getEndPoint(), false);\n    const startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns matched nodes on range\n   *\n   * @param {Function} [pred] - predicate function\n   * @param {Object} [options]\n   * @param {Boolean} [options.includeAncestor]\n   * @param {Boolean} [options.fullyContains]\n   * @return {Node[]}\n   */\n  nodes(pred, options) {\n    pred = pred || func.ok;\n\n    const includeAncestor = options && options.includeAncestor;\n    const fullyContains = options && options.fullyContains;\n\n    // TODO compare points and sort\n    const startPoint = this.getStartPoint();\n    const endPoint = this.getEndPoint();\n\n    const nodes = [];\n    const leftEdgeNodes = [];\n\n    dom.walkPoint(startPoint, endPoint, function(point) {\n      if (dom.isEditable(point.node)) {\n        return;\n      }\n\n      let node;\n      if (fullyContains) {\n        if (dom.isLeftEdgePoint(point)) {\n          leftEdgeNodes.push(point.node);\n        }\n        if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {\n          node = point.node;\n        }\n      } else if (includeAncestor) {\n        node = dom.ancestor(point.node, pred);\n      } else {\n        node = point.node;\n      }\n\n      if (node && pred(node)) {\n        nodes.push(node);\n      }\n    }, true);\n\n    return lists.unique(nodes);\n  }\n\n  /**\n   * returns commonAncestor of range\n   * @return {Element} - commonAncestor\n   */\n  commonAncestor() {\n    return dom.commonAncestor(this.sc, this.ec);\n  }\n\n  /**\n   * returns expanded range by pred\n   *\n   * @param {Function} pred - predicate function\n   * @return {WrappedRange}\n   */\n  expand(pred) {\n    const startAncestor = dom.ancestor(this.sc, pred);\n    const endAncestor = dom.ancestor(this.ec, pred);\n\n    if (!startAncestor && !endAncestor) {\n      return new WrappedRange(this.sc, this.so, this.ec, this.eo);\n    }\n\n    const boundaryPoints = this.getPoints();\n\n    if (startAncestor) {\n      boundaryPoints.sc = startAncestor;\n      boundaryPoints.so = 0;\n    }\n\n    if (endAncestor) {\n      boundaryPoints.ec = endAncestor;\n      boundaryPoints.eo = dom.nodeLength(endAncestor);\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * @param {Boolean} isCollapseToStart\n   * @return {WrappedRange}\n   */\n  collapse(isCollapseToStart) {\n    if (isCollapseToStart) {\n      return new WrappedRange(this.sc, this.so, this.sc, this.so);\n    } else {\n      return new WrappedRange(this.ec, this.eo, this.ec, this.eo);\n    }\n  }\n\n  /**\n   * splitText on range\n   */\n  splitText() {\n    const isSameContainer = this.sc === this.ec;\n    const boundaryPoints = this.getPoints();\n\n    if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {\n      this.ec.splitText(this.eo);\n    }\n\n    if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {\n      boundaryPoints.sc = this.sc.splitText(this.so);\n      boundaryPoints.so = 0;\n\n      if (isSameContainer) {\n        boundaryPoints.ec = boundaryPoints.sc;\n        boundaryPoints.eo = this.eo - this.so;\n      }\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * delete contents on range\n   * @return {WrappedRange}\n   */\n  deleteContents() {\n    if (this.isCollapsed()) {\n      return this;\n    }\n\n    const rng = this.splitText();\n    const nodes = rng.nodes(null, {\n      fullyContains: true,\n    });\n\n    // find new cursor point\n    const point = dom.prevPointUntil(rng.getStartPoint(), function(point) {\n      return !lists.contains(nodes, point.node);\n    });\n\n    const emptyParents = [];\n    $.each(nodes, function(idx, node) {\n      // find empty parents\n      const parent = node.parentNode;\n      if (point.node !== parent && dom.nodeLength(parent) === 1) {\n        emptyParents.push(parent);\n      }\n      dom.remove(node, false);\n    });\n\n    // remove empty parents\n    $.each(emptyParents, function(idx, node) {\n      dom.remove(node, false);\n    });\n\n    return new WrappedRange(\n      point.node,\n      point.offset,\n      point.node,\n      point.offset\n    ).normalize();\n  }\n\n  /**\n   * makeIsOn: return isOn(pred) function\n   */\n  makeIsOn(pred) {\n    return function() {\n      const ancestor = dom.ancestor(this.sc, pred);\n      return !!ancestor && (ancestor === dom.ancestor(this.ec, pred));\n    };\n  }\n\n  /**\n   * @param {Function} pred\n   * @return {Boolean}\n   */\n  isLeftEdgeOf(pred) {\n    if (!dom.isLeftEdgePoint(this.getStartPoint())) {\n      return false;\n    }\n\n    const node = dom.ancestor(this.sc, pred);\n    return node && dom.isLeftEdgeOf(this.sc, node);\n  }\n\n  /**\n   * returns whether range was collapsed or not\n   */\n  isCollapsed() {\n    return this.sc === this.ec && this.so === this.eo;\n  }\n\n  /**\n   * wrap inline nodes which children of body with paragraph\n   *\n   * @return {WrappedRange}\n   */\n  wrapBodyInlineWithPara() {\n    if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {\n      this.sc.innerHTML = dom.emptyPara;\n      return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);\n    }\n\n    /**\n     * [workaround] firefox often create range on not visible point. so normalize here.\n     *  - firefox: |<p>text</p>|\n     *  - chrome: <p>|text|</p>\n     */\n    const rng = this.normalize();\n    if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {\n      return rng;\n    }\n\n    // find inline top ancestor\n    let topAncestor;\n    if (dom.isInline(rng.sc)) {\n      const ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));\n      topAncestor = lists.last(ancestors);\n      if (!dom.isInline(topAncestor)) {\n        topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];\n      }\n    } else {\n      topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];\n    }\n\n    if (topAncestor) {\n      // siblings not in paragraph\n      let inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();\n      inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));\n\n      // wrap with paragraph\n      if (inlineSiblings.length) {\n        const para = dom.wrap(lists.head(inlineSiblings), 'p');\n        dom.appendChildNodes(para, lists.tail(inlineSiblings));\n      }\n    }\n\n    return this.normalize();\n  }\n\n  /**\n   * insert node at current cursor\n   *\n   * @param {Node} node\n   * @return {Node}\n   */\n  insertNode(node) {\n    let rng = this;\n\n    if (dom.isText(node) || dom.isInline(node)) {\n      rng = this.wrapBodyInlineWithPara().deleteContents();\n    }\n\n    const info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));\n    if (info.rightNode) {\n      info.rightNode.parentNode.insertBefore(node, info.rightNode);\n      if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {\n        info.rightNode.parentNode.removeChild(info.rightNode);\n      }\n    } else {\n      info.container.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * insert html at current cursor\n   */\n  pasteHTML(markup) {\n    markup = $.trim(markup);\n\n    const contentsContainer = $('<div></div>').html(markup)[0];\n    let childNodes = lists.from(contentsContainer.childNodes);\n\n    // const rng = this.wrapBodyInlineWithPara().deleteContents();\n    const rng = this;\n    let reversed = false;\n\n    if (rng.so >= 0) {\n      childNodes = childNodes.reverse();\n      reversed = true;\n    }\n\n    childNodes = childNodes.map(function(childNode) {\n      return rng.insertNode(childNode);\n    });\n\n    if (reversed) {\n      childNodes = childNodes.reverse();\n    }\n    return childNodes;\n  }\n\n  /**\n   * returns text in range\n   *\n   * @return {String}\n   */\n  toString() {\n    const nativeRng = this.nativeRange();\n    return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;\n  }\n\n  /**\n   * returns range for word before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordRange(findAfter) {\n    let endPoint = this.getEndPoint();\n\n    if (!dom.isCharPoint(endPoint)) {\n      return this;\n    }\n\n    const startPoint = dom.prevPointUntil(endPoint, function(point) {\n      return !dom.isCharPoint(point);\n    });\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, function(point) {\n        return !dom.isCharPoint(point);\n      });\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordsRange(findAfter) {\n    var endPoint = this.getEndPoint();\n\n    var isNotTextPoint = function(point) {\n      return !dom.isCharPoint(point) && !dom.isSpacePoint(point);\n    };\n\n    if (isNotTextPoint(endPoint)) {\n      return this;\n    }\n\n    var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor that match with a Regex\n   *\n   * example:\n   *  range: 'hi @Peter Pan'\n   *  regex: '/@[a-z ]+/i'\n   *  return range: '@Peter Pan'\n   *\n   * @param {RegExp} [regex]\n   * @return {WrappedRange|null}\n   */\n  getWordsMatchRange(regex) {\n    var endPoint = this.getEndPoint();\n\n    var startPoint = dom.prevPointUntil(endPoint, function(point) {\n      if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {\n        return true;\n      }\n      var rng = new WrappedRange(\n        point.node,\n        point.offset,\n        endPoint.node,\n        endPoint.offset\n      );\n      var result = regex.exec(rng.toString());\n      return result && result.index === 0;\n    });\n\n    var rng = new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n\n    var text = rng.toString();\n    var result = regex.exec(text);\n\n    if (result && result[0].length === text.length) {\n      return rng;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * create offsetPath bookmark\n   *\n   * @param {Node} editable\n   */\n  bookmark(editable) {\n    return {\n      s: {\n        path: dom.makeOffsetPath(editable, this.sc),\n        offset: this.so,\n      },\n      e: {\n        path: dom.makeOffsetPath(editable, this.ec),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * create offsetPath bookmark base on paragraph\n   *\n   * @param {Node[]} paras\n   */\n  paraBookmark(paras) {\n    return {\n      s: {\n        path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),\n        offset: this.so,\n      },\n      e: {\n        path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * getClientRects\n   * @return {Rect[]}\n   */\n  getClientRects() {\n    const nativeRng = this.nativeRange();\n    return nativeRng.getClientRects();\n  }\n}\n\n/**\n * Data structure\n *  * BoundaryPoint: a point of dom tree\n *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range\n *\n * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position\n */\nexport default {\n  /**\n   * create Range Object From arguments or Browser Selection\n   *\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   * @return {WrappedRange}\n   */\n  create: function(sc, so, ec, eo) {\n    if (arguments.length === 4) {\n      return new WrappedRange(sc, so, ec, eo);\n    } else if (arguments.length === 2) { // collapsed\n      ec = sc;\n      eo = so;\n      return new WrappedRange(sc, so, ec, eo);\n    } else {\n      let wrappedRange = this.createFromSelection();\n\n      if (!wrappedRange && arguments.length === 1) {\n        let bodyElement = arguments[0];\n        if (dom.isEditable(bodyElement)) {\n          bodyElement = bodyElement.lastChild;\n        }\n        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);\n      }\n      return wrappedRange;\n    }\n  },\n\n  createFromBodyElement: function(bodyElement, isCollapseToStart = false) {\n    var wrappedRange = this.createFromNode(bodyElement);\n    return wrappedRange.collapse(isCollapseToStart);\n  },\n\n  createFromSelection: function() {\n    let sc, so, ec, eo;\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (!selection || selection.rangeCount === 0) {\n        return null;\n      } else if (dom.isBody(selection.anchorNode)) {\n        // Firefox: returns entire body as range on initialization.\n        // We won't never need it.\n        return null;\n      }\n\n      const nativeRng = selection.getRangeAt(0);\n      sc = nativeRng.startContainer;\n      so = nativeRng.startOffset;\n      ec = nativeRng.endContainer;\n      eo = nativeRng.endOffset;\n    } else { // IE8: TextRange\n      const textRange = document.selection.createRange();\n      const textRangeEnd = textRange.duplicate();\n      textRangeEnd.collapse(false);\n      const textRangeStart = textRange;\n      textRangeStart.collapse(true);\n\n      let startPoint = textRangeToPoint(textRangeStart, true);\n      let endPoint = textRangeToPoint(textRangeEnd, false);\n\n      // same visible point case: range was collapsed.\n      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&\n        dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&\n        endPoint.node.nextSibling === startPoint.node) {\n        startPoint = endPoint;\n      }\n\n      sc = startPoint.cont;\n      so = startPoint.offset;\n      ec = endPoint.cont;\n      eo = endPoint.offset;\n    }\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from node\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNode: function(node) {\n    let sc = node;\n    let so = 0;\n    let ec = node;\n    let eo = dom.nodeLength(ec);\n\n    // browsers can't target a picture or void node\n    if (dom.isVoid(sc)) {\n      so = dom.listPrev(sc).length - 1;\n      sc = sc.parentNode;\n    }\n    if (dom.isBR(ec)) {\n      eo = dom.listPrev(ec).length - 1;\n      ec = ec.parentNode;\n    } else if (dom.isVoid(ec)) {\n      eo = dom.listPrev(ec).length;\n      ec = ec.parentNode;\n    }\n\n    return this.create(sc, so, ec, eo);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeBefore: function(node) {\n    return this.createFromNode(node).collapse(true);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeAfter: function(node) {\n    return this.createFromNode(node).collapse();\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from bookmark\n   *\n   * @param {Node} editable\n   * @param {Object} bookmark\n   * @return {WrappedRange}\n   */\n  createFromBookmark: function(editable, bookmark) {\n    const sc = dom.fromOffsetPath(editable, bookmark.s.path);\n    const so = bookmark.s.offset;\n    const ec = dom.fromOffsetPath(editable, bookmark.e.path);\n    const eo = bookmark.e.offset;\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from paraBookmark\n   *\n   * @param {Object} bookmark\n   * @param {Node[]} paras\n   * @return {WrappedRange}\n   */\n  createFromParaBookmark: function(bookmark, paras) {\n    const so = bookmark.s.offset;\n    const eo = bookmark.e.offset;\n    const sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);\n    const ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n};\n","import $ from 'jquery';\nimport env from './base/core/env';\nimport lists from './base/core/lists';\nimport Context from './base/Context';\n\n$.fn.extend({\n  /**\n   * Summernote API\n   *\n   * @param {Object|String}\n   * @return {this}\n   */\n  summernote: function() {\n    const type = $.type(lists.head(arguments));\n    const isExternalAPICalled = type === 'string';\n    const hasInitOptions = type === 'object';\n\n    const options = $.extend({}, $.summernote.options, hasInitOptions ? lists.head(arguments) : {});\n\n    // Update options\n    options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);\n    options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons);\n    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;\n\n    this.each((idx, note) => {\n      const $note = $(note);\n      if (!$note.data('summernote')) {\n        const context = new Context($note, options);\n        $note.data('summernote', context);\n        $note.data('summernote').triggerEvent('init', context.layoutInfo);\n      }\n    });\n\n    const $note = this.first();\n    if ($note.length) {\n      const context = $note.data('summernote');\n      if (isExternalAPICalled) {\n        return context.invoke.apply(context, lists.from(arguments));\n      } else if (options.focus) {\n        context.invoke('editor.focus');\n      }\n    }\n\n    return this;\n  },\n});\n","import lists from './lists';\nimport func from './func';\n\nconst KEY_MAP = {\n  'BACKSPACE': 8,\n  'TAB': 9,\n  'ENTER': 13,\n  'ESCAPE': 27,\n  'SPACE': 32,\n  'DELETE': 46,\n\n  // Arrow\n  'LEFT': 37,\n  'UP': 38,\n  'RIGHT': 39,\n  'DOWN': 40,\n\n  // Number: 0-9\n  'NUM0': 48,\n  'NUM1': 49,\n  'NUM2': 50,\n  'NUM3': 51,\n  'NUM4': 52,\n  'NUM5': 53,\n  'NUM6': 54,\n  'NUM7': 55,\n  'NUM8': 56,\n\n  // Alphabet: a-z\n  'B': 66,\n  'E': 69,\n  'I': 73,\n  'J': 74,\n  'K': 75,\n  'L': 76,\n  'R': 82,\n  'S': 83,\n  'U': 85,\n  'V': 86,\n  'Y': 89,\n  'Z': 90,\n\n  'SLASH': 191,\n  'LEFTBRACKET': 219,\n  'BACKSLASH': 220,\n  'RIGHTBRACKET': 221,\n\n  // Navigation\n  'HOME': 36,\n  'END': 35,\n  'PAGEUP': 33,\n  'PAGEDOWN': 34,\n};\n\n/**\n * @class core.key\n *\n * Object for keycodes.\n *\n * @singleton\n * @alternateClassName key\n */\nexport default {\n  /**\n   * @method isEdit\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isEdit: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.BACKSPACE,\n      KEY_MAP.TAB,\n      KEY_MAP.ENTER,\n      KEY_MAP.SPACE,\n      KEY_MAP.DELETE,\n    ], keyCode);\n  },\n  /**\n   * @method isMove\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isMove: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.LEFT,\n      KEY_MAP.UP,\n      KEY_MAP.RIGHT,\n      KEY_MAP.DOWN,\n    ], keyCode);\n  },\n  /**\n   * @method isNavigation\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isNavigation: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.HOME,\n      KEY_MAP.END,\n      KEY_MAP.PAGEUP,\n      KEY_MAP.PAGEDOWN,\n    ], keyCode);\n  },\n  /**\n   * @property {Object} nameFromCode\n   * @property {String} nameFromCode.8 \"BACKSPACE\"\n   */\n  nameFromCode: func.invertObject(KEY_MAP),\n  code: KEY_MAP,\n};\n","import range from '../core/range';\n\nexport default class History {\n  constructor(context) {\n    this.stack = [];\n    this.stackOffset = -1;\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n    this.editable = this.$editable[0];\n  }\n\n  makeSnapshot() {\n    const rng = range.create(this.editable);\n    const emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };\n\n    return {\n      contents: this.$editable.html(),\n      bookmark: ((rng && rng.isOnEditable()) ? rng.bookmark(this.editable) : emptyBookmark),\n    };\n  }\n\n  applySnapshot(snapshot) {\n    if (snapshot.contents !== null) {\n      this.$editable.html(snapshot.contents);\n    }\n    if (snapshot.bookmark !== null) {\n      range.createFromBookmark(this.editable, snapshot.bookmark).select();\n    }\n  }\n\n  /**\n  * @method rewind\n  * Rewinds the history stack back to the first snapshot taken.\n  * Leaves the stack intact, so that \"Redo\" can still be used.\n  */\n  rewind() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    // Return to the first available snapshot.\n    this.stackOffset = 0;\n\n    // Apply that snapshot.\n    this.applySnapshot(this.stack[this.stackOffset]);\n  }\n\n  /**\n  *  @method commit\n  *  Resets history stack, but keeps current editor's content.\n  */\n  commit() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n  * @method reset\n  * Resets the history stack completely; reverting to an empty editor.\n  */\n  reset() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Clear the editable area.\n    this.$editable.html('');\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    if (this.stackOffset > 0) {\n      this.stackOffset--;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    if (this.stack.length - 1 > this.stackOffset) {\n      this.stackOffset++;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * recorded undo\n   */\n  recordUndo() {\n    this.stackOffset++;\n\n    // Wash out stack after stackOffset\n    if (this.stack.length > this.stackOffset) {\n      this.stack = this.stack.slice(0, this.stackOffset);\n    }\n\n    // Create new snapshot and push it to the end\n    this.stack.push(this.makeSnapshot());\n\n    // If the stack size reachs to the limit, then slice it\n    if (this.stack.length > this.context.options.historyLimit) {\n      this.stack.shift();\n      this.stackOffset -= 1;\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class Style {\n  /**\n   * @method jQueryCSS\n   *\n   * [workaround] for old jQuery\n   * passing an array of style properties to .css()\n   * will result in an object of property-value pairs.\n   * (compability with version < 1.9)\n   *\n   * @private\n   * @param  {jQuery} $obj\n   * @param  {Array} propertyNames - An array of one or more CSS properties.\n   * @return {Object}\n   */\n  jQueryCSS($obj, propertyNames) {\n    if (env.jqueryVersion < 1.9) {\n      const result = {};\n      $.each(propertyNames, (idx, propertyName) => {\n        result[propertyName] = $obj.css(propertyName);\n      });\n      return result;\n    }\n    return $obj.css(propertyNames);\n  }\n\n  /**\n   * returns style object from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  fromNode($node) {\n    const properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];\n    const styleInfo = this.jQueryCSS($node, properties) || {};\n\n    const fontSize = $node[0].style.fontSize || styleInfo['font-size'];\n\n    styleInfo['font-size'] = parseInt(fontSize, 10);\n    styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);\n\n    return styleInfo;\n  }\n\n  /**\n   * paragraph level style\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} styleInfo\n   */\n  stylePara(rng, styleInfo) {\n    $.each(rng.nodes(dom.isPara, {\n      includeAncestor: true,\n    }), (idx, para) => {\n      $(para).css(styleInfo);\n    });\n  }\n\n  /**\n   * insert and returns styleNodes on range.\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} [options] - options for styleNodes\n   * @param {String} [options.nodeName] - default: `SPAN`\n   * @param {Boolean} [options.expandClosestSibling] - default: `false`\n   * @param {Boolean} [options.onlyPartialContains] - default: `false`\n   * @return {Node[]}\n   */\n  styleNodes(rng, options) {\n    rng = rng.splitText();\n\n    const nodeName = (options && options.nodeName) || 'SPAN';\n    const expandClosestSibling = !!(options && options.expandClosestSibling);\n    const onlyPartialContains = !!(options && options.onlyPartialContains);\n\n    if (rng.isCollapsed()) {\n      return [rng.insertNode(dom.create(nodeName))];\n    }\n\n    let pred = dom.makePredByNodeName(nodeName);\n    const nodes = rng.nodes(dom.isText, {\n      fullyContains: true,\n    }).map((text) => {\n      return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);\n    });\n\n    if (expandClosestSibling) {\n      if (onlyPartialContains) {\n        const nodesInRange = rng.nodes();\n        // compose with partial contains predication\n        pred = func.and(pred, (node) => {\n          return lists.contains(nodesInRange, node);\n        });\n      }\n\n      return nodes.map((node) => {\n        const siblings = dom.withClosestSiblings(node, pred);\n        const head = lists.head(siblings);\n        const tails = lists.tail(siblings);\n        $.each(tails, (idx, elem) => {\n          dom.appendChildNodes(head, elem.childNodes);\n          dom.remove(elem);\n        });\n        return lists.head(siblings);\n      });\n    } else {\n      return nodes;\n    }\n  }\n\n  /**\n   * get current style on cursor\n   *\n   * @param {WrappedRange} rng\n   * @return {Object} - object contains style properties.\n   */\n  current(rng) {\n    const $cont = $(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);\n    let styleInfo = this.fromNode($cont);\n\n    // document.queryCommandState for toggle state\n    // [workaround] prevent Firefox nsresult: \"0x80004005 (NS_ERROR_FAILURE)\"\n    try {\n      styleInfo = $.extend(styleInfo, {\n        'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',\n        'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',\n        'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',\n        'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',\n        'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',\n        'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',\n        'font-family': document.queryCommandValue('fontname') || styleInfo['font-family'],\n      });\n    } catch (e) {\n      // eslint-disable-next-line\n    }\n\n    // list-style-type to list-style(unordered, ordered)\n    if (!rng.isOnList()) {\n      styleInfo['list-style'] = 'none';\n    } else {\n      const orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];\n      const isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;\n      styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';\n    }\n\n    const para = dom.ancestor(rng.sc, dom.isPara);\n    if (para && para.style['line-height']) {\n      styleInfo['line-height'] = para.style.lineHeight;\n    } else {\n      const lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);\n      styleInfo['line-height'] = lineHeight.toFixed(1);\n    }\n\n    styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);\n    styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);\n    styleInfo.range = rng;\n\n    return styleInfo;\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport func from '../core/func';\nimport dom from '../core/dom';\nimport range from '../core/range';\n\nexport default class Bullet {\n  /**\n   * toggle ordered list\n   */\n  insertOrderedList(editable) {\n    this.toggleList('OL', editable);\n  }\n\n  /**\n   * toggle unordered list\n   */\n  insertUnorderedList(editable) {\n    this.toggleList('UL', editable);\n  }\n\n  /**\n   * indent\n   */\n  indent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        const previousList = this.findList(head.previousSibling);\n        if (previousList) {\n          paras\n            .map(para => previousList.appendChild(para));\n        } else {\n          this.wrapList(paras, head.parentNode.nodeName);\n          paras\n            .map((para) => para.parentNode)\n            .map((para) => this.appendToPrevious(para));\n        }\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            return (parseInt(val, 10) || 0) + 25;\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * outdent\n   */\n  outdent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        this.releaseList([paras]);\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            val = (parseInt(val, 10) || 0);\n            return val > 25 ? val - 25 : '';\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * toggle list\n   *\n   * @param {String} listName - OL or UL\n   */\n  toggleList(listName, editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    let paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const bookmark = rng.paraBookmark(paras);\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    // paragraph to list\n    if (lists.find(paras, dom.isPurePara)) {\n      let wrappedParas = [];\n      $.each(clustereds, (idx, paras) => {\n        wrappedParas = wrappedParas.concat(this.wrapList(paras, listName));\n      });\n      paras = wrappedParas;\n    // list to paragraph or change list style\n    } else {\n      const diffLists = rng.nodes(dom.isList, {\n        includeAncestor: true,\n      }).filter((listNode) => {\n        return !$.nodeName(listNode, listName);\n      });\n\n      if (diffLists.length) {\n        $.each(diffLists, (idx, listNode) => {\n          dom.replace(listNode, listName);\n        });\n      } else {\n        paras = this.releaseList(clustereds, true);\n      }\n    }\n\n    range.createFromParaBookmark(bookmark, paras).select();\n  }\n\n  /**\n   * @param {Node[]} paras\n   * @param {String} listName\n   * @return {Node[]}\n   */\n  wrapList(paras, listName) {\n    const head = lists.head(paras);\n    const last = lists.last(paras);\n\n    const prevList = dom.isList(head.previousSibling) && head.previousSibling;\n    const nextList = dom.isList(last.nextSibling) && last.nextSibling;\n\n    const listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);\n\n    // P to LI\n    paras = paras.map((para) => {\n      return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;\n    });\n\n    // append to list(<ul>, <ol>)\n    dom.appendChildNodes(listNode, paras);\n\n    if (nextList) {\n      dom.appendChildNodes(listNode, lists.from(nextList.childNodes));\n      dom.remove(nextList);\n    }\n\n    return paras;\n  }\n\n  /**\n   * @method releaseList\n   *\n   * @param {Array[]} clustereds\n   * @param {Boolean} isEscapseToBody\n   * @return {Node[]}\n   */\n  releaseList(clustereds, isEscapseToBody) {\n    let releasedParas = [];\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      const last = lists.last(paras);\n\n      const headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;\n      const parentItem = headList.parentNode;\n\n      if (headList.parentNode.nodeName === 'LI') {\n        paras.map(para => {\n          const newList = this.findNextSiblings(para);\n\n          if (parentItem.nextSibling) {\n            parentItem.parentNode.insertBefore(\n              para,\n              parentItem.nextSibling\n            );\n          } else {\n            parentItem.parentNode.appendChild(para);\n          }\n\n          if (newList.length) {\n            this.wrapList(newList, headList.nodeName);\n            para.appendChild(newList[0].parentNode);\n          }\n        });\n\n        if (headList.children.length === 0) {\n          parentItem.removeChild(headList);\n        }\n\n        if (parentItem.childNodes.length === 0) {\n          parentItem.parentNode.removeChild(parentItem);\n        }\n      } else {\n        const lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {\n          node: last.parentNode,\n          offset: dom.position(last) + 1,\n        }, {\n          isSkipPaddingBlankHTML: true,\n        }) : null;\n\n        const middleList = dom.splitTree(headList, {\n          node: head.parentNode,\n          offset: dom.position(head),\n        }, {\n          isSkipPaddingBlankHTML: true,\n        });\n\n        paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi)\n          : lists.from(middleList.childNodes).filter(dom.isLi);\n\n        // LI to P\n        if (isEscapseToBody || !dom.isList(headList.parentNode)) {\n          paras = paras.map((para) => {\n            return dom.replace(para, 'P');\n          });\n        }\n\n        $.each(lists.from(paras).reverse(), (idx, para) => {\n          dom.insertAfter(para, headList);\n        });\n\n        // remove empty lists\n        const rootLists = lists.compact([headList, middleList, lastList]);\n        $.each(rootLists, (idx, rootList) => {\n          const listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));\n          $.each(listNodes.reverse(), (idx, listNode) => {\n            if (!dom.nodeLength(listNode)) {\n              dom.remove(listNode, true);\n            }\n          });\n        });\n      }\n\n      releasedParas = releasedParas.concat(paras);\n    });\n\n    return releasedParas;\n  }\n\n  /**\n   * @method appendToPrevious\n   *\n   * Appends list to previous list item, if\n   * none exist it wraps the list in a new list item.\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  appendToPrevious(node) {\n    return node.previousSibling\n      ? dom.appendChildNodes(node.previousSibling, [node])\n      : this.wrapList([node], 'LI');\n  }\n\n  /**\n   * @method findList\n   *\n   * Finds an existing list in list item\n   *\n   * @param {HTMLNode} ListItem\n   * @return {Array[]}\n   */\n  findList(node) {\n    return node\n      ? lists.find(node.children, child => ['OL', 'UL'].indexOf(child.nodeName) > -1)\n      : null;\n  }\n\n  /**\n   * @method findNextSiblings\n   *\n   * Finds all list item siblings that follow it\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  findNextSiblings(node) {\n    const siblings = [];\n    while (node.nextSibling) {\n      siblings.push(node.nextSibling);\n      node = node.nextSibling;\n    }\n    return siblings;\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport Bullet from '../editing/Bullet';\n\n/**\n * @class editing.Typing\n *\n * Typing\n *\n */\nexport default class Typing {\n  constructor(context) {\n    // a Bullet instance to toggle lists off\n    this.bullet = new Bullet();\n    this.options = context.options;\n  }\n\n  /**\n   * insert tab\n   *\n   * @param {WrappedRange} rng\n   * @param {Number} tabsize\n   */\n  insertTab(rng, tabsize) {\n    const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));\n    rng = rng.deleteContents();\n    rng.insertNode(tab, true);\n\n    rng = range.create(tab, tabsize);\n    rng.select();\n  }\n\n  /**\n   * insert paragraph\n   *\n   * @param {jQuery} $editable\n   * @param {WrappedRange} rng Can be used in unit tests to \"mock\" the range\n   *\n   * blockquoteBreakingLevel\n   *   0 - No break, the new paragraph remains inside the quote\n   *   1 - Break the first blockquote in the ancestors list\n   *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)\n   */\n  insertParagraph(editable, rng) {\n    rng = rng || range.create(editable);\n\n    // deleteContents on range.\n    rng = rng.deleteContents();\n\n    // Wrap range if it needs to be wrapped by paragraph\n    rng = rng.wrapBodyInlineWithPara();\n\n    // finding paragraph\n    const splitRoot = dom.ancestor(rng.sc, dom.isPara);\n\n    let nextPara;\n    // on paragraph: split paragraph\n    if (splitRoot) {\n      // if it is an empty line with li\n      if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {\n        // toggle UL/OL and escape\n        this.bullet.toggleList(splitRoot.parentNode.nodeName);\n        return;\n      } else {\n        let blockquote = null;\n        if (this.options.blockquoteBreakingLevel === 1) {\n          blockquote = dom.ancestor(splitRoot, dom.isBlockquote);\n        } else if (this.options.blockquoteBreakingLevel === 2) {\n          blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);\n        }\n\n        if (blockquote) {\n          // We're inside a blockquote and options ask us to break it\n          nextPara = $(dom.emptyPara)[0];\n          // If the split is right before a <br>, remove it so that there's no \"empty line\"\n          // after the split in the new blockquote created\n          if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {\n            $(rng.sc.nextSibling).remove();\n          }\n          const split = dom.splitTree(blockquote, rng.getStartPoint(), { isDiscardEmptySplits: true });\n          if (split) {\n            split.parentNode.insertBefore(nextPara, split);\n          } else {\n            dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote\n          }\n        } else {\n          nextPara = dom.splitTree(splitRoot, rng.getStartPoint());\n\n          // not a blockquote, just insert the paragraph\n          let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);\n          emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));\n\n          $.each(emptyAnchors, (idx, anchor) => {\n            dom.remove(anchor);\n          });\n\n          // replace empty heading, pre or custom-made styleTag with P tag\n          if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {\n            nextPara = dom.replace(nextPara, 'p');\n          }\n        }\n      }\n    // no paragraph: insert empty paragraph\n    } else {\n      const next = rng.sc.childNodes[rng.so];\n      nextPara = $(dom.emptyPara)[0];\n      if (next) {\n        rng.sc.insertBefore(nextPara, next);\n      } else {\n        rng.sc.appendChild(nextPara);\n      }\n    }\n\n    range.create(nextPara, 0).normalize().select().scrollIntoView(editable);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport lists from '../core/lists';\n\n/**\n * @class Create a virtual table to create what actions to do in change.\n * @param {object} startPoint Cell selected to apply change.\n * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where\n * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction\n * @param {object} domTable Dom element of table to make changes.\n */\nconst TableResultAction = function(startPoint, where, action, domTable) {\n  const _startPoint = { 'colPos': 0, 'rowPos': 0 };\n  const _virtualTable = [];\n  const _actionCellList = [];\n\n  /// ///////////////////////////////////////////\n  // Private functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Set the startPoint of action.\n   */\n  function setStartPoint() {\n    if (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {\n      // Impossible to identify start Cell point\n      return;\n    }\n    _startPoint.colPos = startPoint.cellIndex;\n    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {\n      // Impossible to identify start Row point\n      return;\n    }\n    _startPoint.rowPos = startPoint.parentElement.rowIndex;\n  }\n\n  /**\n   * Define virtual table position info object.\n   *\n   * @param {int} rowIndex Index position in line of virtual table.\n   * @param {int} cellIndex Index position in column of virtual table.\n   * @param {object} baseRow Row affected by this position.\n   * @param {object} baseCell Cell affected by this position.\n   * @param {bool} isSpan Inform if it is an span cell/row.\n   */\n  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {\n    const objPosition = {\n      'baseRow': baseRow,\n      'baseCell': baseCell,\n      'isRowSpan': isRowSpan,\n      'isColSpan': isColSpan,\n      'isVirtual': isVirtualCell,\n    };\n    if (!_virtualTable[rowIndex]) {\n      _virtualTable[rowIndex] = [];\n    }\n    _virtualTable[rowIndex][cellIndex] = objPosition;\n  }\n\n  /**\n   * Create action cell object.\n   *\n   * @param {object} virtualTableCellObj Object of specific position on virtual table.\n   * @param {enum} resultAction Action to be applied in that item.\n   */\n  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {\n    return {\n      'baseCell': virtualTableCellObj.baseCell,\n      'action': resultAction,\n      'virtualTable': {\n        'rowIndex': virtualRowPosition,\n        'cellIndex': virtualColPosition,\n      },\n    };\n  }\n\n  /**\n   * Recover free index of row to append Cell.\n   *\n   * @param {int} rowIndex Index of row to find free space.\n   * @param {int} cellIndex Index of cell to find free space in table.\n   */\n  function recoverCellIndex(rowIndex, cellIndex) {\n    if (!_virtualTable[rowIndex]) {\n      return cellIndex;\n    }\n    if (!_virtualTable[rowIndex][cellIndex]) {\n      return cellIndex;\n    }\n\n    let newCellIndex = cellIndex;\n    while (_virtualTable[rowIndex][newCellIndex]) {\n      newCellIndex++;\n      if (!_virtualTable[rowIndex][newCellIndex]) {\n        return newCellIndex;\n      }\n    }\n  }\n\n  /**\n   * Recover info about row and cell and add information to virtual table.\n   *\n   * @param {object} row Row to recover information.\n   * @param {object} cell Cell to recover information.\n   */\n  function addCellInfoToVirtual(row, cell) {\n    const cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);\n    const cellHasColspan = (cell.colSpan > 1);\n    const cellHasRowspan = (cell.rowSpan > 1);\n    const isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);\n    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);\n\n    // Add span rows to virtual Table.\n    const rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;\n    if (rowspanNumber > 1) {\n      for (let rp = 1; rp < rowspanNumber; rp++) {\n        const rowspanIndex = row.rowIndex + rp;\n        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);\n      }\n    }\n\n    // Add span cols to virtual table.\n    const colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;\n    if (colspanNumber > 1) {\n      for (let cp = 1; cp < colspanNumber; cp++) {\n        const cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));\n        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);\n      }\n    }\n  }\n\n  /**\n   * Process validation and adjust of start point if needed\n   *\n   * @param {int} rowIndex\n   * @param {int} cellIndex\n   * @param {object} cell\n   * @param {bool} isSelectedCell\n   */\n  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {\n    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {\n      _startPoint.colPos++;\n    }\n  }\n\n  /**\n   * Create virtual table of cells with all cells, including span cells.\n   */\n  function createVirtualTable() {\n    const rows = domTable.rows;\n    for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      const cells = rows[rowIndex].cells;\n      for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);\n      }\n    }\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getDeleteResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (!cell.isVirtual && cell.isRowSpan) {\n          return TableResultAction.resultAction.AddCell;\n        } else if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.RemoveCell;\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getAddResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isRowSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isColSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.AddCell;\n  }\n\n  function init() {\n    setStartPoint();\n    createVirtualTable();\n  }\n\n  /// ///////////////////////////////////////////\n  // Public functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Recover array os what to do in table.\n   */\n  this.getActionList = function() {\n    const fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;\n    const fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;\n\n    let actualPosition = 0;\n    let canContinue = true;\n    while (canContinue) {\n      const rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;\n      const colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;\n      const row = _virtualTable[rowPosition];\n      if (!row) {\n        canContinue = false;\n        return _actionCellList;\n      }\n      const cell = row[colPosition];\n      if (!cell) {\n        canContinue = false;\n        return _actionCellList;\n      }\n\n      // Define action to be applied in this cell\n      let resultAction = TableResultAction.resultAction.Ignore;\n      switch (action) {\n        case TableResultAction.requestAction.Add:\n          resultAction = getAddResultActionToCell(cell);\n          break;\n        case TableResultAction.requestAction.Delete:\n          resultAction = getDeleteResultActionToCell(cell);\n          break;\n      }\n      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));\n      actualPosition++;\n    }\n\n    return _actionCellList;\n  };\n\n  init();\n};\n/**\n*\n* Where action occours enum.\n*/\nTableResultAction.where = { 'Row': 0, 'Column': 1 };\n/**\n*\n* Requested action to apply enum.\n*/\nTableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };\n/**\n*\n* Result action to be executed enum.\n*/\nTableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };\n\n/**\n *\n * @class editing.Table\n *\n * Table\n *\n */\nexport default class Table {\n  /**\n   * handle tab key\n   *\n   * @param {WrappedRange} rng\n   * @param {Boolean} isShift\n   */\n  tab(rng, isShift) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const table = dom.ancestor(cell, dom.isTable);\n    const cells = dom.listDescendant(table, dom.isCell);\n\n    const nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);\n    if (nextCell) {\n      range.create(nextCell, 0).select();\n    }\n  }\n\n  /**\n   * Add a new row\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (top/bottom)\n   * @return {Node}\n   */\n  addRow(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n\n    const currentTr = $(cell).closest('tr');\n    const trAttributes = this.recoverAttributes(currentTr);\n    const html = $('<tr' + trAttributes + '></tr>');\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Add, $(currentTr).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let idCell = 0; idCell < actions.length; idCell++) {\n      const currentCell = actions[idCell];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          {\n            if (position === 'top') {\n              const baseCellTr = currentCell.baseCell.parent;\n              const isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;\n              if (isTopFromRowSpan) {\n                const newTd = $('<div></div>').append($('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();\n                html.append(newTd);\n                break;\n              }\n            }\n            let rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);\n            rowspanNumber++;\n            currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);\n          }\n          break;\n      }\n    }\n\n    if (position === 'top') {\n      currentTr.before(html);\n    } else {\n      const cellHasRowspan = (cell.rowSpan > 1);\n      if (cellHasRowspan) {\n        const lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);\n        $($(currentTr).parent().find('tr')[lastTrIndex]).after($(html));\n        return;\n      }\n      currentTr.after(html);\n    }\n  }\n\n  /**\n   * Add a new col\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (left/right)\n   * @return {Node}\n   */\n  addCol(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const rowsGroup = $(row).siblings();\n    rowsGroup.push(row);\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Add, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      const currentCell = actions[actionIndex];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          if (position === 'right') {\n            $(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          if (position === 'right') {\n            let colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);\n            colspanNumber++;\n            currentCell.baseCell.setAttribute('colSpan', colspanNumber);\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n      }\n    }\n  }\n\n  /*\n  * Copy attributes from element.\n  *\n  * @param {object} Element to recover attributes.\n  * @return {string} Copied string elements.\n  */\n  recoverAttributes(el) {\n    let resultStr = '';\n\n    if (!el) {\n      return resultStr;\n    }\n\n    const attrList = el.attributes || [];\n\n    for (let i = 0; i < attrList.length; i++) {\n      if (attrList[i].name.toLowerCase() === 'id') {\n        continue;\n      }\n\n      if (attrList[i].specified) {\n        resultStr += ' ' + attrList[i].name + '=\\'' + attrList[i].value + '\\'';\n      }\n    }\n\n    return resultStr;\n  }\n\n  /**\n   * Delete current row\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteRow(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n    const rowPos = row[0].rowIndex;\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n\n      const baseCell = actions[actionIndex].baseCell;\n      const virtualPosition = actions[actionIndex].virtualTable;\n      const hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);\n      let rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.AddCell:\n          {\n            const nextRow = row.next('tr')[0];\n            if (!nextRow) { continue; }\n            const cloneRow = row[0].cells[cellPos];\n            if (hasRowspan) {\n              if (rowspanNumber > 2) {\n                rowspanNumber--;\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);\n                nextRow.cells[cellPos].innerHTML = '';\n              } else if (rowspanNumber === 2) {\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].removeAttribute('rowSpan');\n                nextRow.cells[cellPos].innerHTML = '';\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          if (hasRowspan) {\n            if (rowspanNumber > 2) {\n              rowspanNumber--;\n              baseCell.setAttribute('rowSpan', rowspanNumber);\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            } else if (rowspanNumber === 2) {\n              baseCell.removeAttribute('rowSpan');\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          // Do not need remove cell because row will be deleted.\n          continue;\n      }\n    }\n    row.remove();\n  }\n\n  /**\n   * Delete current col\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteCol(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          {\n            const baseCell = actions[actionIndex].baseCell;\n            const hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);\n            if (hasColspan) {\n              let colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;\n              if (colspanNumber > 2) {\n                colspanNumber--;\n                baseCell.setAttribute('colSpan', colspanNumber);\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              } else if (colspanNumber === 2) {\n                baseCell.removeAttribute('colSpan');\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          dom.remove(actions[actionIndex].baseCell, true);\n          continue;\n      }\n    }\n  }\n\n  /**\n   * create empty table element\n   *\n   * @param {Number} rowCount\n   * @param {Number} colCount\n   * @return {Node}\n   */\n  createTable(colCount, rowCount, options) {\n    const tds = [];\n    let tdHTML;\n    for (let idxCol = 0; idxCol < colCount; idxCol++) {\n      tds.push('<td>' + dom.blank + '</td>');\n    }\n    tdHTML = tds.join('');\n\n    const trs = [];\n    let trHTML;\n    for (let idxRow = 0; idxRow < rowCount; idxRow++) {\n      trs.push('<tr>' + tdHTML + '</tr>');\n    }\n    trHTML = trs.join('');\n    const $table = $('<table>' + trHTML + '</table>');\n    if (options && options.tableClassName) {\n      $table.addClass(options.tableClassName);\n    }\n\n    return $table[0];\n  }\n\n  /**\n   * Delete current table\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteTable(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    $(cell).closest('table').remove();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport { readFileAsDataURL, createImage } from '../core/async';\nimport History from '../editing/History';\nimport Style from '../editing/Style';\nimport Typing from '../editing/Typing';\nimport Table from '../editing/Table';\nimport Bullet from '../editing/Bullet';\n\nconst KEY_BOGUS = 'bogus';\n\n/**\n * @class Editor\n */\nexport default class Editor {\n  constructor(context) {\n    this.context = context;\n\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.editable = this.$editable[0];\n    this.lastRange = null;\n    this.snapshot = null;\n\n    this.style = new Style();\n    this.table = new Table();\n    this.typing = new Typing(context);\n    this.bullet = new Bullet();\n    this.history = new History(context);\n\n    this.context.memo('help.escape', this.lang.help.escape);\n    this.context.memo('help.undo', this.lang.help.undo);\n    this.context.memo('help.redo', this.lang.help.redo);\n    this.context.memo('help.tab', this.lang.help.tab);\n    this.context.memo('help.untab', this.lang.help.untab);\n    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);\n    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);\n    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);\n    this.context.memo('help.indent', this.lang.help.indent);\n    this.context.memo('help.outdent', this.lang.help.outdent);\n    this.context.memo('help.formatPara', this.lang.help.formatPara);\n    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);\n    this.context.memo('help.fontName', this.lang.help.fontName);\n\n    // native commands(with execCommand), generate function for execCommand\n    const commands = [\n      'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',\n      'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n      'formatBlock', 'removeFormat', 'backColor',\n    ];\n\n    for (let idx = 0, len = commands.length; idx < len; idx++) {\n      this[commands[idx]] = ((sCmd) => {\n        return (value) => {\n          this.beforeCommand();\n          document.execCommand(sCmd, false, value);\n          this.afterCommand(true);\n        };\n      })(commands[idx]);\n      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);\n    }\n\n    this.fontName = this.wrapCommand((value) => {\n      return this.fontStyling('font-family', env.validFontName(value));\n    });\n\n    this.fontSize = this.wrapCommand((value) => {\n      const unit = this.currentStyle()['font-size-unit'];\n      return this.fontStyling('font-size', value + unit);\n    });\n\n    this.fontSizeUnit = this.wrapCommand((value) => {\n      const size = this.currentStyle()['font-size'];\n      return this.fontStyling('font-size', size + value);\n    });\n\n    for (let idx = 1; idx <= 6; idx++) {\n      this['formatH' + idx] = ((idx) => {\n        return () => {\n          this.formatBlock('H' + idx);\n        };\n      })(idx);\n      this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);\n    }\n\n    this.insertParagraph = this.wrapCommand(() => {\n      this.typing.insertParagraph(this.editable);\n    });\n\n    this.insertOrderedList = this.wrapCommand(() => {\n      this.bullet.insertOrderedList(this.editable);\n    });\n\n    this.insertUnorderedList = this.wrapCommand(() => {\n      this.bullet.insertUnorderedList(this.editable);\n    });\n\n    this.indent = this.wrapCommand(() => {\n      this.bullet.indent(this.editable);\n    });\n\n    this.outdent = this.wrapCommand(() => {\n      this.bullet.outdent(this.editable);\n    });\n\n    /**\n     * insertNode\n     * insert node\n     * @param {Node} node\n     */\n    this.insertNode = this.wrapCommand((node) => {\n      if (this.isLimited($(node).text().length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      rng.insertNode(node);\n      this.setLastRange(range.createFromNodeAfter(node).select());\n    });\n\n    /**\n     * insert text\n     * @param {String} text\n     */\n    this.insertText = this.wrapCommand((text) => {\n      if (this.isLimited(text.length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      const textNode = rng.insertNode(dom.createText(text));\n      this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());\n    });\n\n    /**\n     * paste HTML\n     * @param {String} markup\n     */\n    this.pasteHTML = this.wrapCommand((markup) => {\n      if (this.isLimited(markup.length)) {\n        return;\n      }\n      markup = this.context.invoke('codeview.purify', markup);\n      const contents = this.getLastRange().pasteHTML(markup);\n      this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());\n    });\n\n    /**\n     * formatBlock\n     *\n     * @param {String} tagName\n     */\n    this.formatBlock = this.wrapCommand((tagName, $target) => {\n      const onApplyCustomStyle = this.options.callbacks.onApplyCustomStyle;\n      if (onApplyCustomStyle) {\n        onApplyCustomStyle.call(this, $target, this.context, this.onFormatBlock);\n      } else {\n        this.onFormatBlock(tagName, $target);\n      }\n    });\n\n    /**\n     * insert horizontal rule\n     */\n    this.insertHorizontalRule = this.wrapCommand(() => {\n      const hrNode = this.getLastRange().insertNode(dom.create('HR'));\n      if (hrNode.nextSibling) {\n        this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());\n      }\n    });\n\n    /**\n     * lineHeight\n     * @param {String} value\n     */\n    this.lineHeight = this.wrapCommand((value) => {\n      this.style.stylePara(this.getLastRange(), {\n        lineHeight: value,\n      });\n    });\n\n    /**\n     * create link (command)\n     *\n     * @param {Object} linkInfo\n     */\n    this.createLink = this.wrapCommand((linkInfo) => {\n      let linkUrl = linkInfo.url;\n      const linkText = linkInfo.text;\n      const isNewWindow = linkInfo.isNewWindow;\n      const checkProtocol = linkInfo.checkProtocol;\n      let rng = linkInfo.range || this.getLastRange();\n      const additionalTextLength = linkText.length - rng.toString().length;\n      if (additionalTextLength > 0 && this.isLimited(additionalTextLength)) {\n        return;\n      }\n      const isTextChanged = rng.toString() !== linkText;\n\n      // handle spaced urls from input\n      if (typeof linkUrl === 'string') {\n        linkUrl = linkUrl.trim();\n      }\n\n      if (this.options.onCreateLink) {\n        linkUrl = this.options.onCreateLink(linkUrl);\n      } else if (checkProtocol) {\n        // if url doesn't have any protocol and not even a relative or a label, use http:// as default\n        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\\:|#|\\/)/.test(linkUrl)\n          ? linkUrl : this.options.defaultProtocol + linkUrl;\n      }\n\n      let anchors = [];\n      if (isTextChanged) {\n        rng = rng.deleteContents();\n        const anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);\n        anchors.push(anchor);\n      } else {\n        anchors = this.style.styleNodes(rng, {\n          nodeName: 'A',\n          expandClosestSibling: true,\n          onlyPartialContains: true,\n        });\n      }\n\n      $.each(anchors, (idx, anchor) => {\n        $(anchor).attr('href', linkUrl);\n        if (isNewWindow) {\n          $(anchor).attr('target', '_blank');\n        } else {\n          $(anchor).removeAttr('target');\n        }\n      });\n\n      this.setLastRange(\n        this.createRangeFromList(anchors).select()\n      );\n    });\n\n    /**\n     * setting color\n     *\n     * @param {Object} sObjColor  color code\n     * @param {String} sObjColor.foreColor foreground color\n     * @param {String} sObjColor.backColor background color\n     */\n    this.color = this.wrapCommand((colorInfo) => {\n      const foreColor = colorInfo.foreColor;\n      const backColor = colorInfo.backColor;\n\n      if (foreColor) { document.execCommand('foreColor', false, foreColor); }\n      if (backColor) { document.execCommand('backColor', false, backColor); }\n    });\n\n    /**\n     * Set foreground color\n     *\n     * @param {String} colorCode foreground color code\n     */\n    this.foreColor = this.wrapCommand((colorInfo) => {\n      document.execCommand('foreColor', false, colorInfo);\n    });\n\n    /**\n     * insert Table\n     *\n     * @param {String} dimension of table (ex : \"5x5\")\n     */\n    this.insertTable = this.wrapCommand((dim) => {\n      const dimension = dim.split('x');\n\n      const rng = this.getLastRange().deleteContents();\n      rng.insertNode(this.table.createTable(dimension[0], dimension[1], this.options));\n    });\n\n    /**\n     * remove media object and Figure Elements if media object is img with Figure.\n     */\n    this.removeMedia = this.wrapCommand(() => {\n      let $target = $(this.restoreTarget()).parent();\n      if ($target.closest('figure').length) {\n        $target.closest('figure').remove();\n      } else {\n        $target = $(this.restoreTarget()).detach();\n      }\n      this.context.triggerEvent('media.delete', $target, this.$editable);\n    });\n\n    /**\n     * float me\n     *\n     * @param {String} value\n     */\n    this.floatMe = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      $target.toggleClass('note-float-left', value === 'left');\n      $target.toggleClass('note-float-right', value === 'right');\n      $target.css('float', (value === 'none' ? '' : value));\n    });\n\n    /**\n     * resize overlay element\n     * @param {String} value\n     */\n    this.resize = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      value = parseFloat(value);\n      if (value === 0) {\n        $target.css('width', '');\n      } else {\n        $target.css({\n          width: value * 100 + '%',\n          height: '',\n        });\n      }\n    });\n  }\n\n  initialize() {\n    // bind custom events\n    this.$editable.on('keydown', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        this.context.triggerEvent('enter', event);\n      }\n      this.context.triggerEvent('keydown', event);\n\n      // keep a snapshot to limit text on input event\n      this.snapshot = this.history.makeSnapshot();\n      this.hasKeyShortCut = false;\n      if (!event.isDefaultPrevented()) {\n        if (this.options.shortcuts) {\n          this.hasKeyShortCut = this.handleKeyMap(event);\n        } else {\n          this.preventDefaultEditableShortCuts(event);\n        }\n      }\n      if (this.isLimited(1, event)) {\n        const lastRange = this.getLastRange();\n        if (lastRange.eo - lastRange.so === 0) {\n          return false;\n        }\n      }\n      this.setLastRange();\n\n      // record undo in the key event except keyMap.\n      if (this.options.recordEveryKeystroke) {\n        if (this.hasKeyShortCut === false) {\n          this.history.recordUndo();\n        }\n      }\n    }).on('keyup', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('keyup', event);\n    }).on('focus', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('focus', event);\n    }).on('blur', (event) => {\n      this.context.triggerEvent('blur', event);\n    }).on('mousedown', (event) => {\n      this.context.triggerEvent('mousedown', event);\n    }).on('mouseup', (event) => {\n      this.setLastRange();\n      this.history.recordUndo();\n      this.context.triggerEvent('mouseup', event);\n    }).on('scroll', (event) => {\n      this.context.triggerEvent('scroll', event);\n    }).on('paste', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('paste', event);\n    }).on('input', () => {\n      // To limit composition characters (e.g. Korean)\n      if (this.isLimited(0) && this.snapshot) {\n        this.history.applySnapshot(this.snapshot);\n      }\n    });\n\n    this.$editable.attr('spellcheck', this.options.spellCheck);\n\n    this.$editable.attr('autocorrect', this.options.spellCheck);\n\n    if (this.options.disableGrammar) {\n      this.$editable.attr('data-gramm', false);\n    }\n\n    // init content before set event\n    this.$editable.html(dom.html(this.$note) || dom.emptyPara);\n\n    this.$editable.on(env.inputEventName, func.debounce(() => {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }, 10));\n\n    this.$editable.on('focusin', (event) => {\n      this.context.triggerEvent('focusin', event);\n    }).on('focusout', (event) => {\n      this.context.triggerEvent('focusout', event);\n    });\n\n    if (this.options.airMode) {\n      if (this.options.overrideContextMenu) {\n        this.$editor.on('contextmenu', (event) => {\n          this.context.triggerEvent('contextmenu', event);\n          return false;\n        });\n      }\n    } else {\n      if (this.options.width) {\n        this.$editor.outerWidth(this.options.width);\n      }\n      if (this.options.height) {\n        this.$editable.outerHeight(this.options.height);\n      }\n      if (this.options.maxHeight) {\n        this.$editable.css('max-height', this.options.maxHeight);\n      }\n      if (this.options.minHeight) {\n        this.$editable.css('min-height', this.options.minHeight);\n      }\n    }\n\n    this.history.recordUndo();\n    this.setLastRange();\n  }\n\n  destroy() {\n    this.$editable.off();\n  }\n\n  handleKeyMap(event) {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    const keys = [];\n\n    if (event.metaKey) { keys.push('CMD'); }\n    if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }\n    if (event.shiftKey) { keys.push('SHIFT'); }\n\n    const keyName = key.nameFromCode[event.keyCode];\n    if (keyName) {\n      keys.push(keyName);\n    }\n\n    const eventName = keyMap[keys.join('+')];\n\n    if (keyName === 'TAB' && !this.options.tabDisable) {\n      this.afterCommand();\n    } else if (eventName) {\n      if (this.context.invoke(eventName) !== false) {\n        event.preventDefault();\n        // if keyMap action was invoked\n        return true;\n      }\n    } else if (key.isEdit(event.keyCode)) {\n      this.afterCommand();\n    }\n    return false;\n  }\n\n  preventDefaultEditableShortCuts(event) {\n    // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)\n    if ((event.ctrlKey || event.metaKey) &&\n      lists.contains([66, 73, 85], event.keyCode)) {\n      event.preventDefault();\n    }\n  }\n\n  isLimited(pad, event) {\n    pad = pad || 0;\n\n    if (typeof event !== 'undefined') {\n      if (key.isMove(event.keyCode) ||\n          key.isNavigation(event.keyCode) ||\n          (event.ctrlKey || event.metaKey) ||\n          lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {\n        return false;\n      }\n    }\n\n    if (this.options.maxTextLength > 0) {\n      if ((this.$editable.text().length + pad) > this.options.maxTextLength) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * create range\n   * @return {WrappedRange}\n   */\n  createRange() {\n    this.focus();\n    this.setLastRange();\n    return this.getLastRange();\n  }\n\n  /**\n   * create a new range from the list of elements\n   *\n   * @param {list} dom element list\n   * @return {WrappedRange}\n   */\n  createRangeFromList(lst) {\n    const startRange = range.createFromNodeBefore(lists.head(lst));\n    const startPoint = startRange.getStartPoint();\n    const endRange = range.createFromNodeAfter(lists.last(lst));\n    const endPoint = endRange.getEndPoint();\n\n    return range.create(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * set the last range\n   *\n   * if given rng is exist, set rng as the last range\n   * or create a new range at the end of the document\n   *\n   * @param {WrappedRange} rng\n   */\n  setLastRange(rng) {\n    if (rng) {\n      this.lastRange = rng;\n    } else {\n      this.lastRange = range.create(this.editable);\n\n      if ($(this.lastRange.sc).closest('.note-editable').length === 0) {\n        this.lastRange = range.createFromBodyElement(this.editable);\n      }\n    }\n  }\n\n  /**\n   * get the last range\n   *\n   * if there is a saved last range, return it\n   * or create a new range and return it\n   *\n   * @return {WrappedRange}\n   */\n  getLastRange() {\n    if (!this.lastRange) {\n      this.setLastRange();\n    }\n    return this.lastRange;\n  }\n\n  /**\n   * saveRange\n   *\n   * save current range\n   *\n   * @param {Boolean} [thenCollapse=false]\n   */\n  saveRange(thenCollapse) {\n    if (thenCollapse) {\n      this.getLastRange().collapse().select();\n    }\n  }\n\n  /**\n   * restoreRange\n   *\n   * restore lately range\n   */\n  restoreRange() {\n    if (this.lastRange) {\n      this.lastRange.select();\n      this.focus();\n    }\n  }\n\n  saveTarget(node) {\n    this.$editable.data('target', node);\n  }\n\n  clearTarget() {\n    this.$editable.removeData('target');\n  }\n\n  restoreTarget() {\n    return this.$editable.data('target');\n  }\n\n  /**\n   * currentStyle\n   *\n   * current style\n   * @return {Object|Boolean} unfocus\n   */\n  currentStyle() {\n    let rng = range.create();\n    if (rng) {\n      rng = rng.normalize();\n    }\n    return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);\n  }\n\n  /**\n   * style from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  styleFromNode($node) {\n    return this.style.fromNode($node);\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.undo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /*\n  * commit\n  */\n  commit() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.commit();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.redo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * before command\n   */\n  beforeCommand() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n\n    // Set styleWithCSS before run a command\n    document.execCommand('styleWithCSS', false, this.options.styleWithCSS);\n\n    // keep focus on editable before command execution\n    this.focus();\n  }\n\n  /**\n   * after command\n   * @param {Boolean} isPreventTrigger\n   */\n  afterCommand(isPreventTrigger) {\n    this.normalizeContent();\n    this.history.recordUndo();\n    if (!isPreventTrigger) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  /**\n   * handle tab key\n   */\n  tab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n\n      if (!this.isLimited(this.options.tabSize)) {\n        this.beforeCommand();\n        this.typing.insertTab(rng, this.options.tabSize);\n        this.afterCommand();\n      }\n    }\n  }\n\n  /**\n   * handle shift+tab key\n   */\n  untab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng, true);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * run given function between beforeCommand and afterCommand\n   */\n  wrapCommand(fn) {\n    return function() {\n      this.beforeCommand();\n      fn.apply(this, arguments);\n      this.afterCommand();\n    };\n  }\n\n  /**\n   * insert image\n   *\n   * @param {String} src\n   * @param {String|Function} param\n   * @return {Promise}\n   */\n  insertImage(src, param) {\n    return createImage(src, param).then(($image) => {\n      this.beforeCommand();\n\n      if (typeof param === 'function') {\n        param($image);\n      } else {\n        if (typeof param === 'string') {\n          $image.attr('data-filename', param);\n        }\n        $image.css('width', Math.min(this.$editable.width(), $image.width()));\n      }\n\n      $image.show();\n      this.getLastRange().insertNode($image[0]);\n      this.setLastRange(range.createFromNodeAfter($image[0]).select());\n      this.afterCommand();\n    }).fail((e) => {\n      this.context.triggerEvent('image.upload.error', e);\n    });\n  }\n\n  /**\n   * insertImages\n   * @param {File[]} files\n   */\n  insertImagesAsDataURL(files) {\n    $.each(files, (idx, file) => {\n      const filename = file.name;\n      if (this.options.maximumImageFileSize && this.options.maximumImageFileSize < file.size) {\n        this.context.triggerEvent('image.upload.error', this.lang.image.maximumFileSizeError);\n      } else {\n        readFileAsDataURL(file).then((dataURL) => {\n          return this.insertImage(dataURL, filename);\n        }).fail(() => {\n          this.context.triggerEvent('image.upload.error');\n        });\n      }\n    });\n  }\n\n  /**\n   * insertImagesOrCallback\n   * @param {File[]} files\n   */\n  insertImagesOrCallback(files) {\n    const callbacks = this.options.callbacks;\n    // If onImageUpload set,\n    if (callbacks.onImageUpload) {\n      this.context.triggerEvent('image.upload', files);\n      // else insert Image as dataURL\n    } else {\n      this.insertImagesAsDataURL(files);\n    }\n  }\n\n  /**\n   * return selected plain text\n   * @return {String} text\n   */\n  getSelectedText() {\n    let rng = this.getLastRange();\n\n    // if range on anchor, expand range with anchor\n    if (rng.isOnAnchor()) {\n      rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));\n    }\n\n    return rng.toString();\n  }\n\n  onFormatBlock(tagName, $target) {\n    // [workaround] for MSIE, IE need `<`\n    document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName);\n\n    // support custom class\n    if ($target && $target.length) {\n      // find the exact element has given tagName\n      if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {\n        $target = $target.find(tagName);\n      }\n\n      if ($target && $target.length) {\n        const className = $target[0].className || '';\n        if (className) {\n          const currentRange = this.createRange();\n\n          const $parent = $([currentRange.sc, currentRange.ec]).closest(tagName);\n          $parent.addClass(className);\n        }\n      }\n    }\n  }\n\n  formatPara() {\n    this.formatBlock('P');\n  }\n\n  fontStyling(target, value) {\n    const rng = this.getLastRange();\n\n    if (rng !== '') {\n      const spans = this.style.styleNodes(rng);\n      this.$editor.find('.note-status-output').html('');\n      $(spans).css(target, value);\n\n      // [workaround] added styled bogus span for style\n      //  - also bogus character needed for cursor position\n      if (rng.isCollapsed()) {\n        const firstSpan = lists.head(spans);\n        if (firstSpan && !dom.nodeLength(firstSpan)) {\n          firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;\n          range.createFromNode(firstSpan.firstChild).select();\n          this.setLastRange();\n          this.$editable.data(KEY_BOGUS, firstSpan);\n        }\n      } else {\n        this.setLastRange(\n          this.createRangeFromList(spans).select()\n        );\n      }\n    } else {\n      const noteStatusOutput = $.now();\n      this.$editor.find('.note-status-output').html('<div id=\"note-status-output-' + noteStatusOutput + '\" class=\"alert alert-info\">' + this.lang.output.noSelection + '</div>');\n      setTimeout(function() { $('#note-status-output-' + noteStatusOutput).remove(); }, 5000);\n    }\n  }\n\n  /**\n   * unlink\n   *\n   * @type command\n   */\n  unlink() {\n    let rng = this.getLastRange();\n    if (rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      rng = range.createFromNode(anchor);\n      rng.select();\n      this.setLastRange();\n\n      this.beforeCommand();\n      document.execCommand('unlink');\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * returns link info\n   *\n   * @return {Object}\n   * @return {WrappedRange} return.range\n   * @return {String} return.text\n   * @return {Boolean} [return.isNewWindow=true]\n   * @return {String} [return.url=\"\"]\n   */\n  getLinkInfo() {\n    const rng = this.getLastRange().expand(dom.isAnchor);\n    // Get the first anchor on range(for edit).\n    const $anchor = $(lists.head(rng.nodes(dom.isAnchor)));\n    const linkInfo = {\n      range: rng,\n      text: rng.toString(),\n      url: $anchor.length ? $anchor.attr('href') : '',\n    };\n\n    // When anchor exists,\n    if ($anchor.length) {\n      // Set isNewWindow by checking its target.\n      linkInfo.isNewWindow = $anchor.attr('target') === '_blank';\n    }\n\n    return linkInfo;\n  }\n\n  addRow(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addRow(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  addCol(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addCol(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  deleteRow() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteRow(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteCol() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteCol(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteTable() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteTable(rng);\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * @param {Position} pos\n   * @param {jQuery} $target - target element\n   * @param {Boolean} [bKeepRatio] - keep ratio\n   */\n  resizeTo(pos, $target, bKeepRatio) {\n    let imageSize;\n    if (bKeepRatio) {\n      const newRatio = pos.y / pos.x;\n      const ratio = $target.data('ratio');\n      imageSize = {\n        width: ratio > newRatio ? pos.x : pos.y / ratio,\n        height: ratio > newRatio ? pos.x * ratio : pos.y,\n      };\n    } else {\n      imageSize = {\n        width: pos.x,\n        height: pos.y,\n      };\n    }\n\n    $target.css(imageSize);\n  }\n\n  /**\n   * returns whether editable area has focus or not.\n   */\n  hasFocus() {\n    return this.$editable.is(':focus');\n  }\n\n  /**\n   * set focus\n   */\n  focus() {\n    // [workaround] Screen will move when page is scolled in IE.\n    //  - do focus when not focused\n    if (!this.hasFocus()) {\n      this.$editable.focus();\n    }\n  }\n\n  /**\n   * returns whether contents is empty or not.\n   * @return {Boolean}\n   */\n  isEmpty() {\n    return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();\n  }\n\n  /**\n   * Removes all contents and restores the editable instance to an _emptyPara_.\n   */\n  empty() {\n    this.context.invoke('code', dom.emptyPara);\n  }\n\n  /**\n   * normalize content\n   */\n  normalizeContent() {\n    this.$editable[0].normalize();\n  }\n}\n","import $ from 'jquery';\n\n/**\n * @method readFileAsDataURL\n *\n * read contents of file as representing URL\n *\n * @param {File} file\n * @return {Promise} - then: dataUrl\n */\nexport function readFileAsDataURL(file) {\n  return $.Deferred((deferred) => {\n    $.extend(new FileReader(), {\n      onload: (e) => {\n        const dataURL = e.target.result;\n        deferred.resolve(dataURL);\n      },\n      onerror: (err) => {\n        deferred.reject(err);\n      },\n    }).readAsDataURL(file);\n  }).promise();\n}\n\n/**\n * @method createImage\n *\n * create `<image>` from url string\n *\n * @param {String} url\n * @return {Promise} - then: $image\n */\nexport function createImage(url) {\n  return $.Deferred((deferred) => {\n    const $img = $('<img>');\n\n    $img.one('load', () => {\n      $img.off('error abort');\n      deferred.resolve($img);\n    }).one('error abort', () => {\n      $img.off('load').detach();\n      deferred.reject($img);\n    }).css({\n      display: 'none',\n    }).appendTo(document.body).attr('src', url);\n  }).promise();\n}\n","import lists from '../core/lists';\n\nexport default class Clipboard {\n  constructor(context) {\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n  }\n\n  initialize() {\n    this.$editable.on('paste', this.pasteByEvent.bind(this));\n  }\n\n  /**\n   * paste by clipboard event\n   *\n   * @param {Event} event\n   */\n  pasteByEvent(event) {\n    const clipboardData = event.originalEvent.clipboardData;\n\n    if (clipboardData && clipboardData.items && clipboardData.items.length) {\n      const item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);\n      if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {\n        // paste img file\n        this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);\n        event.preventDefault();\n      } else if (item.kind === 'string') {\n        // paste text with maxTextLength check\n        if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {\n          event.preventDefault();\n        }\n      }\n    } else if (window.clipboardData) {\n      // for IE\n      let text = window.clipboardData.getData('text');\n      if (this.context.invoke('editor.isLimited', text.length)) {\n        event.preventDefault();\n      }\n    }\n    // Call editor.afterCommand after proceeding default event handler\n    setTimeout(() => {\n      this.context.invoke('editor.afterCommand');\n    }, 10);\n  }\n}\n","import $ from 'jquery';\n\nexport default class Dropzone {\n  constructor(context) {\n    this.context = context;\n    this.$eventListener = $(document);\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.documentEventHandlers = {};\n\n    this.$dropzone = $([\n      '<div class=\"note-dropzone\">',\n        '<div class=\"note-dropzone-message\"></div>',\n      '</div>',\n    ].join('')).prependTo(this.$editor);\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  initialize() {\n    if (this.options.disableDragAndDrop) {\n      // prevent default drop event\n      this.documentEventHandlers.onDrop = (e) => {\n        e.preventDefault();\n      };\n      // do not consider outside of dropzone\n      this.$eventListener = this.$dropzone;\n      this.$eventListener.on('drop', this.documentEventHandlers.onDrop);\n    } else {\n      this.attachDragAndDropEvent();\n    }\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  attachDragAndDropEvent() {\n    let collection = $();\n    const $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');\n\n    this.documentEventHandlers.onDragenter = (e) => {\n      const isCodeview = this.context.invoke('codeview.isActivated');\n      const hasEditorSize = this.$editor.width() > 0 && this.$editor.height() > 0;\n      if (!isCodeview && !collection.length && hasEditorSize) {\n        this.$editor.addClass('dragover');\n        this.$dropzone.width(this.$editor.width());\n        this.$dropzone.height(this.$editor.height());\n        $dropzoneMessage.text(this.lang.image.dragImageHere);\n      }\n      collection = collection.add(e.target);\n    };\n\n    this.documentEventHandlers.onDragleave = (e) => {\n      collection = collection.not(e.target);\n\n      // If nodeName is BODY, then just make it over (fix for IE)\n      if (!collection.length || e.target.nodeName === 'BODY') {\n        collection = $();\n        this.$editor.removeClass('dragover');\n      }\n    };\n\n    this.documentEventHandlers.onDrop = () => {\n      collection = $();\n      this.$editor.removeClass('dragover');\n    };\n\n    // show dropzone on dragenter when dragging a object to document\n    // -but only if the editor is visible, i.e. has a positive width and height\n    this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter)\n      .on('dragleave', this.documentEventHandlers.onDragleave)\n      .on('drop', this.documentEventHandlers.onDrop);\n\n    // change dropzone's message on hover.\n    this.$dropzone.on('dragenter', () => {\n      this.$dropzone.addClass('hover');\n      $dropzoneMessage.text(this.lang.image.dropImage);\n    }).on('dragleave', () => {\n      this.$dropzone.removeClass('hover');\n      $dropzoneMessage.text(this.lang.image.dragImageHere);\n    });\n\n    // attach dropImage\n    this.$dropzone.on('drop', (event) => {\n      const dataTransfer = event.originalEvent.dataTransfer;\n\n      // stop the browser from opening the dropped content\n      event.preventDefault();\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        this.$editable.focus();\n        this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);\n      } else {\n        $.each(dataTransfer.types, (idx, type) => {\n          // skip moz-specific types\n          if (type.toLowerCase().indexOf('_moz_') > -1) {\n            return;\n          }\n          const content = dataTransfer.getData(type);\n\n          if (type.toLowerCase().indexOf('text') > -1) {\n            this.context.invoke('editor.pasteHTML', content);\n          } else {\n            $(content).each((idx, item) => {\n              this.context.invoke('editor.insertNode', item);\n            });\n          }\n        });\n      }\n    }).on('dragover', false); // prevent default dragover event\n  }\n\n  destroy() {\n    Object.keys(this.documentEventHandlers).forEach((key) => {\n      this.$eventListener.off(key.substr(2).toLowerCase(), this.documentEventHandlers[key]);\n    });\n    this.documentEventHandlers = {};\n  }\n}\n","import dom from '../core/dom';\nimport key from '../core/key';\n\n/**\n * @class Codeview\n */\nexport default class CodeView {\n  constructor(context) {\n    this.context = context;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n    this.CodeMirrorConstructor = window.CodeMirror;\n\n    if (this.options.codemirror.CodeMirrorConstructor) {\n      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;\n    }\n  }\n\n  sync(html) {\n    const isCodeview = this.isActivated();\n    const CodeMirror = this.CodeMirrorConstructor;\n\n    if (isCodeview) {\n      if (html) {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').getDoc().setValue(html);\n        } else {\n          this.$codable.val(html);\n        }\n      } else {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').save();\n        }\n      }\n    }\n  }\n\n  initialize() {\n    this.$codable.on('keyup', (event) => {\n      if (event.keyCode === key.code.ESCAPE) {\n        this.deactivate();\n      }\n    });\n  }\n\n  /**\n   * @return {Boolean}\n   */\n  isActivated() {\n    return this.$editor.hasClass('codeview');\n  }\n\n  /**\n   * toggle codeview\n   */\n  toggle() {\n    if (this.isActivated()) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n    this.context.triggerEvent('codeview.toggled');\n  }\n\n  /**\n   * purify input value\n   * @param value\n   * @returns {*}\n   */\n  purify(value) {\n    if (this.options.codeviewFilter) {\n      // filter code view regex\n      value = value.replace(this.options.codeviewFilterRegex, '');\n      // allow specific iframe tag\n      if (this.options.codeviewIframeFilter) {\n        const whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);\n        value = value.replace(/(<iframe.*?>.*?(?:<\\/iframe>)?)/gi, function(tag) {\n          // remove if src attribute is duplicated\n          if (/<.+src(?==?('|\"|\\s)?)[\\s\\S]+src(?=('|\"|\\s)?)[^>]*?>/i.test(tag)) {\n            return '';\n          }\n          for (const src of whitelist) {\n            // pass if src is trusted\n            if ((new RegExp('src=\"(https?:)?\\/\\/' + src.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '\\/(.+)\"')).test(tag)) {\n              return tag;\n            }\n          }\n          return '';\n        });\n      }\n    }\n    return value;\n  }\n\n  /**\n   * activate code view\n   */\n  activate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));\n    this.$codable.height(this.$editable.height());\n\n    this.context.invoke('toolbar.updateCodeview', true);\n    this.context.invoke('airPopover.updateCodeview', true);\n\n    this.$editor.addClass('codeview');\n    this.$codable.focus();\n\n    // activate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror);\n\n      // CodeMirror TernServer\n      if (this.options.codemirror.tern) {\n        const server = new CodeMirror.TernServer(this.options.codemirror.tern);\n        cmEditor.ternServer = server;\n        cmEditor.on('cursorActivity', (cm) => {\n          server.updateArgHints(cm);\n        });\n      }\n\n      cmEditor.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);\n      });\n      cmEditor.on('change', () => {\n        this.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);\n      });\n\n      // CodeMirror hasn't Padding.\n      cmEditor.setSize(null, this.$editable.outerHeight());\n      this.$codable.data('cmEditor', cmEditor);\n    } else {\n      this.$codable.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', this.$codable.val(), event);\n      });\n      this.$codable.on('input', () => {\n        this.context.triggerEvent('change.codeview', this.$codable.val(), this.$codable);\n      });\n    }\n  }\n\n  /**\n   * deactivate code view\n   */\n  deactivate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    // deactivate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = this.$codable.data('cmEditor');\n      this.$codable.val(cmEditor.getValue());\n      cmEditor.toTextArea();\n    }\n\n    const value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);\n    const isChange = this.$editable.html() !== value;\n\n    this.$editable.html(value);\n    this.$editable.height(this.options.height ? this.$codable.height() : 'auto');\n    this.$editor.removeClass('codeview');\n\n    if (isChange) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n\n    this.$editable.focus();\n\n    this.context.invoke('toolbar.updateCodeview', false);\n    this.context.invoke('airPopover.updateCodeview', false);\n  }\n\n  destroy() {\n    if (this.isActivated()) {\n      this.deactivate();\n    }\n  }\n}\n","import $ from 'jquery';\nconst EDITABLE_PADDING = 24;\n\nexport default class Statusbar {\n  constructor(context) {\n    this.$document = $(document);\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n  }\n\n  initialize() {\n    if (this.options.airMode || this.options.disableResizeEditor) {\n      this.destroy();\n      return;\n    }\n\n    this.$statusbar.on('mousedown', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const editableTop = this.$editable.offset().top - this.$document.scrollTop();\n      const onMouseMove = (event) => {\n        let height = event.clientY - (editableTop + EDITABLE_PADDING);\n\n        height = (this.options.minheight > 0) ? Math.max(height, this.options.minheight) : height;\n        height = (this.options.maxHeight > 0) ? Math.min(height, this.options.maxHeight) : height;\n\n        this.$editable.height(height);\n      };\n\n      this.$document.on('mousemove', onMouseMove).one('mouseup', () => {\n        this.$document.off('mousemove', onMouseMove);\n      });\n    });\n  }\n\n  destroy() {\n    this.$statusbar.off();\n    this.$statusbar.addClass('locked');\n  }\n}\n","import $ from 'jquery';\n\nexport default class Fullscreen {\n  constructor(context) {\n    this.context = context;\n\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n\n    this.$window = $(window);\n    this.$scrollbar = $('html, body');\n\n    this.onResize = () => {\n      this.resizeTo({\n        h: this.$window.height() - this.$toolbar.outerHeight(),\n      });\n    };\n  }\n\n  resizeTo(size) {\n    this.$editable.css('height', size.h);\n    this.$codable.css('height', size.h);\n    if (this.$codable.data('cmeditor')) {\n      this.$codable.data('cmeditor').setsize(null, size.h);\n    }\n  }\n\n  /**\n   * toggle fullscreen\n   */\n  toggle() {\n    this.$editor.toggleClass('fullscreen');\n    if (this.isFullscreen()) {\n      this.$editable.data('orgHeight', this.$editable.css('height'));\n      this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));\n      this.$editable.css('maxHeight', '');\n      this.$window.on('resize', this.onResize).trigger('resize');\n      this.$scrollbar.css('overflow', 'hidden');\n    } else {\n      this.$window.off('resize', this.onResize);\n      this.resizeTo({ h: this.$editable.data('orgHeight') });\n      this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));\n      this.$scrollbar.css('overflow', 'visible');\n    }\n\n    this.context.invoke('toolbar.updateFullscreen', this.isFullscreen());\n  }\n\n  isFullscreen() {\n    return this.$editor.hasClass('fullscreen');\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\n\nexport default class Handle {\n  constructor(context) {\n    this.context = context;\n    this.$document = $(document);\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        if (this.update(e.target, e)) {\n          e.preventDefault();\n        }\n      },\n      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  initialize() {\n    this.$handle = $([\n      '<div class=\"note-handle\">',\n        '<div class=\"note-control-selection\">',\n          '<div class=\"note-control-selection-bg\"></div>',\n          '<div class=\"note-control-holder note-control-nw\"></div>',\n          '<div class=\"note-control-holder note-control-ne\"></div>',\n          '<div class=\"note-control-holder note-control-sw\"></div>',\n          '<div class=\"',\n            (this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),\n          ' note-control-se\"></div>',\n          (this.options.disableResizeImage ? '' : '<div class=\"note-control-selection-info\"></div>'),\n        '</div>',\n      '</div>',\n    ].join('')).prependTo(this.$editingArea);\n\n    this.$handle.on('mousedown', (event) => {\n      if (dom.isControlSizing(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const $target = this.$handle.find('.note-control-selection').data('target');\n        const posStart = $target.offset();\n        const scrollTop = this.$document.scrollTop();\n\n        const onMouseMove = (event) => {\n          this.context.invoke('editor.resizeTo', {\n            x: event.clientX - posStart.left,\n            y: event.clientY - (posStart.top - scrollTop),\n          }, $target, !event.shiftKey);\n\n          this.update($target[0], event);\n        };\n\n        this.$document\n          .on('mousemove', onMouseMove)\n          .one('mouseup', (e) => {\n            e.preventDefault();\n            this.$document.off('mousemove', onMouseMove);\n            this.context.invoke('editor.afterCommand');\n          });\n\n        if (!$target.data('ratio')) { // original ratio.\n          $target.data('ratio', $target.height() / $target.width());\n        }\n      }\n    });\n\n    // Listen for scrolling on the handle overlay.\n    this.$handle.on('wheel', (e) => {\n      e.preventDefault();\n      this.update();\n    });\n  }\n\n  destroy() {\n    this.$handle.remove();\n  }\n\n  update(target, event) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isImage = dom.isImg(target);\n    const $selection = this.$handle.find('.note-control-selection');\n\n    this.context.invoke('imagePopover.update', target, event);\n\n    if (isImage) {\n      const $image = $(target);\n      const position = $image.position();\n      const pos = {\n        left: position.left + parseInt($image.css('marginLeft'), 10),\n        top: position.top + parseInt($image.css('marginTop'), 10),\n      };\n\n      // exclude margin\n      const imageSize = {\n        w: $image.outerWidth(false),\n        h: $image.outerHeight(false),\n      };\n\n      $selection.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n        width: imageSize.w,\n        height: imageSize.h,\n      }).data('target', $image); // save current image element.\n\n      const origImageObj = new Image();\n      origImageObj.src = $image.attr('src');\n\n      const sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';\n      $selection.find('.note-control-selection-info').text(sizingText);\n      this.context.invoke('editor.saveTarget', target);\n    } else {\n      this.hide();\n    }\n\n    return isImage;\n  }\n\n  /**\n   * hide\n   *\n   * @param {jQuery} $handle\n   */\n  hide() {\n    this.context.invoke('editor.clearTarget');\n    this.$handle.children().hide();\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport key from '../core/key';\n\nconst defaultScheme = 'http://';\nconst linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\\:[\\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@)?(www\\.)?(.+)$/i;\n\nexport default class AutoLink {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n  }\n\n  destroy() {\n    this.lastWordRange = null;\n  }\n\n  replace() {\n    if (!this.lastWordRange) {\n      return;\n    }\n\n    const keyword = this.lastWordRange.toString();\n    const match = keyword.match(linkPattern);\n\n    if (match && (match[1] || match[2])) {\n      const link = match[1] ? keyword : defaultScheme + keyword;\n      const urlText = this.options.showDomainOnlyForAutolink ?\n        keyword.replace(/^(?:https?:\\/\\/)?(?:tel?:?)?(?:mailto?:?)?(?:www\\.)?/i, '').split('/')[0]\n        : keyword;\n      const node = $('<a />').html(urlText).attr('href', link)[0];\n      if (this.context.options.linkTargetBlank) {\n        $(node).attr('target', '_blank');\n      }\n\n      this.lastWordRange.insertNode(node);\n      this.lastWordRange = null;\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  handleKeydown(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWordRange = wordRange;\n    }\n  }\n\n  handleKeyup(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import dom from '../core/dom';\n\n/**\n * textarea auto sync.\n */\nexport default class AutoSync {\n  constructor(context) {\n    this.$note = context.layoutInfo.note;\n    this.events = {\n      'summernote.change': () => {\n        this.$note.val(context.invoke('code'));\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return dom.isTextarea(this.$note[0]);\n  }\n}\n","import lists from '../core/lists';\nimport dom from '../core/dom';\nimport key from '../core/key';\n\nexport default class AutoReplace {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options.replace || {};\n\n    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];\n    this.previousKeydownCode = null;\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.match;\n  }\n\n  initialize() {\n    this.lastWord = null;\n  }\n\n  destroy() {\n    this.lastWord = null;\n  }\n\n  replace() {\n    if (!this.lastWord) {\n      return;\n    }\n\n    const self = this;\n    const keyword = this.lastWord.toString();\n    this.options.match(keyword, function(match) {\n      if (match) {\n        let node = '';\n\n        if (typeof match === 'string') {\n          node = dom.createText(match);\n        } else if (match instanceof jQuery) {\n          node = match[0];\n        } else if (match instanceof Node) {\n          node = match;\n        }\n\n        if (!node) return;\n        self.lastWord.insertNode(node);\n        self.lastWord = null;\n        self.context.invoke('editor.focus');\n      }\n    });\n  }\n\n  handleKeydown(e) {\n    // this forces it to remember the last whole word, even if multiple termination keys are pressed\n    // before the previous key is let go.\n    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {\n      this.previousKeydownCode = e.keyCode;\n      return;\n    }\n\n    if (lists.contains(this.keys, e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWord = wordRange;\n    }\n    this.previousKeydownCode = e.keyCode;\n  }\n\n  handleKeyup(e) {\n    if (lists.contains(this.keys, e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import $ from 'jquery';\nexport default class Placeholder {\n  constructor(context) {\n    this.context = context;\n\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n\n    if (this.options.inheritPlaceholder === true) {\n      // get placeholder value from the original element\n      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;\n    }\n\n    this.events = {\n      'summernote.init summernote.change': () => {\n        this.update();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.placeholder;\n  }\n\n  initialize() {\n    this.$placeholder = $('<div class=\"note-placeholder\">');\n    this.$placeholder.on('click', () => {\n      this.context.invoke('focus');\n    }).html(this.options.placeholder).prependTo(this.$editingArea);\n\n    this.update();\n  }\n\n  destroy() {\n    this.$placeholder.remove();\n  }\n\n  update() {\n    const isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');\n    this.$placeholder.toggle(isShow);\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport env from '../core/env';\n\nexport default class Buttons {\n  constructor(context) {\n    this.ui = $.summernote.ui;\n    this.context = context;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.invertedKeyMap = func.invertObject(\n      this.options.keyMap[env.isMac ? 'mac' : 'pc']\n    );\n  }\n\n  representShortcut(editorMethod) {\n    let shortcut = this.invertedKeyMap[editorMethod];\n    if (!this.options.shortcuts || !shortcut) {\n      return '';\n    }\n\n    if (env.isMac) {\n      shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');\n    }\n\n    shortcut = shortcut.replace('BACKSLASH', '\\\\')\n      .replace('SLASH', '/')\n      .replace('LEFTBRACKET', '[')\n      .replace('RIGHTBRACKET', ']');\n\n    return ' (' + shortcut + ')';\n  }\n\n  button(o) {\n    if (!this.options.tooltip && o.tooltip) {\n      delete o.tooltip;\n    }\n    o.container = this.options.container;\n    return this.ui.button(o);\n  }\n\n  initialize() {\n    this.addToolbarButtons();\n    this.addImagePopoverButtons();\n    this.addLinkPopoverButtons();\n    this.addTablePopoverButtons();\n    this.fontInstalledMap = {};\n  }\n\n  destroy() {\n    delete this.fontInstalledMap;\n  }\n\n  isFontInstalled(name) {\n    if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {\n      this.fontInstalledMap[name] = env.isFontInstalled(name) ||\n        lists.contains(this.options.fontNamesIgnoreCheck, name);\n    }\n    return this.fontInstalledMap[name];\n  }\n\n  isFontDeservedToAdd(name) {\n    name = name.toLowerCase();\n    return (name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1);\n  }\n\n  colorPalette(className, tooltip, backColor, foreColor) {\n    return this.ui.buttonGroup({\n      className: 'note-color ' + className,\n      children: [\n        this.button({\n          className: 'note-current-color-button',\n          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),\n          tooltip: tooltip,\n          click: (e) => {\n            const $button = $(e.currentTarget);\n            if (backColor && foreColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n                foreColor: $button.attr('data-foreColor'),\n              });\n            } else if (backColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n              });\n            } else if (foreColor) {\n              this.context.invoke('editor.color', {\n                foreColor: $button.attr('data-foreColor'),\n              });\n            }\n          },\n          callback: ($button) => {\n            const $recentColor = $button.find('.note-recent-color');\n            if (backColor) {\n              $recentColor.css('background-color', this.options.colorButton.backColor);\n              $button.attr('data-backColor', this.options.colorButton.backColor);\n            }\n            if (foreColor) {\n              $recentColor.css('color', this.options.colorButton.foreColor);\n              $button.attr('data-foreColor', this.options.colorButton.foreColor);\n            } else {\n              $recentColor.css('color', 'transparent');\n            }\n          },\n        }),\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('', this.options),\n          tooltip: this.lang.color.more,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          items: (backColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.background + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"backColor\" data-value=\"transparent\">',\n                  this.lang.color.transparent,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"backColor\"><!-- back colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"backColorPicker\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"backColorPicker\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.backColor + '\" data-event=\"backColorPalette\">',\n              '</div>',\n              '<div class=\"note-holder-custom\" id=\"backColorPalette\" data-event=\"backColor\"></div>',\n            '</div>',\n          ].join('') : '') +\n          (foreColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.foreground + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                  this.lang.color.resetToDefault,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"foreColor\"><!-- fore colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"foreColorPicker\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"foreColorPicker\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.foreColor + '\" data-event=\"foreColorPalette\">',\n              '</div>', // Fix missing Div, Commented to find easily if it's wrong\n              '<div class=\"note-holder-custom\" id=\"foreColorPalette\" data-event=\"foreColor\"></div>',\n            '</div>',\n          ].join('') : ''),\n          callback: ($dropdown) => {\n            $dropdown.find('.note-holder').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: this.options.colors,\n                colorsName: this.options.colorsName,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            /* TODO: do we have to record recent custom colors within cookies? */\n            var customColors = [\n              ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF'],\n            ];\n            $dropdown.find('.note-holder-custom').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: customColors,\n                colorsName: customColors,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            $dropdown.find('input[type=color]').each((idx, item) => {\n              $(item).change(function() {\n                const $chip = $dropdown.find('#' + $(this).data('event')).find('.note-color-btn').first();\n                const color = this.value.toUpperCase();\n                $chip.css('background-color', color)\n                  .attr('aria-label', color)\n                  .attr('data-value', color)\n                  .attr('data-original-title', color);\n                $chip.click();\n              });\n            });\n          },\n          click: (event) => {\n            event.stopPropagation();\n\n            const $parent = $('.' + className).find('.note-dropdown-menu');\n            const $button = $(event.target);\n            const eventName = $button.data('event');\n            const value = $button.attr('data-value');\n\n            if (eventName === 'openPalette') {\n              const $picker = $parent.find('#' + value);\n              const $palette = $($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]);\n\n              // Shift palette chips\n              const $chip = $palette.find('.note-color-btn').last().detach();\n\n              // Set chip attributes\n              const color = $picker.val();\n              $chip.css('background-color', color)\n                .attr('aria-label', color)\n                .attr('data-value', color)\n                .attr('data-original-title', color);\n              $palette.prepend($chip);\n              $picker.click();\n            } else {\n              if (lists.contains(['backColor', 'foreColor'], eventName)) {\n                const key = eventName === 'backColor' ? 'background-color' : 'color';\n                const $color = $button.closest('.note-color').find('.note-recent-color');\n                const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n                $color.css(key, value);\n                $currentButton.attr('data-' + eventName, value);\n              }\n              this.context.invoke('editor.' + eventName, value);\n            }\n          },\n        }),\n      ],\n    }).render();\n  }\n\n  addToolbarButtons() {\n    this.context.memo('button.style', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            this.ui.icon(this.options.icons.magic), this.options\n          ),\n          tooltip: this.lang.style.style,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          className: 'dropdown-style',\n          items: this.options.styleTags,\n          title: this.lang.style.style,\n          template: (item) => {\n            // TBD: need to be simplified\n            if (typeof item === 'string') {\n              item = {\n                tag: item,\n                title: (Object.prototype.hasOwnProperty.call(this.lang.style, item) ? this.lang.style[item] : item),\n              };\n            }\n\n            const tag = item.tag;\n            const title = item.title;\n            const style = item.style ? ' style=\"' + item.style + '\" ' : '';\n            const className = item.className ? ' class=\"' + item.className + '\"' : '';\n\n            return '<' + tag + style + className + '>' + title + '</' + tag + '>';\n          },\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }),\n      ]).render();\n    });\n\n    for (let styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {\n      const item = this.options.styleTags[styleIdx];\n\n      this.context.memo('button.style.' + item, () => {\n        return this.button({\n          className: 'note-btn-style-' + item,\n          contents: '<div data-value=\"' + item + '\">' + item.toUpperCase() + '</div>',\n          tooltip: this.lang.style[item],\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }).render();\n      });\n    }\n\n    this.context.memo('button.bold', () => {\n      return this.button({\n        className: 'note-btn-bold',\n        contents: this.ui.icon(this.options.icons.bold),\n        tooltip: this.lang.font.bold + this.representShortcut('bold'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.bold'),\n      }).render();\n    });\n\n    this.context.memo('button.italic', () => {\n      return this.button({\n        className: 'note-btn-italic',\n        contents: this.ui.icon(this.options.icons.italic),\n        tooltip: this.lang.font.italic + this.representShortcut('italic'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.italic'),\n      }).render();\n    });\n\n    this.context.memo('button.underline', () => {\n      return this.button({\n        className: 'note-btn-underline',\n        contents: this.ui.icon(this.options.icons.underline),\n        tooltip: this.lang.font.underline + this.representShortcut('underline'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.underline'),\n      }).render();\n    });\n\n    this.context.memo('button.clear', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.eraser),\n        tooltip: this.lang.font.clear + this.representShortcut('removeFormat'),\n        click: this.context.createInvokeHandler('editor.removeFormat'),\n      }).render();\n    });\n\n    this.context.memo('button.strikethrough', () => {\n      return this.button({\n        className: 'note-btn-strikethrough',\n        contents: this.ui.icon(this.options.icons.strikethrough),\n        tooltip: this.lang.font.strikethrough + this.representShortcut('strikethrough'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.strikethrough'),\n      }).render();\n    });\n\n    this.context.memo('button.superscript', () => {\n      return this.button({\n        className: 'note-btn-superscript',\n        contents: this.ui.icon(this.options.icons.superscript),\n        tooltip: this.lang.font.superscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.superscript'),\n      }).render();\n    });\n\n    this.context.memo('button.subscript', () => {\n      return this.button({\n        className: 'note-btn-subscript',\n        contents: this.ui.icon(this.options.icons.subscript),\n        tooltip: this.lang.font.subscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.subscript'),\n      }).render();\n    });\n\n    this.context.memo('button.fontname', () => {\n      const styleInfo = this.context.invoke('editor.currentStyle');\n\n      if (this.options.addDefaultFonts) {\n        // Add 'default' fonts into the fontnames array if not exist\n        $.each(styleInfo['font-family'].split(','), (idx, fontname) => {\n          fontname = fontname.trim().replace(/['\"]+/g, '');\n          if (this.isFontDeservedToAdd(fontname)) {\n            if (this.options.fontNames.indexOf(fontname) === -1) {\n              this.options.fontNames.push(fontname);\n            }\n          }\n        });\n      }\n\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            '<span class=\"note-current-fontname\"></span>', this.options\n          ),\n          tooltip: this.lang.font.name,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontname',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontNames.filter(this.isFontInstalled.bind(this)),\n          title: this.lang.font.name,\n          template: (item) => {\n            return '<span style=\"font-family: ' + env.validFontName(item) + '\">' + item + '</span>';\n          },\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontName'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsize', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsize\"></span>', this.options),\n          tooltip: this.lang.font.size,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsize',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizes,\n          title: this.lang.font.size,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSize'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsizeunit', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsizeunit\"></span>', this.options),\n          tooltip: this.lang.font.sizeunit,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsizeunit',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizeUnits,\n          title: this.lang.font.sizeunit,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.color', () => {\n      return this.colorPalette('note-color-all', this.lang.color.recent, true, true);\n    });\n\n    this.context.memo('button.forecolor', () => {\n      return this.colorPalette('note-color-fore', this.lang.color.foreground, false, true);\n    });\n\n    this.context.memo('button.backcolor', () => {\n      return this.colorPalette('note-color-back', this.lang.color.background, true, false);\n    });\n\n    this.context.memo('button.ul', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unorderedlist),\n        tooltip: this.lang.lists.unordered + this.representShortcut('insertUnorderedList'),\n        click: this.context.createInvokeHandler('editor.insertUnorderedList'),\n      }).render();\n    });\n\n    this.context.memo('button.ol', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.orderedlist),\n        tooltip: this.lang.lists.ordered + this.representShortcut('insertOrderedList'),\n        click: this.context.createInvokeHandler('editor.insertOrderedList'),\n      }).render();\n    });\n\n    const justifyLeft = this.button({\n      contents: this.ui.icon(this.options.icons.alignLeft),\n      tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),\n      click: this.context.createInvokeHandler('editor.justifyLeft'),\n    });\n\n    const justifyCenter = this.button({\n      contents: this.ui.icon(this.options.icons.alignCenter),\n      tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),\n      click: this.context.createInvokeHandler('editor.justifyCenter'),\n    });\n\n    const justifyRight = this.button({\n      contents: this.ui.icon(this.options.icons.alignRight),\n      tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),\n      click: this.context.createInvokeHandler('editor.justifyRight'),\n    });\n\n    const justifyFull = this.button({\n      contents: this.ui.icon(this.options.icons.alignJustify),\n      tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),\n      click: this.context.createInvokeHandler('editor.justifyFull'),\n    });\n\n    const outdent = this.button({\n      contents: this.ui.icon(this.options.icons.outdent),\n      tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),\n      click: this.context.createInvokeHandler('editor.outdent'),\n    });\n\n    const indent = this.button({\n      contents: this.ui.icon(this.options.icons.indent),\n      tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),\n      click: this.context.createInvokeHandler('editor.indent'),\n    });\n\n    this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));\n    this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));\n    this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));\n    this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));\n    this.context.memo('button.outdent', func.invoke(outdent, 'render'));\n    this.context.memo('button.indent', func.invoke(indent, 'render'));\n\n    this.context.memo('button.paragraph', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.alignLeft), this.options),\n          tooltip: this.lang.paragraph.paragraph,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown([\n          this.ui.buttonGroup({\n            className: 'note-align',\n            children: [justifyLeft, justifyCenter, justifyRight, justifyFull],\n          }),\n          this.ui.buttonGroup({\n            className: 'note-list',\n            children: [outdent, indent],\n          }),\n        ]),\n      ]).render();\n    });\n\n    this.context.memo('button.height', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.textHeight), this.options),\n          tooltip: this.lang.font.height,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          items: this.options.lineHeights,\n          checkClassName: this.options.icons.menuCheck,\n          className: 'dropdown-line-height',\n          title: this.lang.font.height,\n          click: this.context.createInvokeHandler('editor.lineHeight'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.table', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.table), this.options),\n          tooltip: this.lang.table.table,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          title: this.lang.table.table,\n          className: 'note-table',\n          items: [\n            '<div class=\"note-dimension-picker\">',\n              '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n              '<div class=\"note-dimension-picker-highlighted\"></div>',\n              '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n            '</div>',\n            '<div class=\"note-dimension-display\">1 x 1</div>',\n          ].join(''),\n        }),\n      ], {\n        callback: ($node) => {\n          const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n          $catcher.css({\n            width: this.options.insertTableMaxSize.col + 'em',\n            height: this.options.insertTableMaxSize.row + 'em',\n          }).mousedown(this.context.createInvokeHandler('editor.insertTable'))\n            .on('mousemove', this.tableMoveHandler.bind(this));\n        },\n      }).render();\n    });\n\n    this.context.memo('button.link', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.link + this.representShortcut('linkDialog.show'),\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.picture', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.picture),\n        tooltip: this.lang.image.image,\n        click: this.context.createInvokeHandler('imageDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.video', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.video),\n        tooltip: this.lang.video.video,\n        click: this.context.createInvokeHandler('videoDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.hr', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.minus),\n        tooltip: this.lang.hr.insert + this.representShortcut('insertHorizontalRule'),\n        click: this.context.createInvokeHandler('editor.insertHorizontalRule'),\n      }).render();\n    });\n\n    this.context.memo('button.fullscreen', () => {\n      return this.button({\n        className: 'btn-fullscreen note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.arrowsAlt),\n        tooltip: this.lang.options.fullscreen,\n        click: this.context.createInvokeHandler('fullscreen.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.codeview', () => {\n      return this.button({\n        className: 'btn-codeview note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.code),\n        tooltip: this.lang.options.codeview,\n        click: this.context.createInvokeHandler('codeview.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.redo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.redo),\n        tooltip: this.lang.history.redo + this.representShortcut('redo'),\n        click: this.context.createInvokeHandler('editor.redo'),\n      }).render();\n    });\n\n    this.context.memo('button.undo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.undo),\n        tooltip: this.lang.history.undo + this.representShortcut('undo'),\n        click: this.context.createInvokeHandler('editor.undo'),\n      }).render();\n    });\n\n    this.context.memo('button.help', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.question),\n        tooltip: this.lang.options.help,\n        click: this.context.createInvokeHandler('helpDialog.show'),\n      }).render();\n    });\n  }\n\n  /**\n   * image: [\n   *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n   *   ['float', ['floatLeft', 'floatRight', 'floatNone']],\n   *   ['remove', ['removeMedia']],\n   * ],\n   */\n  addImagePopoverButtons() {\n    // Image Size Buttons\n    this.context.memo('button.resizeFull', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">100%</span>',\n        tooltip: this.lang.image.resizeFull,\n        click: this.context.createInvokeHandler('editor.resize', '1'),\n      }).render();\n    });\n    this.context.memo('button.resizeHalf', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">50%</span>',\n        tooltip: this.lang.image.resizeHalf,\n        click: this.context.createInvokeHandler('editor.resize', '0.5'),\n      }).render();\n    });\n    this.context.memo('button.resizeQuarter', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">25%</span>',\n        tooltip: this.lang.image.resizeQuarter,\n        click: this.context.createInvokeHandler('editor.resize', '0.25'),\n      }).render();\n    });\n    this.context.memo('button.resizeNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.resizeNone,\n        click: this.context.createInvokeHandler('editor.resize', '0'),\n      }).render();\n    });\n\n    // Float Buttons\n    this.context.memo('button.floatLeft', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatLeft),\n        tooltip: this.lang.image.floatLeft,\n        click: this.context.createInvokeHandler('editor.floatMe', 'left'),\n      }).render();\n    });\n\n    this.context.memo('button.floatRight', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatRight),\n        tooltip: this.lang.image.floatRight,\n        click: this.context.createInvokeHandler('editor.floatMe', 'right'),\n      }).render();\n    });\n\n    this.context.memo('button.floatNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.floatNone,\n        click: this.context.createInvokeHandler('editor.floatMe', 'none'),\n      }).render();\n    });\n\n    // Remove Buttons\n    this.context.memo('button.removeMedia', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.image.remove,\n        click: this.context.createInvokeHandler('editor.removeMedia'),\n      }).render();\n    });\n  }\n\n  addLinkPopoverButtons() {\n    this.context.memo('button.linkDialogShow', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.edit,\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.unlink', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unlink),\n        tooltip: this.lang.link.unlink,\n        click: this.context.createInvokeHandler('editor.unlink'),\n      }).render();\n    });\n  }\n\n  /**\n   * table : [\n   *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n   *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]\n   * ],\n   */\n  addTablePopoverButtons() {\n    this.context.memo('button.addRowUp', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowAbove),\n        tooltip: this.lang.table.addRowAbove,\n        click: this.context.createInvokeHandler('editor.addRow', 'top'),\n      }).render();\n    });\n    this.context.memo('button.addRowDown', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowBelow),\n        tooltip: this.lang.table.addRowBelow,\n        click: this.context.createInvokeHandler('editor.addRow', 'bottom'),\n      }).render();\n    });\n    this.context.memo('button.addColLeft', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colBefore),\n        tooltip: this.lang.table.addColLeft,\n        click: this.context.createInvokeHandler('editor.addCol', 'left'),\n      }).render();\n    });\n    this.context.memo('button.addColRight', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colAfter),\n        tooltip: this.lang.table.addColRight,\n        click: this.context.createInvokeHandler('editor.addCol', 'right'),\n      }).render();\n    });\n    this.context.memo('button.deleteRow', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowRemove),\n        tooltip: this.lang.table.delRow,\n        click: this.context.createInvokeHandler('editor.deleteRow'),\n      }).render();\n    });\n    this.context.memo('button.deleteCol', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colRemove),\n        tooltip: this.lang.table.delCol,\n        click: this.context.createInvokeHandler('editor.deleteCol'),\n      }).render();\n    });\n    this.context.memo('button.deleteTable', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.table.delTable,\n        click: this.context.createInvokeHandler('editor.deleteTable'),\n      }).render();\n    });\n  }\n\n  build($container, groups) {\n    for (let groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {\n      const group = groups[groupIdx];\n      const groupName = Array.isArray(group) ? group[0] : group;\n      const buttons = Array.isArray(group) ? ((group.length === 1) ? [group[0]] : group[1]) : [group];\n\n      const $group = this.ui.buttonGroup({\n        className: 'note-' + groupName,\n      }).render();\n\n      for (let idx = 0, len = buttons.length; idx < len; idx++) {\n        const btn = this.context.memo('button.' + buttons[idx]);\n        if (btn) {\n          $group.append(typeof btn === 'function' ? btn(this.context) : btn);\n        }\n      }\n      $group.appendTo($container);\n    }\n  }\n\n  /**\n   * @param {jQuery} [$container]\n   */\n  updateCurrentStyle($container) {\n    const $cont = $container || this.$toolbar;\n\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    this.updateBtnStates($cont, {\n      '.note-btn-bold': () => {\n        return styleInfo['font-bold'] === 'bold';\n      },\n      '.note-btn-italic': () => {\n        return styleInfo['font-italic'] === 'italic';\n      },\n      '.note-btn-underline': () => {\n        return styleInfo['font-underline'] === 'underline';\n      },\n      '.note-btn-subscript': () => {\n        return styleInfo['font-subscript'] === 'subscript';\n      },\n      '.note-btn-superscript': () => {\n        return styleInfo['font-superscript'] === 'superscript';\n      },\n      '.note-btn-strikethrough': () => {\n        return styleInfo['font-strikethrough'] === 'strikethrough';\n      },\n    });\n\n    if (styleInfo['font-family']) {\n      const fontNames = styleInfo['font-family'].split(',').map((name) => {\n        return name.replace(/[\\'\\\"]/g, '')\n          .replace(/\\s+$/, '')\n          .replace(/^\\s+/, '');\n      });\n      const fontName = lists.find(fontNames, this.isFontInstalled.bind(this));\n\n      $cont.find('.dropdown-fontname a').each((idx, item) => {\n        const $item = $(item);\n        // always compare string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontName + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);\n    }\n\n    if (styleInfo['font-size']) {\n      const fontSize = styleInfo['font-size'];\n      $cont.find('.dropdown-fontsize a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontSize + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsize').text(fontSize);\n\n      const fontSizeUnit = styleInfo['font-size-unit'];\n      $cont.find('.dropdown-fontsizeunit a').each((idx, item) => {\n        const $item = $(item);\n        const isChecked = ($item.data('value') + '') === (fontSizeUnit + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);\n    }\n\n    if (styleInfo['line-height']) {\n      const lineHeight = styleInfo['line-height'];\n      $cont.find('.dropdown-line-height li a').each((idx, item) => {\n        // always compare with string to avoid creating another func.\n        const isChecked = ($(item).data('value') + '') === (lineHeight + '');\n        this.className = isChecked ? 'checked' : '';\n      });\n    }\n  }\n\n  updateBtnStates($container, infos) {\n    $.each(infos, (selector, pred) => {\n      this.ui.toggleBtnActive($container.find(selector), pred());\n    });\n  }\n\n  tableMoveHandler(event) {\n    const PX_PER_EM = 18;\n    const $picker = $(event.target.parentNode); // target is mousecatcher\n    const $dimensionDisplay = $picker.next();\n    const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n    const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n    const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n    let posOffset;\n    // HTML5 with jQuery - e.offsetX is undefined in Firefox\n    if (event.offsetX === undefined) {\n      const posCatcher = $(event.target).offset();\n      posOffset = {\n        x: event.pageX - posCatcher.left,\n        y: event.pageY - posCatcher.top,\n      };\n    } else {\n      posOffset = {\n        x: event.offsetX,\n        y: event.offsetY,\n      };\n    }\n\n    const dim = {\n      c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n      r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n    };\n\n    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n    $catcher.data('value', dim.c + 'x' + dim.r);\n\n    if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {\n      $unhighlighted.css({ width: dim.c + 1 + 'em' });\n    }\n\n    if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {\n      $unhighlighted.css({ height: dim.r + 1 + 'em' });\n    }\n\n    $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n  }\n}\n","import $ from 'jquery';\nexport default class Toolbar {\n  constructor(context) {\n    this.context = context;\n\n    this.$window = $(window);\n    this.$document = $(document);\n\n    this.ui = $.summernote.ui;\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.options = context.options;\n\n    this.isFollowing = false;\n    this.followScroll = this.followScroll.bind(this);\n  }\n\n  shouldInitialize() {\n    return !this.options.airMode;\n  }\n\n  initialize() {\n    this.options.toolbar = this.options.toolbar || [];\n\n    if (!this.options.toolbar.length) {\n      this.$toolbar.hide();\n    } else {\n      this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);\n    }\n\n    if (this.options.toolbarContainer) {\n      this.$toolbar.appendTo(this.options.toolbarContainer);\n    }\n\n    this.changeContainer(false);\n\n    this.$note.on('summernote.keyup summernote.mouseup summernote.change', () => {\n      this.context.invoke('buttons.updateCurrentStyle');\n    });\n\n    this.context.invoke('buttons.updateCurrentStyle');\n    if (this.options.followingToolbar) {\n      this.$window.on('scroll resize', this.followScroll);\n    }\n  }\n\n  destroy() {\n    this.$toolbar.children().remove();\n\n    if (this.options.followingToolbar) {\n      this.$window.off('scroll resize', this.followScroll);\n    }\n  }\n\n  followScroll() {\n    if (this.$editor.hasClass('fullscreen')) {\n      return false;\n    }\n\n    const editorHeight = this.$editor.outerHeight();\n    const editorWidth = this.$editor.width();\n    const toolbarHeight = this.$toolbar.height();\n    const statusbarHeight = this.$statusbar.height();\n\n    // check if the web app is currently using another static bar\n    let otherBarHeight = 0;\n    if (this.options.otherStaticBar) {\n      otherBarHeight = $(this.options.otherStaticBar).outerHeight();\n    }\n\n    const currentOffset = this.$document.scrollTop();\n    const editorOffsetTop = this.$editor.offset().top;\n    const editorOffsetBottom = editorOffsetTop + editorHeight;\n    const activateOffset = editorOffsetTop - otherBarHeight;\n    const deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;\n\n    if (!this.isFollowing &&\n      (currentOffset > activateOffset) && (currentOffset < deactivateOffsetBottom - toolbarHeight)) {\n      this.isFollowing = true;\n      this.$editable.css({\n        marginTop: this.$toolbar.outerHeight(),\n      });\n      this.$toolbar.css({\n        position: 'fixed',\n        top: otherBarHeight,\n        width: editorWidth,\n        zIndex: 1000,\n      });\n    } else if (this.isFollowing &&\n      ((currentOffset < activateOffset) || (currentOffset > deactivateOffsetBottom))) {\n      this.isFollowing = false;\n      this.$toolbar.css({\n        position: 'relative',\n        top: 0,\n        width: '100%',\n        zIndex: 'auto',\n      });\n      this.$editable.css({\n        marginTop: '',\n      });\n    }\n  }\n\n  changeContainer(isFullscreen) {\n    if (isFullscreen) {\n      this.$toolbar.prependTo(this.$editor);\n    } else {\n      if (this.options.toolbarContainer) {\n        this.$toolbar.appendTo(this.options.toolbarContainer);\n      }\n    }\n    if (this.options.followingToolbar) {\n      this.followScroll();\n    }\n  }\n\n  updateFullscreen(isFullscreen) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);\n\n    this.changeContainer(isFullscreen);\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  }\n\n  activate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, true);\n  }\n\n  deactivate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, false);\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\n\nexport default class LinkDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-txt-${this.options.id}\" class=\"note-form-label\">${this.lang.link.textToDisplay}</label>`,\n        `<input id=\"note-dialog-link-txt-${this.options.id}\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-url-${this.options.id}\" class=\"note-form-label\">${this.lang.link.url}</label>`,\n        `<input id=\"note-dialog-link-url-${this.options.id}\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>`,\n      '</div>',\n      !this.options.disableLinkTarget\n        ? $('<div/>').append(this.ui.checkbox({\n          className: 'sn-checkbox-open-in-new-window',\n          text: this.lang.link.openInNewWindow,\n          checked: true,\n        }).render()).html()\n        : '',\n      $('<div/>').append(this.ui.checkbox({\n        className: 'sn-checkbox-use-protocol',\n        text: this.lang.link.useProtocol,\n        checked: true,\n      }).render()).html(),\n    ].join('');\n\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.link.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      className: 'link-dialog',\n      title: this.lang.link.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  /**\n   * toggle update button\n   */\n  toggleLinkBtn($linkBtn, $linkText, $linkUrl) {\n    this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());\n  }\n\n  /**\n   * Show link dialog and set event handlers on dialog controls.\n   *\n   * @param {Object} linkInfo\n   * @return {Promise}\n   */\n  showLinkDialog(linkInfo) {\n    return $.Deferred((deferred) => {\n      const $linkText = this.$dialog.find('.note-link-text');\n      const $linkUrl = this.$dialog.find('.note-link-url');\n      const $linkBtn = this.$dialog.find('.note-link-btn');\n      const $openInNewWindow = this.$dialog\n        .find('.sn-checkbox-open-in-new-window input[type=checkbox]');\n      const $useProtocol = this.$dialog\n        .find('.sn-checkbox-use-protocol input[type=checkbox]');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // If no url was given and given text is valid URL then copy that into URL Field\n        if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {\n          linkInfo.url = linkInfo.text;\n        }\n\n        $linkText.on('input paste propertychange', () => {\n          // If linktext was modified by input events,\n          // cloning text from linkUrl will be stopped.\n          linkInfo.text = $linkText.val();\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.text);\n\n        $linkUrl.on('input paste propertychange', () => {\n          // Display same text on `Text to display` as default\n          // when linktext has no text\n          if (!linkInfo.text) {\n            $linkText.val($linkUrl.val());\n          }\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.url);\n\n        if (!env.isSupportTouch) {\n          $linkUrl.trigger('focus');\n        }\n\n        this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        this.bindEnterKey($linkUrl, $linkBtn);\n        this.bindEnterKey($linkText, $linkBtn);\n\n        const isNewWindowChecked = linkInfo.isNewWindow !== undefined\n          ? linkInfo.isNewWindow : this.context.options.linkTargetBlank;\n\n        $openInNewWindow.prop('checked', isNewWindowChecked);\n\n        const useProtocolChecked = linkInfo.url\n          ? false : this.context.options.useProtocol;\n\n        $useProtocol.prop('checked', useProtocolChecked);\n\n        $linkBtn.one('click', (event) => {\n          event.preventDefault();\n\n          deferred.resolve({\n            range: linkInfo.range,\n            url: $linkUrl.val(),\n            text: $linkText.val(),\n            isNewWindow: $openInNewWindow.is(':checked'),\n            checkProtocol: $useProtocol.is(':checked'),\n          });\n          this.ui.hideDialog(this.$dialog);\n        });\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        // detach events\n        $linkText.off();\n        $linkUrl.off();\n        $linkBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  /**\n   * @param {Object} layoutInfo\n   */\n  show() {\n    const linkInfo = this.context.invoke('editor.getLinkInfo');\n\n    this.context.invoke('editor.saveRange');\n    this.showLinkDialog(linkInfo).then((linkInfo) => {\n      this.context.invoke('editor.restoreRange');\n      this.context.invoke('editor.createLink', linkInfo);\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class LinkPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.link);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-link-popover',\n      callback: ($node) => {\n        const $content = $node.find('.popover-content,.note-popover-content');\n        $content.prepend('<span><a target=\"_blank\"></a>&nbsp;</span>');\n      },\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.link);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update() {\n    // Prevent focusing on editable when invoke('code') is executed\n    if (!this.context.invoke('editor.hasFocus')) {\n      this.hide();\n      return;\n    }\n\n    const rng = this.context.invoke('editor.getLastRange');\n    if (rng.isCollapsed() && rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      const href = $(anchor).attr('href');\n      this.$popover.find('a').attr('href', href).text(href);\n\n      const pos = dom.posFromPlaceholder(anchor);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class ImageDialog {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    let imageLimitation = '';\n    if (this.options.maximumImageFileSize) {\n      const unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));\n      const readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +\n                         ' ' + ' KMGTP'[unit] + 'B';\n      imageLimitation = `<small>${this.lang.image.maximumFileSize + ' : ' + readableSize}</small>`;\n    }\n\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group note-group-select-from-files\">',\n        '<label for=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.selectFromFiles + '</label>',\n        '<input id=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-image-input form-control-file note-form-control note-input\" ',\n        ' type=\"file\" name=\"files\" accept=\"image/*\" multiple=\"multiple\"/>',\n        imageLimitation,\n      '</div>',\n      '<div class=\"form-group note-group-image-url\">',\n        '<label for=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.url + '</label>',\n        '<input id=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-image-url form-control note-form-control note-input\" type=\"text\"/>',\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.image.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.image.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showImageDialog().then((data) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      if (typeof data === 'string') { // image url\n        // If onImageLinkInsert set,\n        if (this.options.callbacks.onImageLinkInsert) {\n          this.context.triggerEvent('image.link.insert', data);\n        } else {\n          this.context.invoke('editor.insertImage', data);\n        }\n      } else { // array of files\n        this.context.invoke('editor.insertImagesOrCallback', data);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show image dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showImageDialog() {\n    return $.Deferred((deferred) => {\n      const $imageInput = this.$dialog.find('.note-image-input');\n      const $imageUrl = this.$dialog.find('.note-image-url');\n      const $imageBtn = this.$dialog.find('.note-image-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // Cloning imageInput to clear element.\n        $imageInput.replaceWith($imageInput.clone().on('change', (event) => {\n          deferred.resolve(event.target.files || event.target.value);\n        }).val(''));\n\n        $imageUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($imageBtn, $imageUrl.val());\n        }).val('');\n\n        if (!env.isSupportTouch) {\n          $imageUrl.trigger('focus');\n        }\n\n        $imageBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($imageUrl.val());\n        });\n\n        this.bindEnterKey($imageUrl, $imageBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $imageInput.off();\n        $imageUrl.off();\n        $imageBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\n/**\n * Image popover module\n *  mouse events that show/hide popover will be handled by Handle.js.\n *  Handle.js will receive the events and invoke 'imagePopover.update'.\n */\nexport default class ImagePopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n\n    this.editable = context.layoutInfo.editable[0];\n    this.options = context.options;\n\n    this.events = {\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.image);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-image-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n    this.context.invoke('buttons.build', $content, this.options.popover.image);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target, event) {\n    if (dom.isImg(target)) {\n      const position = $(target).offset();\n      const containerOffset = $(this.options.container).offset();\n      let pos = {};\n      if (this.options.popatmouse) {\n        pos.left = event.pageX - 20;\n        pos.top = event.pageY;\n      } else {\n        pos = position;\n      }\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class TablePopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        this.update(e.target);\n      },\n      'summernote.keyup summernote.scroll summernote.change': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.table);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-table-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.table);\n\n    // [workaround] Disable Firefox's default table editor\n    if (env.isFF) {\n      document.execCommand('enableInlineTableEditing', false, false);\n    }\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isCell = dom.isCell(target);\n\n    if (isCell) {\n      const pos = dom.posFromPlaceholder(target);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n\n    return isCell;\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class VideoDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group row-fluid\">',\n        `<label for=\"note-dialog-video-url-${this.options.id}\" class=\"note-form-label\">${this.lang.video.url} <small class=\"text-muted\">${this.lang.video.providers}</small></label>`,\n        `<input id=\"note-dialog-video-url-${this.options.id}\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.video.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.video.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  createVideoNode(url) {\n    // video url patterns(youtube, instagram, vimeo, dailymotion, youku, mp4, ogg, webm)\n    const ytRegExp = /\\/\\/(?:(?:www|m)\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))([\\w|-]{11})(?:(?:[\\?&]t=)(\\S+))?$/;\n    const ytRegExpForStart = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n    const ytMatch = url.match(ytRegExp);\n\n    const igRegExp = /(?:www\\.|\\/\\/)instagram\\.com\\/p\\/(.[a-zA-Z0-9_-]*)/;\n    const igMatch = url.match(igRegExp);\n\n    const vRegExp = /\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9]+)/;\n    const vMatch = url.match(vRegExp);\n\n    const vimRegExp = /\\/\\/(player\\.)?vimeo\\.com\\/([a-z]*\\/)*(\\d+)[?]?.*/;\n    const vimMatch = url.match(vimRegExp);\n\n    const dmRegExp = /.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?/;\n    const dmMatch = url.match(dmRegExp);\n\n    const youkuRegExp = /\\/\\/v\\.youku\\.com\\/v_show\\/id_(\\w+)=*\\.html/;\n    const youkuMatch = url.match(youkuRegExp);\n\n    const qqRegExp = /\\/\\/v\\.qq\\.com.*?vid=(.+)/;\n    const qqMatch = url.match(qqRegExp);\n\n    const qqRegExp2 = /\\/\\/v\\.qq\\.com\\/x?\\/?(page|cover).*?\\/([^\\/]+)\\.html\\??.*/;\n    const qqMatch2 = url.match(qqRegExp2);\n\n    const mp4RegExp = /^.+.(mp4|m4v)$/;\n    const mp4Match = url.match(mp4RegExp);\n\n    const oggRegExp = /^.+.(ogg|ogv)$/;\n    const oggMatch = url.match(oggRegExp);\n\n    const webmRegExp = /^.+.(webm)$/;\n    const webmMatch = url.match(webmRegExp);\n\n    const fbRegExp = /(?:www\\.|\\/\\/)facebook\\.com\\/([^\\/]+)\\/videos\\/([0-9]+)/;\n    const fbMatch = url.match(fbRegExp);\n\n    let $video;\n    if (ytMatch && ytMatch[1].length === 11) {\n      const youtubeId = ytMatch[1];\n      var start = 0;\n      if (typeof ytMatch[2] !== 'undefined') {\n        const ytMatchForStart = ytMatch[2].match(ytRegExpForStart);\n        if (ytMatchForStart) {\n          for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {\n            start += (typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0);\n          }\n        }\n      }\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : ''))\n        .attr('width', '640').attr('height', '360');\n    } else if (igMatch && igMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/')\n        .attr('width', '612').attr('height', '710')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else if (vMatch && vMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', vMatch[0] + '/embed/simple')\n        .attr('width', '600').attr('height', '600')\n        .attr('class', 'vine-embed');\n    } else if (vimMatch && vimMatch[3].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('src', '//player.vimeo.com/video/' + vimMatch[3])\n        .attr('width', '640').attr('height', '360');\n    } else if (dmMatch && dmMatch[2].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2])\n        .attr('width', '640').attr('height', '360');\n    } else if (youkuMatch && youkuMatch[1].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '498')\n        .attr('width', '510')\n        .attr('src', '//player.youku.com/embed/' + youkuMatch[1]);\n    } else if ((qqMatch && qqMatch[1].length) || (qqMatch2 && qqMatch2[2].length)) {\n      const vid = ((qqMatch && qqMatch[1].length) ? qqMatch[1] : qqMatch2[2]);\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '310')\n        .attr('width', '500')\n        .attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');\n    } else if (mp4Match || oggMatch || webmMatch) {\n      $video = $('<video controls>')\n        .attr('src', url)\n        .attr('width', '640').attr('height', '360');\n    } else if (fbMatch && fbMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560')\n        .attr('width', '560').attr('height', '301')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else {\n      // this is not a known video link. Now what, Cat? Now what?\n      return false;\n    }\n\n    $video.addClass('note-video-clip');\n\n    return $video[0];\n  }\n\n  show() {\n    const text = this.context.invoke('editor.getSelectedText');\n    this.context.invoke('editor.saveRange');\n    this.showVideoDialog(text).then((url) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      // build node\n      const $node = this.createVideoNode(url);\n\n      if ($node) {\n        // insert video node\n        this.context.invoke('editor.insertNode', $node);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show video dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showVideoDialog(/* text */) {\n    return $.Deferred((deferred) => {\n      const $videoUrl = this.$dialog.find('.note-video-url');\n      const $videoBtn = this.$dialog.find('.note-video-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        $videoUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($videoBtn, $videoUrl.val());\n        });\n\n        if (!env.isSupportTouch) {\n          $videoUrl.trigger('focus');\n        }\n\n        $videoBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($videoUrl.val());\n        });\n\n        this.bindEnterKey($videoUrl, $videoBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $videoUrl.off();\n        $videoBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\n\nexport default class HelpDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<p class=\"text-center\">',\n        '<a href=\"http://summernote.org/\" target=\"_blank\">Summernote @@VERSION@@</a> · ',\n        '<a href=\"https://github.com/summernote/summernote\" target=\"_blank\">Project</a> · ',\n        '<a href=\"https://github.com/summernote/summernote/issues\" target=\"_blank\">Issues</a>',\n      '</p>',\n    ].join('');\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.options.help,\n      fade: this.options.dialogsFade,\n      body: this.createShortcutList(),\n      footer: body,\n      callback: ($node) => {\n        $node.find('.modal-body,.note-modal-body').css({\n          'max-height': 300,\n          'overflow': 'scroll',\n        });\n      },\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  createShortcutList() {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    return Object.keys(keyMap).map((key) => {\n      const command = keyMap[key];\n      const $row = $('<div><div class=\"help-list-item\"></div></div>');\n      $row.append($('<label><kbd>' + key + '</kdb></label>').css({\n        'width': 180,\n        'margin-right': 10,\n      })).append($('<span/>').html(this.context.memo('help.' + command) || command));\n      return $row.html();\n    }).join('');\n  }\n\n  /**\n   * show help dialog\n   *\n   * @return {Promise}\n   */\n  showHelpDialog() {\n    return $.Deferred((deferred) => {\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n        deferred.resolve();\n      });\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showHelpDialog().then(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\n\nconst AIRMODE_POPOVER_X_OFFSET = -5;\nconst AIRMODE_POPOVER_Y_OFFSET = 5;\n\nexport default class AirPopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n\n    this.hidable = true;\n    this.onContextmenu = false;\n    this.pageX = null;\n    this.pageY = null;\n\n    this.events = {\n      'summernote.contextmenu': (e) => {\n        if (this.options.editing) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.onContextmenu = true;\n          this.update(true);\n        }\n      },\n      'summernote.mousedown': (we, e) => {\n        this.pageX = e.pageX;\n        this.pageY = e.pageY;\n      },\n      'summernote.keyup summernote.mouseup summernote.scroll': (we, e) => {\n        if (this.options.editing && !this.onContextmenu) {\n          this.pageX = e.pageX;\n          this.pageY = e.pageY;\n          this.update();\n        }\n        this.onContextmenu = false;\n      },\n      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.focusout': () => {\n        if (!this.$popover.is(':active,:focus')) {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.options.airMode && !lists.isEmpty(this.options.popover.air);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-air-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.air);\n\n    // disable hiding this popover preemptively by 'summernote.blur' event.\n    this.$popover.on('mousedown', () => { this.hidable = false; });\n    // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).\n    this.$popover.on('mouseup', () => { this.hidable = true; });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(forcelyOpen) {\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {\n      let rect = {\n        left: this.pageX,\n        top: this.pageY,\n      };\n\n      const containerOffset = $(this.options.container).offset();\n      rect.top -= containerOffset.top;\n      rect.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,\n        top: rect.top + AIRMODE_POPOVER_Y_OFFSET,\n      });\n      this.context.invoke('buttons.updateCurrentStyle', this.$popover);\n    } else {\n      this.hide();\n    }\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.hide();\n    } \n  }\n\n  hide() {\n    if (this.hidable) {\n      this.$popover.hide();\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport key from '../core/key';\n\nconst POPOVER_DIST = 5;\n\nexport default class HintPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.hint = this.options.hint || [];\n    this.direction = this.options.hintDirection || 'bottom';\n    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.hints.length > 0;\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n    this.matchingWord = null;\n    this.$popover = this.ui.popover({\n      className: 'note-hint-popover',\n      hideArrow: true,\n      direction: '',\n    }).render().appendTo(this.options.container);\n\n    this.$popover.hide();\n    this.$content = this.$popover.find('.popover-content,.note-popover-content');\n    this.$content.on('click', '.note-hint-item', (e) => {\n      this.$content.find('.active').removeClass('active');\n      $(e.currentTarget).addClass('active');\n      this.replace();\n    });\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  selectItem($item) {\n    this.$content.find('.active').removeClass('active');\n    $item.addClass('active');\n\n    this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);\n  }\n\n  moveDown() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $next = $current.next();\n\n    if ($next.length) {\n      this.selectItem($next);\n    } else {\n      let $nextGroup = $current.parent().next();\n\n      if (!$nextGroup.length) {\n        $nextGroup = this.$content.find('.note-hint-group').first();\n      }\n\n      this.selectItem($nextGroup.find('.note-hint-item').first());\n    }\n  }\n\n  moveUp() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $prev = $current.prev();\n\n    if ($prev.length) {\n      this.selectItem($prev);\n    } else {\n      let $prevGroup = $current.parent().prev();\n\n      if (!$prevGroup.length) {\n        $prevGroup = this.$content.find('.note-hint-group').last();\n      }\n\n      this.selectItem($prevGroup.find('.note-hint-item').last());\n    }\n  }\n\n  replace() {\n    const $item = this.$content.find('.note-hint-item.active');\n\n    if ($item.length) {\n      var node = this.nodeFromItem($item);\n      // If matchingWord length = 0 -> capture OK / open hint / but as mention capture \"\" (\\w*)\n      if (this.matchingWord !== null && this.matchingWord.length === 0) {\n        this.lastWordRange.so = this.lastWordRange.eo;\n      // Else si > 0 and normal case -> adjust range \"before\" for correct position of insertion\n      } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {\n        let rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;\n        if (rangeCompute > 0) {\n          this.lastWordRange.so += rangeCompute;\n        }\n      }\n      this.lastWordRange.insertNode(node);\n\n      if (this.options.hintSelect === 'next') {\n        var blank = document.createTextNode('');\n        $(node).after(blank);\n        range.createFromNodeBefore(blank).select();\n      } else {\n        range.createFromNodeAfter(node).select();\n      }\n\n      this.lastWordRange = null;\n      this.hide();\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  nodeFromItem($item) {\n    const hint = this.hints[$item.data('index')];\n    const item = $item.data('item');\n    let node = hint.content ? hint.content(item) : item;\n    if (typeof node === 'string') {\n      node = dom.createText(node);\n    }\n    return node;\n  }\n\n  createItemTemplates(hintIdx, items) {\n    const hint = this.hints[hintIdx];\n    return items.map((item /*, idx */) => {\n      const $item = $('<div class=\"note-hint-item\"/>');\n      $item.append(hint.template ? hint.template(item) : item + '');\n      $item.data({\n        'index': hintIdx,\n        'item': item,\n      });\n      return $item;\n    });\n  }\n\n  handleKeydown(e) {\n    if (!this.$popover.is(':visible')) {\n      return;\n    }\n\n    if (e.keyCode === key.code.ENTER) {\n      e.preventDefault();\n      this.replace();\n    } else if (e.keyCode === key.code.UP) {\n      e.preventDefault();\n      this.moveUp();\n    } else if (e.keyCode === key.code.DOWN) {\n      e.preventDefault();\n      this.moveDown();\n    }\n  }\n\n  searchKeyword(index, keyword, callback) {\n    const hint = this.hints[index];\n    if (hint && hint.match.test(keyword) && hint.search) {\n      const matches = hint.match.exec(keyword);\n      this.matchingWord = matches[0];\n      hint.search(matches[1], callback);\n    } else {\n      callback();\n    }\n  }\n\n  createGroup(idx, keyword) {\n    const $group = $('<div class=\"note-hint-group note-hint-group-' + idx + '\"></div>');\n    this.searchKeyword(idx, keyword, (items) => {\n      items = items || [];\n      if (items.length) {\n        $group.html(this.createItemTemplates(idx, items));\n        this.show();\n      }\n    });\n\n    return $group;\n  }\n\n  handleKeyup(e) {\n    if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {\n      let range = this.context.invoke('editor.getLastRange');\n      let wordRange, keyword;\n      if (this.options.hintMode === 'words') {\n        wordRange = range.getWordsRange(range);\n        keyword = wordRange.toString();\n\n        this.hints.forEach((hint) => {\n          if (hint.match.test(keyword)) {\n            wordRange = range.getWordsMatchRange(hint.match);\n            return false;\n          }\n        });\n\n        if (!wordRange) {\n          this.hide();\n          return;\n        }\n\n        keyword = wordRange.toString();\n      } else {\n        wordRange = range.getWordRange();\n        keyword = wordRange.toString();\n      }\n\n      if (this.hints.length && keyword) {\n        this.$content.empty();\n\n        const bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));\n        const containerOffset = $(this.options.container).offset();\n        if (bnd) {\n          bnd.top -= containerOffset.top;\n          bnd.left -= containerOffset.left;\n\n          this.$popover.hide();\n          this.lastWordRange = wordRange;\n          this.hints.forEach((hint, idx) => {\n            if (hint.match.test(keyword)) {\n              this.createGroup(idx, keyword).appendTo(this.$content);\n            }\n          });\n          // select first .note-hint-item\n          this.$content.find('.note-hint-item:first').addClass('active');\n\n          // set position for popover after group is created\n          if (this.direction === 'top') {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST,\n            });\n          } else {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top + bnd.height + POPOVER_DIST,\n            });\n          }\n        }\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  show() {\n    this.$popover.show();\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport './summernote-en-US';\nimport '../summernote';\nimport dom from './core/dom';\nimport range from './core/range';\nimport lists from './core/lists';\nimport Editor from './module/Editor';\nimport Clipboard from './module/Clipboard';\nimport Dropzone from './module/Dropzone';\nimport Codeview from './module/Codeview';\nimport Statusbar from './module/Statusbar';\nimport Fullscreen from './module/Fullscreen';\nimport Handle from './module/Handle';\nimport AutoLink from './module/AutoLink';\nimport AutoSync from './module/AutoSync';\nimport AutoReplace from './module/AutoReplace';\nimport Placeholder from './module/Placeholder';\nimport Buttons from './module/Buttons';\nimport Toolbar from './module/Toolbar';\nimport LinkDialog from './module/LinkDialog';\nimport LinkPopover from './module/LinkPopover';\nimport ImageDialog from './module/ImageDialog';\nimport ImagePopover from './module/ImagePopover';\nimport TablePopover from './module/TablePopover';\nimport VideoDialog from './module/VideoDialog';\nimport HelpDialog from './module/HelpDialog';\nimport AirPopover from './module/AirPopover';\nimport HintPopover from './module/HintPopover';\n\n$.summernote = $.extend($.summernote, {\n  version: '@@VERSION@@',\n  plugins: {},\n\n  dom: dom,\n  range: range,\n  lists: lists,\n\n  options: {\n    langInfo: $.summernote.lang['en-US'],\n    editing: true,\n    modules: {\n      'editor': Editor,\n      'clipboard': Clipboard,\n      'dropzone': Dropzone,\n      'codeview': Codeview,\n      'statusbar': Statusbar,\n      'fullscreen': Fullscreen,\n      'handle': Handle,\n      // FIXME: HintPopover must be front of autolink\n      //  - Script error about range when Enter key is pressed on hint popover\n      'hintPopover': HintPopover,\n      'autoLink': AutoLink,\n      'autoSync': AutoSync,\n      'autoReplace': AutoReplace,\n      'placeholder': Placeholder,\n      'buttons': Buttons,\n      'toolbar': Toolbar,\n      'linkDialog': LinkDialog,\n      'linkPopover': LinkPopover,\n      'imageDialog': ImageDialog,\n      'imagePopover': ImagePopover,\n      'tablePopover': TablePopover,\n      'videoDialog': VideoDialog,\n      'helpDialog': HelpDialog,\n      'airPopover': AirPopover,\n    },\n\n    buttons: {},\n\n    lang: 'en-US',\n\n    followingToolbar: false,\n    toolbarPosition: 'top',\n    otherStaticBar: '',\n\n    // toolbar\n    codeviewKeepButton: false,\n    toolbar: [\n      ['style', ['style']],\n      ['font', ['bold', 'underline', 'clear']],\n      ['fontname', ['fontname']],\n      ['color', ['color']],\n      ['para', ['ul', 'ol', 'paragraph']],\n      ['table', ['table']],\n      ['insert', ['link', 'picture', 'video']],\n      ['view', ['fullscreen', 'codeview', 'help']],\n    ],\n\n    // popover\n    popatmouse: true,\n    popover: {\n      image: [\n        ['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n        ['float', ['floatLeft', 'floatRight', 'floatNone']],\n        ['remove', ['removeMedia']],\n      ],\n      link: [\n        ['link', ['linkDialogShow', 'unlink']],\n      ],\n      table: [\n        ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n        ['delete', ['deleteRow', 'deleteCol', 'deleteTable']],\n      ],\n      air: [\n        ['color', ['color']],\n        ['font', ['bold', 'underline', 'clear']],\n        ['para', ['ul', 'paragraph']],\n        ['table', ['table']],\n        ['insert', ['link', 'picture']],\n        ['view', ['fullscreen', 'codeview']],\n      ],\n    },\n\n    // air mode: inline editor\n    airMode: false,\n    overrideContextMenu: false, // TBD\n\n    width: null,\n    height: null,\n    linkTargetBlank: true,\n    useProtocol: true,\n    defaultProtocol: 'http://',\n\n    focus: false,\n    tabDisabled: false,\n    tabSize: 4,\n    styleWithCSS: false,\n    shortcuts: true,\n    textareaAutoSync: true,\n    tooltip: 'auto',\n    container: null,\n    maxTextLength: 0,\n    blockquoteBreakingLevel: 2,\n    spellCheck: true,\n    disableGrammar: false,\n    placeholder: null,\n    inheritPlaceholder: false,\n    // TODO: need to be documented\n    recordEveryKeystroke: false,\n    historyLimit: 200,\n\n    // TODO: need to be documented\n    showDomainOnlyForAutolink: false,\n\n    // TODO: need to be documented\n    hintMode: 'word',\n    hintSelect: 'after',\n    hintDirection: 'bottom',\n\n    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n\n    fontNames: [\n      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',\n      'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',\n      'Tahoma', 'Times New Roman', 'Verdana',\n    ],\n    fontNamesIgnoreCheck: [],\n    addDefaultFonts: true,\n\n    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],\n\n    fontSizeUnits: ['px', 'pt'],\n\n    // pallete colors(n x n)\n    colors: [\n      ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],\n      ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],\n      ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],\n      ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],\n      ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],\n      ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],\n      ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],\n      ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'],\n    ],\n\n    // http://chir.ag/projects/name-that-color/\n    colorsName: [\n      ['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'],\n      ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'],\n      ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'],\n      ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'],\n      ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'],\n      ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'],\n      ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'],\n      ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou'],\n    ],\n\n    colorButton: {\n      foreColor: '#000000',\n      backColor: '#FFFF00',\n    },\n\n    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],\n\n    tableClassName: 'table table-bordered',\n\n    insertTableMaxSize: {\n      col: 10,\n      row: 10,\n    },\n\n    // By default, dialogs are attached in container.\n    dialogsInBody: false,\n    dialogsFade: false,\n\n    maximumImageFileSize: null,\n\n    callbacks: {\n      onBeforeCommand: null,\n      onBlur: null,\n      onBlurCodeview: null,\n      onChange: null,\n      onChangeCodeview: null,\n      onDialogShown: null,\n      onEnter: null,\n      onFocus: null,\n      onImageLinkInsert: null,\n      onImageUpload: null,\n      onImageUploadError: null,\n      onInit: null,\n      onKeydown: null,\n      onKeyup: null,\n      onMousedown: null,\n      onMouseup: null,\n      onPaste: null,\n      onScroll: null,\n    },\n\n    codemirror: {\n      mode: 'text/html',\n      htmlMode: true,\n      lineNumbers: true,\n    },\n\n    codeviewFilter: false,\n    codeviewFilterRegex: /<\\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,\n    codeviewIframeFilter: true,\n    codeviewIframeWhitelistSrc: [],\n    codeviewIframeWhitelistSrcBase: [\n      'www.youtube.com',\n      'www.youtube-nocookie.com',\n      'www.facebook.com',\n      'vine.co',\n      'instagram.com',\n      'player.vimeo.com',\n      'www.dailymotion.com',\n      'player.youku.com',\n      'v.qq.com',\n    ],\n\n    keyMap: {\n      pc: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CTRL+Z': 'undo',\n        'CTRL+Y': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CTRL+B': 'bold',\n        'CTRL+I': 'italic',\n        'CTRL+U': 'underline',\n        'CTRL+SHIFT+S': 'strikethrough',\n        'CTRL+BACKSLASH': 'removeFormat',\n        'CTRL+SHIFT+L': 'justifyLeft',\n        'CTRL+SHIFT+E': 'justifyCenter',\n        'CTRL+SHIFT+R': 'justifyRight',\n        'CTRL+SHIFT+J': 'justifyFull',\n        'CTRL+SHIFT+NUM7': 'insertUnorderedList',\n        'CTRL+SHIFT+NUM8': 'insertOrderedList',\n        'CTRL+LEFTBRACKET': 'outdent',\n        'CTRL+RIGHTBRACKET': 'indent',\n        'CTRL+NUM0': 'formatPara',\n        'CTRL+NUM1': 'formatH1',\n        'CTRL+NUM2': 'formatH2',\n        'CTRL+NUM3': 'formatH3',\n        'CTRL+NUM4': 'formatH4',\n        'CTRL+NUM5': 'formatH5',\n        'CTRL+NUM6': 'formatH6',\n        'CTRL+ENTER': 'insertHorizontalRule',\n        'CTRL+K': 'linkDialog.show',\n      },\n\n      mac: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CMD+Z': 'undo',\n        'CMD+SHIFT+Z': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CMD+B': 'bold',\n        'CMD+I': 'italic',\n        'CMD+U': 'underline',\n        'CMD+SHIFT+S': 'strikethrough',\n        'CMD+BACKSLASH': 'removeFormat',\n        'CMD+SHIFT+L': 'justifyLeft',\n        'CMD+SHIFT+E': 'justifyCenter',\n        'CMD+SHIFT+R': 'justifyRight',\n        'CMD+SHIFT+J': 'justifyFull',\n        'CMD+SHIFT+NUM7': 'insertUnorderedList',\n        'CMD+SHIFT+NUM8': 'insertOrderedList',\n        'CMD+LEFTBRACKET': 'outdent',\n        'CMD+RIGHTBRACKET': 'indent',\n        'CMD+NUM0': 'formatPara',\n        'CMD+NUM1': 'formatH1',\n        'CMD+NUM2': 'formatH2',\n        'CMD+NUM3': 'formatH3',\n        'CMD+NUM4': 'formatH4',\n        'CMD+NUM5': 'formatH5',\n        'CMD+NUM6': 'formatH6',\n        'CMD+ENTER': 'insertHorizontalRule',\n        'CMD+K': 'linkDialog.show',\n      },\n    },\n    icons: {\n      'align': 'note-icon-align',\n      'alignCenter': 'note-icon-align-center',\n      'alignJustify': 'note-icon-align-justify',\n      'alignLeft': 'note-icon-align-left',\n      'alignRight': 'note-icon-align-right',\n      'rowBelow': 'note-icon-row-below',\n      'colBefore': 'note-icon-col-before',\n      'colAfter': 'note-icon-col-after',\n      'rowAbove': 'note-icon-row-above',\n      'rowRemove': 'note-icon-row-remove',\n      'colRemove': 'note-icon-col-remove',\n      'indent': 'note-icon-align-indent',\n      'outdent': 'note-icon-align-outdent',\n      'arrowsAlt': 'note-icon-arrows-alt',\n      'bold': 'note-icon-bold',\n      'caret': 'note-icon-caret',\n      'circle': 'note-icon-circle',\n      'close': 'note-icon-close',\n      'code': 'note-icon-code',\n      'eraser': 'note-icon-eraser',\n      'floatLeft': 'note-icon-float-left',\n      'floatRight': 'note-icon-float-right',\n      'font': 'note-icon-font',\n      'frame': 'note-icon-frame',\n      'italic': 'note-icon-italic',\n      'link': 'note-icon-link',\n      'unlink': 'note-icon-chain-broken',\n      'magic': 'note-icon-magic',\n      'menuCheck': 'note-icon-menu-check',\n      'minus': 'note-icon-minus',\n      'orderedlist': 'note-icon-orderedlist',\n      'pencil': 'note-icon-pencil',\n      'picture': 'note-icon-picture',\n      'question': 'note-icon-question',\n      'redo': 'note-icon-redo',\n      'rollback': 'note-icon-rollback',\n      'square': 'note-icon-square',\n      'strikethrough': 'note-icon-strikethrough',\n      'subscript': 'note-icon-subscript',\n      'superscript': 'note-icon-superscript',\n      'table': 'note-icon-table',\n      'textHeight': 'note-icon-text-height',\n      'trash': 'note-icon-trash',\n      'underline': 'note-icon-underline',\n      'undo': 'note-icon-undo',\n      'unorderedlist': 'note-icon-unorderedlist',\n      'video': 'note-icon-video',\n    },\n  },\n});\n","import $ from 'jquery';\nimport renderer from '../base/renderer';\n\nconst editor = renderer.create('<div class=\"note-editor note-frame card\"/>');\nconst toolbar = renderer.create('<div class=\"note-toolbar card-header\" role=\"toolbar\"/>');\nconst editingArea = renderer.create('<div class=\"note-editing-area\"/>');\nconst codable = renderer.create('<textarea class=\"note-codable\" aria-multiline=\"true\"/>');\nconst editable = renderer.create('<div class=\"note-editable card-block\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"/>');\nconst statusbar = renderer.create([\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n  '<div class=\"note-statusbar\" role=\"status\">',\n    '<div class=\"note-resizebar\" aria-label=\"Resize\">',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n    '</div>',\n  '</div>',\n].join(''));\n\nconst airEditor = renderer.create('<div class=\"note-editor note-airframe\"/>');\nconst airEditable = renderer.create([\n  '<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>',\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n].join(''));\n\nconst buttonGroup = renderer.create('<div class=\"note-btn-group btn-group\">');\n\nconst dropdown = renderer.create('<div class=\"note-dropdown-menu dropdown-menu\" role=\"list\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    const option = (typeof item === 'object') ? item.option : undefined;\n\n    const dataValue = 'data-value=\"' + value + '\"';\n    const dataOption = (option !== undefined) ? ' data-option=\"' + option + '\"' : '';\n    return '<a class=\"dropdown-item\" href=\"#\" ' + (dataValue + dataOption) + ' role=\"listitem\" aria-label=\"' + value + '\">' + content + '</a>';\n  }).join('') : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownButtonContents = function(contents) {\n  return contents;\n};\n\nconst dropdownCheck = renderer.create('<div class=\"note-dropdown-menu dropdown-menu note-check\" role=\"list\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    return '<a class=\"dropdown-item\" href=\"#\" data-value=\"' + value + '\" role=\"listitem\" aria-label=\"' + item + '\">' + icon(options.checkClassName) + ' ' + content + '</a>';\n  }).join('') : options.items;\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dialog = renderer.create('<div class=\"modal note-modal\" aria-hidden=\"false\" tabindex=\"-1\" role=\"dialog\"/>', function($node, options) {\n  if (options.fade) {\n    $node.addClass('fade');\n  }\n  $node.attr({\n    'aria-label': options.title,\n  });\n  $node.html([\n    '<div class=\"modal-dialog\">',\n      '<div class=\"modal-content\">',\n        (options.title ? '<div class=\"modal-header\">' +\n          '<h4 class=\"modal-title\">' + options.title + '</h4>' +\n          '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\" aria-hidden=\"true\">&times;</button>' +\n        '</div>' : ''),\n        '<div class=\"modal-body\">' + options.body + '</div>',\n        (options.footer ? '<div class=\"modal-footer\">' + options.footer + '</div>' : ''),\n      '</div>',\n    '</div>',\n  ].join(''));\n});\n\nconst popover = renderer.create([\n  '<div class=\"note-popover popover in\">',\n    '<div class=\"arrow\"></div>',\n    '<div class=\"popover-content note-children-container\"></div>',\n  '</div>',\n].join(''), function($node, options) {\n  const direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';\n\n  $node.addClass(direction);\n\n  if (options.hideArrow) {\n    $node.find('.arrow').hide();\n  }\n});\n\nconst checkbox = renderer.create('<div class=\"form-check\"></div>', function($node, options) {\n  $node.html([\n    '<label class=\"form-check-label\"' + (options.id ? ' for=\"note-' + options.id + '\"' : '') + '>',\n      '<input type=\"checkbox\" class=\"form-check-input\"' + (options.id ? ' id=\"note-' + options.id + '\"' : ''),\n        (options.checked ? ' checked' : ''),\n        ' aria-label=\"' + (options.text ? options.text : '') + '\"',\n        ' aria-checked=\"' + (options.checked ? 'true' : 'false') + '\"/>',\n      ' ' + (options.text ? options.text : '') +\n    '</label>',\n  ].join(''));\n});\n\nconst icon = function(iconClassName, tagName) {\n  tagName = tagName || 'i';\n  return '<' + tagName + ' class=\"' + iconClassName + '\"></' + tagName+'>';\n};\n\nconst ui = function(editorOptions) {\n  return {\n    editor: editor,\n    toolbar: toolbar,\n    editingArea: editingArea,\n    codable: codable,\n    editable: editable,\n    statusbar: statusbar,\n    airEditor: airEditor,\n    airEditable: airEditable,\n    buttonGroup: buttonGroup,\n    dropdown: dropdown,\n    dropdownButtonContents: dropdownButtonContents,\n    dropdownCheck: dropdownCheck,\n    dialog: dialog,\n    popover: popover,\n    icon: icon,\n    checkbox: checkbox,\n    options: editorOptions,\n\n    palette: function($node, options) {\n      return renderer.create('<div class=\"note-color-palette\"/>', function($node, options) {\n        const contents = [];\n        for (let row = 0, rowSize = options.colors.length; row < rowSize; row++) {\n          const eventName = options.eventName;\n          const colors = options.colors[row];\n          const colorsName = options.colorsName[row];\n          const buttons = [];\n          for (let col = 0, colSize = colors.length; col < colSize; col++) {\n            const color = colors[col];\n            const colorName = colorsName[col];\n            buttons.push([\n              '<button type=\"button\" class=\"note-color-btn\"',\n              'style=\"background-color:', color, '\" ',\n              'data-event=\"', eventName, '\" ',\n              'data-value=\"', color, '\" ',\n              'title=\"', colorName, '\" ',\n              'aria-label=\"', colorName, '\" ',\n              'data-toggle=\"button\" tabindex=\"-1\"></button>',\n            ].join(''));\n          }\n          contents.push('<div class=\"note-color-row\">' + buttons.join('') + '</div>');\n        }\n        $node.html(contents.join(''));\n\n        if (options.tooltip) {\n          $node.find('.note-color-btn').tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          });\n        }\n      })($node, options);\n    },\n\n    button: function($node, options) {\n      return renderer.create('<button type=\"button\" class=\"note-btn btn btn-light btn-sm\" tabindex=\"-1\">', function($node, options) {\n        if (options && options.tooltip) {\n          $node.attr({\n            title: options.tooltip,\n            'aria-label': options.tooltip,\n          }).tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          }).on('click', (e) => {\n            $(e.currentTarget).tooltip('hide');\n          });\n        }\n        if (options && options.codeviewButton) {\n          $node.addClass('note-codeview-keep');\n        }\n      })($node, options);\n    },\n\n    toggleBtn: function($btn, isEnable) {\n      $btn.toggleClass('disabled', !isEnable);\n      $btn.attr('disabled', !isEnable);\n    },\n\n    toggleBtnActive: function($btn, isActive) {\n      $btn.toggleClass('active', isActive);\n    },\n\n    onDialogShown: function($dialog, handler) {\n      $dialog.one('shown.bs.modal', handler);\n    },\n\n    onDialogHidden: function($dialog, handler) {\n      $dialog.one('hidden.bs.modal', handler);\n    },\n\n    showDialog: function($dialog) {\n      $dialog.modal('show');\n    },\n\n    hideDialog: function($dialog) {\n      $dialog.modal('hide');\n    },\n\n    createLayout: function($note) {\n      const $editor = (editorOptions.airMode ? airEditor([\n        editingArea([\n          codable(),\n          airEditable(),\n        ]),\n      ]) : (editorOptions.toolbarPosition === 'bottom'\n        ? editor([\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          toolbar(),\n          statusbar(),\n        ])\n        : editor([\n          toolbar(),\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          statusbar(),\n        ])\n      )).render();\n\n      $editor.insertAfter($note);\n\n      return {\n        note: $note,\n        editor: $editor,\n        toolbar: $editor.find('.note-toolbar'),\n        editingArea: $editor.find('.note-editing-area'),\n        editable: $editor.find('.note-editable'),\n        codable: $editor.find('.note-codable'),\n        statusbar: $editor.find('.note-statusbar'),\n      };\n    },\n\n    removeLayout: function($note, layoutInfo) {\n      $note.html(layoutInfo.editable.html());\n      layoutInfo.editor.remove();\n      $note.show();\n    },\n  };\n};\n\nexport default ui;\n","import $ from 'jquery';\nimport ui from './ui';\nimport '../base/settings.js';\n\nimport '../../styles/summernote-bs4.scss';\n\n$.summernote = $.extend($.summernote, {\n  ui_template: ui,\n  interface: 'bs4',\n});\n\n$.summernote.options.styleTags = [\n  'p',\n  { title: 'Blockquote', tag: 'blockquote', className: 'blockquote', value: 'blockquote' },\n  'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n];\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css
new file mode 100644
index 0000000..9a15519
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css
@@ -0,0 +1,822 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+@font-face {
+    font-family: "summernote";
+    font-style: normal;
+    font-weight: 400;
+    font-display: auto;
+    src: url("./font/summernote.eot?#iefix") format("embedded-opentype"), url("./font/summernote.woff2") format("woff2"), url("./font/summernote.woff") format("woff"), url("./font/summernote.ttf") format("truetype");
+}
+[class^=note-icon]:before,
+[class*=" note-icon"]:before {
+    display: inline-block;
+    font-family: "summernote";
+    font-style: normal;
+    font-size: inherit;
+    text-decoration: inherit;
+    text-rendering: auto;
+    text-transform: none;
+    vertical-align: middle;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    speak: none;
+}
+
+.note-icon-fw {
+    text-align: center;
+    width: 1.25em;
+}
+
+.note-icon-border {
+    border: solid 0.08em #eee;
+    border-radius: 0.1em;
+    padding: 0.2em 0.25em 0.15em;
+}
+
+.note-icon-pull-left {
+    float: left;
+}
+
+.note-icon-pull-right {
+    float: right;
+}
+
+.note-icon.note-icon-pull-left {
+    margin-right: 0.3em;
+}
+.note-icon.note-icon-pull-right {
+    margin-left: 0.3em;
+}
+
+.note-icon-align::before {
+    content: "\ea01";
+}
+
+.note-icon-align-center::before {
+    content: "\ea02";
+}
+
+.note-icon-align-indent::before {
+    content: "\ea03";
+}
+
+.note-icon-align-justify::before {
+    content: "\ea04";
+}
+
+.note-icon-align-left::before {
+    content: "\ea05";
+}
+
+.note-icon-align-outdent::before {
+    content: "\ea06";
+}
+
+.note-icon-align-right::before {
+    content: "\ea07";
+}
+
+.note-icon-arrow-circle-down::before {
+    content: "\ea08";
+}
+
+.note-icon-arrow-circle-left::before {
+    content: "\ea09";
+}
+
+.note-icon-arrow-circle-right::before {
+    content: "\ea0a";
+}
+
+.note-icon-arrow-circle-up::before {
+    content: "\ea0b";
+}
+
+.note-icon-arrows-alt::before {
+    content: "\ea0c";
+}
+
+.note-icon-arrows-h::before {
+    content: "\ea0d";
+}
+
+.note-icon-arrows-v::before {
+    content: "\ea0e";
+}
+
+.note-icon-bold::before {
+    content: "\ea0f";
+}
+
+.note-icon-caret::before {
+    content: "\ea10";
+}
+
+.note-icon-chain-broken::before {
+    content: "\ea11";
+}
+
+.note-icon-circle::before {
+    content: "\ea12";
+}
+
+.note-icon-close::before {
+    content: "\ea13";
+}
+
+.note-icon-code::before {
+    content: "\ea14";
+}
+
+.note-icon-col-after::before {
+    content: "\ea15";
+}
+
+.note-icon-col-before::before {
+    content: "\ea16";
+}
+
+.note-icon-col-remove::before {
+    content: "\ea17";
+}
+
+.note-icon-eraser::before {
+    content: "\ea18";
+}
+
+.note-icon-float-left::before {
+    content: "\ea19";
+}
+
+.note-icon-float-none::before {
+    content: "\ea1a";
+}
+
+.note-icon-float-right::before {
+    content: "\ea1b";
+}
+
+.note-icon-font::before {
+    content: "\ea1c";
+}
+
+.note-icon-frame::before {
+    content: "\ea1d";
+}
+
+.note-icon-italic::before {
+    content: "\ea1e";
+}
+
+.note-icon-link::before {
+    content: "\ea1f";
+}
+
+.note-icon-magic::before {
+    content: "\ea20";
+}
+
+.note-icon-menu-check::before {
+    content: "\ea21";
+}
+
+.note-icon-minus::before {
+    content: "\ea22";
+}
+
+.note-icon-orderedlist::before {
+    content: "\ea23";
+}
+
+.note-icon-pencil::before {
+    content: "\ea24";
+}
+
+.note-icon-picture::before {
+    content: "\ea25";
+}
+
+.note-icon-question::before {
+    content: "\ea26";
+}
+
+.note-icon-redo::before {
+    content: "\ea27";
+}
+
+.note-icon-rollback::before {
+    content: "\ea28";
+}
+
+.note-icon-row-above::before {
+    content: "\ea29";
+}
+
+.note-icon-row-below::before {
+    content: "\ea2a";
+}
+
+.note-icon-row-remove::before {
+    content: "\ea2b";
+}
+
+.note-icon-special-character::before {
+    content: "\ea2c";
+}
+
+.note-icon-square::before {
+    content: "\ea2d";
+}
+
+.note-icon-strikethrough::before {
+    content: "\ea2e";
+}
+
+.note-icon-subscript::before {
+    content: "\ea2f";
+}
+
+.note-icon-summernote::before {
+    content: "\ea30";
+}
+
+.note-icon-superscript::before {
+    content: "\ea31";
+}
+
+.note-icon-table::before {
+    content: "\ea32";
+}
+
+.note-icon-text-height::before {
+    content: "\ea33";
+}
+
+.note-icon-trash::before {
+    content: "\ea34";
+}
+
+.note-icon-underline::before {
+    content: "\ea35";
+}
+
+.note-icon-undo::before {
+    content: "\ea36";
+}
+
+.note-icon-unorderedlist::before {
+    content: "\ea37";
+}
+
+.note-icon-video::before {
+    content: "\ea38";
+}
+
+/* Theme Variables
+ ------------------------------------------ */
+/* Layout
+ ------------------------------------------ */
+.note-editor {
+    position: relative;
+}
+.note-editor .note-dropzone {
+    position: absolute;
+    display: none;
+    z-index: 100;
+    color: lightskyblue;
+    background-color: #fff;
+    opacity: 0.95;
+}
+.note-editor .note-dropzone .note-dropzone-message {
+    display: table-cell;
+    vertical-align: middle;
+    text-align: center;
+    font-size: 28px;
+    font-weight: 700;
+}
+.note-editor .note-dropzone.hover {
+    color: #098ddf;
+}
+.note-editor.dragover .note-dropzone {
+    display: table;
+}
+.note-editor .note-editing-area {
+    position: relative;
+}
+.note-editor .note-editing-area .note-editable {
+    outline: none;
+}
+.note-editor .note-editing-area .note-editable sup {
+    vertical-align: super;
+}
+.note-editor .note-editing-area .note-editable sub {
+    vertical-align: sub;
+}
+.note-editor .note-editing-area .note-editable img.note-float-left {
+    margin-right: 10px;
+}
+.note-editor .note-editing-area .note-editable img.note-float-right {
+    margin-left: 10px;
+}
+
+/* Frame mode layout
+ ------------------------------------------ */
+.note-editor.note-frame,
+.note-editor.note-airframe {
+    border: 1px solid #00000032;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-editable,
+.note-editor.note-airframe.codeview .note-editing-area .note-editable {
+    display: none;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-codable,
+.note-editor.note-airframe.codeview .note-editing-area .note-codable {
+    display: block;
+}
+.note-editor.note-frame .note-editing-area,
+.note-editor.note-airframe .note-editing-area {
+    overflow: hidden;
+}
+.note-editor.note-frame .note-editing-area .note-editable,
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 10px;
+    overflow: auto;
+    word-wrap: break-word;
+}
+.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],
+.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false] {
+    background-color: #8080801d;
+}
+.note-editor.note-frame .note-editing-area .note-codable,
+.note-editor.note-airframe .note-editing-area .note-codable {
+    display: none;
+    width: 100%;
+    padding: 10px;
+    border: none;
+    box-shadow: none;
+    font-family: Menlo, Monaco, monospace, sans-serif;
+    font-size: 14px;
+    color: #ccc;
+    background-color: #222;
+    resize: none;
+    outline: none;
+    -ms-box-sizing: border-box;
+    box-sizing: border-box;
+    border-radius: 0;
+    margin-bottom: 0;
+}
+.note-editor.note-frame.fullscreen,
+.note-editor.note-airframe.fullscreen {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100% !important;
+    z-index: 1050;
+}
+.note-editor.note-frame.fullscreen .note-resizebar,
+.note-editor.note-airframe.fullscreen .note-resizebar {
+    display: none;
+}
+.note-editor.note-frame .note-status-output,
+.note-editor.note-airframe .note-status-output {
+    display: block;
+    width: 100%;
+    font-size: 14px;
+    line-height: 1.42857143;
+    height: 20px;
+    margin-bottom: 0;
+    color: #000;
+    border: 0;
+    border-top: 1px solid #e2e2e2;
+}
+.note-editor.note-frame .note-status-output:empty,
+.note-editor.note-airframe .note-status-output:empty {
+    height: 0;
+    border-top: 0 solid transparent;
+}
+.note-editor.note-frame .note-status-output .pull-right,
+.note-editor.note-airframe .note-status-output .pull-right {
+    float: right !important;
+}
+.note-editor.note-frame .note-status-output .text-muted,
+.note-editor.note-airframe .note-status-output .text-muted {
+    color: #777;
+}
+.note-editor.note-frame .note-status-output .text-primary,
+.note-editor.note-airframe .note-status-output .text-primary {
+    color: #286090;
+}
+.note-editor.note-frame .note-status-output .text-success,
+.note-editor.note-airframe .note-status-output .text-success {
+    color: #3c763d;
+}
+.note-editor.note-frame .note-status-output .text-info,
+.note-editor.note-airframe .note-status-output .text-info {
+    color: #31708f;
+}
+.note-editor.note-frame .note-status-output .text-warning,
+.note-editor.note-airframe .note-status-output .text-warning {
+    color: #8a6d3b;
+}
+.note-editor.note-frame .note-status-output .text-danger,
+.note-editor.note-airframe .note-status-output .text-danger {
+    color: #a94442;
+}
+.note-editor.note-frame .note-status-output .alert,
+.note-editor.note-airframe .note-status-output .alert {
+    margin: -7px 0 0 0;
+    padding: 7px 10px 2px 10px;
+    border-radius: 0;
+    color: #000;
+    background-color: #f5f5f5;
+}
+.note-editor.note-frame .note-status-output .alert .note-icon,
+.note-editor.note-airframe .note-status-output .alert .note-icon {
+    margin-right: 5px;
+}
+.note-editor.note-frame .note-status-output .alert-success,
+.note-editor.note-airframe .note-status-output .alert-success {
+    color: #3c763d !important;
+    background-color: #dff0d8 !important;
+}
+.note-editor.note-frame .note-status-output .alert-info,
+.note-editor.note-airframe .note-status-output .alert-info {
+    color: #31708f !important;
+    background-color: #d9edf7 !important;
+}
+.note-editor.note-frame .note-status-output .alert-warning,
+.note-editor.note-airframe .note-status-output .alert-warning {
+    color: #8a6d3b !important;
+    background-color: #fcf8e3 !important;
+}
+.note-editor.note-frame .note-status-output .alert-danger,
+.note-editor.note-airframe .note-status-output .alert-danger {
+    color: #a94442 !important;
+    background-color: #f2dede !important;
+}
+.note-editor.note-frame .note-statusbar,
+.note-editor.note-airframe .note-statusbar {
+    background-color: #8080801d;
+    border-bottom-left-radius: 4px;
+    border-bottom-right-radius: 4px;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar,
+.note-editor.note-airframe .note-statusbar .note-resizebar {
+    padding-top: 1px;
+    height: 9px;
+    width: 100%;
+    cursor: ns-resize;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar {
+    width: 20px;
+    margin: 1px auto;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar {
+    cursor: default;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar {
+    display: none;
+}
+.note-editor.note-frame .note-placeholder,
+.note-editor.note-airframe .note-placeholder {
+    padding: 10px;
+}
+
+.note-editor.note-airframe {
+    border: 0;
+}
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 0;
+}
+
+/* Popover
+ ------------------------------------------ */
+.note-popover.popover {
+    display: none;
+    max-width: none;
+}
+.note-popover.popover .popover-content a {
+    display: inline-block;
+    max-width: 200px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    vertical-align: middle;
+}
+.note-popover.popover .arrow {
+    left: 20px !important;
+}
+
+/* Popover and Toolbar (Button container)
+ ------------------------------------------ */
+.note-toolbar {
+    position: relative;
+}
+
+.note-popover .popover-content, .note-editor .note-toolbar {
+    margin: 0;
+    padding: 0 0 5px 5px;
+}
+.note-popover .popover-content > .note-btn-group, .note-editor .note-toolbar > .note-btn-group {
+    margin-top: 5px;
+    margin-left: 0;
+    margin-right: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table, .note-editor .note-toolbar .note-btn-group .note-table {
+    min-width: 0;
+    padding: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker {
+    font-size: 18px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher {
+    position: absolute !important;
+    z-index: 3;
+    width: 10em;
+    height: 10em;
+    cursor: pointer;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted {
+    position: relative !important;
+    z-index: 1;
+    width: 5em;
+    height: 5em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted {
+    position: absolute !important;
+    z-index: 2;
+    width: 1em;
+    height: 1em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-style .dropdown-style blockquote, .note-popover .popover-content .note-style .dropdown-style pre, .note-editor .note-toolbar .note-style .dropdown-style blockquote, .note-editor .note-toolbar .note-style .dropdown-style pre {
+    margin: 0;
+    padding: 5px 10px;
+}
+.note-popover .popover-content .note-style .dropdown-style h1, .note-popover .popover-content .note-style .dropdown-style h2, .note-popover .popover-content .note-style .dropdown-style h3, .note-popover .popover-content .note-style .dropdown-style h4, .note-popover .popover-content .note-style .dropdown-style h5, .note-popover .popover-content .note-style .dropdown-style h6, .note-popover .popover-content .note-style .dropdown-style p, .note-editor .note-toolbar .note-style .dropdown-style h1, .note-editor .note-toolbar .note-style .dropdown-style h2, .note-editor .note-toolbar .note-style .dropdown-style h3, .note-editor .note-toolbar .note-style .dropdown-style h4, .note-editor .note-toolbar .note-style .dropdown-style h5, .note-editor .note-toolbar .note-style .dropdown-style h6, .note-editor .note-toolbar .note-style .dropdown-style p {
+    margin: 0;
+    padding: 0;
+}
+.note-popover .popover-content .note-color-all .note-dropdown-menu, .note-editor .note-toolbar .note-color-all .note-dropdown-menu {
+    min-width: 337px;
+}
+.note-popover .popover-content .note-color .dropdown-toggle, .note-editor .note-toolbar .note-color .dropdown-toggle {
+    width: 20px;
+    padding-left: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette {
+    display: inline-block;
+    margin: 0;
+    width: 160px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child {
+    margin: 0 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title {
+    font-size: 12px;
+    margin: 2px 7px;
+    text-align: center;
+    border-bottom: 1px solid #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select {
+    font-size: 11px;
+    margin: 3px;
+    padding: 0 3px;
+    cursor: pointer;
+    width: 100%;
+    border-radius: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover {
+    background: #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row {
+    height: 20px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn {
+    display: none;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn {
+    border: 1px solid #eee;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu, .note-editor .note-toolbar .note-para .note-dropdown-menu {
+    min-width: 228px;
+    padding: 5px;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu > div + div, .note-editor .note-toolbar .note-para .note-dropdown-menu > div + div {
+    margin-left: 5px;
+}
+.note-popover .popover-content .note-dropdown-menu, .note-editor .note-toolbar .note-dropdown-menu {
+    min-width: 160px;
+}
+.note-popover .popover-content .note-dropdown-menu.right, .note-editor .note-toolbar .note-dropdown-menu.right {
+    right: 0;
+    left: auto;
+}
+.note-popover .popover-content .note-dropdown-menu.right::before, .note-editor .note-toolbar .note-dropdown-menu.right::before {
+    right: 9px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.right::after, .note-editor .note-toolbar .note-dropdown-menu.right::after {
+    right: 10px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a i, .note-editor .note-toolbar .note-dropdown-menu.note-check a i {
+    color: deepskyblue;
+    visibility: hidden;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a.checked i, .note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i {
+    visibility: visible;
+}
+.note-popover .popover-content .note-fontsize-10, .note-editor .note-toolbar .note-fontsize-10 {
+    font-size: 10px;
+}
+.note-popover .popover-content .note-color-palette, .note-editor .note-toolbar .note-color-palette {
+    line-height: 1;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn, .note-editor .note-toolbar .note-color-palette div .note-color-btn {
+    width: 20px;
+    height: 20px;
+    padding: 0;
+    margin: 0;
+    border: 0;
+    border-radius: 0;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn:hover, .note-editor .note-toolbar .note-color-palette div .note-color-btn:hover {
+    transform: scale(1.2);
+    transition: all 0.2s;
+}
+
+/* Dialog
+ ------------------------------------------ */
+.note-modal .modal-dialog {
+    outline: 0;
+    border-radius: 5px;
+    box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+}
+.note-modal .form-group {
+    margin-left: 0;
+    margin-right: 0;
+}
+.note-modal .note-modal-form {
+    margin: 0;
+}
+.note-modal .note-image-dialog .note-dropzone {
+    min-height: 100px;
+    font-size: 30px;
+    line-height: 4;
+    color: lightgray;
+    text-align: center;
+    border: 4px dashed lightgray;
+    margin-bottom: 10px;
+}
+@-moz-document url-prefix() {
+    .note-modal .note-image-input {
+        height: auto;
+    }
+}
+
+/* Placeholder
+ ------------------------------------------ */
+.note-placeholder {
+    position: absolute;
+    display: none;
+    color: gray;
+}
+
+/* Handle
+ ------------------------------------------ */
+.note-handle .note-control-selection {
+    position: absolute;
+    display: none;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection > div {
+    position: absolute;
+}
+.note-handle .note-control-selection .note-control-selection-bg {
+    width: 100%;
+    height: 100%;
+    background-color: #000;
+    -webkit-opacity: 0.3;
+    -khtml-opacity: 0.3;
+    -moz-opacity: 0.3;
+    opacity: 0.3;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+    filter: alpha(opacity=30);
+}
+.note-handle .note-control-selection .note-control-handle, .note-handle .note-control-selection .note-control-sizing, .note-handle .note-control-selection .note-control-holder {
+    width: 7px;
+    height: 7px;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection .note-control-sizing {
+    background-color: #000;
+}
+.note-handle .note-control-selection .note-control-nw {
+    top: -5px;
+    left: -5px;
+    border-right: none;
+    border-bottom: none;
+}
+.note-handle .note-control-selection .note-control-ne {
+    top: -5px;
+    right: -5px;
+    border-bottom: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-sw {
+    bottom: -5px;
+    left: -5px;
+    border-top: none;
+    border-right: none;
+}
+.note-handle .note-control-selection .note-control-se {
+    right: -5px;
+    bottom: -5px;
+    cursor: se-resize;
+}
+.note-handle .note-control-selection .note-control-se.note-control-holder {
+    cursor: default;
+    border-top: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-selection-info {
+    right: 0;
+    bottom: 0;
+    padding: 5px;
+    margin: 5px;
+    color: #fff;
+    background-color: #000;
+    font-size: 12px;
+    border-radius: 5px;
+    -webkit-opacity: 0.7;
+    -khtml-opacity: 0.7;
+    -moz-opacity: 0.7;
+    opacity: 0.7;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=70);
+    filter: alpha(opacity=70);
+}
+
+.note-hint-popover {
+    min-width: 100px;
+    padding: 2px;
+}
+.note-hint-popover .popover-content {
+    padding: 3px;
+    max-height: 150px;
+    overflow: auto;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item {
+    display: block !important;
+    padding: 3px;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item.active, .note-hint-popover .popover-content .note-hint-group .note-hint-item:hover {
+    display: block;
+    clear: both;
+    font-weight: 400;
+    line-height: 1.4;
+    color: white;
+    white-space: nowrap;
+    text-decoration: none;
+    background-color: #428bca;
+    outline: 0;
+    cursor: pointer;
+}
+
+/* Handle
+ ------------------------------------------ */
+html .note-fullscreen-body, body .note-fullscreen-body {
+    overflow: hidden !important;
+}
+
+.note-toolbar {
+    background: #8080801d;
+}
+
+.note-btn-group .note-btn {
+    border-color: #00000032;
+    padding: 0.28rem 0.65rem;
+    font-size: 13px;
+}
+
+/*# sourceMappingURL=summernote-bs5.css.map*/
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css.map
new file mode 100644
index 0000000..e23279a
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote-bs5.css","mappings":";;;;;;;;;;;;AAMA;IACE;IACA;IACA;IACA;IACA;ACLF;ADSA;;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ACPF;;ADYA;IACE;IACA;ACTF;;ADYA;IACE;IACA;IACA;ACTF;;ADYA;IACE;ACTF;;ADYA;IACE;ACTF;;ADaE;IACE;ACVJ;ADYE;IACE;ACVJ;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgC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","sources":["webpack:///./src/styles/summernote/font.scss","webpack:///./src/styles/bs5/summernote-bs5.scss","webpack:///./src/styles/summernote/common.scss","webpack:///./src/styles/summernote/elements.scss"],"sourcesContent":["// Variables\n\n$sni-css-prefix: note-icon !default;\n\n// Path\n\n@font-face {\n  font-family: \"summernote\";\n  font-style: normal;\n  font-weight: 400;\n  font-display: auto;\n  src: url(\"./font/summernote.eot?#iefix\") format(\"embedded-opentype\"), url(\"./font/summernote.woff2\") format(\"woff2\"), url(\"./font/summernote.woff\") format(\"woff\"), url(\"./font/summernote.ttf\") format(\"truetype\");}\n\n// Core\n\n[class^=\"#{$sni-css-prefix}\"]:before,\n[class*=\" #{$sni-css-prefix}\"]:before {\n  display: inline-block;\n  font-family: \"summernote\";\n  font-style: normal;\n  font-size: inherit;\n  text-decoration: inherit;\n  text-rendering: auto;\n  text-transform: none;\n  vertical-align: middle;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  speak: none;\n}\n\n// Extras\n\n.#{$sni-css-prefix}-fw {\n  text-align: center;\n  width: 1.25em;\n}\n\n.#{$sni-css-prefix}-border {\n  border: solid 0.08em #eee;\n  border-radius: 0.1em;\n  padding: 0.2em 0.25em 0.15em;\n}\n\n.#{$sni-css-prefix}-pull-left {\n  float: left;\n}\n\n.#{$sni-css-prefix}-pull-right {\n  float: right;\n}\n\n.#{$sni-css-prefix} {\n  &.#{$sni-css-prefix}-pull-left {\n    margin-right: 0.3em;\n  }\n  &.#{$sni-css-prefix}-pull-right {\n    margin-left: 0.3em;\n  }\n}\n\n// Functions\n\n@function char($character-code) {\n  @if function-exists(\"selector-append\") {\n    @return unquote(\"\\\"\\\\#{$character-code}\\\"\");\n  }\n\n  @if \"\\\\#{'x'}\" == \"\\\\x\" {\n    @return str-slice(\"\\x\", 1, 1) + $character-code;\n  }\n  @else {\n    @return #{\"\\\"\\\\\"}#{$character-code + \"\\\"\"};\n  }\n}\n\n// Icons\n\n\n.note-icon-align::before {\n  content: \"\\ea01\";\n}\n\n.note-icon-align-center::before {\n  content: \"\\ea02\";\n}\n\n.note-icon-align-indent::before {\n  content: \"\\ea03\";\n}\n\n.note-icon-align-justify::before {\n  content: \"\\ea04\";\n}\n\n.note-icon-align-left::before {\n  content: \"\\ea05\";\n}\n\n.note-icon-align-outdent::before {\n  content: \"\\ea06\";\n}\n\n.note-icon-align-right::before {\n  content: \"\\ea07\";\n}\n\n.note-icon-arrow-circle-down::before {\n  content: \"\\ea08\";\n}\n\n.note-icon-arrow-circle-left::before {\n  content: \"\\ea09\";\n}\n\n.note-icon-arrow-circle-right::before {\n  content: \"\\ea0a\";\n}\n\n.note-icon-arrow-circle-up::before {\n  content: \"\\ea0b\";\n}\n\n.note-icon-arrows-alt::before {\n  content: \"\\ea0c\";\n}\n\n.note-icon-arrows-h::before {\n  content: \"\\ea0d\";\n}\n\n.note-icon-arrows-v::before {\n  content: \"\\ea0e\";\n}\n\n.note-icon-bold::before {\n  content: \"\\ea0f\";\n}\n\n.note-icon-caret::before {\n  content: \"\\ea10\";\n}\n\n.note-icon-chain-broken::before {\n  content: \"\\ea11\";\n}\n\n.note-icon-circle::before {\n  content: \"\\ea12\";\n}\n\n.note-icon-close::before {\n  content: \"\\ea13\";\n}\n\n.note-icon-code::before {\n  content: \"\\ea14\";\n}\n\n.note-icon-col-after::before {\n  content: \"\\ea15\";\n}\n\n.note-icon-col-before::before {\n  content: \"\\ea16\";\n}\n\n.note-icon-col-remove::before {\n  content: \"\\ea17\";\n}\n\n.note-icon-eraser::before {\n  content: \"\\ea18\";\n}\n\n.note-icon-float-left::before {\n  content: \"\\ea19\";\n}\n\n.note-icon-float-none::before {\n  content: \"\\ea1a\";\n}\n\n.note-icon-float-right::before {\n  content: \"\\ea1b\";\n}\n\n.note-icon-font::before {\n  content: \"\\ea1c\";\n}\n\n.note-icon-frame::before {\n  content: \"\\ea1d\";\n}\n\n.note-icon-italic::before {\n  content: \"\\ea1e\";\n}\n\n.note-icon-link::before {\n  content: \"\\ea1f\";\n}\n\n.note-icon-magic::before {\n  content: \"\\ea20\";\n}\n\n.note-icon-menu-check::before {\n  content: \"\\ea21\";\n}\n\n.note-icon-minus::before {\n  content: \"\\ea22\";\n}\n\n.note-icon-orderedlist::before {\n  content: \"\\ea23\";\n}\n\n.note-icon-pencil::before {\n  content: \"\\ea24\";\n}\n\n.note-icon-picture::before {\n  content: \"\\ea25\";\n}\n\n.note-icon-question::before {\n  content: \"\\ea26\";\n}\n\n.note-icon-redo::before {\n  content: \"\\ea27\";\n}\n\n.note-icon-rollback::before {\n  content: \"\\ea28\";\n}\n\n.note-icon-row-above::before {\n  content: \"\\ea29\";\n}\n\n.note-icon-row-below::before {\n  content: \"\\ea2a\";\n}\n\n.note-icon-row-remove::before {\n  content: \"\\ea2b\";\n}\n\n.note-icon-special-character::before {\n  content: \"\\ea2c\";\n}\n\n.note-icon-square::before {\n  content: \"\\ea2d\";\n}\n\n.note-icon-strikethrough::before {\n  content: \"\\ea2e\";\n}\n\n.note-icon-subscript::before {\n  content: \"\\ea2f\";\n}\n\n.note-icon-summernote::before {\n  content: \"\\ea30\";\n}\n\n.note-icon-superscript::before {\n  content: \"\\ea31\";\n}\n\n.note-icon-table::before {\n  content: \"\\ea32\";\n}\n\n.note-icon-text-height::before {\n  content: \"\\ea33\";\n}\n\n.note-icon-trash::before {\n  content: \"\\ea34\";\n}\n\n.note-icon-underline::before {\n  content: \"\\ea35\";\n}\n\n.note-icon-undo::before {\n  content: \"\\ea36\";\n}\n\n.note-icon-unorderedlist::before {\n  content: \"\\ea37\";\n}\n\n.note-icon-video::before {\n  content: \"\\ea38\";\n}\n\n","@import '../summernote/font.scss';\n@import '../summernote/common.scss';\n\n.note-toolbar {\n  background: $background-color;\n}\n\n.note-btn-group .note-btn {\n  border-color: $border-color;\n  padding: 0.28rem 0.65rem;\n  font-size: 13px;\n}\n","@import \"elements.scss\";\n\n/* Theme Variables\n ------------------------------------------ */\n$border-color: #00000032;\n$background-color: #8080801d;\n\n$img-margin-left: 10px;\n$img-margin-right: 10px;\n\n/* Layout\n ------------------------------------------ */\n.note-editor {\n  position: relative;\n\n  // dropzone\n  $dropzone-color: lightskyblue;\n  $dropzone-active-color: darken($dropzone-color, 30);\n  .note-dropzone {\n    position: absolute;\n    display: none;\n    z-index: 100;\n    color: $dropzone-color;\n    background-color: #fff;\n    opacity: 0.95;\n\n    .note-dropzone-message {\n      display: table-cell;\n      vertical-align: middle;\n      text-align: center;\n      font-size: 28px;\n      font-weight: 700;\n    }\n\n    &.hover {\n      color: $dropzone-active-color;\n    }\n  }\n\n  &.dragover .note-dropzone {\n    display: table;\n  }\n\n  .note-editing-area {\n    position: relative;\n\n    .note-editable {\n      outline: none;\n\n      sup {\n        vertical-align: super;\n      }\n\n      sub {\n        vertical-align: sub;\n      }\n\n      img.note-float-left {\n        margin-right: $img-margin-right;\n      }\n\n      img.note-float-right {\n        margin-left: $img-margin-left;\n      }\n    }\n  }\n}\n\n/* Frame mode layout\n ------------------------------------------ */\n.note-editor.note-frame,\n.note-editor.note-airframe {\n  border: 1px solid $border-color;\n\n  // codeview mode\n  &.codeview {\n    .note-editing-area {\n      .note-editable {\n        display: none;\n      }\n      .note-codable {\n        display: block;\n      }\n    }\n  }\n\n  .note-editing-area {\n    overflow: hidden;\n\n    // editable\n    .note-editable {\n      padding: 10px;\n      overflow: auto;\n      word-wrap: break-word;\n\n      &[contenteditable=\"false\"] {\n        background-color: $background-color;\n      }\n    }\n\n    // codeable\n    .note-codable {\n      display: none;\n      width: 100%;\n      padding: 10px;\n      border: none;\n      box-shadow: none;\n      font-family: Menlo, Monaco, monospace, sans-serif;\n      font-size: 14px;\n      color: #ccc;\n      background-color: #222;\n      resize: none;\n      outline: none;\n\n      // override BS2 default style\n      @include box-sizing(border-box);\n      @include rounded(0);\n      margin-bottom: 0;\n    }\n  }\n\n  // fullscreen mode\n  &.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100% !important;\n    z-index: 1050; // bs3 modal-backdrop: 1030, bs2: 1040\n    .note-resizebar {\n      display: none;\n    }\n  }\n\n  // Notifications\n  .note-status-output {\n    display: block;\n    width: 100%;\n    font-size: 14px;\n    line-height: 1.42857143;\n    height: 20px;\n    margin-bottom: 0;\n    color: #000;\n    border: 0;\n    border-top: 1px solid #e2e2e2;\n  }\n\n  .note-status-output:empty {\n    height: 0;\n    border-top: 0 solid transparent;\n  }\n\n  .note-status-output .pull-right {\n    float: right !important;\n  }\n\n  .note-status-output .text-muted {\n    color: #777;\n  }\n\n  .note-status-output .text-primary {\n    color: #286090;\n  }\n\n  .note-status-output .text-success {\n    color: #3c763d;\n  }\n\n  .note-status-output .text-info {\n    color: #31708f;\n  }\n\n  .note-status-output .text-warning {\n    color: #8a6d3b;\n  }\n\n  .note-status-output .text-danger {\n    color: #a94442;\n  }\n\n  .note-status-output .alert {\n    margin: -7px 0 0 0;\n    padding: 7px 10px 2px 10px;\n    border-radius: 0;\n    color: #000;\n    background-color: #f5f5f5;\n  }\n\n  .note-status-output .alert .note-icon {\n    margin-right: 5px;\n  }\n\n  .note-status-output .alert-success {\n    color: #3c763d !important;\n    background-color: #dff0d8 !important;\n  }\n\n  .note-status-output .alert-info {\n    color: #31708f !important;\n    background-color: #d9edf7 !important;\n  }\n\n  .note-status-output .alert-warning {\n    color: #8a6d3b !important;\n    background-color: #fcf8e3 !important;\n  }\n\n  .note-status-output .alert-danger {\n    color: #a94442 !important;\n    background-color: #f2dede !important;\n  }\n\n  // statusbar\n  .note-statusbar {\n    background-color: $background-color;\n    border-bottom-left-radius: 4px;\n    border-bottom-right-radius: 4px;\n    border-top: 1px solid $border-color;\n    .note-resizebar {\n      padding-top: 1px;\n      height: 9px;\n      width: 100%;\n      cursor: ns-resize;\n      .note-icon-bar {\n        width: 20px;\n        margin: 1px auto;\n        border-top: 1px solid $border-color;\n      }\n    }\n\n    &.locked {\n      .note-resizebar {\n        cursor: default;\n        .note-icon-bar {\n          display: none;\n        }\n      }\n    }\n  }\n  .note-placeholder {\n    padding: 10px;\n  }\n}\n\n.note-editor.note-airframe {\n  border: 0;\n\n  .note-editing-area {\n    .note-editable {\n      padding: 0;\n    }\n  }\n}\n\n\n/* Popover\n ------------------------------------------ */\n.note-popover.popover {\n  display: none;\n  max-width: none;\n\n  .popover-content {\n    a {\n      display: inline-block;\n      max-width: 200px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap; // for FF\n      vertical-align: middle; // for FF\n    }\n  }\n  .arrow {\n    left: 20px !important;\n  }\n}\n\n/* Popover and Toolbar (Button container)\n ------------------------------------------ */\n.note-toolbar {\n  position: relative;\n}\n\n.note-popover .popover-content, .note-editor .note-toolbar {\n  margin: 0;\n  padding: 0 0 5px 5px;\n\n  & > .note-btn-group {\n    margin-top: 5px;\n    margin-left: 0;\n    margin-right: 5px;\n  }\n\n  .note-btn-group {\n    .note-table {\n      min-width: 0;\n      padding: 5px;\n      .note-dimension-picker {\n        font-size: 18px;\n        .note-dimension-picker-mousecatcher {\n          position: absolute !important;\n          z-index: 3;\n          width: 10em;\n          height: 10em;\n          cursor: pointer;\n        }\n        .note-dimension-picker-unhighlighted {\n          position: relative !important;\n          z-index: 1;\n          width: 5em;\n          height: 5em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n        .note-dimension-picker-highlighted {\n          position: absolute !important;\n          z-index: 2;\n          width: 1em;\n          height: 1em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n      }\n    }\n  }\n\n  .note-style {\n    .dropdown-style {\n      blockquote, pre {\n        margin: 0;\n        padding: 5px 10px;\n      }\n      h1, h2, h3, h4, h5, h6, p {\n        margin: 0;\n        padding: 0;\n      }\n    }\n  }\n\n  .note-color-all {\n    .note-dropdown-menu {\n      min-width: 337px;\n    }\n  }\n\n  .note-color {\n    .dropdown-toggle {\n      width: 20px;\n      padding-left: 5px;\n    }\n    .note-dropdown-menu {\n      .note-palette {\n        display: inline-block;\n        margin: 0;\n        width: 160px;\n        &:first-child {\n          margin: 0 5px;\n        }\n\n        .note-palette-title {\n          font-size: 12px;\n          margin: 2px 7px;\n          text-align: center;\n          border-bottom: 1px solid #eee;\n        }\n\n        .note-color-reset,\n        .note-color-select {\n          font-size: 11px;\n          margin: 3px;\n          padding: 0 3px;\n          cursor: pointer;\n          width: 100%;\n          @include rounded(5px);\n\n          &:hover {\n            background: #eee;\n          }\n        }\n\n        .note-color-row {\n          height: 20px;\n        }\n\n        .note-color-select-btn {\n          display: none;\n        }\n\n        .note-holder-custom {\n          .note-color-btn {\n            border: 1px solid #eee;\n          }\n        }\n      }\n    }\n  }\n\n  .note-para {\n    .note-dropdown-menu {\n      min-width: 228px;\n      padding: 5px;\n      & > div + div {\n        margin-left: 5px;\n      }\n    }\n  }\n\n  // dropdown-menu for toolbar and popover\n  .note-dropdown-menu {\n    min-width: 160px;\n\n    // dropdown-menu right position\n    // http://forrst.com/posts/Bootstrap_right_positioned_dropdown-2KB\n    &.right {\n      right: 0;\n      left: auto;\n      &::before {\n        right: 9px;\n        left: auto !important;\n      }\n      &::after {\n        right: 10px;\n        left: auto !important;\n      }\n    }\n    // dropdown-menu for selectbox\n    &.note-check {\n      a i {\n        color: deepskyblue;\n        visibility: hidden;\n      }\n      a.checked i {\n        visibility: visible;\n      }\n    }\n  }\n\n  .note-fontsize-10 {\n    font-size: 10px;\n  }\n\n  // color palette for toolbar and popover\n  .note-color-palette {\n    line-height: 1;\n    div {\n      .note-color-btn {\n        width: 20px;\n        height: 20px;\n        padding: 0;\n        margin: 0;\n        border: 0;\n        border-radius: 0;\n      }\n      .note-color-btn:hover {\n        transform: scale(1.2);\n        transition: all 0.2s;\n      }\n    }\n  }\n}\n\n/* Dialog\n ------------------------------------------ */\n.note-modal {\n  .modal-dialog {\n    outline: 0;\n    border-radius: 5px;\n    @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n  }\n  .form-group { // overwrite BS's form-horizontal minus margins\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .note-modal-form {\n    margin: 0; // overwrite BS2's form margin bottom\n  }\n  .note-image-dialog {\n    .note-dropzone {\n      min-height: 100px;\n      font-size: 30px;\n      line-height: 4; // vertical-align\n      color: lightgray;\n      text-align: center;\n      border: 4px dashed lightgray;\n      margin-bottom: 10px;\n    }\n  }\n\n  // [workaround] firefox fileinput\n  @-moz-document url-prefix() {\n    .note-image-input {\n      height: auto;\n    }\n  }\n}\n\n/* Placeholder\n ------------------------------------------ */\n.note-placeholder {\n  position: absolute;\n  display: none;\n  color: gray;\n}\n\n/* Handle\n ------------------------------------------ */\n.note-handle {\n  // control selection\n  .note-control-selection {\n    position: absolute;\n    display: none;\n    border: 1px solid #000;\n    & > div {\n      position: absolute;\n    }\n\n    .note-control-selection-bg {\n      width: 100%;\n      height: 100%;\n      background-color: #000;\n      @include opacity(0.3);\n    }\n\n    .note-control-handle {\n      width: 7px;\n      height: 7px;\n      border: 1px solid #000;\n    }\n\n    .note-control-holder {\n      @extend .note-control-handle;\n    }\n\n    .note-control-sizing {\n      @extend .note-control-handle;\n      background-color: #000;\n    }\n\n    .note-control-nw {\n      top: -5px;\n      left: -5px;\n      border-right: none;\n      border-bottom: none;\n    }\n\n    .note-control-ne {\n      top: -5px;\n      right: -5px;\n      border-bottom: none;\n      border-left: none;\n    }\n\n    .note-control-sw {\n      bottom: -5px;\n      left: -5px;\n      border-top: none;\n      border-right: none;\n    }\n\n    .note-control-se {\n      right: -5px;\n      bottom: -5px;\n      cursor: se-resize;\n    }\n\n    .note-control-se.note-control-holder {\n      cursor: default;\n      border-top: none;\n      border-left: none;\n    }\n\n    .note-control-selection-info {\n      right: 0;\n      bottom: 0;\n      padding: 5px;\n      margin: 5px;\n      color: #fff;\n      background-color: #000;\n      font-size: 12px;\n      @include rounded(5px);\n      @include opacity(0.7);\n    }\n  }\n}\n\n.note-hint-popover {\n  min-width: 100px;\n  padding: 2px;\n\n  .popover-content {\n    padding: 3px;\n    max-height: 150px;\n    overflow: auto;\n\n    .note-hint-group {\n      .note-hint-item {\n        display: block !important;\n        padding: 3px;\n\n        &.active, &:hover {\n          display: block;\n          clear: both;\n          font-weight: 400;\n          line-height: 1.4;\n          color: white;\n          white-space: nowrap;\n          text-decoration: none;\n          background-color: #428bca;\n          outline: 0;\n          cursor: pointer;\n        }\n      }\n    }\n  }\n}\n\n/* Handle\n ------------------------------------------ */\nhtml, body {\n  .note-fullscreen-body {\n    overflow: hidden !important;\n  }\n}\n","@mixin gradient($color: #F5F5F5, $start: #EEE, $stop: #FFF) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, $start),\n                               color-stop(1, $stop));\n  background: -ms-linear-gradient(bottom,\n                                  $start,\n                                  $stop);\n  background: -moz-linear-gradient(center bottom,\n                                   $start 0%,\n                                   $stop 100%);\n  background: -o-linear-gradient($stop,\n                                 $start);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($stop)}', endColorstr='#{ie-hex-str($start)}', GradientType=0);\n}\n@mixin bw-gradient($color: #F5F5F5, $start: 0, $stop: 255) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, rgb($start,$start,$start)),\n                               color-stop(1, rgb($stop,$stop,$stop)));\n  background: -ms-linear-gradient(bottom,\n                                  rgb($start,$start,$start) 0%,\n                                  rgb($stop,$stop,$stop) 100%);\n  background: -moz-linear-gradient(center bottom,\n                                   rgb($start,$start,$start) 0%,\n                                   rgb($stop,$stop,$stop) 100%);\n  background: -o-linear-gradient(rgb($stop,$stop,$stop),\n                                 rgb($start,$start,$start));\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str(rgb($stop,$stop,$stop))}', endColorstr='#{ie-hex-str(rgb($start,$start,$start))}', GradientType=0);\n}\n@mixin bordered($top-color: #EEE, $right-color: #EEE, $bottom-color: #EEE, $left-color: #EEE) {\n  border-top: solid 1px $top-color;\n  border-left: solid 1px $left-color;\n  border-right: solid 1px $right-color;\n  border-bottom: solid 1px $bottom-color;\n}\n@mixin drop-shadow($x-axis: 0, $y-axis: 1px, $blur: 2px, $alpha: 0.1) {\n  -webkit-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n}\n@mixin rounded($radius: 2px) {\n  -webkit-border-radius: $radius;\n  -moz-border-radius: $radius;\n  border-radius: $radius;\n}\n@mixin border-radius($topright: 0, $bottomright: 0, $bottomleft: 0, $topleft: 0) {\n  -webkit-border-top-right-radius: $topright;\n  -webkit-border-bottom-right-radius: $bottomright;\n  -webkit-border-bottom-left-radius: $bottomleft;\n  -webkit-border-top-left-radius: $topleft;\n  -moz-border-radius-topright: $topright;\n  -moz-border-radius-bottomright: $bottomright;\n  -moz-border-radius-bottomleft: $bottomleft;\n  -moz-border-radius-topleft: $topleft;\n  border-top-right-radius: $topright;\n  border-bottom-right-radius: $bottomright;\n  border-bottom-left-radius: $bottomleft;\n  border-top-left-radius: $topleft;\n  @include background-clip(padding-box);\n}\n@mixin opacity($opacity: 0.5) {\n  -webkit-opacity: $opacity;\n  -khtml-opacity: $opacity;\n  -moz-opacity: $opacity;\n  opacity: $opacity;\n  $opperc: $opacity * 100;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=#{$opperc});\n  filter: alpha(opacity=$opperc);\n}\n@mixin transition-duration($duration: 0.2s) {\n  -moz-transition-duration: $duration;\n  -webkit-transition-duration: $duration;\n  -o-transition-duration: $duration;\n  transition-duration: $duration;\n}\n@mixin transform($arguments...) {\n  -webkit-transform: $arguments;\n  -moz-transform: $arguments;\n  -o-transform: $arguments;\n  -ms-transform: $arguments;\n  transform: $arguments;\n}\n@mixin rotation($deg:5deg) {\n  @include transform(rotate($deg));\n}\n@mixin scale($ratio:1.5) {\n  @include transform(scale($ratio));\n}\n@mixin transition($duration:0.2s, $ease:ease-out) {\n  -webkit-transition: all $duration $ease;\n  -moz-transition: all $duration $ease;\n  -o-transition: all $duration $ease;\n  transition: all $duration $ease;\n}\n@mixin inner-shadow($horizontal:0, $vertical:1px, $blur:2px, $alpha: 0.4) {\n  -webkit-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n}\n@mixin box-shadow($arguments) {\n  -webkit-box-shadow: $arguments;\n  -moz-box-shadow: $arguments;\n  box-shadow: $arguments;\n}\n@mixin box-sizing($sizing: border-box) {\n  -ms-box-sizing: $sizing;\n  -moz-box-sizing: $sizing;\n  -webkit-box-sizing: $sizing;\n  box-sizing: $sizing;\n}\n@mixin user-select($argument: none) {\n  -webkit-user-select: $argument;\n  -moz-user-select: $argument;\n  -ms-user-select: $argument;\n  user-select: $argument;\n}\n@mixin columns($colwidth: 250px, $colcount: 0, $colgap: 50px, $columnRuleColor: #EEE, $columnRuleStyle: solid, $columnRuleWidth: 1px) {\n  -moz-column-width: $colwidth;\n  -moz-column-count: $colcount;\n  -moz-column-gap: $colgap;\n  -moz-column-rule-color: $columnRuleColor;\n  -moz-column-rule-style: $columnRuleStyle;\n  -moz-column-rule-width: $columnRuleWidth;\n  -webkit-column-width: $colwidth;\n  -webkit-column-count: $colcount;\n  -webkit-column-gap: $colgap;\n  -webkit-column-rule-color: $columnRuleColor;\n  -webkit-column-rule-style: $columnRuleStyle;\n  -webkit-column-rule-width: $columnRuleWidth;\n  column-width: $colwidth;\n  column-count: $colcount;\n  column-gap: $colgap;\n  column-rule-color: $columnRuleColor;\n  column-rule-style: $columnRuleStyle;\n  column-rule-width: $columnRuleWidth;\n}\n@mixin translate($x:0, $y:0) {\n  @include transform(translate($x, $y));\n}\n@mixin background-clip($argument: padding-box) {\n  -moz-background-clip: $argument;\n  -webkit-background-clip: $argument;\n  background-clip: $argument;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js
new file mode 100644
index 0000000..6a46fbd
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js
@@ -0,0 +1,10235 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("jQuery"));
+	else if(typeof define === 'function' && define.amd)
+		define(["jQuery"], factory);
+	else {
+		var a = typeof exports === 'object' ? factory(require("jQuery")) : factory(root["jQuery"]);
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {
+return /******/ (() => { // webpackBootstrap
+/******/ 	"use strict";
+/******/ 	var __webpack_modules__ = ({
+
+/***/ 9770:
+/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => {
+
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1145);
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
+
+(jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) = (jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) || {
+  lang: {}
+};
+jquery__WEBPACK_IMPORTED_MODULE_0___default().extend((jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote.lang), {
+  'en-US': {
+    font: {
+      bold: 'Bold',
+      italic: 'Italic',
+      underline: 'Underline',
+      clear: 'Remove Font Style',
+      height: 'Line Height',
+      name: 'Font Family',
+      strikethrough: 'Strikethrough',
+      subscript: 'Subscript',
+      superscript: 'Superscript',
+      size: 'Font Size',
+      sizeunit: 'Font Size Unit'
+    },
+    image: {
+      image: 'Picture',
+      insert: 'Insert Image',
+      resizeFull: 'Resize full',
+      resizeHalf: 'Resize half',
+      resizeQuarter: 'Resize quarter',
+      resizeNone: 'Original size',
+      floatLeft: 'Float Left',
+      floatRight: 'Float Right',
+      floatNone: 'Remove float',
+      shapeRounded: 'Shape: Rounded',
+      shapeCircle: 'Shape: Circle',
+      shapeThumbnail: 'Shape: Thumbnail',
+      shapeNone: 'Shape: None',
+      dragImageHere: 'Drag image or text here',
+      dropImage: 'Drop image or Text',
+      selectFromFiles: 'Select from files',
+      maximumFileSize: 'Maximum file size',
+      maximumFileSizeError: 'Maximum file size exceeded.',
+      url: 'Image URL',
+      remove: 'Remove Image',
+      original: 'Original'
+    },
+    video: {
+      video: 'Video',
+      videoLink: 'Video Link',
+      insert: 'Insert Video',
+      url: 'Video URL',
+      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)'
+    },
+    link: {
+      link: 'Link',
+      insert: 'Insert Link',
+      unlink: 'Unlink',
+      edit: 'Edit',
+      textToDisplay: 'Text to display',
+      url: 'To what URL should this link go?',
+      openInNewWindow: 'Open in new window',
+      useProtocol: 'Use default protocol'
+    },
+    table: {
+      table: 'Table',
+      addRowAbove: 'Add row above',
+      addRowBelow: 'Add row below',
+      addColLeft: 'Add column left',
+      addColRight: 'Add column right',
+      delRow: 'Delete row',
+      delCol: 'Delete column',
+      delTable: 'Delete table'
+    },
+    hr: {
+      insert: 'Insert Horizontal Rule'
+    },
+    style: {
+      style: 'Style',
+      p: 'Normal',
+      blockquote: 'Quote',
+      pre: 'Code',
+      h1: 'Header 1',
+      h2: 'Header 2',
+      h3: 'Header 3',
+      h4: 'Header 4',
+      h5: 'Header 5',
+      h6: 'Header 6'
+    },
+    lists: {
+      unordered: 'Unordered list',
+      ordered: 'Ordered list'
+    },
+    options: {
+      help: 'Help',
+      fullscreen: 'Full Screen',
+      codeview: 'Code View'
+    },
+    paragraph: {
+      paragraph: 'Paragraph',
+      outdent: 'Outdent',
+      indent: 'Indent',
+      left: 'Align left',
+      center: 'Align center',
+      right: 'Align right',
+      justify: 'Justify full'
+    },
+    color: {
+      recent: 'Recent Color',
+      more: 'More Color',
+      background: 'Background Color',
+      foreground: 'Text Color',
+      transparent: 'Transparent',
+      setTransparent: 'Set transparent',
+      reset: 'Reset',
+      resetToDefault: 'Reset to default',
+      cpSelect: 'Select'
+    },
+    shortcut: {
+      shortcuts: 'Keyboard shortcuts',
+      close: 'Close',
+      textFormatting: 'Text formatting',
+      action: 'Action',
+      paragraphFormatting: 'Paragraph formatting',
+      documentStyle: 'Document Style',
+      extraKeys: 'Extra keys'
+    },
+    help: {
+      'escape': 'Escape',
+      'insertParagraph': 'Insert Paragraph',
+      'undo': 'Undo the last command',
+      'redo': 'Redo the last command',
+      'tab': 'Tab',
+      'untab': 'Untab',
+      'bold': 'Set a bold style',
+      'italic': 'Set a italic style',
+      'underline': 'Set a underline style',
+      'strikethrough': 'Set a strikethrough style',
+      'removeFormat': 'Clean a style',
+      'justifyLeft': 'Set left align',
+      'justifyCenter': 'Set center align',
+      'justifyRight': 'Set right align',
+      'justifyFull': 'Set full align',
+      'insertUnorderedList': 'Toggle unordered list',
+      'insertOrderedList': 'Toggle ordered list',
+      'outdent': 'Outdent on current paragraph',
+      'indent': 'Indent on current paragraph',
+      'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+      'formatH1': 'Change current block\'s format as H1',
+      'formatH2': 'Change current block\'s format as H2',
+      'formatH3': 'Change current block\'s format as H3',
+      'formatH4': 'Change current block\'s format as H4',
+      'formatH5': 'Change current block\'s format as H5',
+      'formatH6': 'Change current block\'s format as H6',
+      'insertHorizontalRule': 'Insert horizontal rule',
+      'linkDialog.show': 'Show Link Dialog'
+    },
+    history: {
+      undo: 'Undo',
+      redo: 'Redo'
+    },
+    specialChar: {
+      specialChar: 'SPECIAL CHARACTERS',
+      select: 'Select Special characters'
+    },
+    output: {
+      noSelection: 'No Selection Made!'
+    }
+  }
+});
+
+/***/ }),
+
+/***/ 1145:
+/***/ ((module) => {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;
+
+/***/ })
+
+/******/ 	});
+/************************************************************************/
+/******/ 	// The module cache
+/******/ 	var __webpack_module_cache__ = {};
+/******/ 	
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// Check if module is in cache
+/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
+/******/ 		if (cachedModule !== undefined) {
+/******/ 			return cachedModule.exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = __webpack_module_cache__[moduleId] = {
+/******/ 			// no module.id needed
+/******/ 			// no module.loaded needed
+/******/ 			exports: {}
+/******/ 		};
+/******/ 	
+/******/ 		// Execute the module function
+/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/ 	
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/compat get default export */
+/******/ 	(() => {
+/******/ 		// getDefaultExport function for compatibility with non-harmony modules
+/******/ 		__webpack_require__.n = (module) => {
+/******/ 			var getter = module && module.__esModule ?
+/******/ 				() => (module['default']) :
+/******/ 				() => (module);
+/******/ 			__webpack_require__.d(getter, { a: getter });
+/******/ 			return getter;
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	(() => {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = (exports, definition) => {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	(() => {
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/make namespace object */
+/******/ 	(() => {
+/******/ 		// define __esModule on exports
+/******/ 		__webpack_require__.r = (exports) => {
+/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 			}
+/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+// ESM COMPAT FLAG
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: external "jQuery"
+var external_jQuery_ = __webpack_require__(1145);
+var external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_);
+// EXTERNAL MODULE: ./src/lang/summernote-en-US.js
+var summernote_en_US = __webpack_require__(9770);
+;// CONCATENATED MODULE: ./src/js/core/env.js
+
+/**
+ * returns whether font is installed or not.
+ *
+ * @param {String} fontName
+ * @return {Boolean}
+ */
+
+var genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];
+
+function validFontName(fontName) {
+  return external_jQuery_default().inArray(fontName.toLowerCase(), genericFontFamilies) === -1 ? "'".concat(fontName, "'") : fontName;
+}
+
+function isFontInstalled(fontName) {
+  var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';
+  var testText = 'mmmmmmmmmmwwwww';
+  var testSize = '200px';
+  var canvas = document.createElement('canvas');
+  var context = canvas.getContext('2d');
+  context.font = testSize + " '" + testFontName + "'";
+  var originalWidth = context.measureText(testText).width;
+  context.font = testSize + ' ' + validFontName(fontName) + ', "' + testFontName + '"';
+  var width = context.measureText(testText).width;
+  return originalWidth !== width;
+}
+
+var userAgent = navigator.userAgent;
+var isMSIE = /MSIE|Trident/i.test(userAgent);
+var browserVersion;
+
+if (isMSIE) {
+  var matches = /MSIE (\d+[.]\d+)/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+
+  matches = /Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+}
+
+var isEdge = /Edge\/\d+/.test(userAgent);
+var isSupportTouch = 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; // [workaround] IE doesn't have input events for contentEditable
+// - see: https://goo.gl/4bfIvA
+
+var inputEventName = isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';
+/**
+ * @class core.env
+ *
+ * Object which check platform and agent
+ *
+ * @singleton
+ * @alternateClassName env
+ */
+
+/* harmony default export */ const env = ({
+  isMac: navigator.appVersion.indexOf('Mac') > -1,
+  isMSIE: isMSIE,
+  isEdge: isEdge,
+  isFF: !isEdge && /firefox/i.test(userAgent),
+  isPhantom: /PhantomJS/i.test(userAgent),
+  isWebkit: !isEdge && /webkit/i.test(userAgent),
+  isChrome: !isEdge && /chrome/i.test(userAgent),
+  isSafari: !isEdge && /safari/i.test(userAgent) && !/chrome/i.test(userAgent),
+  browserVersion: browserVersion,
+  isSupportTouch: isSupportTouch,
+  isFontInstalled: isFontInstalled,
+  isW3CRangeSupport: !!document.createRange,
+  inputEventName: inputEventName,
+  genericFontFamilies: genericFontFamilies,
+  validFontName: validFontName
+});
+;// CONCATENATED MODULE: ./src/js/core/func.js
+
+/**
+ * @class core.func
+ *
+ * func utils (for high-order func's arg)
+ *
+ * @singleton
+ * @alternateClassName func
+ */
+
+function eq(itemA) {
+  return function (itemB) {
+    return itemA === itemB;
+  };
+}
+
+function eq2(itemA, itemB) {
+  return itemA === itemB;
+}
+
+function peq2(propName) {
+  return function (itemA, itemB) {
+    return itemA[propName] === itemB[propName];
+  };
+}
+
+function ok() {
+  return true;
+}
+
+function fail() {
+  return false;
+}
+
+function not(f) {
+  return function () {
+    return !f.apply(f, arguments);
+  };
+}
+
+function and(fA, fB) {
+  return function (item) {
+    return fA(item) && fB(item);
+  };
+}
+
+function func_self(a) {
+  return a;
+}
+
+function invoke(obj, method) {
+  return function () {
+    return obj[method].apply(obj, arguments);
+  };
+}
+
+var idCounter = 0;
+/**
+ * reset globally-unique id
+ *
+ */
+
+function resetUniqueId() {
+  idCounter = 0;
+}
+/**
+ * generate a globally-unique id
+ *
+ * @param {String} [prefix]
+ */
+
+
+function uniqueId(prefix) {
+  var id = ++idCounter + '';
+  return prefix ? prefix + id : id;
+}
+/**
+ * returns bnd (bounds) from rect
+ *
+ * - IE Compatibility Issue: http://goo.gl/sRLOAo
+ * - Scroll Issue: http://goo.gl/sNjUc
+ *
+ * @param {Rect} rect
+ * @return {Object} bounds
+ * @return {Number} bounds.top
+ * @return {Number} bounds.left
+ * @return {Number} bounds.width
+ * @return {Number} bounds.height
+ */
+
+
+function rect2bnd(rect) {
+  var $document = external_jQuery_default()(document);
+  return {
+    top: rect.top + $document.scrollTop(),
+    left: rect.left + $document.scrollLeft(),
+    width: rect.right - rect.left,
+    height: rect.bottom - rect.top
+  };
+}
+/**
+ * returns a copy of the object where the keys have become the values and the values the keys.
+ * @param {Object} obj
+ * @return {Object}
+ */
+
+
+function invertObject(obj) {
+  var inverted = {};
+
+  for (var key in obj) {
+    if (Object.prototype.hasOwnProperty.call(obj, key)) {
+      inverted[obj[key]] = key;
+    }
+  }
+
+  return inverted;
+}
+/**
+ * @param {String} namespace
+ * @param {String} [prefix]
+ * @return {String}
+ */
+
+
+function namespaceToCamel(namespace, prefix) {
+  prefix = prefix || '';
+  return prefix + namespace.split('.').map(function (name) {
+    return name.substring(0, 1).toUpperCase() + name.substring(1);
+  }).join('');
+}
+/**
+ * Returns a function, that, as long as it continues to be invoked, will not
+ * be triggered. The function will be called after it stops being called for
+ * N milliseconds. If `immediate` is passed, trigger the function on the
+ * leading edge, instead of the trailing.
+ * @param {Function} func
+ * @param {Number} wait
+ * @param {Boolean} immediate
+ * @return {Function}
+ */
+
+
+function debounce(func, wait, immediate) {
+  var timeout;
+  return function () {
+    var context = this;
+    var args = arguments;
+
+    var later = function later() {
+      timeout = null;
+
+      if (!immediate) {
+        func.apply(context, args);
+      }
+    };
+
+    var callNow = immediate && !timeout;
+    clearTimeout(timeout);
+    timeout = setTimeout(later, wait);
+
+    if (callNow) {
+      func.apply(context, args);
+    }
+  };
+}
+/**
+ *
+ * @param {String} url
+ * @return {Boolean}
+ */
+
+
+function isValidUrl(url) {
+  var expression = /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
+  return expression.test(url);
+}
+
+/* harmony default export */ const func = ({
+  eq: eq,
+  eq2: eq2,
+  peq2: peq2,
+  ok: ok,
+  fail: fail,
+  self: func_self,
+  not: not,
+  and: and,
+  invoke: invoke,
+  resetUniqueId: resetUniqueId,
+  uniqueId: uniqueId,
+  rect2bnd: rect2bnd,
+  invertObject: invertObject,
+  namespaceToCamel: namespaceToCamel,
+  debounce: debounce,
+  isValidUrl: isValidUrl
+});
+;// CONCATENATED MODULE: ./src/js/core/lists.js
+
+/**
+ * returns the first item of an array.
+ *
+ * @param {Array} array
+ */
+
+function head(array) {
+  return array[0];
+}
+/**
+ * returns the last item of an array.
+ *
+ * @param {Array} array
+ */
+
+
+function last(array) {
+  return array[array.length - 1];
+}
+/**
+ * returns everything but the last entry of the array.
+ *
+ * @param {Array} array
+ */
+
+
+function initial(array) {
+  return array.slice(0, array.length - 1);
+}
+/**
+ * returns the rest of the items in an array.
+ *
+ * @param {Array} array
+ */
+
+
+function tail(array) {
+  return array.slice(1);
+}
+/**
+ * returns item of array
+ */
+
+
+function find(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    var item = array[idx];
+
+    if (pred(item)) {
+      return item;
+    }
+  }
+}
+/**
+ * returns true if all of the values in the array pass the predicate truth test.
+ */
+
+
+function lists_all(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!pred(array[idx])) {
+      return false;
+    }
+  }
+
+  return true;
+}
+/**
+ * returns true if the value is present in the list.
+ */
+
+
+function contains(array, item) {
+  if (array && array.length && item) {
+    if (array.indexOf) {
+      return array.indexOf(item) !== -1;
+    } else if (array.contains) {
+      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`
+      return array.contains(item);
+    }
+  }
+
+  return false;
+}
+/**
+ * get sum from a list
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - iterator
+ */
+
+
+function sum(array, fn) {
+  fn = fn || func.self;
+  return array.reduce(function (memo, v) {
+    return memo + fn(v);
+  }, 0);
+}
+/**
+ * returns a copy of the collection with array type.
+ * @param {Collection} collection - collection eg) node.childNodes, ...
+ */
+
+
+function from(collection) {
+  var result = [];
+  var length = collection.length;
+  var idx = -1;
+
+  while (++idx < length) {
+    result[idx] = collection[idx];
+  }
+
+  return result;
+}
+/**
+ * returns whether list is empty or not
+ */
+
+
+function isEmpty(array) {
+  return !array || !array.length;
+}
+/**
+ * cluster elements by predicate function.
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ * @param {Array[]}
+ */
+
+
+function clusterBy(array, fn) {
+  if (!array.length) {
+    return [];
+  }
+
+  var aTail = tail(array);
+  return aTail.reduce(function (memo, v) {
+    var aLast = last(memo);
+
+    if (fn(last(aLast), v)) {
+      aLast[aLast.length] = v;
+    } else {
+      memo[memo.length] = [v];
+    }
+
+    return memo;
+  }, [[head(array)]]);
+}
+/**
+ * returns a copy of the array with all false values removed
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ */
+
+
+function compact(array) {
+  var aResult = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (array[idx]) {
+      aResult.push(array[idx]);
+    }
+  }
+
+  return aResult;
+}
+/**
+ * produces a duplicate-free version of the array
+ *
+ * @param {Array} array
+ */
+
+
+function unique(array) {
+  var results = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!contains(results, array[idx])) {
+      results.push(array[idx]);
+    }
+  }
+
+  return results;
+}
+/**
+ * returns next item.
+ * @param {Array} array
+ */
+
+
+function next(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx + 1];
+  }
+
+  return null;
+}
+/**
+ * returns prev item.
+ * @param {Array} array
+ */
+
+
+function prev(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx - 1];
+  }
+
+  return null;
+}
+/**
+ * @class core.list
+ *
+ * list utils
+ *
+ * @singleton
+ * @alternateClassName list
+ */
+
+
+/* harmony default export */ const lists = ({
+  head: head,
+  last: last,
+  initial: initial,
+  tail: tail,
+  prev: prev,
+  next: next,
+  find: find,
+  contains: contains,
+  all: lists_all,
+  sum: sum,
+  from: from,
+  isEmpty: isEmpty,
+  clusterBy: clusterBy,
+  compact: compact,
+  unique: unique
+});
+;// CONCATENATED MODULE: ./src/js/core/dom.js
+
+
+
+
+var NBSP_CHAR = String.fromCharCode(160);
+var ZERO_WIDTH_NBSP_CHAR = "\uFEFF";
+/**
+ * @method isEditable
+ *
+ * returns whether node is `note-editable` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+function isEditable(node) {
+  return node && external_jQuery_default()(node).hasClass('note-editable');
+}
+/**
+ * @method isControlSizing
+ *
+ * returns whether node is `note-control-sizing` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function isControlSizing(node) {
+  return node && external_jQuery_default()(node).hasClass('note-control-sizing');
+}
+/**
+ * @method makePredByNodeName
+ *
+ * returns predicate which judge whether nodeName is same
+ *
+ * @param {String} nodeName
+ * @return {Function}
+ */
+
+
+function makePredByNodeName(nodeName) {
+  nodeName = nodeName.toUpperCase();
+  return function (node) {
+    return node && node.nodeName.toUpperCase() === nodeName;
+  };
+}
+/**
+ * @method isText
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is text(3)
+ */
+
+
+function isText(node) {
+  return node && node.nodeType === 3;
+}
+/**
+ * @method isElement
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is element(1)
+ */
+
+
+function isElement(node) {
+  return node && node.nodeType === 1;
+}
+/**
+ * ex) br, col, embed, hr, img, input, ...
+ * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
+ */
+
+
+function isVoid(node) {
+  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());
+}
+
+function isPara(node) {
+  if (isEditable(node)) {
+    return false;
+  } // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
+
+
+  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+function isHeading(node) {
+  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+var isPre = makePredByNodeName('PRE');
+var isLi = makePredByNodeName('LI');
+
+function isPurePara(node) {
+  return isPara(node) && !isLi(node);
+}
+
+var isTable = makePredByNodeName('TABLE');
+var isData = makePredByNodeName('DATA');
+
+function isInline(node) {
+  return !isBodyContainer(node) && !isList(node) && !isHr(node) && !isPara(node) && !isTable(node) && !isBlockquote(node) && !isData(node);
+}
+
+function isList(node) {
+  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
+}
+
+var isHr = makePredByNodeName('HR');
+
+function isCell(node) {
+  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
+}
+
+var isBlockquote = makePredByNodeName('BLOCKQUOTE');
+
+function isBodyContainer(node) {
+  return isCell(node) || isBlockquote(node) || isEditable(node);
+}
+
+var isAnchor = makePredByNodeName('A');
+
+function isParaInline(node) {
+  return isInline(node) && !!ancestor(node, isPara);
+}
+
+function isBodyInline(node) {
+  return isInline(node) && !ancestor(node, isPara);
+}
+
+var isBody = makePredByNodeName('BODY');
+/**
+ * returns whether nodeB is closest sibling of nodeA
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ * @return {Boolean}
+ */
+
+function isClosestSibling(nodeA, nodeB) {
+  return nodeA.nextSibling === nodeB || nodeA.previousSibling === nodeB;
+}
+/**
+ * returns array of closest siblings with node
+ *
+ * @param {Node} node
+ * @param {function} [pred] - predicate function
+ * @return {Node[]}
+ */
+
+
+function withClosestSiblings(node, pred) {
+  pred = pred || func.ok;
+  var siblings = [];
+
+  if (node.previousSibling && pred(node.previousSibling)) {
+    siblings.push(node.previousSibling);
+  }
+
+  siblings.push(node);
+
+  if (node.nextSibling && pred(node.nextSibling)) {
+    siblings.push(node.nextSibling);
+  }
+
+  return siblings;
+}
+/**
+ * blank HTML for cursor position
+ * - [workaround] old IE only works with &nbsp;
+ * - [workaround] IE11 and other browser works with bogus br
+ */
+
+
+var blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';
+/**
+ * @method nodeLength
+ *
+ * returns #text's text size or element's childNodes size
+ *
+ * @param {Node} node
+ */
+
+function nodeLength(node) {
+  if (isText(node)) {
+    return node.nodeValue.length;
+  }
+
+  if (node) {
+    return node.childNodes.length;
+  }
+
+  return 0;
+}
+/**
+ * returns whether deepest child node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function deepestChildIsEmpty(node) {
+  do {
+    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;
+  } while (node = node.firstElementChild);
+
+  return dom_isEmpty(node);
+}
+/**
+ * returns whether node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function dom_isEmpty(node) {
+  var len = nodeLength(node);
+
+  if (len === 0) {
+    return true;
+  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {
+    // ex) <p><br></p>, <span><br></span>
+    return true;
+  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {
+    // ex) <p></p>, <span></span>
+    return true;
+  }
+
+  return false;
+}
+/**
+ * padding blankHTML if node is empty (for cursor position)
+ */
+
+
+function paddingBlankHTML(node) {
+  if (!isVoid(node) && !nodeLength(node)) {
+    node.innerHTML = blankHTML;
+  }
+}
+/**
+ * find nearest ancestor predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function ancestor(node, pred) {
+  while (node) {
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * find nearest ancestor only single child blood line and predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function singleChildAncestor(node, pred) {
+  node = node.parentNode;
+
+  while (node) {
+    if (nodeLength(node) !== 1) {
+      break;
+    }
+
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * returns new array of ancestor nodes (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listAncestor(node, pred) {
+  pred = pred || func.fail;
+  var ancestors = [];
+  ancestor(node, function (el) {
+    if (!isEditable(el)) {
+      ancestors.push(el);
+    }
+
+    return pred(el);
+  });
+  return ancestors;
+}
+/**
+ * find farthest ancestor predicate hit
+ */
+
+
+function lastAncestor(node, pred) {
+  var ancestors = listAncestor(node);
+  return lists.last(ancestors.filter(pred));
+}
+/**
+ * returns common ancestor node between two nodes.
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ */
+
+
+function commonAncestor(nodeA, nodeB) {
+  var ancestors = listAncestor(nodeA);
+
+  for (var n = nodeB; n; n = n.parentNode) {
+    if (ancestors.indexOf(n) > -1) return n;
+  }
+
+  return null; // difference document area
+}
+/**
+ * listing all previous siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listPrev(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.previousSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing next siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listNext(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.nextSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing descendant nodes
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listDescendant(node, pred) {
+  var descendants = [];
+  pred = pred || func.ok; // start DFS(depth first search) with node
+
+  (function fnWalk(current) {
+    if (node !== current && pred(current)) {
+      descendants.push(current);
+    }
+
+    for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
+      fnWalk(current.childNodes[idx]);
+    }
+  })(node);
+
+  return descendants;
+}
+/**
+ * wrap node with new tag.
+ *
+ * @param {Node} node
+ * @param {Node} tagName of wrapper
+ * @return {Node} - wrapper
+ */
+
+
+function wrap(node, wrapperName) {
+  var parent = node.parentNode;
+  var wrapper = external_jQuery_default()('<' + wrapperName + '>')[0];
+  parent.insertBefore(wrapper, node);
+  wrapper.appendChild(node);
+  return wrapper;
+}
+/**
+ * insert node after preceding
+ *
+ * @param {Node} node
+ * @param {Node} preceding - predicate function
+ */
+
+
+function insertAfter(node, preceding) {
+  var next = preceding.nextSibling;
+  var parent = preceding.parentNode;
+
+  if (next) {
+    parent.insertBefore(node, next);
+  } else {
+    parent.appendChild(node);
+  }
+
+  return node;
+}
+/**
+ * append elements.
+ *
+ * @param {Node} node
+ * @param {Collection} aChild
+ */
+
+
+function appendChildNodes(node, aChild) {
+  external_jQuery_default().each(aChild, function (idx, child) {
+    node.appendChild(child);
+  });
+  return node;
+}
+/**
+ * returns whether boundaryPoint is left edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePoint(point) {
+  return point.offset === 0;
+}
+/**
+ * returns whether boundaryPoint is right edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePoint(point) {
+  return point.offset === nodeLength(point.node);
+}
+/**
+ * returns whether boundaryPoint is edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isEdgePoint(point) {
+  return isLeftEdgePoint(point) || isRightEdgePoint(point);
+}
+/**
+ * returns whether node is left edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgeOf(node, ancestor) {
+  while (node && node !== ancestor) {
+    if (position(node) !== 0) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether node is right edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgeOf(node, ancestor) {
+  if (!ancestor) {
+    return false;
+  }
+
+  while (node && node !== ancestor) {
+    if (position(node) !== nodeLength(node.parentNode) - 1) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether point is left edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePointOf(point, ancestor) {
+  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);
+}
+/**
+ * returns whether point is right edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePointOf(point, ancestor) {
+  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);
+}
+/**
+ * returns offset from parent.
+ *
+ * @param {Node} node
+ */
+
+
+function position(node) {
+  var offset = 0;
+
+  while (node = node.previousSibling) {
+    offset += 1;
+  }
+
+  return offset;
+}
+
+function hasChildren(node) {
+  return !!(node && node.childNodes && node.childNodes.length);
+}
+/**
+ * returns previous boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPoint(point, isSkipInnerOffset) {
+  var node;
+  var offset;
+
+  if (point.offset === 0) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node);
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset - 1];
+    offset = nodeLength(node);
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? 0 : point.offset - 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPoint(point, isSkipInnerOffset) {
+  var node, offset;
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    var nextTextNode = getNextTextNode(point.node);
+
+    if (nextTextNode) {
+      node = nextTextNode;
+      offset = 0;
+    } else {
+      node = point.node.parentNode;
+      offset = position(point.node) + 1;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint with empty node
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointWithEmptyNode(point, isSkipInnerOffset) {
+  var node,
+      offset = 0; // if node is empty string node, return current node's sibling.
+
+  if (dom_isEmpty(point.node)) {
+    if (point.node === null) {
+      return null;
+    }
+
+    node = point.node.nextSibling;
+    offset = 0;
+    return {
+      node: node,
+      offset: offset
+    };
+  }
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node) + 1; // if next node is editable ,  return current node's sibling node.
+
+    if (isEditable(node)) {
+      node = point.node.nextSibling;
+      offset = 0;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+
+    if (dom_isEmpty(node)) {
+      if (!dom_isEmpty(point.node.nextSibling)) {
+        return {
+          node: point.node.nextSibling,
+          offset: offset
+        };
+      }
+
+      return null;
+    }
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+
+    if (dom_isEmpty(node)) {
+      return null;
+    }
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/*
+* returns the next Text node index or 0 if not found.
+*/
+
+
+function getNextTextNode(actual) {
+  if (!actual.nextSibling) return undefined;
+  if (actual.parent !== actual.nextSibling.parent) return undefined;
+  if (isText(actual.nextSibling)) return actual.nextSibling;else return getNextTextNode(actual.nextSibling);
+}
+/**
+ * returns whether pointA and pointB is same or not.
+ *
+ * @param {BoundaryPoint} pointA
+ * @param {BoundaryPoint} pointB
+ * @return {Boolean}
+ */
+
+
+function isSamePoint(pointA, pointB) {
+  return pointA.node === pointB.node && pointA.offset === pointB.offset;
+}
+/**
+ * returns whether point is visible (can set cursor) or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isVisiblePoint(point) {
+  if (isText(point.node) || !hasChildren(point.node) || dom_isEmpty(point.node)) {
+    return true;
+  }
+
+  var leftNode = point.node.childNodes[point.offset - 1];
+  var rightNode = point.node.childNodes[point.offset];
+
+  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {
+    return true;
+  }
+
+  return false;
+}
+/**
+ * @method prevPointUtil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = prevPoint(point);
+  }
+
+  return null;
+}
+/**
+ * @method nextPointUntil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = nextPoint(point);
+  }
+
+  return null;
+}
+/**
+ * returns whether point has character or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isCharPoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch && ch !== ' ' && ch !== NBSP_CHAR;
+}
+/**
+ * returns whether point has space or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isSpacePoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch === ' ' || ch === NBSP_CHAR;
+}
+/**
+ * @method walkPoint
+ *
+ * @param {BoundaryPoint} startPoint
+ * @param {BoundaryPoint} endPoint
+ * @param {Function} handler
+ * @param {Boolean} isSkipInnerOffset
+ */
+
+
+function walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {
+  var point = startPoint;
+
+  while (point) {
+    handler(point);
+
+    if (isSamePoint(point, endPoint)) {
+      break;
+    }
+
+    var isSkipOffset = isSkipInnerOffset && startPoint.node !== point.node && endPoint.node !== point.node;
+    point = nextPointWithEmptyNode(point, isSkipOffset);
+  }
+}
+/**
+ * @method makeOffsetPath
+ *
+ * return offsetPath(array of offset) from ancestor
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {Node} node
+ */
+
+
+function makeOffsetPath(ancestor, node) {
+  var ancestors = listAncestor(node, func.eq(ancestor));
+  return ancestors.map(position).reverse();
+}
+/**
+ * @method fromOffsetPath
+ *
+ * return element from offsetPath(array of offset)
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {array} offsets - offsetPath
+ */
+
+
+function fromOffsetPath(ancestor, offsets) {
+  var current = ancestor;
+
+  for (var i = 0, len = offsets.length; i < len; i++) {
+    if (current.childNodes.length <= offsets[i]) {
+      current = current.childNodes[current.childNodes.length - 1];
+    } else {
+      current = current.childNodes[offsets[i]];
+    }
+  }
+
+  return current;
+}
+/**
+ * @method splitNode
+ *
+ * split element or #text
+ *
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @param {Boolean} [options.isDiscardEmptySplits] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitNode(point, options) {
+  var isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;
+  var isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;
+  var isDiscardEmptySplits = options && options.isDiscardEmptySplits;
+
+  if (isDiscardEmptySplits) {
+    isSkipPaddingBlankHTML = true;
+  } // edge case
+
+
+  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {
+    if (isLeftEdgePoint(point)) {
+      return point.node;
+    } else if (isRightEdgePoint(point)) {
+      return point.node.nextSibling;
+    }
+  } // split #text
+
+
+  if (isText(point.node)) {
+    return point.node.splitText(point.offset);
+  } else {
+    var childNode = point.node.childNodes[point.offset];
+    var clone = insertAfter(point.node.cloneNode(false), point.node);
+    appendChildNodes(clone, listNext(childNode));
+
+    if (!isSkipPaddingBlankHTML) {
+      paddingBlankHTML(point.node);
+      paddingBlankHTML(clone);
+    }
+
+    if (isDiscardEmptySplits) {
+      if (dom_isEmpty(point.node)) {
+        remove(point.node);
+      }
+
+      if (dom_isEmpty(clone)) {
+        remove(clone);
+        return point.node.nextSibling;
+      }
+    }
+
+    return clone;
+  }
+}
+/**
+ * @method splitTree
+ *
+ * split tree by point
+ *
+ * @param {Node} root - split root
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitTree(root, point, options) {
+  // ex) [#text, <span>, <p>]
+  var ancestors = listAncestor(point.node, func.eq(root));
+
+  if (!ancestors.length) {
+    return null;
+  } else if (ancestors.length === 1) {
+    return splitNode(point, options);
+  }
+
+  return ancestors.reduce(function (node, parent) {
+    if (node === point.node) {
+      node = splitNode(point, options);
+    }
+
+    return splitNode({
+      node: parent,
+      offset: node ? position(node) : nodeLength(parent)
+    }, options);
+  });
+}
+/**
+ * split point
+ *
+ * @param {Point} point
+ * @param {Boolean} isInline
+ * @return {Object}
+ */
+
+
+function splitPoint(point, isInline) {
+  // find splitRoot, container
+  //  - inline: splitRoot is a child of paragraph
+  //  - block: splitRoot is a child of bodyContainer
+  var pred = isInline ? isPara : isBodyContainer;
+  var ancestors = listAncestor(point.node, pred);
+  var topAncestor = lists.last(ancestors) || point.node;
+  var splitRoot, container;
+
+  if (pred(topAncestor)) {
+    splitRoot = ancestors[ancestors.length - 2];
+    container = topAncestor;
+  } else {
+    splitRoot = topAncestor;
+    container = splitRoot.parentNode;
+  } // if splitRoot is exists, split with splitTree
+
+
+  var pivot = splitRoot && splitTree(splitRoot, point, {
+    isSkipPaddingBlankHTML: isInline,
+    isNotSplitEdgePoint: isInline
+  }); // if container is point.node, find pivot with point.offset
+
+  if (!pivot && container === point.node) {
+    pivot = point.node.childNodes[point.offset];
+  }
+
+  return {
+    rightNode: pivot,
+    container: container
+  };
+}
+
+function create(nodeName) {
+  return document.createElement(nodeName);
+}
+
+function createText(text) {
+  return document.createTextNode(text);
+}
+/**
+ * @method remove
+ *
+ * remove node, (isRemoveChild: remove child or not)
+ *
+ * @param {Node} node
+ * @param {Boolean} isRemoveChild
+ */
+
+
+function remove(node, isRemoveChild) {
+  if (!node || !node.parentNode) {
+    return;
+  }
+
+  if (node.removeNode) {
+    return node.removeNode(isRemoveChild);
+  }
+
+  var parent = node.parentNode;
+
+  if (!isRemoveChild) {
+    var nodes = [];
+
+    for (var i = 0, len = node.childNodes.length; i < len; i++) {
+      nodes.push(node.childNodes[i]);
+    }
+
+    for (var _i = 0, _len = nodes.length; _i < _len; _i++) {
+      parent.insertBefore(nodes[_i], node);
+    }
+  }
+
+  parent.removeChild(node);
+}
+/**
+ * @method removeWhile
+ *
+ * @param {Node} node
+ * @param {Function} pred
+ */
+
+
+function removeWhile(node, pred) {
+  while (node) {
+    if (isEditable(node) || !pred(node)) {
+      break;
+    }
+
+    var parent = node.parentNode;
+    remove(node);
+    node = parent;
+  }
+}
+/**
+ * @method replace
+ *
+ * replace node with provided nodeName
+ *
+ * @param {Node} node
+ * @param {String} nodeName
+ * @return {Node} - new node
+ */
+
+
+function replace(node, nodeName) {
+  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {
+    return node;
+  }
+
+  var newNode = create(nodeName);
+
+  if (node.style.cssText) {
+    newNode.style.cssText = node.style.cssText;
+  }
+
+  appendChildNodes(newNode, lists.from(node.childNodes));
+  insertAfter(newNode, node);
+  remove(node);
+  return newNode;
+}
+
+var isTextarea = makePredByNodeName('TEXTAREA');
+/**
+ * @param {jQuery} $node
+ * @param {Boolean} [stripLinebreaks] - default: false
+ */
+
+function value($node, stripLinebreaks) {
+  var val = isTextarea($node[0]) ? $node.val() : $node.html();
+
+  if (stripLinebreaks) {
+    return val.replace(/[\n\r]/g, '');
+  }
+
+  return val;
+}
+/**
+ * @method html
+ *
+ * get the HTML contents of node
+ *
+ * @param {jQuery} $node
+ * @param {Boolean} [isNewlineOnBlock]
+ */
+
+
+function html($node, isNewlineOnBlock) {
+  var markup = value($node);
+
+  if (isNewlineOnBlock) {
+    var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g;
+    markup = markup.replace(regexTag, function (match, endSlash, name) {
+      name = name.toUpperCase();
+      var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) && !!endSlash;
+      var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);
+      return match + (isEndOfInlineContainer || isBlockNode ? '\n' : '');
+    });
+    markup = markup.trim();
+  }
+
+  return markup;
+}
+
+function posFromPlaceholder(placeholder) {
+  var $placeholder = external_jQuery_default()(placeholder);
+  var pos = $placeholder.offset();
+  var height = $placeholder.outerHeight(true); // include margin
+
+  return {
+    left: pos.left,
+    top: pos.top + height
+  };
+}
+
+function attachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.on(key, events[key]);
+  });
+}
+
+function detachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.off(key, events[key]);
+  });
+}
+/**
+ * @method isCustomStyleTag
+ *
+ * assert if a node contains a "note-styletag" class,
+ * which implies that's a custom-made style tag node
+ *
+ * @param {Node} an HTML DOM node
+ */
+
+
+function isCustomStyleTag(node) {
+  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');
+}
+
+/* harmony default export */ const dom = ({
+  /** @property {String} NBSP_CHAR */
+  NBSP_CHAR: NBSP_CHAR,
+
+  /** @property {String} ZERO_WIDTH_NBSP_CHAR */
+  ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR,
+
+  /** @property {String} blank */
+  blank: blankHTML,
+
+  /** @property {String} emptyPara */
+  emptyPara: "<p>".concat(blankHTML, "</p>"),
+  makePredByNodeName: makePredByNodeName,
+  isEditable: isEditable,
+  isControlSizing: isControlSizing,
+  isText: isText,
+  isElement: isElement,
+  isVoid: isVoid,
+  isPara: isPara,
+  isPurePara: isPurePara,
+  isHeading: isHeading,
+  isInline: isInline,
+  isBlock: func.not(isInline),
+  isBodyInline: isBodyInline,
+  isBody: isBody,
+  isParaInline: isParaInline,
+  isPre: isPre,
+  isList: isList,
+  isTable: isTable,
+  isData: isData,
+  isCell: isCell,
+  isBlockquote: isBlockquote,
+  isBodyContainer: isBodyContainer,
+  isAnchor: isAnchor,
+  isDiv: makePredByNodeName('DIV'),
+  isLi: isLi,
+  isBR: makePredByNodeName('BR'),
+  isSpan: makePredByNodeName('SPAN'),
+  isB: makePredByNodeName('B'),
+  isU: makePredByNodeName('U'),
+  isS: makePredByNodeName('S'),
+  isI: makePredByNodeName('I'),
+  isImg: makePredByNodeName('IMG'),
+  isTextarea: isTextarea,
+  deepestChildIsEmpty: deepestChildIsEmpty,
+  isEmpty: dom_isEmpty,
+  isEmptyAnchor: func.and(isAnchor, dom_isEmpty),
+  isClosestSibling: isClosestSibling,
+  withClosestSiblings: withClosestSiblings,
+  nodeLength: nodeLength,
+  isLeftEdgePoint: isLeftEdgePoint,
+  isRightEdgePoint: isRightEdgePoint,
+  isEdgePoint: isEdgePoint,
+  isLeftEdgeOf: isLeftEdgeOf,
+  isRightEdgeOf: isRightEdgeOf,
+  isLeftEdgePointOf: isLeftEdgePointOf,
+  isRightEdgePointOf: isRightEdgePointOf,
+  prevPoint: prevPoint,
+  nextPoint: nextPoint,
+  nextPointWithEmptyNode: nextPointWithEmptyNode,
+  isSamePoint: isSamePoint,
+  isVisiblePoint: isVisiblePoint,
+  prevPointUntil: prevPointUntil,
+  nextPointUntil: nextPointUntil,
+  isCharPoint: isCharPoint,
+  isSpacePoint: isSpacePoint,
+  walkPoint: walkPoint,
+  ancestor: ancestor,
+  singleChildAncestor: singleChildAncestor,
+  listAncestor: listAncestor,
+  lastAncestor: lastAncestor,
+  listNext: listNext,
+  listPrev: listPrev,
+  listDescendant: listDescendant,
+  commonAncestor: commonAncestor,
+  wrap: wrap,
+  insertAfter: insertAfter,
+  appendChildNodes: appendChildNodes,
+  position: position,
+  hasChildren: hasChildren,
+  makeOffsetPath: makeOffsetPath,
+  fromOffsetPath: fromOffsetPath,
+  splitTree: splitTree,
+  splitPoint: splitPoint,
+  create: create,
+  createText: createText,
+  remove: remove,
+  removeWhile: removeWhile,
+  replace: replace,
+  html: html,
+  value: value,
+  posFromPlaceholder: posFromPlaceholder,
+  attachEvents: attachEvents,
+  detachEvents: detachEvents,
+  isCustomStyleTag: isCustomStyleTag
+});
+;// CONCATENATED MODULE: ./src/js/Context.js
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Context = /*#__PURE__*/function () {
+  /**
+   * @param {jQuery} $note
+   * @param {Object} options
+   */
+  function Context($note, options) {
+    _classCallCheck(this, Context);
+
+    this.$note = $note;
+    this.memos = {};
+    this.modules = {};
+    this.layoutInfo = {};
+    this.options = external_jQuery_default().extend(true, {}, options); // init ui with options
+
+    (external_jQuery_default()).summernote.ui = external_jQuery_default().summernote.ui_template(this.options);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.initialize();
+  }
+  /**
+   * create layout and initialize modules and other resources
+   */
+
+
+  _createClass(Context, [{
+    key: "initialize",
+    value: function initialize() {
+      this.layoutInfo = this.ui.createLayout(this.$note);
+
+      this._initialize();
+
+      this.$note.hide();
+      return this;
+    }
+    /**
+     * destroy modules and other resources and remove layout
+     */
+
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this._destroy();
+
+      this.$note.removeData('summernote');
+      this.ui.removeLayout(this.$note, this.layoutInfo);
+    }
+    /**
+     * destory modules and other resources and initialize it again
+     */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      var disabled = this.isDisabled();
+      this.code(dom.emptyPara);
+
+      this._destroy();
+
+      this._initialize();
+
+      if (disabled) {
+        this.disable();
+      }
+    }
+  }, {
+    key: "_initialize",
+    value: function _initialize() {
+      var _this = this;
+
+      // set own id
+      this.options.id = func.uniqueId(external_jQuery_default().now()); // set default container for tooltips, popovers, and dialogs
+
+      this.options.container = this.options.container || this.layoutInfo.editor; // add optional buttons
+
+      var buttons = external_jQuery_default().extend({}, this.options.buttons);
+      Object.keys(buttons).forEach(function (key) {
+        _this.memo('button.' + key, buttons[key]);
+      });
+      var modules = external_jQuery_default().extend({}, this.options.modules, (external_jQuery_default()).summernote.plugins || {}); // add and initialize modules
+
+      Object.keys(modules).forEach(function (key) {
+        _this.module(key, modules[key], true);
+      });
+      Object.keys(this.modules).forEach(function (key) {
+        _this.initializeModule(key);
+      });
+    }
+  }, {
+    key: "_destroy",
+    value: function _destroy() {
+      var _this2 = this;
+
+      // destroy modules with reversed order
+      Object.keys(this.modules).reverse().forEach(function (key) {
+        _this2.removeModule(key);
+      });
+      Object.keys(this.memos).forEach(function (key) {
+        _this2.removeMemo(key);
+      }); // trigger custom onDestroy callback
+
+      this.triggerEvent('destroy', this);
+    }
+  }, {
+    key: "code",
+    value: function code(html) {
+      var isActivated = this.invoke('codeview.isActivated');
+
+      if (html === undefined) {
+        this.invoke('codeview.sync');
+        return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();
+      } else {
+        if (isActivated) {
+          this.invoke('codeview.sync', html);
+        } else {
+          this.layoutInfo.editable.html(html);
+        }
+
+        this.$note.val(html);
+        this.triggerEvent('change', html, this.layoutInfo.editable);
+      }
+    }
+  }, {
+    key: "isDisabled",
+    value: function isDisabled() {
+      return this.layoutInfo.editable.attr('contenteditable') === 'false';
+    }
+  }, {
+    key: "enable",
+    value: function enable() {
+      this.layoutInfo.editable.attr('contenteditable', true);
+      this.invoke('toolbar.activate', true);
+      this.triggerEvent('disable', false);
+      this.options.editing = true;
+    }
+  }, {
+    key: "disable",
+    value: function disable() {
+      // close codeview if codeview is opend
+      if (this.invoke('codeview.isActivated')) {
+        this.invoke('codeview.deactivate');
+      }
+
+      this.layoutInfo.editable.attr('contenteditable', false);
+      this.options.editing = false;
+      this.invoke('toolbar.deactivate', true);
+      this.triggerEvent('disable', true);
+    }
+  }, {
+    key: "triggerEvent",
+    value: function triggerEvent() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];
+
+      if (callback) {
+        callback.apply(this.$note[0], args);
+      }
+
+      this.$note.trigger('summernote.' + namespace, args);
+    }
+  }, {
+    key: "initializeModule",
+    value: function initializeModule(key) {
+      var module = this.modules[key];
+      module.shouldInitialize = module.shouldInitialize || func.ok;
+
+      if (!module.shouldInitialize()) {
+        return;
+      } // initialize module
+
+
+      if (module.initialize) {
+        module.initialize();
+      } // attach events
+
+
+      if (module.events) {
+        dom.attachEvents(this.$note, module.events);
+      }
+    }
+  }, {
+    key: "module",
+    value: function module(key, ModuleClass, withoutIntialize) {
+      if (arguments.length === 1) {
+        return this.modules[key];
+      }
+
+      this.modules[key] = new ModuleClass(this);
+
+      if (!withoutIntialize) {
+        this.initializeModule(key);
+      }
+    }
+  }, {
+    key: "removeModule",
+    value: function removeModule(key) {
+      var module = this.modules[key];
+
+      if (module.shouldInitialize()) {
+        if (module.events) {
+          dom.detachEvents(this.$note, module.events);
+        }
+
+        if (module.destroy) {
+          module.destroy();
+        }
+      }
+
+      delete this.modules[key];
+    }
+  }, {
+    key: "memo",
+    value: function memo(key, obj) {
+      if (arguments.length === 1) {
+        return this.memos[key];
+      }
+
+      this.memos[key] = obj;
+    }
+  }, {
+    key: "removeMemo",
+    value: function removeMemo(key) {
+      if (this.memos[key] && this.memos[key].destroy) {
+        this.memos[key].destroy();
+      }
+
+      delete this.memos[key];
+    }
+    /**
+     * Some buttons need to change their visual style immediately once they get pressed
+     */
+
+  }, {
+    key: "createInvokeHandlerAndUpdateState",
+    value: function createInvokeHandlerAndUpdateState(namespace, value) {
+      var _this3 = this;
+
+      return function (event) {
+        _this3.createInvokeHandler(namespace, value)(event);
+
+        _this3.invoke('buttons.updateCurrentStyle');
+      };
+    }
+  }, {
+    key: "createInvokeHandler",
+    value: function createInvokeHandler(namespace, value) {
+      var _this4 = this;
+
+      return function (event) {
+        event.preventDefault();
+        var $target = external_jQuery_default()(event.target);
+
+        _this4.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);
+      };
+    }
+  }, {
+    key: "invoke",
+    value: function invoke() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var splits = namespace.split('.');
+      var hasSeparator = splits.length > 1;
+      var moduleName = hasSeparator && lists.head(splits);
+      var methodName = hasSeparator ? lists.last(splits) : lists.head(splits);
+      var module = this.modules[moduleName || 'editor'];
+
+      if (!moduleName && this[methodName]) {
+        return this[methodName].apply(this, args);
+      } else if (module && module[methodName] && module.shouldInitialize()) {
+        return module[methodName].apply(module, args);
+      }
+    }
+  }]);
+
+  return Context;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/summernote.js
+
+
+
+
+external_jQuery_default().fn.extend({
+  /**
+   * Summernote API
+   *
+   * @param {Object|String}
+   * @return {this}
+   */
+  summernote: function summernote() {
+    var type = external_jQuery_default().type(lists.head(arguments));
+    var isExternalAPICalled = type === 'string';
+    var hasInitOptions = type === 'object';
+    var options = external_jQuery_default().extend({}, (external_jQuery_default()).summernote.options, hasInitOptions ? lists.head(arguments) : {}); // Update options
+
+    options.langInfo = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.lang["en-US"], (external_jQuery_default()).summernote.lang[options.lang]);
+    options.icons = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.options.icons, options.icons);
+    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;
+    this.each(function (idx, note) {
+      var $note = external_jQuery_default()(note);
+
+      if (!$note.data('summernote')) {
+        var context = new Context($note, options);
+        $note.data('summernote', context);
+        $note.data('summernote').triggerEvent('init', context.layoutInfo);
+      }
+    });
+    var $note = this.first();
+
+    if ($note.length) {
+      var context = $note.data('summernote');
+
+      if (isExternalAPICalled) {
+        return context.invoke.apply(context, lists.from(arguments));
+      } else if (options.focus) {
+        context.invoke('editor.focus');
+      }
+    }
+
+    return this;
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/range.js
+function range_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function range_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function range_createClass(Constructor, protoProps, staticProps) { if (protoProps) range_defineProperties(Constructor.prototype, protoProps); if (staticProps) range_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+/**
+ * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
+ *
+ * @param {TextRange} textRange
+ * @param {Boolean} isStart
+ * @return {BoundaryPoint}
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
+ */
+
+function textRangeToPoint(textRange, isStart) {
+  var container = textRange.parentElement();
+  var offset;
+  var tester = document.body.createTextRange();
+  var prevContainer;
+  var childNodes = lists.from(container.childNodes);
+
+  for (offset = 0; offset < childNodes.length; offset++) {
+    if (dom.isText(childNodes[offset])) {
+      continue;
+    }
+
+    tester.moveToElementText(childNodes[offset]);
+
+    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {
+      break;
+    }
+
+    prevContainer = childNodes[offset];
+  }
+
+  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {
+    var textRangeStart = document.body.createTextRange();
+    var curTextNode = null;
+    textRangeStart.moveToElementText(prevContainer || container);
+    textRangeStart.collapse(!prevContainer);
+    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;
+    var pointTester = textRange.duplicate();
+    pointTester.setEndPoint('StartToStart', textRangeStart);
+    var textCount = pointTester.text.replace(/[\r\n]/g, '').length;
+
+    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    } // [workaround] enforce IE to re-reference curTextNode, hack
+
+
+    var dummy = curTextNode.nodeValue; // eslint-disable-line
+
+    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) && textCount === curTextNode.nodeValue.length) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    }
+
+    container = curTextNode;
+    offset = textCount;
+  }
+
+  return {
+    cont: container,
+    offset: offset
+  };
+}
+/**
+ * return TextRange from boundary point (inspired by google closure-library)
+ * @param {BoundaryPoint} point
+ * @return {TextRange}
+ */
+
+
+function pointToTextRange(point) {
+  var textRangeInfo = function textRangeInfo(container, offset) {
+    var node, isCollapseToStart;
+
+    if (dom.isText(container)) {
+      var prevTextNodes = dom.listPrev(container, func.not(dom.isText));
+      var prevContainer = lists.last(prevTextNodes).previousSibling;
+      node = prevContainer || container.parentNode;
+      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);
+      isCollapseToStart = !prevContainer;
+    } else {
+      node = container.childNodes[offset] || container;
+
+      if (dom.isText(node)) {
+        return textRangeInfo(node, 0);
+      }
+
+      offset = 0;
+      isCollapseToStart = false;
+    }
+
+    return {
+      node: node,
+      collapseToStart: isCollapseToStart,
+      offset: offset
+    };
+  };
+
+  var textRange = document.body.createTextRange();
+  var info = textRangeInfo(point.node, point.offset);
+  textRange.moveToElementText(info.node);
+  textRange.collapse(info.collapseToStart);
+  textRange.moveStart('character', info.offset);
+  return textRange;
+}
+/**
+   * Wrapped Range
+   *
+   * @constructor
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   */
+
+
+var WrappedRange = /*#__PURE__*/function () {
+  function WrappedRange(sc, so, ec, eo) {
+    range_classCallCheck(this, WrappedRange);
+
+    this.sc = sc;
+    this.so = so;
+    this.ec = ec;
+    this.eo = eo; // isOnEditable: judge whether range is on editable or not
+
+    this.isOnEditable = this.makeIsOn(dom.isEditable); // isOnList: judge whether range is on list node or not
+
+    this.isOnList = this.makeIsOn(dom.isList); // isOnAnchor: judge whether range is on anchor node or not
+
+    this.isOnAnchor = this.makeIsOn(dom.isAnchor); // isOnCell: judge whether range is on cell node or not
+
+    this.isOnCell = this.makeIsOn(dom.isCell); // isOnData: judge whether range is on data node or not
+
+    this.isOnData = this.makeIsOn(dom.isData);
+  } // nativeRange: get nativeRange from sc, so, ec, eo
+
+
+  range_createClass(WrappedRange, [{
+    key: "nativeRange",
+    value: function nativeRange() {
+      if (env.isW3CRangeSupport) {
+        var w3cRange = document.createRange();
+        w3cRange.setStart(this.sc, this.so);
+        w3cRange.setEnd(this.ec, this.eo);
+        return w3cRange;
+      } else {
+        var textRange = pointToTextRange({
+          node: this.sc,
+          offset: this.so
+        });
+        textRange.setEndPoint('EndToEnd', pointToTextRange({
+          node: this.ec,
+          offset: this.eo
+        }));
+        return textRange;
+      }
+    }
+  }, {
+    key: "getPoints",
+    value: function getPoints() {
+      return {
+        sc: this.sc,
+        so: this.so,
+        ec: this.ec,
+        eo: this.eo
+      };
+    }
+  }, {
+    key: "getStartPoint",
+    value: function getStartPoint() {
+      return {
+        node: this.sc,
+        offset: this.so
+      };
+    }
+  }, {
+    key: "getEndPoint",
+    value: function getEndPoint() {
+      return {
+        node: this.ec,
+        offset: this.eo
+      };
+    }
+    /**
+     * select update visible range
+     */
+
+  }, {
+    key: "select",
+    value: function select() {
+      var nativeRng = this.nativeRange();
+
+      if (env.isW3CRangeSupport) {
+        var selection = document.getSelection();
+
+        if (selection.rangeCount > 0) {
+          selection.removeAllRanges();
+        }
+
+        selection.addRange(nativeRng);
+      } else {
+        nativeRng.select();
+      }
+
+      return this;
+    }
+    /**
+     * Moves the scrollbar to start container(sc) of current range
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "scrollIntoView",
+    value: function scrollIntoView(container) {
+      var height = external_jQuery_default()(container).height();
+
+      if (container.scrollTop + height < this.sc.offsetTop) {
+        container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);
+      }
+
+      return this;
+    }
+    /**
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "normalize",
+    value: function normalize() {
+      /**
+       * @param {BoundaryPoint} point
+       * @param {Boolean} isLeftToRight - true: prefer to choose right node
+       *                                - false: prefer to choose left node
+       * @return {BoundaryPoint}
+       */
+      var getVisiblePoint = function getVisiblePoint(point, isLeftToRight) {
+        if (!point) {
+          return point;
+        } // Just use the given point [XXX:Adhoc]
+        //  - case 01. if the point is on the middle of the node
+        //  - case 02. if the point is on the right edge and prefer to choose left node
+        //  - case 03. if the point is on the left edge and prefer to choose right node
+        //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void
+        //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void
+        //  - case 06. if the point is on the block node and there is no children
+
+
+        if (dom.isVisiblePoint(point)) {
+          if (!dom.isEdgePoint(point) || dom.isRightEdgePoint(point) && !isLeftToRight || dom.isLeftEdgePoint(point) && isLeftToRight || dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling) || dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling) || dom.isBlock(point.node) && dom.isEmpty(point.node)) {
+            return point;
+          }
+        } // point on block's edge
+
+
+        var block = dom.ancestor(point.node, dom.isBlock);
+        var hasRightNode = false;
+
+        if (!hasRightNode) {
+          var prevPoint = dom.prevPoint(point) || {
+            node: null
+          };
+          hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;
+        }
+
+        var hasLeftNode = false;
+
+        if (!hasLeftNode) {
+          var _nextPoint = dom.nextPoint(point) || {
+            node: null
+          };
+
+          hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(_nextPoint.node)) && isLeftToRight;
+        }
+
+        if (hasRightNode || hasLeftNode) {
+          // returns point already on visible point
+          if (dom.isVisiblePoint(point)) {
+            return point;
+          } // reverse direction
+
+
+          isLeftToRight = !isLeftToRight;
+        }
+
+        var nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint) : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);
+        return nextPoint || point;
+      };
+
+      var endPoint = getVisiblePoint(this.getEndPoint(), false);
+      var startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns matched nodes on range
+     *
+     * @param {Function} [pred] - predicate function
+     * @param {Object} [options]
+     * @param {Boolean} [options.includeAncestor]
+     * @param {Boolean} [options.fullyContains]
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "nodes",
+    value: function nodes(pred, options) {
+      pred = pred || func.ok;
+      var includeAncestor = options && options.includeAncestor;
+      var fullyContains = options && options.fullyContains; // TODO compare points and sort
+
+      var startPoint = this.getStartPoint();
+      var endPoint = this.getEndPoint();
+      var nodes = [];
+      var leftEdgeNodes = [];
+      dom.walkPoint(startPoint, endPoint, function (point) {
+        if (dom.isEditable(point.node)) {
+          return;
+        }
+
+        var node;
+
+        if (fullyContains) {
+          if (dom.isLeftEdgePoint(point)) {
+            leftEdgeNodes.push(point.node);
+          }
+
+          if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {
+            node = point.node;
+          }
+        } else if (includeAncestor) {
+          node = dom.ancestor(point.node, pred);
+        } else {
+          node = point.node;
+        }
+
+        if (node && pred(node)) {
+          nodes.push(node);
+        }
+      }, true);
+      return lists.unique(nodes);
+    }
+    /**
+     * returns commonAncestor of range
+     * @return {Element} - commonAncestor
+     */
+
+  }, {
+    key: "commonAncestor",
+    value: function commonAncestor() {
+      return dom.commonAncestor(this.sc, this.ec);
+    }
+    /**
+     * returns expanded range by pred
+     *
+     * @param {Function} pred - predicate function
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "expand",
+    value: function expand(pred) {
+      var startAncestor = dom.ancestor(this.sc, pred);
+      var endAncestor = dom.ancestor(this.ec, pred);
+
+      if (!startAncestor && !endAncestor) {
+        return new WrappedRange(this.sc, this.so, this.ec, this.eo);
+      }
+
+      var boundaryPoints = this.getPoints();
+
+      if (startAncestor) {
+        boundaryPoints.sc = startAncestor;
+        boundaryPoints.so = 0;
+      }
+
+      if (endAncestor) {
+        boundaryPoints.ec = endAncestor;
+        boundaryPoints.eo = dom.nodeLength(endAncestor);
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * @param {Boolean} isCollapseToStart
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "collapse",
+    value: function collapse(isCollapseToStart) {
+      if (isCollapseToStart) {
+        return new WrappedRange(this.sc, this.so, this.sc, this.so);
+      } else {
+        return new WrappedRange(this.ec, this.eo, this.ec, this.eo);
+      }
+    }
+    /**
+     * splitText on range
+     */
+
+  }, {
+    key: "splitText",
+    value: function splitText() {
+      var isSameContainer = this.sc === this.ec;
+      var boundaryPoints = this.getPoints();
+
+      if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {
+        this.ec.splitText(this.eo);
+      }
+
+      if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {
+        boundaryPoints.sc = this.sc.splitText(this.so);
+        boundaryPoints.so = 0;
+
+        if (isSameContainer) {
+          boundaryPoints.ec = boundaryPoints.sc;
+          boundaryPoints.eo = this.eo - this.so;
+        }
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * delete contents on range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "deleteContents",
+    value: function deleteContents() {
+      if (this.isCollapsed()) {
+        return this;
+      }
+
+      var rng = this.splitText();
+      var nodes = rng.nodes(null, {
+        fullyContains: true
+      }); // find new cursor point
+
+      var point = dom.prevPointUntil(rng.getStartPoint(), function (point) {
+        return !lists.contains(nodes, point.node);
+      });
+      var emptyParents = [];
+      external_jQuery_default().each(nodes, function (idx, node) {
+        // find empty parents
+        var parent = node.parentNode;
+
+        if (point.node !== parent && dom.nodeLength(parent) === 1) {
+          emptyParents.push(parent);
+        }
+
+        dom.remove(node, false);
+      }); // remove empty parents
+
+      external_jQuery_default().each(emptyParents, function (idx, node) {
+        dom.remove(node, false);
+      });
+      return new WrappedRange(point.node, point.offset, point.node, point.offset).normalize();
+    }
+    /**
+     * makeIsOn: return isOn(pred) function
+     */
+
+  }, {
+    key: "makeIsOn",
+    value: function makeIsOn(pred) {
+      return function () {
+        var ancestor = dom.ancestor(this.sc, pred);
+        return !!ancestor && ancestor === dom.ancestor(this.ec, pred);
+      };
+    }
+    /**
+     * @param {Function} pred
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isLeftEdgeOf",
+    value: function isLeftEdgeOf(pred) {
+      if (!dom.isLeftEdgePoint(this.getStartPoint())) {
+        return false;
+      }
+
+      var node = dom.ancestor(this.sc, pred);
+      return node && dom.isLeftEdgeOf(this.sc, node);
+    }
+    /**
+     * returns whether range was collapsed or not
+     */
+
+  }, {
+    key: "isCollapsed",
+    value: function isCollapsed() {
+      return this.sc === this.ec && this.so === this.eo;
+    }
+    /**
+     * wrap inline nodes which children of body with paragraph
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "wrapBodyInlineWithPara",
+    value: function wrapBodyInlineWithPara() {
+      if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {
+        this.sc.innerHTML = dom.emptyPara;
+        return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);
+      }
+      /**
+       * [workaround] firefox often create range on not visible point. so normalize here.
+       *  - firefox: |<p>text</p>|
+       *  - chrome: <p>|text|</p>
+       */
+
+
+      var rng = this.normalize();
+
+      if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {
+        return rng;
+      } // find inline top ancestor
+
+
+      var topAncestor;
+
+      if (dom.isInline(rng.sc)) {
+        var ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));
+        topAncestor = lists.last(ancestors);
+
+        if (!dom.isInline(topAncestor)) {
+          topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];
+        }
+      } else {
+        topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];
+      }
+
+      if (topAncestor) {
+        // siblings not in paragraph
+        var inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();
+        inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline)); // wrap with paragraph
+
+        if (inlineSiblings.length) {
+          var para = dom.wrap(lists.head(inlineSiblings), 'p');
+          dom.appendChildNodes(para, lists.tail(inlineSiblings));
+        }
+      }
+
+      return this.normalize();
+    }
+    /**
+     * insert node at current cursor
+     *
+     * @param {Node} node
+     * @return {Node}
+     */
+
+  }, {
+    key: "insertNode",
+    value: function insertNode(node) {
+      var rng = this;
+
+      if (dom.isText(node) || dom.isInline(node)) {
+        rng = this.wrapBodyInlineWithPara().deleteContents();
+      }
+
+      var info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));
+
+      if (info.rightNode) {
+        info.rightNode.parentNode.insertBefore(node, info.rightNode);
+
+        if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {
+          info.rightNode.parentNode.removeChild(info.rightNode);
+        }
+      } else {
+        info.container.appendChild(node);
+      }
+
+      return node;
+    }
+    /**
+     * insert html at current cursor
+     */
+
+  }, {
+    key: "pasteHTML",
+    value: function pasteHTML(markup) {
+      markup = external_jQuery_default().trim(markup);
+      var contentsContainer = external_jQuery_default()('<div></div>').html(markup)[0];
+      var childNodes = lists.from(contentsContainer.childNodes); // const rng = this.wrapBodyInlineWithPara().deleteContents();
+
+      var rng = this;
+      var reversed = false;
+
+      if (rng.so >= 0) {
+        childNodes = childNodes.reverse();
+        reversed = true;
+      }
+
+      childNodes = childNodes.map(function (childNode) {
+        return rng.insertNode(childNode);
+      });
+
+      if (reversed) {
+        childNodes = childNodes.reverse();
+      }
+
+      return childNodes;
+    }
+    /**
+     * returns text in range
+     *
+     * @return {String}
+     */
+
+  }, {
+    key: "toString",
+    value: function toString() {
+      var nativeRng = this.nativeRange();
+      return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
+    }
+    /**
+     * returns range for word before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordRange",
+    value: function getWordRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      if (!dom.isCharPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        return !dom.isCharPoint(point);
+      });
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, function (point) {
+          return !dom.isCharPoint(point);
+        });
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordsRange",
+    value: function getWordsRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      var isNotTextPoint = function isNotTextPoint(point) {
+        return !dom.isCharPoint(point) && !dom.isSpacePoint(point);
+      };
+
+      if (isNotTextPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor that match with a Regex
+     *
+     * example:
+     *  range: 'hi @Peter Pan'
+     *  regex: '/@[a-z ]+/i'
+     *  return range: '@Peter Pan'
+     *
+     * @param {RegExp} [regex]
+     * @return {WrappedRange|null}
+     */
+
+  }, {
+    key: "getWordsMatchRange",
+    value: function getWordsMatchRange(regex) {
+      var endPoint = this.getEndPoint();
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {
+          return true;
+        }
+
+        var rng = new WrappedRange(point.node, point.offset, endPoint.node, endPoint.offset);
+        var result = regex.exec(rng.toString());
+        return result && result.index === 0;
+      });
+      var rng = new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+      var text = rng.toString();
+      var result = regex.exec(text);
+
+      if (result && result[0].length === text.length) {
+        return rng;
+      } else {
+        return null;
+      }
+    }
+    /**
+     * create offsetPath bookmark
+     *
+     * @param {Node} editable
+     */
+
+  }, {
+    key: "bookmark",
+    value: function bookmark(editable) {
+      return {
+        s: {
+          path: dom.makeOffsetPath(editable, this.sc),
+          offset: this.so
+        },
+        e: {
+          path: dom.makeOffsetPath(editable, this.ec),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * create offsetPath bookmark base on paragraph
+     *
+     * @param {Node[]} paras
+     */
+
+  }, {
+    key: "paraBookmark",
+    value: function paraBookmark(paras) {
+      return {
+        s: {
+          path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),
+          offset: this.so
+        },
+        e: {
+          path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * getClientRects
+     * @return {Rect[]}
+     */
+
+  }, {
+    key: "getClientRects",
+    value: function getClientRects() {
+      var nativeRng = this.nativeRange();
+      return nativeRng.getClientRects();
+    }
+  }]);
+
+  return WrappedRange;
+}();
+/**
+ * Data structure
+ *  * BoundaryPoint: a point of dom tree
+ *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range
+ *
+ * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
+ */
+
+
+/* harmony default export */ const range = ({
+  /**
+   * create Range Object From arguments or Browser Selection
+   *
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   * @return {WrappedRange}
+   */
+  create: function create(sc, so, ec, eo) {
+    if (arguments.length === 4) {
+      return new WrappedRange(sc, so, ec, eo);
+    } else if (arguments.length === 2) {
+      // collapsed
+      ec = sc;
+      eo = so;
+      return new WrappedRange(sc, so, ec, eo);
+    } else {
+      var wrappedRange = this.createFromSelection();
+
+      if (!wrappedRange && arguments.length === 1) {
+        var bodyElement = arguments[0];
+
+        if (dom.isEditable(bodyElement)) {
+          bodyElement = bodyElement.lastChild;
+        }
+
+        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);
+      }
+
+      return wrappedRange;
+    }
+  },
+  createFromBodyElement: function createFromBodyElement(bodyElement) {
+    var isCollapseToStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+    var wrappedRange = this.createFromNode(bodyElement);
+    return wrappedRange.collapse(isCollapseToStart);
+  },
+  createFromSelection: function createFromSelection() {
+    var sc, so, ec, eo;
+
+    if (env.isW3CRangeSupport) {
+      var selection = document.getSelection();
+
+      if (!selection || selection.rangeCount === 0) {
+        return null;
+      } else if (dom.isBody(selection.anchorNode)) {
+        // Firefox: returns entire body as range on initialization.
+        // We won't never need it.
+        return null;
+      }
+
+      var nativeRng = selection.getRangeAt(0);
+      sc = nativeRng.startContainer;
+      so = nativeRng.startOffset;
+      ec = nativeRng.endContainer;
+      eo = nativeRng.endOffset;
+    } else {
+      // IE8: TextRange
+      var textRange = document.selection.createRange();
+      var textRangeEnd = textRange.duplicate();
+      textRangeEnd.collapse(false);
+      var textRangeStart = textRange;
+      textRangeStart.collapse(true);
+      var startPoint = textRangeToPoint(textRangeStart, true);
+      var endPoint = textRangeToPoint(textRangeEnd, false); // same visible point case: range was collapsed.
+
+      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) && dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) && endPoint.node.nextSibling === startPoint.node) {
+        startPoint = endPoint;
+      }
+
+      sc = startPoint.cont;
+      so = startPoint.offset;
+      ec = endPoint.cont;
+      eo = endPoint.offset;
+    }
+
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from node
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNode: function createFromNode(node) {
+    var sc = node;
+    var so = 0;
+    var ec = node;
+    var eo = dom.nodeLength(ec); // browsers can't target a picture or void node
+
+    if (dom.isVoid(sc)) {
+      so = dom.listPrev(sc).length - 1;
+      sc = sc.parentNode;
+    }
+
+    if (dom.isBR(ec)) {
+      eo = dom.listPrev(ec).length - 1;
+      ec = ec.parentNode;
+    } else if (dom.isVoid(ec)) {
+      eo = dom.listPrev(ec).length;
+      ec = ec.parentNode;
+    }
+
+    return this.create(sc, so, ec, eo);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeBefore: function createFromNodeBefore(node) {
+    return this.createFromNode(node).collapse(true);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeAfter: function createFromNodeAfter(node) {
+    return this.createFromNode(node).collapse();
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from bookmark
+   *
+   * @param {Node} editable
+   * @param {Object} bookmark
+   * @return {WrappedRange}
+   */
+  createFromBookmark: function createFromBookmark(editable, bookmark) {
+    var sc = dom.fromOffsetPath(editable, bookmark.s.path);
+    var so = bookmark.s.offset;
+    var ec = dom.fromOffsetPath(editable, bookmark.e.path);
+    var eo = bookmark.e.offset;
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from paraBookmark
+   *
+   * @param {Object} bookmark
+   * @param {Node[]} paras
+   * @return {WrappedRange}
+   */
+  createFromParaBookmark: function createFromParaBookmark(bookmark, paras) {
+    var so = bookmark.s.offset;
+    var eo = bookmark.e.offset;
+    var sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);
+    var ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);
+    return new WrappedRange(sc, so, ec, eo);
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/key.js
+
+
+var KEY_MAP = {
+  'BACKSPACE': 8,
+  'TAB': 9,
+  'ENTER': 13,
+  'ESCAPE': 27,
+  'SPACE': 32,
+  'DELETE': 46,
+  // Arrow
+  'LEFT': 37,
+  'UP': 38,
+  'RIGHT': 39,
+  'DOWN': 40,
+  // Number: 0-9
+  'NUM0': 48,
+  'NUM1': 49,
+  'NUM2': 50,
+  'NUM3': 51,
+  'NUM4': 52,
+  'NUM5': 53,
+  'NUM6': 54,
+  'NUM7': 55,
+  'NUM8': 56,
+  // Alphabet: a-z
+  'B': 66,
+  'E': 69,
+  'I': 73,
+  'J': 74,
+  'K': 75,
+  'L': 76,
+  'R': 82,
+  'S': 83,
+  'U': 85,
+  'V': 86,
+  'Y': 89,
+  'Z': 90,
+  'SLASH': 191,
+  'LEFTBRACKET': 219,
+  'BACKSLASH': 220,
+  'RIGHTBRACKET': 221,
+  // Navigation
+  'HOME': 36,
+  'END': 35,
+  'PAGEUP': 33,
+  'PAGEDOWN': 34
+};
+/**
+ * @class core.key
+ *
+ * Object for keycodes.
+ *
+ * @singleton
+ * @alternateClassName key
+ */
+
+/* harmony default export */ const key = ({
+  /**
+   * @method isEdit
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isEdit: function isEdit(keyCode) {
+    return lists.contains([KEY_MAP.BACKSPACE, KEY_MAP.TAB, KEY_MAP.ENTER, KEY_MAP.SPACE, KEY_MAP.DELETE], keyCode);
+  },
+
+  /**
+   * @method isMove
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isMove: function isMove(keyCode) {
+    return lists.contains([KEY_MAP.LEFT, KEY_MAP.UP, KEY_MAP.RIGHT, KEY_MAP.DOWN], keyCode);
+  },
+
+  /**
+   * @method isNavigation
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isNavigation: function isNavigation(keyCode) {
+    return lists.contains([KEY_MAP.HOME, KEY_MAP.END, KEY_MAP.PAGEUP, KEY_MAP.PAGEDOWN], keyCode);
+  },
+
+  /**
+   * @property {Object} nameFromCode
+   * @property {String} nameFromCode.8 "BACKSPACE"
+   */
+  nameFromCode: func.invertObject(KEY_MAP),
+  code: KEY_MAP
+});
+;// CONCATENATED MODULE: ./src/js/core/async.js
+
+/**
+ * @method readFileAsDataURL
+ *
+ * read contents of file as representing URL
+ *
+ * @param {File} file
+ * @return {Promise} - then: dataUrl
+ */
+
+function readFileAsDataURL(file) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    external_jQuery_default().extend(new FileReader(), {
+      onload: function onload(e) {
+        var dataURL = e.target.result;
+        deferred.resolve(dataURL);
+      },
+      onerror: function onerror(err) {
+        deferred.reject(err);
+      }
+    }).readAsDataURL(file);
+  }).promise();
+}
+/**
+ * @method createImage
+ *
+ * create `<image>` from url string
+ *
+ * @param {String} url
+ * @return {Promise} - then: $image
+ */
+
+function createImage(url) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    var $img = external_jQuery_default()('<img>');
+    $img.one('load', function () {
+      $img.off('error abort');
+      deferred.resolve($img);
+    }).one('error abort', function () {
+      $img.off('load').detach();
+      deferred.reject($img);
+    }).css({
+      display: 'none'
+    }).appendTo(document.body).attr('src', url);
+  }).promise();
+}
+;// CONCATENATED MODULE: ./src/js/editing/History.js
+function History_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function History_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function History_createClass(Constructor, protoProps, staticProps) { if (protoProps) History_defineProperties(Constructor.prototype, protoProps); if (staticProps) History_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var History = /*#__PURE__*/function () {
+  function History(context) {
+    History_classCallCheck(this, History);
+
+    this.stack = [];
+    this.stackOffset = -1;
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+    this.editable = this.$editable[0];
+  }
+
+  History_createClass(History, [{
+    key: "makeSnapshot",
+    value: function makeSnapshot() {
+      var rng = range.create(this.editable);
+      var emptyBookmark = {
+        s: {
+          path: [],
+          offset: 0
+        },
+        e: {
+          path: [],
+          offset: 0
+        }
+      };
+      return {
+        contents: this.$editable.html(),
+        bookmark: rng && rng.isOnEditable() ? rng.bookmark(this.editable) : emptyBookmark
+      };
+    }
+  }, {
+    key: "applySnapshot",
+    value: function applySnapshot(snapshot) {
+      if (snapshot.contents !== null) {
+        this.$editable.html(snapshot.contents);
+      }
+
+      if (snapshot.bookmark !== null) {
+        range.createFromBookmark(this.editable, snapshot.bookmark).select();
+      }
+    }
+    /**
+    * @method rewind
+    * Rewinds the history stack back to the first snapshot taken.
+    * Leaves the stack intact, so that "Redo" can still be used.
+    */
+
+  }, {
+    key: "rewind",
+    value: function rewind() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      } // Return to the first available snapshot.
+
+
+      this.stackOffset = 0; // Apply that snapshot.
+
+      this.applySnapshot(this.stack[this.stackOffset]);
+    }
+    /**
+    *  @method commit
+    *  Resets history stack, but keeps current editor's content.
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+    * @method reset
+    * Resets the history stack completely; reverting to an empty editor.
+    */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Clear the editable area.
+
+      this.$editable.html(''); // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      }
+
+      if (this.stackOffset > 0) {
+        this.stackOffset--;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      if (this.stack.length - 1 > this.stackOffset) {
+        this.stackOffset++;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * recorded undo
+     */
+
+  }, {
+    key: "recordUndo",
+    value: function recordUndo() {
+      this.stackOffset++; // Wash out stack after stackOffset
+
+      if (this.stack.length > this.stackOffset) {
+        this.stack = this.stack.slice(0, this.stackOffset);
+      } // Create new snapshot and push it to the end
+
+
+      this.stack.push(this.makeSnapshot()); // If the stack size reachs to the limit, then slice it
+
+      if (this.stack.length > this.context.options.historyLimit) {
+        this.stack.shift();
+        this.stackOffset -= 1;
+      }
+    }
+  }]);
+
+  return History;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Style.js
+function Style_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Style_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Style_createClass(Constructor, protoProps, staticProps) { if (protoProps) Style_defineProperties(Constructor.prototype, protoProps); if (staticProps) Style_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Style = /*#__PURE__*/function () {
+  function Style() {
+    Style_classCallCheck(this, Style);
+  }
+
+  Style_createClass(Style, [{
+    key: "jQueryCSS",
+    value:
+    /**
+     * @method jQueryCSS
+     *
+     * [workaround] for old jQuery
+     * passing an array of style properties to .css()
+     * will result in an object of property-value pairs.
+     * (compability with version < 1.9)
+     *
+     * @private
+     * @param  {jQuery} $obj
+     * @param  {Array} propertyNames - An array of one or more CSS properties.
+     * @return {Object}
+     */
+    function jQueryCSS($obj, propertyNames) {
+      var result = {};
+      external_jQuery_default().each(propertyNames, function (idx, propertyName) {
+        result[propertyName] = $obj.css(propertyName);
+      });
+      return result;
+    }
+    /**
+     * returns style object from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "fromNode",
+    value: function fromNode($node) {
+      var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
+      var styleInfo = this.jQueryCSS($node, properties) || {};
+      var fontSize = $node[0].style.fontSize || styleInfo['font-size'];
+      styleInfo['font-size'] = parseInt(fontSize, 10);
+      styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);
+      return styleInfo;
+    }
+    /**
+     * paragraph level style
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} styleInfo
+     */
+
+  }, {
+    key: "stylePara",
+    value: function stylePara(rng, styleInfo) {
+      external_jQuery_default().each(rng.nodes(dom.isPara, {
+        includeAncestor: true
+      }), function (idx, para) {
+        external_jQuery_default()(para).css(styleInfo);
+      });
+    }
+    /**
+     * insert and returns styleNodes on range.
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} [options] - options for styleNodes
+     * @param {String} [options.nodeName] - default: `SPAN`
+     * @param {Boolean} [options.expandClosestSibling] - default: `false`
+     * @param {Boolean} [options.onlyPartialContains] - default: `false`
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "styleNodes",
+    value: function styleNodes(rng, options) {
+      rng = rng.splitText();
+      var nodeName = options && options.nodeName || 'SPAN';
+      var expandClosestSibling = !!(options && options.expandClosestSibling);
+      var onlyPartialContains = !!(options && options.onlyPartialContains);
+
+      if (rng.isCollapsed()) {
+        return [rng.insertNode(dom.create(nodeName))];
+      }
+
+      var pred = dom.makePredByNodeName(nodeName);
+      var nodes = rng.nodes(dom.isText, {
+        fullyContains: true
+      }).map(function (text) {
+        return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
+      });
+
+      if (expandClosestSibling) {
+        if (onlyPartialContains) {
+          var nodesInRange = rng.nodes(); // compose with partial contains predication
+
+          pred = func.and(pred, function (node) {
+            return lists.contains(nodesInRange, node);
+          });
+        }
+
+        return nodes.map(function (node) {
+          var siblings = dom.withClosestSiblings(node, pred);
+          var head = lists.head(siblings);
+          var tails = lists.tail(siblings);
+          external_jQuery_default().each(tails, function (idx, elem) {
+            dom.appendChildNodes(head, elem.childNodes);
+            dom.remove(elem);
+          });
+          return lists.head(siblings);
+        });
+      } else {
+        return nodes;
+      }
+    }
+    /**
+     * get current style on cursor
+     *
+     * @param {WrappedRange} rng
+     * @return {Object} - object contains style properties.
+     */
+
+  }, {
+    key: "current",
+    value: function current(rng) {
+      var $cont = external_jQuery_default()(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);
+      var styleInfo = this.fromNode($cont); // document.queryCommandState for toggle state
+      // [workaround] prevent Firefox nsresult: "0x80004005 (NS_ERROR_FAILURE)"
+
+      try {
+        styleInfo = external_jQuery_default().extend(styleInfo, {
+          'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',
+          'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',
+          'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',
+          'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',
+          'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',
+          'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',
+          'font-family': document.queryCommandValue('fontname') || styleInfo['font-family']
+        });
+      } catch (e) {// eslint-disable-next-line
+      } // list-style-type to list-style(unordered, ordered)
+
+
+      if (!rng.isOnList()) {
+        styleInfo['list-style'] = 'none';
+      } else {
+        var orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];
+        var isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;
+        styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';
+      }
+
+      var para = dom.ancestor(rng.sc, dom.isPara);
+
+      if (para && para.style['line-height']) {
+        styleInfo['line-height'] = para.style.lineHeight;
+      } else {
+        var lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);
+        styleInfo['line-height'] = lineHeight.toFixed(1);
+      }
+
+      styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
+      styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
+      styleInfo.range = rng;
+      return styleInfo;
+    }
+  }]);
+
+  return Style;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Bullet.js
+function Bullet_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Bullet_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Bullet_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bullet_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bullet_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var Bullet = /*#__PURE__*/function () {
+  function Bullet() {
+    Bullet_classCallCheck(this, Bullet);
+  }
+
+  Bullet_createClass(Bullet, [{
+    key: "insertOrderedList",
+    value:
+    /**
+     * toggle ordered list
+     */
+    function insertOrderedList(editable) {
+      this.toggleList('OL', editable);
+    }
+    /**
+     * toggle unordered list
+     */
+
+  }, {
+    key: "insertUnorderedList",
+    value: function insertUnorderedList(editable) {
+      this.toggleList('UL', editable);
+    }
+    /**
+     * indent
+     */
+
+  }, {
+    key: "indent",
+    value: function indent(editable) {
+      var _this = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          var previousList = _this.findList(head.previousSibling);
+
+          if (previousList) {
+            paras.map(function (para) {
+              return previousList.appendChild(para);
+            });
+          } else {
+            _this.wrapList(paras, head.parentNode.nodeName);
+
+            paras.map(function (para) {
+              return para.parentNode;
+            }).map(function (para) {
+              return _this.appendToPrevious(para);
+            });
+          }
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              return (parseInt(val, 10) || 0) + 25;
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * outdent
+     */
+
+  }, {
+    key: "outdent",
+    value: function outdent(editable) {
+      var _this2 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          _this2.releaseList([paras]);
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              val = parseInt(val, 10) || 0;
+              return val > 25 ? val - 25 : '';
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * toggle list
+     *
+     * @param {String} listName - OL or UL
+     */
+
+  }, {
+    key: "toggleList",
+    value: function toggleList(listName, editable) {
+      var _this3 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var bookmark = rng.paraBookmark(paras);
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode')); // paragraph to list
+
+      if (lists.find(paras, dom.isPurePara)) {
+        var wrappedParas = [];
+        external_jQuery_default().each(clustereds, function (idx, paras) {
+          wrappedParas = wrappedParas.concat(_this3.wrapList(paras, listName));
+        });
+        paras = wrappedParas; // list to paragraph or change list style
+      } else {
+        var diffLists = rng.nodes(dom.isList, {
+          includeAncestor: true
+        }).filter(function (listNode) {
+          return !external_jQuery_default().nodeName(listNode, listName);
+        });
+
+        if (diffLists.length) {
+          external_jQuery_default().each(diffLists, function (idx, listNode) {
+            dom.replace(listNode, listName);
+          });
+        } else {
+          paras = this.releaseList(clustereds, true);
+        }
+      }
+
+      range.createFromParaBookmark(bookmark, paras).select();
+    }
+    /**
+     * @param {Node[]} paras
+     * @param {String} listName
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "wrapList",
+    value: function wrapList(paras, listName) {
+      var head = lists.head(paras);
+      var last = lists.last(paras);
+      var prevList = dom.isList(head.previousSibling) && head.previousSibling;
+      var nextList = dom.isList(last.nextSibling) && last.nextSibling;
+      var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last); // P to LI
+
+      paras = paras.map(function (para) {
+        return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
+      }); // append to list(<ul>, <ol>)
+
+      dom.appendChildNodes(listNode, paras);
+
+      if (nextList) {
+        dom.appendChildNodes(listNode, lists.from(nextList.childNodes));
+        dom.remove(nextList);
+      }
+
+      return paras;
+    }
+    /**
+     * @method releaseList
+     *
+     * @param {Array[]} clustereds
+     * @param {Boolean} isEscapseToBody
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "releaseList",
+    value: function releaseList(clustereds, isEscapseToBody) {
+      var _this4 = this;
+
+      var releasedParas = [];
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+        var last = lists.last(paras);
+        var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;
+        var parentItem = headList.parentNode;
+
+        if (headList.parentNode.nodeName === 'LI') {
+          paras.map(function (para) {
+            var newList = _this4.findNextSiblings(para);
+
+            if (parentItem.nextSibling) {
+              parentItem.parentNode.insertBefore(para, parentItem.nextSibling);
+            } else {
+              parentItem.parentNode.appendChild(para);
+            }
+
+            if (newList.length) {
+              _this4.wrapList(newList, headList.nodeName);
+
+              para.appendChild(newList[0].parentNode);
+            }
+          });
+
+          if (headList.children.length === 0) {
+            parentItem.removeChild(headList);
+          }
+
+          if (parentItem.childNodes.length === 0) {
+            parentItem.parentNode.removeChild(parentItem);
+          }
+        } else {
+          var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {
+            node: last.parentNode,
+            offset: dom.position(last) + 1
+          }, {
+            isSkipPaddingBlankHTML: true
+          }) : null;
+          var middleList = dom.splitTree(headList, {
+            node: head.parentNode,
+            offset: dom.position(head)
+          }, {
+            isSkipPaddingBlankHTML: true
+          });
+          paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) : lists.from(middleList.childNodes).filter(dom.isLi); // LI to P
+
+          if (isEscapseToBody || !dom.isList(headList.parentNode)) {
+            paras = paras.map(function (para) {
+              return dom.replace(para, 'P');
+            });
+          }
+
+          external_jQuery_default().each(lists.from(paras).reverse(), function (idx, para) {
+            dom.insertAfter(para, headList);
+          }); // remove empty lists
+
+          var rootLists = lists.compact([headList, middleList, lastList]);
+          external_jQuery_default().each(rootLists, function (idx, rootList) {
+            var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));
+            external_jQuery_default().each(listNodes.reverse(), function (idx, listNode) {
+              if (!dom.nodeLength(listNode)) {
+                dom.remove(listNode, true);
+              }
+            });
+          });
+        }
+
+        releasedParas = releasedParas.concat(paras);
+      });
+      return releasedParas;
+    }
+    /**
+     * @method appendToPrevious
+     *
+     * Appends list to previous list item, if
+     * none exist it wraps the list in a new list item.
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "appendToPrevious",
+    value: function appendToPrevious(node) {
+      return node.previousSibling ? dom.appendChildNodes(node.previousSibling, [node]) : this.wrapList([node], 'LI');
+    }
+    /**
+     * @method findList
+     *
+     * Finds an existing list in list item
+     *
+     * @param {HTMLNode} ListItem
+     * @return {Array[]}
+     */
+
+  }, {
+    key: "findList",
+    value: function findList(node) {
+      return node ? lists.find(node.children, function (child) {
+        return ['OL', 'UL'].indexOf(child.nodeName) > -1;
+      }) : null;
+    }
+    /**
+     * @method findNextSiblings
+     *
+     * Finds all list item siblings that follow it
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "findNextSiblings",
+    value: function findNextSiblings(node) {
+      var siblings = [];
+
+      while (node.nextSibling) {
+        siblings.push(node.nextSibling);
+        node = node.nextSibling;
+      }
+
+      return siblings;
+    }
+  }]);
+
+  return Bullet;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Typing.js
+function Typing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Typing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Typing_createClass(Constructor, protoProps, staticProps) { if (protoProps) Typing_defineProperties(Constructor.prototype, protoProps); if (staticProps) Typing_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class editing.Typing
+ *
+ * Typing
+ *
+ */
+
+var Typing = /*#__PURE__*/function () {
+  function Typing(context) {
+    Typing_classCallCheck(this, Typing);
+
+    // a Bullet instance to toggle lists off
+    this.bullet = new Bullet();
+    this.options = context.options;
+  }
+  /**
+   * insert tab
+   *
+   * @param {WrappedRange} rng
+   * @param {Number} tabsize
+   */
+
+
+  Typing_createClass(Typing, [{
+    key: "insertTab",
+    value: function insertTab(rng, tabsize) {
+      var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
+      rng = rng.deleteContents();
+      rng.insertNode(tab, true);
+      rng = range.create(tab, tabsize);
+      rng.select();
+    }
+    /**
+     * insert paragraph
+     *
+     * @param {jQuery} $editable
+     * @param {WrappedRange} rng Can be used in unit tests to "mock" the range
+     *
+     * blockquoteBreakingLevel
+     *   0 - No break, the new paragraph remains inside the quote
+     *   1 - Break the first blockquote in the ancestors list
+     *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)
+     */
+
+  }, {
+    key: "insertParagraph",
+    value: function insertParagraph(editable, rng) {
+      rng = rng || range.create(editable); // deleteContents on range.
+
+      rng = rng.deleteContents(); // Wrap range if it needs to be wrapped by paragraph
+
+      rng = rng.wrapBodyInlineWithPara(); // finding paragraph
+
+      var splitRoot = dom.ancestor(rng.sc, dom.isPara);
+      var nextPara; // on paragraph: split paragraph
+
+      if (splitRoot) {
+        // if it is an empty line with li
+        if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {
+          // toggle UL/OL and escape
+          this.bullet.toggleList(splitRoot.parentNode.nodeName);
+          return;
+        } else {
+          var blockquote = null;
+
+          if (this.options.blockquoteBreakingLevel === 1) {
+            blockquote = dom.ancestor(splitRoot, dom.isBlockquote);
+          } else if (this.options.blockquoteBreakingLevel === 2) {
+            blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);
+          }
+
+          if (blockquote) {
+            // We're inside a blockquote and options ask us to break it
+            nextPara = external_jQuery_default()(dom.emptyPara)[0]; // If the split is right before a <br>, remove it so that there's no "empty line"
+            // after the split in the new blockquote created
+
+            if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {
+              external_jQuery_default()(rng.sc.nextSibling).remove();
+            }
+
+            var split = dom.splitTree(blockquote, rng.getStartPoint(), {
+              isDiscardEmptySplits: true
+            });
+
+            if (split) {
+              split.parentNode.insertBefore(nextPara, split);
+            } else {
+              dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote
+            }
+          } else {
+            nextPara = dom.splitTree(splitRoot, rng.getStartPoint()); // not a blockquote, just insert the paragraph
+
+            var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
+            emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));
+            external_jQuery_default().each(emptyAnchors, function (idx, anchor) {
+              dom.remove(anchor);
+            }); // replace empty heading, pre or custom-made styleTag with P tag
+
+            if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {
+              nextPara = dom.replace(nextPara, 'p');
+            }
+          }
+        } // no paragraph: insert empty paragraph
+
+      } else {
+        var next = rng.sc.childNodes[rng.so];
+        nextPara = external_jQuery_default()(dom.emptyPara)[0];
+
+        if (next) {
+          rng.sc.insertBefore(nextPara, next);
+        } else {
+          rng.sc.appendChild(nextPara);
+        }
+      }
+
+      range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
+    }
+  }]);
+
+  return Typing;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Table.js
+function Table_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Table_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Table_createClass(Constructor, protoProps, staticProps) { if (protoProps) Table_defineProperties(Constructor.prototype, protoProps); if (staticProps) Table_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class Create a virtual table to create what actions to do in change.
+ * @param {object} startPoint Cell selected to apply change.
+ * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where
+ * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction
+ * @param {object} domTable Dom element of table to make changes.
+ */
+
+var TableResultAction = function TableResultAction(startPoint, where, action, domTable) {
+  var _startPoint = {
+    'colPos': 0,
+    'rowPos': 0
+  };
+  var _virtualTable = [];
+  var _actionCellList = []; /// ///////////////////////////////////////////
+  // Private functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Set the startPoint of action.
+   */
+
+  function setStartPoint() {
+    if (!startPoint || !startPoint.tagName || startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th') {
+      // Impossible to identify start Cell point
+      return;
+    }
+
+    _startPoint.colPos = startPoint.cellIndex;
+
+    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {
+      // Impossible to identify start Row point
+      return;
+    }
+
+    _startPoint.rowPos = startPoint.parentElement.rowIndex;
+  }
+  /**
+   * Define virtual table position info object.
+   *
+   * @param {int} rowIndex Index position in line of virtual table.
+   * @param {int} cellIndex Index position in column of virtual table.
+   * @param {object} baseRow Row affected by this position.
+   * @param {object} baseCell Cell affected by this position.
+   * @param {bool} isSpan Inform if it is an span cell/row.
+   */
+
+
+  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {
+    var objPosition = {
+      'baseRow': baseRow,
+      'baseCell': baseCell,
+      'isRowSpan': isRowSpan,
+      'isColSpan': isColSpan,
+      'isVirtual': isVirtualCell
+    };
+
+    if (!_virtualTable[rowIndex]) {
+      _virtualTable[rowIndex] = [];
+    }
+
+    _virtualTable[rowIndex][cellIndex] = objPosition;
+  }
+  /**
+   * Create action cell object.
+   *
+   * @param {object} virtualTableCellObj Object of specific position on virtual table.
+   * @param {enum} resultAction Action to be applied in that item.
+   */
+
+
+  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {
+    return {
+      'baseCell': virtualTableCellObj.baseCell,
+      'action': resultAction,
+      'virtualTable': {
+        'rowIndex': virtualRowPosition,
+        'cellIndex': virtualColPosition
+      }
+    };
+  }
+  /**
+   * Recover free index of row to append Cell.
+   *
+   * @param {int} rowIndex Index of row to find free space.
+   * @param {int} cellIndex Index of cell to find free space in table.
+   */
+
+
+  function recoverCellIndex(rowIndex, cellIndex) {
+    if (!_virtualTable[rowIndex]) {
+      return cellIndex;
+    }
+
+    if (!_virtualTable[rowIndex][cellIndex]) {
+      return cellIndex;
+    }
+
+    var newCellIndex = cellIndex;
+
+    while (_virtualTable[rowIndex][newCellIndex]) {
+      newCellIndex++;
+
+      if (!_virtualTable[rowIndex][newCellIndex]) {
+        return newCellIndex;
+      }
+    }
+  }
+  /**
+   * Recover info about row and cell and add information to virtual table.
+   *
+   * @param {object} row Row to recover information.
+   * @param {object} cell Cell to recover information.
+   */
+
+
+  function addCellInfoToVirtual(row, cell) {
+    var cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);
+    var cellHasColspan = cell.colSpan > 1;
+    var cellHasRowspan = cell.rowSpan > 1;
+    var isThisSelectedCell = row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos;
+    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false); // Add span rows to virtual Table.
+
+    var rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;
+
+    if (rowspanNumber > 1) {
+      for (var rp = 1; rp < rowspanNumber; rp++) {
+        var rowspanIndex = row.rowIndex + rp;
+        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);
+      }
+    } // Add span cols to virtual table.
+
+
+    var colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;
+
+    if (colspanNumber > 1) {
+      for (var cp = 1; cp < colspanNumber; cp++) {
+        var cellspanIndex = recoverCellIndex(row.rowIndex, cellIndex + cp);
+        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);
+      }
+    }
+  }
+  /**
+   * Process validation and adjust of start point if needed
+   *
+   * @param {int} rowIndex
+   * @param {int} cellIndex
+   * @param {object} cell
+   * @param {bool} isSelectedCell
+   */
+
+
+  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {
+    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {
+      _startPoint.colPos++;
+    }
+  }
+  /**
+   * Create virtual table of cells with all cells, including span cells.
+   */
+
+
+  function createVirtualTable() {
+    var rows = domTable.rows;
+
+    for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
+      var cells = rows[rowIndex].cells;
+
+      for (var cellIndex = 0; cellIndex < cells.length; cellIndex++) {
+        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);
+      }
+    }
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getDeleteResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (!cell.isVirtual && cell.isRowSpan) {
+          return TableResultAction.resultAction.AddCell;
+        } else if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.RemoveCell;
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getAddResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isRowSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isColSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.AddCell;
+  }
+
+  function init() {
+    setStartPoint();
+    createVirtualTable();
+  } /// ///////////////////////////////////////////
+  // Public functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Recover array os what to do in table.
+   */
+
+
+  this.getActionList = function () {
+    var fixedRow = where === TableResultAction.where.Row ? _startPoint.rowPos : -1;
+    var fixedCol = where === TableResultAction.where.Column ? _startPoint.colPos : -1;
+    var actualPosition = 0;
+    var canContinue = true;
+
+    while (canContinue) {
+      var rowPosition = fixedRow >= 0 ? fixedRow : actualPosition;
+      var colPosition = fixedCol >= 0 ? fixedCol : actualPosition;
+      var row = _virtualTable[rowPosition];
+
+      if (!row) {
+        canContinue = false;
+        return _actionCellList;
+      }
+
+      var cell = row[colPosition];
+
+      if (!cell) {
+        canContinue = false;
+        return _actionCellList;
+      } // Define action to be applied in this cell
+
+
+      var resultAction = TableResultAction.resultAction.Ignore;
+
+      switch (action) {
+        case TableResultAction.requestAction.Add:
+          resultAction = getAddResultActionToCell(cell);
+          break;
+
+        case TableResultAction.requestAction.Delete:
+          resultAction = getDeleteResultActionToCell(cell);
+          break;
+      }
+
+      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));
+
+      actualPosition++;
+    }
+
+    return _actionCellList;
+  };
+
+  init();
+};
+/**
+*
+* Where action occours enum.
+*/
+
+
+TableResultAction.where = {
+  'Row': 0,
+  'Column': 1
+};
+/**
+*
+* Requested action to apply enum.
+*/
+
+TableResultAction.requestAction = {
+  'Add': 0,
+  'Delete': 1
+};
+/**
+*
+* Result action to be executed enum.
+*/
+
+TableResultAction.resultAction = {
+  'Ignore': 0,
+  'SubtractSpanCount': 1,
+  'RemoveCell': 2,
+  'AddCell': 3,
+  'SumSpanCount': 4
+};
+/**
+ *
+ * @class editing.Table
+ *
+ * Table
+ *
+ */
+
+var Table = /*#__PURE__*/function () {
+  function Table() {
+    Table_classCallCheck(this, Table);
+  }
+
+  Table_createClass(Table, [{
+    key: "tab",
+    value:
+    /**
+     * handle tab key
+     *
+     * @param {WrappedRange} rng
+     * @param {Boolean} isShift
+     */
+    function tab(rng, isShift) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var table = dom.ancestor(cell, dom.isTable);
+      var cells = dom.listDescendant(table, dom.isCell);
+      var nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);
+
+      if (nextCell) {
+        range.create(nextCell, 0).select();
+      }
+    }
+    /**
+     * Add a new row
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (top/bottom)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addRow",
+    value: function addRow(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var currentTr = external_jQuery_default()(cell).closest('tr');
+      var trAttributes = this.recoverAttributes(currentTr);
+      var html = external_jQuery_default()('<tr' + trAttributes + '></tr>');
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Add, external_jQuery_default()(currentTr).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var idCell = 0; idCell < actions.length; idCell++) {
+        var currentCell = actions[idCell];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            {
+              if (position === 'top') {
+                var baseCellTr = currentCell.baseCell.parent;
+                var isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;
+
+                if (isTopFromRowSpan) {
+                  var newTd = external_jQuery_default()('<div></div>').append(external_jQuery_default()('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();
+                  html.append(newTd);
+                  break;
+                }
+              }
+
+              var rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);
+              rowspanNumber++;
+              currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);
+            }
+            break;
+        }
+      }
+
+      if (position === 'top') {
+        currentTr.before(html);
+      } else {
+        var cellHasRowspan = cell.rowSpan > 1;
+
+        if (cellHasRowspan) {
+          var lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);
+          external_jQuery_default()(external_jQuery_default()(currentTr).parent().find('tr')[lastTrIndex]).after(external_jQuery_default()(html));
+          return;
+        }
+
+        currentTr.after(html);
+      }
+    }
+    /**
+     * Add a new col
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (left/right)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addCol",
+    value: function addCol(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var rowsGroup = external_jQuery_default()(row).siblings();
+      rowsGroup.push(row);
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Add, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        var currentCell = actions[actionIndex];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            if (position === 'right') {
+              external_jQuery_default()(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            if (position === 'right') {
+              var colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);
+              colspanNumber++;
+              currentCell.baseCell.setAttribute('colSpan', colspanNumber);
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+        }
+      }
+    }
+    /*
+    * Copy attributes from element.
+    *
+    * @param {object} Element to recover attributes.
+    * @return {string} Copied string elements.
+    */
+
+  }, {
+    key: "recoverAttributes",
+    value: function recoverAttributes(el) {
+      var resultStr = '';
+
+      if (!el) {
+        return resultStr;
+      }
+
+      var attrList = el.attributes || [];
+
+      for (var i = 0; i < attrList.length; i++) {
+        if (attrList[i].name.toLowerCase() === 'id') {
+          continue;
+        }
+
+        if (attrList[i].specified) {
+          resultStr += ' ' + attrList[i].name + '=\'' + attrList[i].value + '\'';
+        }
+      }
+
+      return resultStr;
+    }
+    /**
+     * Delete current row
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteRow",
+    value: function deleteRow(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var rowPos = row[0].rowIndex;
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        var baseCell = actions[actionIndex].baseCell;
+        var virtualPosition = actions[actionIndex].virtualTable;
+        var hasRowspan = baseCell.rowSpan && baseCell.rowSpan > 1;
+        var rowspanNumber = hasRowspan ? parseInt(baseCell.rowSpan, 10) : 0;
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.AddCell:
+            {
+              var nextRow = row.next('tr')[0];
+
+              if (!nextRow) {
+                continue;
+              }
+
+              var cloneRow = row[0].cells[cellPos];
+
+              if (hasRowspan) {
+                if (rowspanNumber > 2) {
+                  rowspanNumber--;
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);
+                  nextRow.cells[cellPos].innerHTML = '';
+                } else if (rowspanNumber === 2) {
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].removeAttribute('rowSpan');
+                  nextRow.cells[cellPos].innerHTML = '';
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            if (hasRowspan) {
+              if (rowspanNumber > 2) {
+                rowspanNumber--;
+                baseCell.setAttribute('rowSpan', rowspanNumber);
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              } else if (rowspanNumber === 2) {
+                baseCell.removeAttribute('rowSpan');
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              }
+            }
+
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            // Do not need remove cell because row will be deleted.
+            continue;
+        }
+      }
+
+      row.remove();
+    }
+    /**
+     * Delete current col
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteCol",
+    value: function deleteCol(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            {
+              var baseCell = actions[actionIndex].baseCell;
+              var hasColspan = baseCell.colSpan && baseCell.colSpan > 1;
+
+              if (hasColspan) {
+                var colspanNumber = baseCell.colSpan ? parseInt(baseCell.colSpan, 10) : 0;
+
+                if (colspanNumber > 2) {
+                  colspanNumber--;
+                  baseCell.setAttribute('colSpan', colspanNumber);
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                } else if (colspanNumber === 2) {
+                  baseCell.removeAttribute('colSpan');
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            dom.remove(actions[actionIndex].baseCell, true);
+            continue;
+        }
+      }
+    }
+    /**
+     * create empty table element
+     *
+     * @param {Number} rowCount
+     * @param {Number} colCount
+     * @return {Node}
+     */
+
+  }, {
+    key: "createTable",
+    value: function createTable(colCount, rowCount, options) {
+      var tds = [];
+      var tdHTML;
+
+      for (var idxCol = 0; idxCol < colCount; idxCol++) {
+        tds.push('<td>' + dom.blank + '</td>');
+      }
+
+      tdHTML = tds.join('');
+      var trs = [];
+      var trHTML;
+
+      for (var idxRow = 0; idxRow < rowCount; idxRow++) {
+        trs.push('<tr>' + tdHTML + '</tr>');
+      }
+
+      trHTML = trs.join('');
+      var $table = external_jQuery_default()('<table>' + trHTML + '</table>');
+
+      if (options && options.tableClassName) {
+        $table.addClass(options.tableClassName);
+      }
+
+      return $table[0];
+    }
+    /**
+     * Delete current table
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteTable",
+    value: function deleteTable(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      external_jQuery_default()(cell).closest('table').remove();
+    }
+  }]);
+
+  return Table;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Editor.js
+function Editor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Editor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Editor_createClass(Constructor, protoProps, staticProps) { if (protoProps) Editor_defineProperties(Constructor.prototype, protoProps); if (staticProps) Editor_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var KEY_BOGUS = 'bogus';
+/**
+ * @class Editor
+ */
+
+var Editor = /*#__PURE__*/function () {
+  function Editor(context) {
+    var _this = this;
+
+    Editor_classCallCheck(this, Editor);
+
+    this.context = context;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.editable = this.$editable[0];
+    this.lastRange = null;
+    this.snapshot = null;
+    this.style = new Style();
+    this.table = new Table();
+    this.typing = new Typing(context);
+    this.bullet = new Bullet();
+    this.history = new History(context);
+    this.context.memo('help.escape', this.lang.help.escape);
+    this.context.memo('help.undo', this.lang.help.undo);
+    this.context.memo('help.redo', this.lang.help.redo);
+    this.context.memo('help.tab', this.lang.help.tab);
+    this.context.memo('help.untab', this.lang.help.untab);
+    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);
+    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);
+    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);
+    this.context.memo('help.indent', this.lang.help.indent);
+    this.context.memo('help.outdent', this.lang.help.outdent);
+    this.context.memo('help.formatPara', this.lang.help.formatPara);
+    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);
+    this.context.memo('help.fontName', this.lang.help.fontName); // native commands(with execCommand), generate function for execCommand
+
+    var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'formatBlock', 'removeFormat', 'backColor'];
+
+    for (var idx = 0, len = commands.length; idx < len; idx++) {
+      this[commands[idx]] = function (sCmd) {
+        return function (value) {
+          _this.beforeCommand();
+
+          document.execCommand(sCmd, false, value);
+
+          _this.afterCommand(true);
+        };
+      }(commands[idx]);
+
+      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);
+    }
+
+    this.fontName = this.wrapCommand(function (value) {
+      return _this.fontStyling('font-family', env.validFontName(value));
+    });
+    this.fontSize = this.wrapCommand(function (value) {
+      var unit = _this.currentStyle()['font-size-unit'];
+
+      return _this.fontStyling('font-size', value + unit);
+    });
+    this.fontSizeUnit = this.wrapCommand(function (value) {
+      var size = _this.currentStyle()['font-size'];
+
+      return _this.fontStyling('font-size', size + value);
+    });
+
+    for (var _idx = 1; _idx <= 6; _idx++) {
+      this['formatH' + _idx] = function (idx) {
+        return function () {
+          _this.formatBlock('H' + idx);
+        };
+      }(_idx);
+
+      this.context.memo('help.formatH' + _idx, this.lang.help['formatH' + _idx]);
+    }
+
+    this.insertParagraph = this.wrapCommand(function () {
+      _this.typing.insertParagraph(_this.editable);
+    });
+    this.insertOrderedList = this.wrapCommand(function () {
+      _this.bullet.insertOrderedList(_this.editable);
+    });
+    this.insertUnorderedList = this.wrapCommand(function () {
+      _this.bullet.insertUnorderedList(_this.editable);
+    });
+    this.indent = this.wrapCommand(function () {
+      _this.bullet.indent(_this.editable);
+    });
+    this.outdent = this.wrapCommand(function () {
+      _this.bullet.outdent(_this.editable);
+    });
+    /**
+     * insertNode
+     * insert node
+     * @param {Node} node
+     */
+
+    this.insertNode = this.wrapCommand(function (node) {
+      if (_this.isLimited(external_jQuery_default()(node).text().length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      rng.insertNode(node);
+
+      _this.setLastRange(range.createFromNodeAfter(node).select());
+    });
+    /**
+     * insert text
+     * @param {String} text
+     */
+
+    this.insertText = this.wrapCommand(function (text) {
+      if (_this.isLimited(text.length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      var textNode = rng.insertNode(dom.createText(text));
+
+      _this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());
+    });
+    /**
+     * paste HTML
+     * @param {String} markup
+     */
+
+    this.pasteHTML = this.wrapCommand(function (markup) {
+      if (_this.isLimited(markup.length)) {
+        return;
+      }
+
+      markup = _this.context.invoke('codeview.purify', markup);
+
+      var contents = _this.getLastRange().pasteHTML(markup);
+
+      _this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());
+    });
+    /**
+     * formatBlock
+     *
+     * @param {String} tagName
+     */
+
+    this.formatBlock = this.wrapCommand(function (tagName, $target) {
+      var onApplyCustomStyle = _this.options.callbacks.onApplyCustomStyle;
+
+      if (onApplyCustomStyle) {
+        onApplyCustomStyle.call(_this, $target, _this.context, _this.onFormatBlock);
+      } else {
+        _this.onFormatBlock(tagName, $target);
+      }
+    });
+    /**
+     * insert horizontal rule
+     */
+
+    this.insertHorizontalRule = this.wrapCommand(function () {
+      var hrNode = _this.getLastRange().insertNode(dom.create('HR'));
+
+      if (hrNode.nextSibling) {
+        _this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());
+      }
+    });
+    /**
+     * lineHeight
+     * @param {String} value
+     */
+
+    this.lineHeight = this.wrapCommand(function (value) {
+      _this.style.stylePara(_this.getLastRange(), {
+        lineHeight: value
+      });
+    });
+    /**
+     * create link (command)
+     *
+     * @param {Object} linkInfo
+     */
+
+    this.createLink = this.wrapCommand(function (linkInfo) {
+      var linkUrl = linkInfo.url;
+      var linkText = linkInfo.text;
+      var isNewWindow = linkInfo.isNewWindow;
+      var checkProtocol = linkInfo.checkProtocol;
+
+      var rng = linkInfo.range || _this.getLastRange();
+
+      var additionalTextLength = linkText.length - rng.toString().length;
+
+      if (additionalTextLength > 0 && _this.isLimited(additionalTextLength)) {
+        return;
+      }
+
+      var isTextChanged = rng.toString() !== linkText; // handle spaced urls from input
+
+      if (typeof linkUrl === 'string') {
+        linkUrl = linkUrl.trim();
+      }
+
+      if (_this.options.onCreateLink) {
+        linkUrl = _this.options.onCreateLink(linkUrl);
+      } else if (checkProtocol) {
+        // if url doesn't have any protocol and not even a relative or a label, use http:// as default
+        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(linkUrl) ? linkUrl : _this.options.defaultProtocol + linkUrl;
+      }
+
+      var anchors = [];
+
+      if (isTextChanged) {
+        rng = rng.deleteContents();
+        var anchor = rng.insertNode(external_jQuery_default()('<A>' + linkText + '</A>')[0]);
+        anchors.push(anchor);
+      } else {
+        anchors = _this.style.styleNodes(rng, {
+          nodeName: 'A',
+          expandClosestSibling: true,
+          onlyPartialContains: true
+        });
+      }
+
+      external_jQuery_default().each(anchors, function (idx, anchor) {
+        external_jQuery_default()(anchor).attr('href', linkUrl);
+
+        if (isNewWindow) {
+          external_jQuery_default()(anchor).attr('target', '_blank');
+        } else {
+          external_jQuery_default()(anchor).removeAttr('target');
+        }
+      });
+
+      _this.setLastRange(_this.createRangeFromList(anchors).select());
+    });
+    /**
+     * setting color
+     *
+     * @param {Object} sObjColor  color code
+     * @param {String} sObjColor.foreColor foreground color
+     * @param {String} sObjColor.backColor background color
+     */
+
+    this.color = this.wrapCommand(function (colorInfo) {
+      var foreColor = colorInfo.foreColor;
+      var backColor = colorInfo.backColor;
+
+      if (foreColor) {
+        document.execCommand('foreColor', false, foreColor);
+      }
+
+      if (backColor) {
+        document.execCommand('backColor', false, backColor);
+      }
+    });
+    /**
+     * Set foreground color
+     *
+     * @param {String} colorCode foreground color code
+     */
+
+    this.foreColor = this.wrapCommand(function (colorInfo) {
+      document.execCommand('foreColor', false, colorInfo);
+    });
+    /**
+     * insert Table
+     *
+     * @param {String} dimension of table (ex : "5x5")
+     */
+
+    this.insertTable = this.wrapCommand(function (dim) {
+      var dimension = dim.split('x');
+
+      var rng = _this.getLastRange().deleteContents();
+
+      rng.insertNode(_this.table.createTable(dimension[0], dimension[1], _this.options));
+    });
+    /**
+     * remove media object and Figure Elements if media object is img with Figure.
+     */
+
+    this.removeMedia = this.wrapCommand(function () {
+      var $target = external_jQuery_default()(_this.restoreTarget()).parent();
+
+      if ($target.closest('figure').length) {
+        $target.closest('figure').remove();
+      } else {
+        $target = external_jQuery_default()(_this.restoreTarget()).detach();
+      }
+
+      _this.context.triggerEvent('media.delete', $target, _this.$editable);
+    });
+    /**
+     * float me
+     *
+     * @param {String} value
+     */
+
+    this.floatMe = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      $target.toggleClass('note-float-left', value === 'left');
+      $target.toggleClass('note-float-right', value === 'right');
+      $target.css('float', value === 'none' ? '' : value);
+    });
+    /**
+     * resize overlay element
+     * @param {String} value
+     */
+
+    this.resize = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      value = parseFloat(value);
+
+      if (value === 0) {
+        $target.css('width', '');
+      } else {
+        $target.css({
+          width: value * 100 + '%',
+          height: ''
+        });
+      }
+    });
+  }
+
+  Editor_createClass(Editor, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      // bind custom events
+      this.$editable.on('keydown', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          _this2.context.triggerEvent('enter', event);
+        }
+
+        _this2.context.triggerEvent('keydown', event); // keep a snapshot to limit text on input event
+
+
+        _this2.snapshot = _this2.history.makeSnapshot();
+        _this2.hasKeyShortCut = false;
+
+        if (!event.isDefaultPrevented()) {
+          if (_this2.options.shortcuts) {
+            _this2.hasKeyShortCut = _this2.handleKeyMap(event);
+          } else {
+            _this2.preventDefaultEditableShortCuts(event);
+          }
+        }
+
+        if (_this2.isLimited(1, event)) {
+          var lastRange = _this2.getLastRange();
+
+          if (lastRange.eo - lastRange.so === 0) {
+            return false;
+          }
+        }
+
+        _this2.setLastRange(); // record undo in the key event except keyMap.
+
+
+        if (_this2.options.recordEveryKeystroke) {
+          if (_this2.hasKeyShortCut === false) {
+            _this2.history.recordUndo();
+          }
+        }
+      }).on('keyup', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('keyup', event);
+      }).on('focus', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('focus', event);
+      }).on('blur', function (event) {
+        _this2.context.triggerEvent('blur', event);
+      }).on('mousedown', function (event) {
+        _this2.context.triggerEvent('mousedown', event);
+      }).on('mouseup', function (event) {
+        _this2.setLastRange();
+
+        _this2.history.recordUndo();
+
+        _this2.context.triggerEvent('mouseup', event);
+      }).on('scroll', function (event) {
+        _this2.context.triggerEvent('scroll', event);
+      }).on('paste', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('paste', event);
+      }).on('input', function () {
+        // To limit composition characters (e.g. Korean)
+        if (_this2.isLimited(0) && _this2.snapshot) {
+          _this2.history.applySnapshot(_this2.snapshot);
+        }
+      });
+      this.$editable.attr('spellcheck', this.options.spellCheck);
+      this.$editable.attr('autocorrect', this.options.spellCheck);
+
+      if (this.options.disableGrammar) {
+        this.$editable.attr('data-gramm', false);
+      } // init content before set event
+
+
+      this.$editable.html(dom.html(this.$note) || dom.emptyPara);
+      this.$editable.on(env.inputEventName, func.debounce(function () {
+        _this2.context.triggerEvent('change', _this2.$editable.html(), _this2.$editable);
+      }, 10));
+      this.$editable.on('focusin', function (event) {
+        _this2.context.triggerEvent('focusin', event);
+      }).on('focusout', function (event) {
+        _this2.context.triggerEvent('focusout', event);
+      });
+
+      if (this.options.airMode) {
+        if (this.options.overrideContextMenu) {
+          this.$editor.on('contextmenu', function (event) {
+            _this2.context.triggerEvent('contextmenu', event);
+
+            return false;
+          });
+        }
+      } else {
+        if (this.options.width) {
+          this.$editor.outerWidth(this.options.width);
+        }
+
+        if (this.options.height) {
+          this.$editable.outerHeight(this.options.height);
+        }
+
+        if (this.options.maxHeight) {
+          this.$editable.css('max-height', this.options.maxHeight);
+        }
+
+        if (this.options.minHeight) {
+          this.$editable.css('min-height', this.options.minHeight);
+        }
+      }
+
+      this.history.recordUndo();
+      this.setLastRange();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$editable.off();
+    }
+  }, {
+    key: "handleKeyMap",
+    value: function handleKeyMap(event) {
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      var keys = [];
+
+      if (event.metaKey) {
+        keys.push('CMD');
+      }
+
+      if (event.ctrlKey && !event.altKey) {
+        keys.push('CTRL');
+      }
+
+      if (event.shiftKey) {
+        keys.push('SHIFT');
+      }
+
+      var keyName = key.nameFromCode[event.keyCode];
+
+      if (keyName) {
+        keys.push(keyName);
+      }
+
+      var eventName = keyMap[keys.join('+')];
+
+      if (keyName === 'TAB' && !this.options.tabDisable) {
+        this.afterCommand();
+      } else if (eventName) {
+        if (this.context.invoke(eventName) !== false) {
+          event.preventDefault(); // if keyMap action was invoked
+
+          return true;
+        }
+      } else if (key.isEdit(event.keyCode)) {
+        this.afterCommand();
+      }
+
+      return false;
+    }
+  }, {
+    key: "preventDefaultEditableShortCuts",
+    value: function preventDefaultEditableShortCuts(event) {
+      // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)
+      if ((event.ctrlKey || event.metaKey) && lists.contains([66, 73, 85], event.keyCode)) {
+        event.preventDefault();
+      }
+    }
+  }, {
+    key: "isLimited",
+    value: function isLimited(pad, event) {
+      pad = pad || 0;
+
+      if (typeof event !== 'undefined') {
+        if (key.isMove(event.keyCode) || key.isNavigation(event.keyCode) || event.ctrlKey || event.metaKey || lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {
+          return false;
+        }
+      }
+
+      if (this.options.maxTextLength > 0) {
+        if (this.$editable.text().length + pad > this.options.maxTextLength) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+    /**
+     * create range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRange",
+    value: function createRange() {
+      this.focus();
+      this.setLastRange();
+      return this.getLastRange();
+    }
+    /**
+     * create a new range from the list of elements
+     *
+     * @param {list} dom element list
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRangeFromList",
+    value: function createRangeFromList(lst) {
+      var startRange = range.createFromNodeBefore(lists.head(lst));
+      var startPoint = startRange.getStartPoint();
+      var endRange = range.createFromNodeAfter(lists.last(lst));
+      var endPoint = endRange.getEndPoint();
+      return range.create(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * set the last range
+     *
+     * if given rng is exist, set rng as the last range
+     * or create a new range at the end of the document
+     *
+     * @param {WrappedRange} rng
+     */
+
+  }, {
+    key: "setLastRange",
+    value: function setLastRange(rng) {
+      if (rng) {
+        this.lastRange = rng;
+      } else {
+        this.lastRange = range.create(this.editable);
+
+        if (external_jQuery_default()(this.lastRange.sc).closest('.note-editable').length === 0) {
+          this.lastRange = range.createFromBodyElement(this.editable);
+        }
+      }
+    }
+    /**
+     * get the last range
+     *
+     * if there is a saved last range, return it
+     * or create a new range and return it
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getLastRange",
+    value: function getLastRange() {
+      if (!this.lastRange) {
+        this.setLastRange();
+      }
+
+      return this.lastRange;
+    }
+    /**
+     * saveRange
+     *
+     * save current range
+     *
+     * @param {Boolean} [thenCollapse=false]
+     */
+
+  }, {
+    key: "saveRange",
+    value: function saveRange(thenCollapse) {
+      if (thenCollapse) {
+        this.getLastRange().collapse().select();
+      }
+    }
+    /**
+     * restoreRange
+     *
+     * restore lately range
+     */
+
+  }, {
+    key: "restoreRange",
+    value: function restoreRange() {
+      if (this.lastRange) {
+        this.lastRange.select();
+        this.focus();
+      }
+    }
+  }, {
+    key: "saveTarget",
+    value: function saveTarget(node) {
+      this.$editable.data('target', node);
+    }
+  }, {
+    key: "clearTarget",
+    value: function clearTarget() {
+      this.$editable.removeData('target');
+    }
+  }, {
+    key: "restoreTarget",
+    value: function restoreTarget() {
+      return this.$editable.data('target');
+    }
+    /**
+     * currentStyle
+     *
+     * current style
+     * @return {Object|Boolean} unfocus
+     */
+
+  }, {
+    key: "currentStyle",
+    value: function currentStyle() {
+      var rng = range.create();
+
+      if (rng) {
+        rng = rng.normalize();
+      }
+
+      return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);
+    }
+    /**
+     * style from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "styleFromNode",
+    value: function styleFromNode($node) {
+      return this.style.fromNode($node);
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.undo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /*
+    * commit
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.commit();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.redo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * before command
+     */
+
+  }, {
+    key: "beforeCommand",
+    value: function beforeCommand() {
+      this.context.triggerEvent('before.command', this.$editable.html()); // Set styleWithCSS before run a command
+
+      document.execCommand('styleWithCSS', false, this.options.styleWithCSS); // keep focus on editable before command execution
+
+      this.focus();
+    }
+    /**
+     * after command
+     * @param {Boolean} isPreventTrigger
+     */
+
+  }, {
+    key: "afterCommand",
+    value: function afterCommand(isPreventTrigger) {
+      this.normalizeContent();
+      this.history.recordUndo();
+
+      if (!isPreventTrigger) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+    /**
+     * handle tab key
+     */
+
+  }, {
+    key: "tab",
+    value: function tab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+
+        if (!this.isLimited(this.options.tabSize)) {
+          this.beforeCommand();
+          this.typing.insertTab(rng, this.options.tabSize);
+          this.afterCommand();
+        }
+      }
+    }
+    /**
+     * handle shift+tab key
+     */
+
+  }, {
+    key: "untab",
+    value: function untab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng, true);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+      }
+    }
+    /**
+     * run given function between beforeCommand and afterCommand
+     */
+
+  }, {
+    key: "wrapCommand",
+    value: function wrapCommand(fn) {
+      return function () {
+        this.beforeCommand();
+        fn.apply(this, arguments);
+        this.afterCommand();
+      };
+    }
+    /**
+     * insert image
+     *
+     * @param {String} src
+     * @param {String|Function} param
+     * @return {Promise}
+     */
+
+  }, {
+    key: "insertImage",
+    value: function insertImage(src, param) {
+      var _this3 = this;
+
+      return createImage(src, param).then(function ($image) {
+        _this3.beforeCommand();
+
+        if (typeof param === 'function') {
+          param($image);
+        } else {
+          if (typeof param === 'string') {
+            $image.attr('data-filename', param);
+          }
+
+          $image.css('width', Math.min(_this3.$editable.width(), $image.width()));
+        }
+
+        $image.show();
+
+        _this3.getLastRange().insertNode($image[0]);
+
+        _this3.setLastRange(range.createFromNodeAfter($image[0]).select());
+
+        _this3.afterCommand();
+      }).fail(function (e) {
+        _this3.context.triggerEvent('image.upload.error', e);
+      });
+    }
+    /**
+     * insertImages
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesAsDataURL",
+    value: function insertImagesAsDataURL(files) {
+      var _this4 = this;
+
+      external_jQuery_default().each(files, function (idx, file) {
+        var filename = file.name;
+
+        if (_this4.options.maximumImageFileSize && _this4.options.maximumImageFileSize < file.size) {
+          _this4.context.triggerEvent('image.upload.error', _this4.lang.image.maximumFileSizeError);
+        } else {
+          readFileAsDataURL(file).then(function (dataURL) {
+            return _this4.insertImage(dataURL, filename);
+          }).fail(function () {
+            _this4.context.triggerEvent('image.upload.error');
+          });
+        }
+      });
+    }
+    /**
+     * insertImagesOrCallback
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesOrCallback",
+    value: function insertImagesOrCallback(files) {
+      var callbacks = this.options.callbacks; // If onImageUpload set,
+
+      if (callbacks.onImageUpload) {
+        this.context.triggerEvent('image.upload', files); // else insert Image as dataURL
+      } else {
+        this.insertImagesAsDataURL(files);
+      }
+    }
+    /**
+     * return selected plain text
+     * @return {String} text
+     */
+
+  }, {
+    key: "getSelectedText",
+    value: function getSelectedText() {
+      var rng = this.getLastRange(); // if range on anchor, expand range with anchor
+
+      if (rng.isOnAnchor()) {
+        rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));
+      }
+
+      return rng.toString();
+    }
+  }, {
+    key: "onFormatBlock",
+    value: function onFormatBlock(tagName, $target) {
+      // [workaround] for MSIE, IE need `<`
+      document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName); // support custom class
+
+      if ($target && $target.length) {
+        // find the exact element has given tagName
+        if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {
+          $target = $target.find(tagName);
+        }
+
+        if ($target && $target.length) {
+          var currentRange = this.createRange();
+          var $parent = external_jQuery_default()([currentRange.sc, currentRange.ec]).closest(tagName); // remove class added for current block
+
+          $parent.removeClass();
+          var className = $target[0].className || '';
+
+          if (className) {
+            $parent.addClass(className);
+          }
+        }
+      }
+    }
+  }, {
+    key: "formatPara",
+    value: function formatPara() {
+      this.formatBlock('P');
+    }
+  }, {
+    key: "fontStyling",
+    value: function fontStyling(target, value) {
+      var rng = this.getLastRange();
+
+      if (rng !== '') {
+        var spans = this.style.styleNodes(rng);
+        this.$editor.find('.note-status-output').html('');
+        external_jQuery_default()(spans).css(target, value); // [workaround] added styled bogus span for style
+        //  - also bogus character needed for cursor position
+
+        if (rng.isCollapsed()) {
+          var firstSpan = lists.head(spans);
+
+          if (firstSpan && !dom.nodeLength(firstSpan)) {
+            firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;
+            range.createFromNode(firstSpan.firstChild).select();
+            this.setLastRange();
+            this.$editable.data(KEY_BOGUS, firstSpan);
+          }
+        } else {
+          this.setLastRange(this.createRangeFromList(spans).select());
+        }
+      } else {
+        var noteStatusOutput = external_jQuery_default().now();
+        this.$editor.find('.note-status-output').html('<div id="note-status-output-' + noteStatusOutput + '" class="alert alert-info">' + this.lang.output.noSelection + '</div>');
+        setTimeout(function () {
+          external_jQuery_default()('#note-status-output-' + noteStatusOutput).remove();
+        }, 5000);
+      }
+    }
+    /**
+     * unlink
+     *
+     * @type command
+     */
+
+  }, {
+    key: "unlink",
+    value: function unlink() {
+      var rng = this.getLastRange();
+
+      if (rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        rng = range.createFromNode(anchor);
+        rng.select();
+        this.setLastRange();
+        this.beforeCommand();
+        document.execCommand('unlink');
+        this.afterCommand();
+      }
+    }
+    /**
+     * returns link info
+     *
+     * @return {Object}
+     * @return {WrappedRange} return.range
+     * @return {String} return.text
+     * @return {Boolean} [return.isNewWindow=true]
+     * @return {String} [return.url=""]
+     */
+
+  }, {
+    key: "getLinkInfo",
+    value: function getLinkInfo() {
+      var rng = this.getLastRange().expand(dom.isAnchor); // Get the first anchor on range(for edit).
+
+      var $anchor = external_jQuery_default()(lists.head(rng.nodes(dom.isAnchor)));
+      var linkInfo = {
+        range: rng,
+        text: rng.toString(),
+        url: $anchor.length ? $anchor.attr('href') : ''
+      }; // When anchor exists,
+
+      if ($anchor.length) {
+        // Set isNewWindow by checking its target.
+        linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
+      }
+
+      return linkInfo;
+    }
+  }, {
+    key: "addRow",
+    value: function addRow(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addRow(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "addCol",
+    value: function addCol(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addCol(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteRow",
+    value: function deleteRow() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteRow(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteCol",
+    value: function deleteCol() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteCol(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteTable",
+    value: function deleteTable() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteTable(rng);
+        this.afterCommand();
+      }
+    }
+    /**
+     * @param {Position} pos
+     * @param {jQuery} $target - target element
+     * @param {Boolean} [bKeepRatio] - keep ratio
+     */
+
+  }, {
+    key: "resizeTo",
+    value: function resizeTo(pos, $target, bKeepRatio) {
+      var imageSize;
+
+      if (bKeepRatio) {
+        var newRatio = pos.y / pos.x;
+        var ratio = $target.data('ratio');
+        imageSize = {
+          width: ratio > newRatio ? pos.x : pos.y / ratio,
+          height: ratio > newRatio ? pos.x * ratio : pos.y
+        };
+      } else {
+        imageSize = {
+          width: pos.x,
+          height: pos.y
+        };
+      }
+
+      $target.css(imageSize);
+    }
+    /**
+     * returns whether editable area has focus or not.
+     */
+
+  }, {
+    key: "hasFocus",
+    value: function hasFocus() {
+      return this.$editable.is(':focus');
+    }
+    /**
+     * set focus
+     */
+
+  }, {
+    key: "focus",
+    value: function focus() {
+      // [workaround] Screen will move when page is scolled in IE.
+      //  - do focus when not focused
+      if (!this.hasFocus()) {
+        this.$editable.focus();
+      }
+    }
+    /**
+     * returns whether contents is empty or not.
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isEmpty",
+    value: function isEmpty() {
+      return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();
+    }
+    /**
+     * Removes all contents and restores the editable instance to an _emptyPara_.
+     */
+
+  }, {
+    key: "empty",
+    value: function empty() {
+      this.context.invoke('code', dom.emptyPara);
+    }
+    /**
+     * normalize content
+     */
+
+  }, {
+    key: "normalizeContent",
+    value: function normalizeContent() {
+      this.$editable[0].normalize();
+    }
+  }]);
+
+  return Editor;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Clipboard.js
+function Clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Clipboard_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Clipboard_createClass(Constructor, protoProps, staticProps) { if (protoProps) Clipboard_defineProperties(Constructor.prototype, protoProps); if (staticProps) Clipboard_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Clipboard = /*#__PURE__*/function () {
+  function Clipboard(context) {
+    Clipboard_classCallCheck(this, Clipboard);
+
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+  }
+
+  Clipboard_createClass(Clipboard, [{
+    key: "initialize",
+    value: function initialize() {
+      this.$editable.on('paste', this.pasteByEvent.bind(this));
+    }
+    /**
+     * paste by clipboard event
+     *
+     * @param {Event} event
+     */
+
+  }, {
+    key: "pasteByEvent",
+    value: function pasteByEvent(event) {
+      var _this = this;
+
+      var clipboardData = event.originalEvent.clipboardData;
+
+      if (clipboardData && clipboardData.items && clipboardData.items.length) {
+        var item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);
+
+        if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
+          // paste img file
+          this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);
+          event.preventDefault();
+        } else if (item.kind === 'string') {
+          // paste text with maxTextLength check
+          if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {
+            event.preventDefault();
+          }
+        }
+      } else if (window.clipboardData) {
+        // for IE
+        var text = window.clipboardData.getData('text');
+
+        if (this.context.invoke('editor.isLimited', text.length)) {
+          event.preventDefault();
+        }
+      } // Call editor.afterCommand after proceeding default event handler
+
+
+      setTimeout(function () {
+        _this.context.invoke('editor.afterCommand');
+      }, 10);
+    }
+  }]);
+
+  return Clipboard;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Dropzone.js
+function Dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) Dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) Dropzone_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Dropzone = /*#__PURE__*/function () {
+  function Dropzone(context) {
+    Dropzone_classCallCheck(this, Dropzone);
+
+    this.context = context;
+    this.$eventListener = external_jQuery_default()(document);
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.documentEventHandlers = {};
+    this.$dropzone = external_jQuery_default()(['<div class="note-dropzone">', '<div class="note-dropzone-message"></div>', '</div>'].join('')).prependTo(this.$editor);
+  }
+  /**
+   * attach Drag and Drop Events
+   */
+
+
+  Dropzone_createClass(Dropzone, [{
+    key: "initialize",
+    value: function initialize() {
+      if (this.options.disableDragAndDrop) {
+        // prevent default drop event
+        this.documentEventHandlers.onDrop = function (e) {
+          e.preventDefault();
+        }; // do not consider outside of dropzone
+
+
+        this.$eventListener = this.$dropzone;
+        this.$eventListener.on('drop', this.documentEventHandlers.onDrop);
+      } else {
+        this.attachDragAndDropEvent();
+      }
+    }
+    /**
+     * attach Drag and Drop Events
+     */
+
+  }, {
+    key: "attachDragAndDropEvent",
+    value: function attachDragAndDropEvent() {
+      var _this = this;
+
+      var collection = external_jQuery_default()();
+      var $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');
+
+      this.documentEventHandlers.onDragenter = function (e) {
+        var isCodeview = _this.context.invoke('codeview.isActivated');
+
+        var hasEditorSize = _this.$editor.width() > 0 && _this.$editor.height() > 0;
+
+        if (!isCodeview && !collection.length && hasEditorSize) {
+          _this.$editor.addClass('dragover');
+
+          _this.$dropzone.width(_this.$editor.width());
+
+          _this.$dropzone.height(_this.$editor.height());
+
+          $dropzoneMessage.text(_this.lang.image.dragImageHere);
+        }
+
+        collection = collection.add(e.target);
+      };
+
+      this.documentEventHandlers.onDragleave = function (e) {
+        collection = collection.not(e.target); // If nodeName is BODY, then just make it over (fix for IE)
+
+        if (!collection.length || e.target.nodeName === 'BODY') {
+          collection = external_jQuery_default()();
+
+          _this.$editor.removeClass('dragover');
+        }
+      };
+
+      this.documentEventHandlers.onDrop = function () {
+        collection = external_jQuery_default()();
+
+        _this.$editor.removeClass('dragover');
+      }; // show dropzone on dragenter when dragging a object to document
+      // -but only if the editor is visible, i.e. has a positive width and height
+
+
+      this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter).on('dragleave', this.documentEventHandlers.onDragleave).on('drop', this.documentEventHandlers.onDrop); // change dropzone's message on hover.
+
+      this.$dropzone.on('dragenter', function () {
+        _this.$dropzone.addClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dropImage);
+      }).on('dragleave', function () {
+        _this.$dropzone.removeClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dragImageHere);
+      }); // attach dropImage
+
+      this.$dropzone.on('drop', function (event) {
+        var dataTransfer = event.originalEvent.dataTransfer; // stop the browser from opening the dropped content
+
+        event.preventDefault();
+
+        if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
+          _this.$editable.focus();
+
+          _this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);
+        } else {
+          external_jQuery_default().each(dataTransfer.types, function (idx, type) {
+            // skip moz-specific types
+            if (type.toLowerCase().indexOf('_moz_') > -1) {
+              return;
+            }
+
+            var content = dataTransfer.getData(type);
+
+            if (type.toLowerCase().indexOf('text') > -1) {
+              _this.context.invoke('editor.pasteHTML', content);
+            } else {
+              external_jQuery_default()(content).each(function (idx, item) {
+                _this.context.invoke('editor.insertNode', item);
+              });
+            }
+          });
+        }
+      }).on('dragover', false); // prevent default dragover event
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      var _this2 = this;
+
+      Object.keys(this.documentEventHandlers).forEach(function (key) {
+        _this2.$eventListener.off(key.substr(2).toLowerCase(), _this2.documentEventHandlers[key]);
+      });
+      this.documentEventHandlers = {};
+    }
+  }]);
+
+  return Dropzone;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Codeview.js
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function Codeview_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Codeview_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Codeview_createClass(Constructor, protoProps, staticProps) { if (protoProps) Codeview_defineProperties(Constructor.prototype, protoProps); if (staticProps) Codeview_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+/**
+ * @class Codeview
+ */
+
+var CodeView = /*#__PURE__*/function () {
+  function CodeView(context) {
+    Codeview_classCallCheck(this, CodeView);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+    this.CodeMirrorConstructor = window.CodeMirror;
+
+    if (this.options.codemirror.CodeMirrorConstructor) {
+      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;
+    }
+  }
+
+  Codeview_createClass(CodeView, [{
+    key: "sync",
+    value: function sync(html) {
+      var isCodeview = this.isActivated();
+      var CodeMirror = this.CodeMirrorConstructor;
+
+      if (isCodeview) {
+        if (html) {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').getDoc().setValue(html);
+          } else {
+            this.$codable.val(html);
+          }
+        } else {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').save();
+          }
+        }
+      }
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.$codable.on('keyup', function (event) {
+        if (event.keyCode === key.code.ESCAPE) {
+          _this.deactivate();
+        }
+      });
+    }
+    /**
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isActivated",
+    value: function isActivated() {
+      return this.$editor.hasClass('codeview');
+    }
+    /**
+     * toggle codeview
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      if (this.isActivated()) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+
+      this.context.triggerEvent('codeview.toggled');
+    }
+    /**
+     * purify input value
+     * @param value
+     * @returns {*}
+     */
+
+  }, {
+    key: "purify",
+    value: function purify(value) {
+      if (this.options.codeviewFilter) {
+        // filter code view regex
+        value = value.replace(this.options.codeviewFilterRegex, ''); // allow specific iframe tag
+
+        if (this.options.codeviewIframeFilter) {
+          var whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);
+          value = value.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi, function (tag) {
+            // remove if src attribute is duplicated
+            if (/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(tag)) {
+              return '';
+            }
+
+            var _iterator = _createForOfIteratorHelper(whitelist),
+                _step;
+
+            try {
+              for (_iterator.s(); !(_step = _iterator.n()).done;) {
+                var src = _step.value;
+
+                // pass if src is trusted
+                if (new RegExp('src="(https?:)?\/\/' + src.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '\/(.+)"').test(tag)) {
+                  return tag;
+                }
+              }
+            } catch (err) {
+              _iterator.e(err);
+            } finally {
+              _iterator.f();
+            }
+
+            return '';
+          });
+        }
+      }
+
+      return value;
+    }
+    /**
+     * activate code view
+     */
+
+  }, {
+    key: "activate",
+    value: function activate() {
+      var _this2 = this;
+
+      var CodeMirror = this.CodeMirrorConstructor;
+      this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));
+      this.$codable.height(this.$editable.height());
+      this.context.invoke('toolbar.updateCodeview', true);
+      this.context.invoke('airPopover.updateCodeview', true);
+      this.$editor.addClass('codeview');
+      this.$codable.focus(); // activate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror); // CodeMirror TernServer
+
+        if (this.options.codemirror.tern) {
+          var server = new CodeMirror.TernServer(this.options.codemirror.tern);
+          cmEditor.ternServer = server;
+          cmEditor.on('cursorActivity', function (cm) {
+            server.updateArgHints(cm);
+          });
+        }
+
+        cmEditor.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);
+        });
+        cmEditor.on('change', function () {
+          _this2.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);
+        }); // CodeMirror hasn't Padding.
+
+        cmEditor.setSize(null, this.$editable.outerHeight());
+        this.$codable.data('cmEditor', cmEditor);
+      } else {
+        this.$codable.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', _this2.$codable.val(), event);
+        });
+        this.$codable.on('input', function () {
+          _this2.context.triggerEvent('change.codeview', _this2.$codable.val(), _this2.$codable);
+        });
+      }
+    }
+    /**
+     * deactivate code view
+     */
+
+  }, {
+    key: "deactivate",
+    value: function deactivate() {
+      var CodeMirror = this.CodeMirrorConstructor; // deactivate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = this.$codable.data('cmEditor');
+        this.$codable.val(cmEditor.getValue());
+        cmEditor.toTextArea();
+      }
+
+      var value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);
+      var isChange = this.$editable.html() !== value;
+      this.$editable.html(value);
+      this.$editable.height(this.options.height ? this.$codable.height() : 'auto');
+      this.$editor.removeClass('codeview');
+
+      if (isChange) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+
+      this.$editable.focus();
+      this.context.invoke('toolbar.updateCodeview', false);
+      this.context.invoke('airPopover.updateCodeview', false);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      if (this.isActivated()) {
+        this.deactivate();
+      }
+    }
+  }]);
+
+  return CodeView;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Statusbar.js
+function Statusbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Statusbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Statusbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Statusbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Statusbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+var EDITABLE_PADDING = 24;
+
+var Statusbar = /*#__PURE__*/function () {
+  function Statusbar(context) {
+    Statusbar_classCallCheck(this, Statusbar);
+
+    this.$document = external_jQuery_default()(document);
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+  }
+
+  Statusbar_createClass(Statusbar, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      if (this.options.airMode || this.options.disableResizeEditor) {
+        this.destroy();
+        return;
+      }
+
+      this.$statusbar.on('mousedown', function (event) {
+        event.preventDefault();
+        event.stopPropagation();
+
+        var editableTop = _this.$editable.offset().top - _this.$document.scrollTop();
+
+        var editableCodeTop = _this.$codable.offset().top - _this.$document.scrollTop();
+
+        var onMouseMove = function onMouseMove(event) {
+          var height = event.clientY - (editableTop + EDITABLE_PADDING);
+          var heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);
+          height = _this.options.minheight > 0 ? Math.max(height, _this.options.minheight) : height;
+          height = _this.options.maxHeight > 0 ? Math.min(height, _this.options.maxHeight) : height;
+          heightCode = _this.options.minheight > 0 ? Math.max(heightCode, _this.options.minheight) : heightCode;
+          heightCode = _this.options.maxHeight > 0 ? Math.min(heightCode, _this.options.maxHeight) : heightCode;
+
+          _this.$editable.height(height);
+
+          _this.$codable.height(heightCode);
+        };
+
+        _this.$document.on('mousemove', onMouseMove).one('mouseup', function () {
+          _this.$document.off('mousemove', onMouseMove);
+        });
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$statusbar.off();
+      this.$statusbar.addClass('locked');
+    }
+  }]);
+
+  return Statusbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Fullscreen.js
+function Fullscreen_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Fullscreen_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Fullscreen_createClass(Constructor, protoProps, staticProps) { if (protoProps) Fullscreen_defineProperties(Constructor.prototype, protoProps); if (staticProps) Fullscreen_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Fullscreen = /*#__PURE__*/function () {
+  function Fullscreen(context) {
+    var _this = this;
+
+    Fullscreen_classCallCheck(this, Fullscreen);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.$window = external_jQuery_default()(window);
+    this.$scrollbar = external_jQuery_default()('html, body');
+    this.scrollbarClassName = 'note-fullscreen-body';
+
+    this.onResize = function () {
+      _this.resizeTo({
+        h: _this.$window.height() - _this.$toolbar.outerHeight()
+      });
+    };
+  }
+
+  Fullscreen_createClass(Fullscreen, [{
+    key: "resizeTo",
+    value: function resizeTo(size) {
+      this.$editable.css('height', size.h);
+      this.$codable.css('height', size.h);
+
+      if (this.$codable.data('cmeditor')) {
+        this.$codable.data('cmeditor').setsize(null, size.h);
+      }
+    }
+    /**
+     * toggle fullscreen
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      this.$editor.toggleClass('fullscreen');
+      var isFullscreen = this.isFullscreen();
+      this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);
+
+      if (isFullscreen) {
+        this.$editable.data('orgHeight', this.$editable.css('height'));
+        this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));
+        this.$editable.css('maxHeight', '');
+        this.$window.on('resize', this.onResize).trigger('resize');
+      } else {
+        this.$window.off('resize', this.onResize);
+        this.resizeTo({
+          h: this.$editable.data('orgHeight')
+        });
+        this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));
+      }
+
+      this.context.invoke('toolbar.updateFullscreen', isFullscreen);
+    }
+  }, {
+    key: "isFullscreen",
+    value: function isFullscreen() {
+      return this.$editor.hasClass('fullscreen');
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$scrollbar.removeClass(this.scrollbarClassName);
+    }
+  }]);
+
+  return Fullscreen;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Handle.js
+function Handle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Handle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Handle_createClass(Constructor, protoProps, staticProps) { if (protoProps) Handle_defineProperties(Constructor.prototype, protoProps); if (staticProps) Handle_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Handle = /*#__PURE__*/function () {
+  function Handle(context) {
+    var _this = this;
+
+    Handle_classCallCheck(this, Handle);
+
+    this.context = context;
+    this.$document = external_jQuery_default()(document);
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        if (_this.update(e.target, e)) {
+          e.preventDefault();
+        }
+      },
+      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': function summernoteKeyupSummernoteScrollSummernoteChangeSummernoteDialogShown() {
+        _this.update();
+      },
+      'summernote.disable summernote.blur': function summernoteDisableSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Handle_createClass(Handle, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$handle = external_jQuery_default()(['<div class="note-handle">', '<div class="note-control-selection">', '<div class="note-control-selection-bg"></div>', '<div class="note-control-holder note-control-nw"></div>', '<div class="note-control-holder note-control-ne"></div>', '<div class="note-control-holder note-control-sw"></div>', '<div class="', this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing', ' note-control-se"></div>', this.options.disableResizeImage ? '' : '<div class="note-control-selection-info"></div>', '</div>', '</div>'].join('')).prependTo(this.$editingArea);
+      this.$handle.on('mousedown', function (event) {
+        if (dom.isControlSizing(event.target)) {
+          event.preventDefault();
+          event.stopPropagation();
+
+          var $target = _this2.$handle.find('.note-control-selection').data('target');
+
+          var posStart = $target.offset();
+
+          var scrollTop = _this2.$document.scrollTop();
+
+          var onMouseMove = function onMouseMove(event) {
+            _this2.context.invoke('editor.resizeTo', {
+              x: event.clientX - posStart.left,
+              y: event.clientY - (posStart.top - scrollTop)
+            }, $target, !event.shiftKey);
+
+            _this2.update($target[0], event);
+          };
+
+          _this2.$document.on('mousemove', onMouseMove).one('mouseup', function (e) {
+            e.preventDefault();
+
+            _this2.$document.off('mousemove', onMouseMove);
+
+            _this2.context.invoke('editor.afterCommand');
+          });
+
+          if (!$target.data('ratio')) {
+            // original ratio.
+            $target.data('ratio', $target.height() / $target.width());
+          }
+        }
+      }); // Listen for scrolling on the handle overlay.
+
+      this.$handle.on('wheel', function (e) {
+        e.preventDefault();
+
+        _this2.update();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$handle.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isImage = dom.isImg(target);
+      var $selection = this.$handle.find('.note-control-selection');
+      this.context.invoke('imagePopover.update', target, event);
+
+      if (isImage) {
+        var $image = external_jQuery_default()(target);
+        var position = $image.position();
+        var pos = {
+          left: position.left + parseInt($image.css('marginLeft'), 10),
+          top: position.top + parseInt($image.css('marginTop'), 10)
+        }; // exclude margin
+
+        var imageSize = {
+          w: $image.outerWidth(false),
+          h: $image.outerHeight(false)
+        };
+        $selection.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top,
+          width: imageSize.w,
+          height: imageSize.h
+        }).data('target', $image); // save current image element.
+
+        var origImageObj = new Image();
+        origImageObj.src = $image.attr('src');
+        var sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';
+        $selection.find('.note-control-selection-info').text(sizingText);
+        this.context.invoke('editor.saveTarget', target);
+      } else {
+        this.hide();
+      }
+
+      return isImage;
+    }
+    /**
+     * hide
+     *
+     * @param {jQuery} $handle
+     */
+
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.context.invoke('editor.clearTarget');
+      this.$handle.children().hide();
+    }
+  }]);
+
+  return Handle;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoLink.js
+function AutoLink_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoLink_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoLink_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoLink_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoLink_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var defaultScheme = 'http://';
+var linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i;
+
+var AutoLink = /*#__PURE__*/function () {
+  function AutoLink(context) {
+    var _this = this;
+
+    AutoLink_classCallCheck(this, AutoLink);
+
+    this.context = context;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoLink_createClass(AutoLink, [{
+    key: "initialize",
+    value: function initialize() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWordRange) {
+        return;
+      }
+
+      var keyword = this.lastWordRange.toString();
+      var match = keyword.match(linkPattern);
+
+      if (match && (match[1] || match[2])) {
+        var link = match[1] ? keyword : defaultScheme + keyword;
+        var urlText = this.options.showDomainOnlyForAutolink ? keyword.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i, '').split('/')[0] : keyword;
+        var node = external_jQuery_default()('<a></a>').html(urlText).attr('href', link)[0];
+
+        if (this.context.options.linkTargetBlank) {
+          external_jQuery_default()(node).attr('target', '_blank');
+        }
+
+        this.lastWordRange.insertNode(node);
+        this.lastWordRange = null;
+        this.context.invoke('editor.focus');
+      }
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWordRange = wordRange;
+      }
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoLink;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoSync.js
+function AutoSync_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoSync_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoSync_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoSync_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoSync_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+/**
+ * textarea auto sync.
+ */
+
+var AutoSync = /*#__PURE__*/function () {
+  function AutoSync(context) {
+    var _this = this;
+
+    AutoSync_classCallCheck(this, AutoSync);
+
+    this.$note = context.layoutInfo.note;
+    this.events = {
+      'summernote.change': function summernoteChange() {
+        _this.$note.val(context.invoke('code'));
+      }
+    };
+  }
+
+  AutoSync_createClass(AutoSync, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return dom.isTextarea(this.$note[0]);
+    }
+  }]);
+
+  return AutoSync;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoReplace.js
+function AutoReplace_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoReplace_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoReplace_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoReplace_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoReplace_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var AutoReplace = /*#__PURE__*/function () {
+  function AutoReplace(context) {
+    var _this = this;
+
+    AutoReplace_classCallCheck(this, AutoReplace);
+
+    this.context = context;
+    this.options = context.options.replace || {};
+    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];
+    this.previousKeydownCode = null;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoReplace_createClass(AutoReplace, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.match;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWord) {
+        return;
+      }
+
+      var self = this;
+      var keyword = this.lastWord.toString();
+      this.options.match(keyword, function (match) {
+        if (match) {
+          var node = '';
+
+          if (typeof match === 'string') {
+            node = dom.createText(match);
+          } else if (match instanceof jQuery) {
+            node = match[0];
+          } else if (match instanceof Node) {
+            node = match;
+          }
+
+          if (!node) return;
+          self.lastWord.insertNode(node);
+          self.lastWord = null;
+          self.context.invoke('editor.focus');
+        }
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      // this forces it to remember the last whole word, even if multiple termination keys are pressed
+      // before the previous key is let go.
+      if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {
+        this.previousKeydownCode = e.keyCode;
+        return;
+      }
+
+      if (lists.contains(this.keys, e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWord = wordRange;
+      }
+
+      this.previousKeydownCode = e.keyCode;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains(this.keys, e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoReplace;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Placeholder.js
+function Placeholder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Placeholder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Placeholder_createClass(Constructor, protoProps, staticProps) { if (protoProps) Placeholder_defineProperties(Constructor.prototype, protoProps); if (staticProps) Placeholder_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Placeholder = /*#__PURE__*/function () {
+  function Placeholder(context) {
+    var _this = this;
+
+    Placeholder_classCallCheck(this, Placeholder);
+
+    this.context = context;
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+
+    if (this.options.inheritPlaceholder === true) {
+      // get placeholder value from the original element
+      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;
+    }
+
+    this.events = {
+      'summernote.init summernote.change': function summernoteInitSummernoteChange() {
+        _this.update();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Placeholder_createClass(Placeholder, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.placeholder;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$placeholder = external_jQuery_default()('<div class="note-placeholder"></div>');
+      this.$placeholder.on('click', function () {
+        _this2.context.invoke('focus');
+      }).html(this.options.placeholder).prependTo(this.$editingArea);
+      this.update();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$placeholder.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      var isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');
+      this.$placeholder.toggle(isShow);
+    }
+  }]);
+
+  return Placeholder;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Buttons.js
+function Buttons_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Buttons_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Buttons_createClass(Constructor, protoProps, staticProps) { if (protoProps) Buttons_defineProperties(Constructor.prototype, protoProps); if (staticProps) Buttons_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Buttons = /*#__PURE__*/function () {
+  function Buttons(context) {
+    Buttons_classCallCheck(this, Buttons);
+
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.context = context;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.invertedKeyMap = func.invertObject(this.options.keyMap[env.isMac ? 'mac' : 'pc']);
+  }
+
+  Buttons_createClass(Buttons, [{
+    key: "representShortcut",
+    value: function representShortcut(editorMethod) {
+      var shortcut = this.invertedKeyMap[editorMethod];
+
+      if (!this.options.shortcuts || !shortcut) {
+        return '';
+      }
+
+      if (env.isMac) {
+        shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');
+      }
+
+      shortcut = shortcut.replace('BACKSLASH', '\\').replace('SLASH', '/').replace('LEFTBRACKET', '[').replace('RIGHTBRACKET', ']');
+      return ' (' + shortcut + ')';
+    }
+  }, {
+    key: "button",
+    value: function button(o) {
+      if (!this.options.tooltip && o.tooltip) {
+        delete o.tooltip;
+      }
+
+      o.container = this.options.container;
+      return this.ui.button(o);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.addToolbarButtons();
+      this.addImagePopoverButtons();
+      this.addLinkPopoverButtons();
+      this.addTablePopoverButtons();
+      this.fontInstalledMap = {};
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      delete this.fontInstalledMap;
+    }
+  }, {
+    key: "isFontInstalled",
+    value: function isFontInstalled(name) {
+      if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {
+        this.fontInstalledMap[name] = env.isFontInstalled(name) || lists.contains(this.options.fontNamesIgnoreCheck, name);
+      }
+
+      return this.fontInstalledMap[name];
+    }
+  }, {
+    key: "isFontDeservedToAdd",
+    value: function isFontDeservedToAdd(name) {
+      name = name.toLowerCase();
+      return name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1;
+    }
+  }, {
+    key: "colorPalette",
+    value: function colorPalette(className, tooltip, backColor, foreColor) {
+      var _this = this;
+
+      return this.ui.buttonGroup({
+        className: 'note-color ' + className,
+        children: [this.button({
+          className: 'note-current-color-button',
+          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),
+          tooltip: tooltip,
+          click: function click(e) {
+            var $button = external_jQuery_default()(e.currentTarget);
+
+            if (backColor && foreColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor'),
+                foreColor: $button.attr('data-foreColor')
+              });
+            } else if (backColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor')
+              });
+            } else if (foreColor) {
+              _this.context.invoke('editor.color', {
+                foreColor: $button.attr('data-foreColor')
+              });
+            }
+          },
+          callback: function callback($button) {
+            var $recentColor = $button.find('.note-recent-color');
+
+            if (backColor) {
+              $recentColor.css('background-color', _this.options.colorButton.backColor);
+              $button.attr('data-backColor', _this.options.colorButton.backColor);
+            }
+
+            if (foreColor) {
+              $recentColor.css('color', _this.options.colorButton.foreColor);
+              $button.attr('data-foreColor', _this.options.colorButton.foreColor);
+            } else {
+              $recentColor.css('color', 'transparent');
+            }
+          }
+        }), this.button({
+          className: 'dropdown-toggle',
+          contents: this.ui.dropdownButtonContents('', this.options),
+          tooltip: this.lang.color.more,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), this.ui.dropdown({
+          items: (backColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.background + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">', this.lang.color.transparent, '</button>', '</div>', '<div class="note-holder" data-event="backColor"><!-- back colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="backColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.backColor + '" data-event="backColorPalette-' + this.options.id + '">', '</div>', '<div class="note-holder-custom" id="backColorPalette-' + this.options.id + '" data-event="backColor"></div>', '</div>'].join('') : '') + (foreColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.foreground + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">', this.lang.color.resetToDefault, '</button>', '</div>', '<div class="note-holder" data-event="foreColor"><!-- fore colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="foreColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.foreColor + '" data-event="foreColorPalette-' + this.options.id + '">', '</div>', // Fix missing Div, Commented to find easily if it's wrong
+          '<div class="note-holder-custom" id="foreColorPalette-' + this.options.id + '" data-event="foreColor"></div>', '</div>'].join('') : ''),
+          callback: function callback($dropdown) {
+            $dropdown.find('.note-holder').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: _this.options.colors,
+                colorsName: _this.options.colorsName,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            /* TODO: do we have to record recent custom colors within cookies? */
+
+            var customColors = [['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF']];
+            $dropdown.find('.note-holder-custom').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: customColors,
+                colorsName: customColors,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            $dropdown.find('input[type=color]').each(function (idx, item) {
+              external_jQuery_default()(item).change(function () {
+                var $chip = $dropdown.find('#' + external_jQuery_default()(this).data('event')).find('.note-color-btn').first();
+                var color = this.value.toUpperCase();
+                $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+                $chip.click();
+              });
+            });
+          },
+          click: function click(event) {
+            event.stopPropagation();
+            var $parent = external_jQuery_default()('.' + className).find('.note-dropdown-menu');
+            var $button = external_jQuery_default()(event.target);
+            var eventName = $button.data('event');
+            var value = $button.attr('data-value');
+
+            if (eventName === 'openPalette') {
+              var $picker = $parent.find('#' + value);
+              var $palette = external_jQuery_default()($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]); // Shift palette chips
+
+              var $chip = $palette.find('.note-color-btn').last().detach(); // Set chip attributes
+
+              var color = $picker.val();
+              $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+              $palette.prepend($chip);
+              $picker.click();
+            } else {
+              if (lists.contains(['backColor', 'foreColor'], eventName)) {
+                var key = eventName === 'backColor' ? 'background-color' : 'color';
+                var $color = $button.closest('.note-color').find('.note-recent-color');
+                var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
+                $color.css(key, value);
+                $currentButton.attr('data-' + eventName, value);
+              }
+
+              _this.context.invoke('editor.' + eventName, value);
+            }
+          }
+        })]
+      }).render();
+    }
+  }, {
+    key: "addToolbarButtons",
+    value: function addToolbarButtons() {
+      var _this2 = this;
+
+      this.context.memo('button.style', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.magic), _this2.options),
+          tooltip: _this2.lang.style.style,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          className: 'dropdown-style',
+          items: _this2.options.styleTags,
+          title: _this2.lang.style.style,
+          template: function template(item) {
+            // TBD: need to be simplified
+            if (typeof item === 'string') {
+              item = {
+                tag: item,
+                title: Object.prototype.hasOwnProperty.call(_this2.lang.style, item) ? _this2.lang.style[item] : item
+              };
+            }
+
+            var tag = item.tag;
+            var title = item.title;
+            var style = item.style ? ' style="' + item.style + '" ' : '';
+            var className = item.className ? ' class="' + item.className + '"' : '';
+            return '<' + tag + style + className + '>' + title + '</' + tag + '>';
+          },
+          click: _this2.context.createInvokeHandler('editor.formatBlock')
+        })]).render();
+      });
+
+      var _loop = function _loop(styleIdx, styleLen) {
+        var item = _this2.options.styleTags[styleIdx];
+
+        _this2.context.memo('button.style.' + item, function () {
+          return _this2.button({
+            className: 'note-btn-style-' + item,
+            contents: '<div data-value="' + item + '">' + item.toUpperCase() + '</div>',
+            tooltip: _this2.lang.style[item],
+            click: _this2.context.createInvokeHandler('editor.formatBlock')
+          }).render();
+        });
+      };
+
+      for (var styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {
+        _loop(styleIdx, styleLen);
+      }
+
+      this.context.memo('button.bold', function () {
+        return _this2.button({
+          className: 'note-btn-bold',
+          contents: _this2.ui.icon(_this2.options.icons.bold),
+          tooltip: _this2.lang.font.bold + _this2.representShortcut('bold'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.bold')
+        }).render();
+      });
+      this.context.memo('button.italic', function () {
+        return _this2.button({
+          className: 'note-btn-italic',
+          contents: _this2.ui.icon(_this2.options.icons.italic),
+          tooltip: _this2.lang.font.italic + _this2.representShortcut('italic'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.italic')
+        }).render();
+      });
+      this.context.memo('button.underline', function () {
+        return _this2.button({
+          className: 'note-btn-underline',
+          contents: _this2.ui.icon(_this2.options.icons.underline),
+          tooltip: _this2.lang.font.underline + _this2.representShortcut('underline'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.underline')
+        }).render();
+      });
+      this.context.memo('button.clear', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.eraser),
+          tooltip: _this2.lang.font.clear + _this2.representShortcut('removeFormat'),
+          click: _this2.context.createInvokeHandler('editor.removeFormat')
+        }).render();
+      });
+      this.context.memo('button.strikethrough', function () {
+        return _this2.button({
+          className: 'note-btn-strikethrough',
+          contents: _this2.ui.icon(_this2.options.icons.strikethrough),
+          tooltip: _this2.lang.font.strikethrough + _this2.representShortcut('strikethrough'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.strikethrough')
+        }).render();
+      });
+      this.context.memo('button.superscript', function () {
+        return _this2.button({
+          className: 'note-btn-superscript',
+          contents: _this2.ui.icon(_this2.options.icons.superscript),
+          tooltip: _this2.lang.font.superscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.superscript')
+        }).render();
+      });
+      this.context.memo('button.subscript', function () {
+        return _this2.button({
+          className: 'note-btn-subscript',
+          contents: _this2.ui.icon(_this2.options.icons.subscript),
+          tooltip: _this2.lang.font.subscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.subscript')
+        }).render();
+      });
+      this.context.memo('button.fontname', function () {
+        var styleInfo = _this2.context.invoke('editor.currentStyle');
+
+        if (_this2.options.addDefaultFonts) {
+          // Add 'default' fonts into the fontnames array if not exist
+          external_jQuery_default().each(styleInfo['font-family'].split(','), function (idx, fontname) {
+            fontname = fontname.trim().replace(/['"]+/g, '');
+
+            if (_this2.isFontDeservedToAdd(fontname)) {
+              if (_this2.options.fontNames.indexOf(fontname) === -1) {
+                _this2.options.fontNames.push(fontname);
+              }
+            }
+          });
+        }
+
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontname"></span>', _this2.options),
+          tooltip: _this2.lang.font.name,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontname',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontNames.filter(_this2.isFontInstalled.bind(_this2)),
+          title: _this2.lang.font.name,
+          template: function template(item) {
+            return '<span style="font-family: ' + env.validFontName(item) + '">' + item + '</span>';
+          },
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontName')
+        })]).render();
+      });
+      this.context.memo('button.fontsize', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>', _this2.options),
+          tooltip: _this2.lang.font.size,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsize',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizes,
+          title: _this2.lang.font.size,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSize')
+        })]).render();
+      });
+      this.context.memo('button.fontsizeunit', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>', _this2.options),
+          tooltip: _this2.lang.font.sizeunit,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsizeunit',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizeUnits,
+          title: _this2.lang.font.sizeunit,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit')
+        })]).render();
+      });
+      this.context.memo('button.color', function () {
+        return _this2.colorPalette('note-color-all', _this2.lang.color.recent, true, true);
+      });
+      this.context.memo('button.forecolor', function () {
+        return _this2.colorPalette('note-color-fore', _this2.lang.color.foreground, false, true);
+      });
+      this.context.memo('button.backcolor', function () {
+        return _this2.colorPalette('note-color-back', _this2.lang.color.background, true, false);
+      });
+      this.context.memo('button.ul', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.unorderedlist),
+          tooltip: _this2.lang.lists.unordered + _this2.representShortcut('insertUnorderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertUnorderedList')
+        }).render();
+      });
+      this.context.memo('button.ol', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.orderedlist),
+          tooltip: _this2.lang.lists.ordered + _this2.representShortcut('insertOrderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertOrderedList')
+        }).render();
+      });
+      var justifyLeft = this.button({
+        contents: this.ui.icon(this.options.icons.alignLeft),
+        tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),
+        click: this.context.createInvokeHandler('editor.justifyLeft')
+      });
+      var justifyCenter = this.button({
+        contents: this.ui.icon(this.options.icons.alignCenter),
+        tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),
+        click: this.context.createInvokeHandler('editor.justifyCenter')
+      });
+      var justifyRight = this.button({
+        contents: this.ui.icon(this.options.icons.alignRight),
+        tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),
+        click: this.context.createInvokeHandler('editor.justifyRight')
+      });
+      var justifyFull = this.button({
+        contents: this.ui.icon(this.options.icons.alignJustify),
+        tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),
+        click: this.context.createInvokeHandler('editor.justifyFull')
+      });
+      var outdent = this.button({
+        contents: this.ui.icon(this.options.icons.outdent),
+        tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),
+        click: this.context.createInvokeHandler('editor.outdent')
+      });
+      var indent = this.button({
+        contents: this.ui.icon(this.options.icons.indent),
+        tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),
+        click: this.context.createInvokeHandler('editor.indent')
+      });
+      this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));
+      this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));
+      this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));
+      this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));
+      this.context.memo('button.outdent', func.invoke(outdent, 'render'));
+      this.context.memo('button.indent', func.invoke(indent, 'render'));
+      this.context.memo('button.paragraph', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.alignLeft), _this2.options),
+          tooltip: _this2.lang.paragraph.paragraph,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown([_this2.ui.buttonGroup({
+          className: 'note-align',
+          children: [justifyLeft, justifyCenter, justifyRight, justifyFull]
+        }), _this2.ui.buttonGroup({
+          className: 'note-list',
+          children: [outdent, indent]
+        })])]).render();
+      });
+      this.context.memo('button.height', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.textHeight), _this2.options),
+          tooltip: _this2.lang.font.height,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          items: _this2.options.lineHeights,
+          checkClassName: _this2.options.icons.menuCheck,
+          className: 'dropdown-line-height',
+          title: _this2.lang.font.height,
+          click: _this2.context.createInvokeHandler('editor.lineHeight')
+        })]).render();
+      });
+      this.context.memo('button.table', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.table), _this2.options),
+          tooltip: _this2.lang.table.table,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          title: _this2.lang.table.table,
+          className: 'note-table',
+          items: ['<div class="note-dimension-picker">', '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>', '<div class="note-dimension-picker-highlighted"></div>', '<div class="note-dimension-picker-unhighlighted"></div>', '</div>', '<div class="note-dimension-display">1 x 1</div>'].join('')
+        })], {
+          callback: function callback($node) {
+            var $catcher = $node.find('.note-dimension-picker-mousecatcher');
+            $catcher.css({
+              width: _this2.options.insertTableMaxSize.col + 'em',
+              height: _this2.options.insertTableMaxSize.row + 'em'
+            }).mouseup(_this2.context.createInvokeHandler('editor.insertTable')).on('mousemove', _this2.tableMoveHandler.bind(_this2));
+          }
+        }).render();
+      });
+      this.context.memo('button.link', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.link),
+          tooltip: _this2.lang.link.link + _this2.representShortcut('linkDialog.show'),
+          click: _this2.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.picture', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.picture),
+          tooltip: _this2.lang.image.image,
+          click: _this2.context.createInvokeHandler('imageDialog.show')
+        }).render();
+      });
+      this.context.memo('button.video', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.video),
+          tooltip: _this2.lang.video.video,
+          click: _this2.context.createInvokeHandler('videoDialog.show')
+        }).render();
+      });
+      this.context.memo('button.hr', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.minus),
+          tooltip: _this2.lang.hr.insert + _this2.representShortcut('insertHorizontalRule'),
+          click: _this2.context.createInvokeHandler('editor.insertHorizontalRule')
+        }).render();
+      });
+      this.context.memo('button.fullscreen', function () {
+        return _this2.button({
+          className: 'btn-fullscreen note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.arrowsAlt),
+          tooltip: _this2.lang.options.fullscreen,
+          click: _this2.context.createInvokeHandler('fullscreen.toggle')
+        }).render();
+      });
+      this.context.memo('button.codeview', function () {
+        return _this2.button({
+          className: 'btn-codeview note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.code),
+          tooltip: _this2.lang.options.codeview,
+          click: _this2.context.createInvokeHandler('codeview.toggle')
+        }).render();
+      });
+      this.context.memo('button.redo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.redo),
+          tooltip: _this2.lang.history.redo + _this2.representShortcut('redo'),
+          click: _this2.context.createInvokeHandler('editor.redo')
+        }).render();
+      });
+      this.context.memo('button.undo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.undo),
+          tooltip: _this2.lang.history.undo + _this2.representShortcut('undo'),
+          click: _this2.context.createInvokeHandler('editor.undo')
+        }).render();
+      });
+      this.context.memo('button.help', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.question),
+          tooltip: _this2.lang.options.help,
+          click: _this2.context.createInvokeHandler('helpDialog.show')
+        }).render();
+      });
+    }
+    /**
+     * image: [
+     *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],
+     *   ['float', ['floatLeft', 'floatRight', 'floatNone']],
+     *   ['remove', ['removeMedia']],
+     * ],
+     */
+
+  }, {
+    key: "addImagePopoverButtons",
+    value: function addImagePopoverButtons() {
+      var _this3 = this;
+
+      // Image Size Buttons
+      this.context.memo('button.resizeFull', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">100%</span>',
+          tooltip: _this3.lang.image.resizeFull,
+          click: _this3.context.createInvokeHandler('editor.resize', '1')
+        }).render();
+      });
+      this.context.memo('button.resizeHalf', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">50%</span>',
+          tooltip: _this3.lang.image.resizeHalf,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.5')
+        }).render();
+      });
+      this.context.memo('button.resizeQuarter', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">25%</span>',
+          tooltip: _this3.lang.image.resizeQuarter,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.25')
+        }).render();
+      });
+      this.context.memo('button.resizeNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.resizeNone,
+          click: _this3.context.createInvokeHandler('editor.resize', '0')
+        }).render();
+      }); // Float Buttons
+
+      this.context.memo('button.floatLeft', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatLeft),
+          tooltip: _this3.lang.image.floatLeft,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'left')
+        }).render();
+      });
+      this.context.memo('button.floatRight', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatRight),
+          tooltip: _this3.lang.image.floatRight,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'right')
+        }).render();
+      });
+      this.context.memo('button.floatNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.floatNone,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'none')
+        }).render();
+      }); // Remove Buttons
+
+      this.context.memo('button.removeMedia', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.trash),
+          tooltip: _this3.lang.image.remove,
+          click: _this3.context.createInvokeHandler('editor.removeMedia')
+        }).render();
+      });
+    }
+  }, {
+    key: "addLinkPopoverButtons",
+    value: function addLinkPopoverButtons() {
+      var _this4 = this;
+
+      this.context.memo('button.linkDialogShow', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.link),
+          tooltip: _this4.lang.link.edit,
+          click: _this4.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.unlink', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.unlink),
+          tooltip: _this4.lang.link.unlink,
+          click: _this4.context.createInvokeHandler('editor.unlink')
+        }).render();
+      });
+    }
+    /**
+     * table : [
+     *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],
+     *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]
+     * ],
+     */
+
+  }, {
+    key: "addTablePopoverButtons",
+    value: function addTablePopoverButtons() {
+      var _this5 = this;
+
+      this.context.memo('button.addRowUp', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowAbove),
+          tooltip: _this5.lang.table.addRowAbove,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'top')
+        }).render();
+      });
+      this.context.memo('button.addRowDown', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowBelow),
+          tooltip: _this5.lang.table.addRowBelow,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'bottom')
+        }).render();
+      });
+      this.context.memo('button.addColLeft', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colBefore),
+          tooltip: _this5.lang.table.addColLeft,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'left')
+        }).render();
+      });
+      this.context.memo('button.addColRight', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colAfter),
+          tooltip: _this5.lang.table.addColRight,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'right')
+        }).render();
+      });
+      this.context.memo('button.deleteRow', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowRemove),
+          tooltip: _this5.lang.table.delRow,
+          click: _this5.context.createInvokeHandler('editor.deleteRow')
+        }).render();
+      });
+      this.context.memo('button.deleteCol', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colRemove),
+          tooltip: _this5.lang.table.delCol,
+          click: _this5.context.createInvokeHandler('editor.deleteCol')
+        }).render();
+      });
+      this.context.memo('button.deleteTable', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.trash),
+          tooltip: _this5.lang.table.delTable,
+          click: _this5.context.createInvokeHandler('editor.deleteTable')
+        }).render();
+      });
+    }
+  }, {
+    key: "build",
+    value: function build($container, groups) {
+      for (var groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {
+        var group = groups[groupIdx];
+        var groupName = Array.isArray(group) ? group[0] : group;
+        var buttons = Array.isArray(group) ? group.length === 1 ? [group[0]] : group[1] : [group];
+        var $group = this.ui.buttonGroup({
+          className: 'note-' + groupName
+        }).render();
+
+        for (var idx = 0, len = buttons.length; idx < len; idx++) {
+          var btn = this.context.memo('button.' + buttons[idx]);
+
+          if (btn) {
+            $group.append(typeof btn === 'function' ? btn(this.context) : btn);
+          }
+        }
+
+        $group.appendTo($container);
+      }
+    }
+    /**
+     * @param {jQuery} [$container]
+     */
+
+  }, {
+    key: "updateCurrentStyle",
+    value: function updateCurrentStyle($container) {
+      var $cont = $container || this.$toolbar;
+      var styleInfo = this.context.invoke('editor.currentStyle');
+      this.updateBtnStates($cont, {
+        '.note-btn-bold': function noteBtnBold() {
+          return styleInfo['font-bold'] === 'bold';
+        },
+        '.note-btn-italic': function noteBtnItalic() {
+          return styleInfo['font-italic'] === 'italic';
+        },
+        '.note-btn-underline': function noteBtnUnderline() {
+          return styleInfo['font-underline'] === 'underline';
+        },
+        '.note-btn-subscript': function noteBtnSubscript() {
+          return styleInfo['font-subscript'] === 'subscript';
+        },
+        '.note-btn-superscript': function noteBtnSuperscript() {
+          return styleInfo['font-superscript'] === 'superscript';
+        },
+        '.note-btn-strikethrough': function noteBtnStrikethrough() {
+          return styleInfo['font-strikethrough'] === 'strikethrough';
+        }
+      });
+
+      if (styleInfo['font-family']) {
+        var fontNames = styleInfo['font-family'].split(',').map(function (name) {
+          return name.replace(/[\'\"]/g, '').replace(/\s+$/, '').replace(/^\s+/, '');
+        });
+        var fontName = lists.find(fontNames, this.isFontInstalled.bind(this));
+        $cont.find('.dropdown-fontname a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontName + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);
+      }
+
+      if (styleInfo['font-size']) {
+        var fontSize = styleInfo['font-size'];
+        $cont.find('.dropdown-fontsize a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontSize + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsize').text(fontSize);
+        var fontSizeUnit = styleInfo['font-size-unit'];
+        $cont.find('.dropdown-fontsizeunit a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item);
+          var isChecked = $item.data('value') + '' === fontSizeUnit + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);
+      }
+
+      if (styleInfo['line-height']) {
+        var lineHeight = styleInfo['line-height'];
+        $cont.find('.dropdown-line-height a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = external_jQuery_default()(item).data('value') + '' === lineHeight + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-line-height').text(lineHeight);
+      }
+    }
+  }, {
+    key: "updateBtnStates",
+    value: function updateBtnStates($container, infos) {
+      var _this6 = this;
+
+      external_jQuery_default().each(infos, function (selector, pred) {
+        _this6.ui.toggleBtnActive($container.find(selector), pred());
+      });
+    }
+  }, {
+    key: "tableMoveHandler",
+    value: function tableMoveHandler(event) {
+      var PX_PER_EM = 18;
+      var $picker = external_jQuery_default()(event.target.parentNode); // target is mousecatcher
+
+      var $dimensionDisplay = $picker.next();
+      var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
+      var $highlighted = $picker.find('.note-dimension-picker-highlighted');
+      var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
+      var posOffset; // HTML5 with jQuery - e.offsetX is undefined in Firefox
+
+      if (event.offsetX === undefined) {
+        var posCatcher = external_jQuery_default()(event.target).offset();
+        posOffset = {
+          x: event.pageX - posCatcher.left,
+          y: event.pageY - posCatcher.top
+        };
+      } else {
+        posOffset = {
+          x: event.offsetX,
+          y: event.offsetY
+        };
+      }
+
+      var dim = {
+        c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
+        r: Math.ceil(posOffset.y / PX_PER_EM) || 1
+      };
+      $highlighted.css({
+        width: dim.c + 'em',
+        height: dim.r + 'em'
+      });
+      $catcher.data('value', dim.c + 'x' + dim.r);
+
+      if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {
+        $unhighlighted.css({
+          width: dim.c + 1 + 'em'
+        });
+      }
+
+      if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {
+        $unhighlighted.css({
+          height: dim.r + 1 + 'em'
+        });
+      }
+
+      $dimensionDisplay.html(dim.c + ' x ' + dim.r);
+    }
+  }]);
+
+  return Buttons;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Toolbar.js
+function Toolbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Toolbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Toolbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Toolbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Toolbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Toolbar = /*#__PURE__*/function () {
+  function Toolbar(context) {
+    Toolbar_classCallCheck(this, Toolbar);
+
+    this.context = context;
+    this.$window = external_jQuery_default()(window);
+    this.$document = external_jQuery_default()(document);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.options = context.options;
+    this.isFollowing = false;
+    this.followScroll = this.followScroll.bind(this);
+  }
+
+  Toolbar_createClass(Toolbar, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !this.options.airMode;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.options.toolbar = this.options.toolbar || [];
+
+      if (!this.options.toolbar.length) {
+        this.$toolbar.hide();
+      } else {
+        this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);
+      }
+
+      if (this.options.toolbarContainer) {
+        this.$toolbar.appendTo(this.options.toolbarContainer);
+      }
+
+      this.changeContainer(false);
+      this.$note.on('summernote.keyup summernote.mouseup summernote.change', function () {
+        _this.context.invoke('buttons.updateCurrentStyle');
+      });
+      this.context.invoke('buttons.updateCurrentStyle');
+
+      if (this.options.followingToolbar) {
+        this.$window.on('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$toolbar.children().remove();
+
+      if (this.options.followingToolbar) {
+        this.$window.off('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "followScroll",
+    value: function followScroll() {
+      if (this.$editor.hasClass('fullscreen')) {
+        return false;
+      }
+
+      var editorHeight = this.$editor.outerHeight();
+      var editorWidth = this.$editor.width();
+      var toolbarHeight = this.$toolbar.height();
+      var statusbarHeight = this.$statusbar.height(); // check if the web app is currently using another static bar
+
+      var otherBarHeight = 0;
+
+      if (this.options.otherStaticBar) {
+        otherBarHeight = external_jQuery_default()(this.options.otherStaticBar).outerHeight();
+      }
+
+      var currentOffset = this.$document.scrollTop();
+      var editorOffsetTop = this.$editor.offset().top;
+      var editorOffsetBottom = editorOffsetTop + editorHeight;
+      var activateOffset = editorOffsetTop - otherBarHeight;
+      var deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;
+
+      if (!this.isFollowing && currentOffset > activateOffset && currentOffset < deactivateOffsetBottom - toolbarHeight) {
+        this.isFollowing = true;
+        this.$editable.css({
+          marginTop: this.$toolbar.outerHeight()
+        });
+        this.$toolbar.css({
+          position: 'fixed',
+          top: otherBarHeight,
+          width: editorWidth,
+          zIndex: 1000
+        });
+      } else if (this.isFollowing && (currentOffset < activateOffset || currentOffset > deactivateOffsetBottom)) {
+        this.isFollowing = false;
+        this.$toolbar.css({
+          position: 'relative',
+          top: 0,
+          width: '100%',
+          zIndex: 'auto'
+        });
+        this.$editable.css({
+          marginTop: ''
+        });
+      }
+    }
+  }, {
+    key: "changeContainer",
+    value: function changeContainer(isFullscreen) {
+      if (isFullscreen) {
+        this.$toolbar.prependTo(this.$editor);
+      } else {
+        if (this.options.toolbarContainer) {
+          this.$toolbar.appendTo(this.options.toolbarContainer);
+        }
+      }
+
+      if (this.options.followingToolbar) {
+        this.followScroll();
+      }
+    }
+  }, {
+    key: "updateFullscreen",
+    value: function updateFullscreen(isFullscreen) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);
+      this.changeContainer(isFullscreen);
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+    }
+  }, {
+    key: "activate",
+    value: function activate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, true);
+    }
+  }, {
+    key: "deactivate",
+    value: function deactivate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, false);
+    }
+  }]);
+
+  return Toolbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkDialog.js
+function LinkDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var LinkDialog = /*#__PURE__*/function () {
+  function LinkDialog(context) {
+    LinkDialog_classCallCheck(this, LinkDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);
+  }
+
+  LinkDialog_createClass(LinkDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group">', "<label for=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.textToDisplay, "</label>"), "<input id=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>"), '</div>', '<div class="form-group note-form-group">', "<label for=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.url, "</label>"), "<input id=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>"), '</div>', !this.options.disableLinkTarget ? external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-open-in-new-window',
+        text: this.lang.link.openInNewWindow,
+        checked: true
+      }).render()).html() : '', external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-use-protocol',
+        text: this.lang.link.useProtocol,
+        checked: true
+      }).render()).html()].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.link.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        className: 'link-dialog',
+        title: this.lang.link.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+    /**
+     * toggle update button
+     */
+
+  }, {
+    key: "toggleLinkBtn",
+    value: function toggleLinkBtn($linkBtn, $linkText, $linkUrl) {
+      this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());
+    }
+    /**
+     * Show link dialog and set event handlers on dialog controls.
+     *
+     * @param {Object} linkInfo
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showLinkDialog",
+    value: function showLinkDialog(linkInfo) {
+      var _this = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $linkText = _this.$dialog.find('.note-link-text');
+
+        var $linkUrl = _this.$dialog.find('.note-link-url');
+
+        var $linkBtn = _this.$dialog.find('.note-link-btn');
+
+        var $openInNewWindow = _this.$dialog.find('.sn-checkbox-open-in-new-window input[type=checkbox]');
+
+        var $useProtocol = _this.$dialog.find('.sn-checkbox-use-protocol input[type=checkbox]');
+
+        _this.ui.onDialogShown(_this.$dialog, function () {
+          _this.context.triggerEvent('dialog.shown'); // If no url was given and given text is valid URL then copy that into URL Field
+
+
+          if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {
+            linkInfo.url = linkInfo.text;
+          }
+
+          $linkText.on('input paste propertychange', function () {
+            // If linktext was modified by input events,
+            // cloning text from linkUrl will be stopped.
+            linkInfo.text = $linkText.val();
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.text);
+          $linkUrl.on('input paste propertychange', function () {
+            // Display same text on `Text to display` as default
+            // when linktext has no text
+            if (!linkInfo.text) {
+              $linkText.val($linkUrl.val());
+            }
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.url);
+
+          if (!env.isSupportTouch) {
+            $linkUrl.trigger('focus');
+          }
+
+          _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+
+          _this.bindEnterKey($linkUrl, $linkBtn);
+
+          _this.bindEnterKey($linkText, $linkBtn);
+
+          var isNewWindowChecked = linkInfo.isNewWindow !== undefined ? linkInfo.isNewWindow : _this.context.options.linkTargetBlank;
+          $openInNewWindow.prop('checked', isNewWindowChecked);
+          var useProtocolChecked = linkInfo.url ? false : _this.context.options.useProtocol;
+          $useProtocol.prop('checked', useProtocolChecked);
+          $linkBtn.one('click', function (event) {
+            event.preventDefault();
+            deferred.resolve({
+              range: linkInfo.range,
+              url: $linkUrl.val(),
+              text: $linkText.val(),
+              isNewWindow: $openInNewWindow.is(':checked'),
+              checkProtocol: $useProtocol.is(':checked')
+            });
+
+            _this.ui.hideDialog(_this.$dialog);
+          });
+        });
+
+        _this.ui.onDialogHidden(_this.$dialog, function () {
+          // detach events
+          $linkText.off();
+          $linkUrl.off();
+          $linkBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this.ui.showDialog(_this.$dialog);
+      }).promise();
+    }
+    /**
+     * @param {Object} layoutInfo
+     */
+
+  }, {
+    key: "show",
+    value: function show() {
+      var _this2 = this;
+
+      var linkInfo = this.context.invoke('editor.getLinkInfo');
+      this.context.invoke('editor.saveRange');
+      this.showLinkDialog(linkInfo).then(function (linkInfo) {
+        _this2.context.invoke('editor.restoreRange');
+
+        _this2.context.invoke('editor.createLink', linkInfo);
+      }).fail(function () {
+        _this2.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return LinkDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkPopover.js
+function LinkPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var LinkPopover = /*#__PURE__*/function () {
+  function LinkPopover(context) {
+    var _this = this;
+
+    LinkPopover_classCallCheck(this, LinkPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteChangeSummernoteScroll() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  LinkPopover_createClass(LinkPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.link);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-link-popover',
+        callback: function callback($node) {
+          var $content = $node.find('.popover-content,.note-popover-content');
+          $content.prepend('<span><a target="_blank"></a>&nbsp;</span>');
+        }
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.link);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      // Prevent focusing on editable when invoke('code') is executed
+      if (!this.context.invoke('editor.hasFocus')) {
+        this.hide();
+        return;
+      }
+
+      var rng = this.context.invoke('editor.getLastRange');
+
+      if (rng.isCollapsed() && rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        var href = external_jQuery_default()(anchor).attr('href');
+        this.$popover.find('a').attr('href', href).text(href);
+        var pos = dom.posFromPlaceholder(anchor);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return LinkPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImageDialog.js
+function ImageDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImageDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImageDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var ImageDialog = /*#__PURE__*/function () {
+  function ImageDialog(context) {
+    ImageDialog_classCallCheck(this, ImageDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  ImageDialog_createClass(ImageDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var imageLimitation = '';
+
+      if (this.options.maximumImageFileSize) {
+        var unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));
+        var readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 + ' ' + ' KMGTP'[unit] + 'B';
+        imageLimitation = "<small>".concat(this.lang.image.maximumFileSize + ' : ' + readableSize, "</small>");
+      }
+
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group note-group-select-from-files">', '<label for="note-dialog-image-file-' + this.options.id + '" class="note-form-label">' + this.lang.image.selectFromFiles + '</label>', '<input id="note-dialog-image-file-' + this.options.id + '" class="note-image-input form-control-file note-form-control note-input" ', ' type="file" name="files" accept="' + this.options.acceptImageFileTypes + '" multiple="multiple"/>', imageLimitation, '</div>', '<div class="form-group note-group-image-url">', '<label for="note-dialog-image-url-' + this.options.id + '" class="note-form-label">' + this.lang.image.url + '</label>', '<input id="note-dialog-image-url-' + this.options.id + '" class="note-image-url form-control note-form-control note-input" type="text"/>', '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.image.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.image.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showImageDialog().then(function (data) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange');
+
+        if (typeof data === 'string') {
+          // image url
+          // If onImageLinkInsert set,
+          if (_this.options.callbacks.onImageLinkInsert) {
+            _this.context.triggerEvent('image.link.insert', data);
+          } else {
+            _this.context.invoke('editor.insertImage', data);
+          }
+        } else {
+          // array of files
+          _this.context.invoke('editor.insertImagesOrCallback', data);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show image dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showImageDialog",
+    value: function showImageDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $imageInput = _this2.$dialog.find('.note-image-input');
+
+        var $imageUrl = _this2.$dialog.find('.note-image-url');
+
+        var $imageBtn = _this2.$dialog.find('.note-image-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown'); // Cloning imageInput to clear element.
+
+
+          $imageInput.replaceWith($imageInput.clone().on('change', function (event) {
+            deferred.resolve(event.target.files || event.target.value);
+          }).val(''));
+          $imageUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($imageBtn, $imageUrl.val());
+          }).val('');
+
+          if (!env.isSupportTouch) {
+            $imageUrl.trigger('focus');
+          }
+
+          $imageBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($imageUrl.val());
+          });
+
+          _this2.bindEnterKey($imageUrl, $imageBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $imageInput.off();
+          $imageUrl.off();
+          $imageBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return ImageDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImagePopover.js
+function ImagePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImagePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImagePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImagePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImagePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+/**
+ * Image popover module
+ *  mouse events that show/hide popover will be handled by Handle.js.
+ *  Handle.js will receive the events and invoke 'imagePopover.update'.
+ */
+
+var ImagePopover = /*#__PURE__*/function () {
+  function ImagePopover(context) {
+    var _this = this;
+
+    ImagePopover_classCallCheck(this, ImagePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.editable = context.layoutInfo.editable[0];
+    this.options = context.options;
+    this.events = {
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  ImagePopover_createClass(ImagePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.image);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-image-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.image);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (dom.isImg(target)) {
+        var position = external_jQuery_default()(target).offset();
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        var pos = {};
+
+        if (this.options.popatmouse) {
+          pos.left = event.pageX - 20;
+          pos.top = event.pageY;
+        } else {
+          pos = position;
+        }
+
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return ImagePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/TablePopover.js
+function TablePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function TablePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function TablePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) TablePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) TablePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var TablePopover = /*#__PURE__*/function () {
+  function TablePopover(context) {
+    var _this = this;
+
+    TablePopover_classCallCheck(this, TablePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.update(e.target);
+      },
+      'summernote.keyup summernote.scroll summernote.change': function summernoteKeyupSummernoteScrollSummernoteChange() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  TablePopover_createClass(TablePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.table);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-table-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.table); // [workaround] Disable Firefox's default table editor
+
+      if (env.isFF) {
+        document.execCommand('enableInlineTableEditing', false, false);
+      }
+
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isCell = dom.isCell(target) || dom.isCell(target === null || target === void 0 ? void 0 : target.parentElement);
+
+      if (isCell) {
+        var pos = dom.posFromPlaceholder(target);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+
+      return isCell;
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return TablePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/VideoDialog.js
+function VideoDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function VideoDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function VideoDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) VideoDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) VideoDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var VideoDialog = /*#__PURE__*/function () {
+  function VideoDialog(context) {
+    VideoDialog_classCallCheck(this, VideoDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  VideoDialog_createClass(VideoDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group row-fluid">', "<label for=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.video.url, " <small class=\"text-muted\">").concat(this.lang.video.providers, "</small></label>"), "<input id=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>"), '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.video.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.video.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "createVideoNode",
+    value: function createVideoNode(url) {
+      // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)
+      var ytRegExp = /\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/;
+      var ytRegExpForStart = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/;
+      var ytMatch = url.match(ytRegExp);
+      var gdRegExp = /(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/;
+      var gdMatch = url.match(gdRegExp);
+      var igRegExp = /(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/;
+      var igMatch = url.match(igRegExp);
+      var vRegExp = /\/\/vine\.co\/v\/([a-zA-Z0-9]+)/;
+      var vMatch = url.match(vRegExp);
+      var vimRegExp = /\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/;
+      var vimMatch = url.match(vimRegExp);
+      var dmRegExp = /.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/;
+      var dmMatch = url.match(dmRegExp);
+      var youkuRegExp = /\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/;
+      var youkuMatch = url.match(youkuRegExp);
+      var peerTubeRegExp = /\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/;
+      var peerTubeMatch = url.match(peerTubeRegExp);
+      var qqRegExp = /\/\/v\.qq\.com.*?vid=(.+)/;
+      var qqMatch = url.match(qqRegExp);
+      var qqRegExp2 = /\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/;
+      var qqMatch2 = url.match(qqRegExp2);
+      var mp4RegExp = /^.+.(mp4|m4v)$/;
+      var mp4Match = url.match(mp4RegExp);
+      var oggRegExp = /^.+.(ogg|ogv)$/;
+      var oggMatch = url.match(oggRegExp);
+      var webmRegExp = /^.+.(webm)$/;
+      var webmMatch = url.match(webmRegExp);
+      var fbRegExp = /(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/;
+      var fbMatch = url.match(fbRegExp);
+      var $video;
+
+      if (ytMatch && ytMatch[1].length === 11) {
+        var youtubeId = ytMatch[1];
+        var start = 0;
+
+        if (typeof ytMatch[2] !== 'undefined') {
+          var ytMatchForStart = ytMatch[2].match(ytRegExpForStart);
+
+          if (ytMatchForStart) {
+            for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {
+              start += typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0;
+            }
+          }
+        }
+
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : '')).attr('width', '640').attr('height', '360');
+      } else if (gdMatch && gdMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview').attr('width', '640').attr('height', '480');
+      } else if (igMatch && igMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/').attr('width', '612').attr('height', '710').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else if (vMatch && vMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', vMatch[0] + '/embed/simple').attr('width', '600').attr('height', '600').attr('class', 'vine-embed');
+      } else if (vimMatch && vimMatch[3].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('src', '//player.vimeo.com/video/' + vimMatch[3]).attr('width', '640').attr('height', '360');
+      } else if (dmMatch && dmMatch[2].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2]).attr('width', '640').attr('height', '360');
+      } else if (youkuMatch && youkuMatch[1].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '498').attr('width', '510').attr('src', '//player.youku.com/embed/' + youkuMatch[1]);
+      } else if (peerTubeMatch && peerTubeMatch[0].length) {
+        var begin = 0;
+        if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];
+        var end = 0;
+        if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];
+        var loop = 0;
+        if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];
+        var autoplay = 0;
+        if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];
+        var muted = 0;
+        if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];
+        $video = external_jQuery_default()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr('frameborder', 0).attr('src', '//' + peerTubeMatch[1] + '/videos/embed/' + peerTubeMatch[2] + "?loop=" + loop + "&autoplay=" + autoplay + "&muted=" + muted + (begin > 0 ? '&start=' + begin : '') + (end > 0 ? '&end=' + start : '')).attr('width', '560').attr('height', '315');
+      } else if (qqMatch && qqMatch[1].length || qqMatch2 && qqMatch2[2].length) {
+        var vid = qqMatch && qqMatch[1].length ? qqMatch[1] : qqMatch2[2];
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '310').attr('width', '500').attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');
+      } else if (mp4Match || oggMatch || webmMatch) {
+        $video = external_jQuery_default()('<video controls>').attr('src', url).attr('width', '640').attr('height', '360');
+      } else if (fbMatch && fbMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560').attr('width', '560').attr('height', '301').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else {
+        // this is not a known video link. Now what, Cat? Now what?
+        return false;
+      }
+
+      $video.addClass('note-video-clip');
+      return $video[0];
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      var text = this.context.invoke('editor.getSelectedText');
+      this.context.invoke('editor.saveRange');
+      this.showVideoDialog(text).then(function (url) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange'); // build node
+
+
+        var $node = _this.createVideoNode(url);
+
+        if ($node) {
+          // insert video node
+          _this.context.invoke('editor.insertNode', $node);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show video dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showVideoDialog",
+    value: function showVideoDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $videoUrl = _this2.$dialog.find('.note-video-url');
+
+        var $videoBtn = _this2.$dialog.find('.note-video-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          $videoUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($videoBtn, $videoUrl.val());
+          });
+
+          if (!env.isSupportTouch) {
+            $videoUrl.trigger('focus');
+          }
+
+          $videoBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($videoUrl.val());
+          });
+
+          _this2.bindEnterKey($videoUrl, $videoBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $videoUrl.off();
+          $videoBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return VideoDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HelpDialog.js
+function HelpDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HelpDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HelpDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) HelpDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) HelpDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var HelpDialog = /*#__PURE__*/function () {
+  function HelpDialog(context) {
+    HelpDialog_classCallCheck(this, HelpDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  HelpDialog_createClass(HelpDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<p class="text-center">', '<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ', '<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ', '<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>', '</p>'].join('');
+      this.$dialog = this.ui.dialog({
+        title: this.lang.options.help,
+        fade: this.options.dialogsFade,
+        body: this.createShortcutList(),
+        footer: body,
+        callback: function callback($node) {
+          $node.find('.modal-body,.note-modal-body').css({
+            'max-height': 300,
+            'overflow': 'scroll'
+          });
+        }
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "createShortcutList",
+    value: function createShortcutList() {
+      var _this = this;
+
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      return Object.keys(keyMap).map(function (key) {
+        var command = keyMap[key];
+        var $row = external_jQuery_default()('<div><div class="help-list-item"></div></div>');
+        $row.append(external_jQuery_default()('<label><kbd>' + key + '</kdb></label>').css({
+          'width': 180,
+          'margin-right': 10
+        })).append(external_jQuery_default()('<span></span>').html(_this.context.memo('help.' + command) || command));
+        return $row.html();
+      }).join('');
+    }
+    /**
+     * show help dialog
+     *
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showHelpDialog",
+    value: function showHelpDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          deferred.resolve();
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      }).promise();
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this3 = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showHelpDialog().then(function () {
+        _this3.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return HelpDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AirPopover.js
+function AirPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AirPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AirPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) AirPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) AirPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var AIRMODE_POPOVER_X_OFFSET = -5;
+var AIRMODE_POPOVER_Y_OFFSET = 5;
+
+var AirPopover = /*#__PURE__*/function () {
+  function AirPopover(context) {
+    var _this = this;
+
+    AirPopover_classCallCheck(this, AirPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.hidable = true;
+    this.onContextmenu = false;
+    this.pageX = null;
+    this.pageY = null;
+    this.events = {
+      'summernote.contextmenu': function summernoteContextmenu(e) {
+        if (_this.options.editing) {
+          e.preventDefault();
+          e.stopPropagation();
+          _this.onContextmenu = true;
+
+          _this.update(true);
+        }
+      },
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.pageX = e.pageX;
+        _this.pageY = e.pageY;
+      },
+      'summernote.keyup summernote.mouseup summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteScroll(we, e) {
+        if (_this.options.editing && !_this.onContextmenu) {
+          _this.pageX = e.pageX;
+          _this.pageY = e.pageY;
+
+          _this.update();
+        }
+
+        _this.onContextmenu = false;
+      },
+      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteChangeSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.focusout': function summernoteFocusout() {
+        if (!_this.$popover.is(':active,:focus')) {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  AirPopover_createClass(AirPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.options.airMode && !lists.isEmpty(this.options.popover.air);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$popover = this.ui.popover({
+        className: 'note-air-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.air); // disable hiding this popover preemptively by 'summernote.blur' event.
+
+      this.$popover.on('mousedown', function () {
+        _this2.hidable = false;
+      }); // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).
+
+      this.$popover.on('mouseup', function () {
+        _this2.hidable = true;
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(forcelyOpen) {
+      var styleInfo = this.context.invoke('editor.currentStyle');
+
+      if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {
+        var rect = {
+          left: this.pageX,
+          top: this.pageY
+        };
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        rect.top -= containerOffset.top;
+        rect.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,
+          top: rect.top + AIRMODE_POPOVER_Y_OFFSET
+        });
+        this.context.invoke('buttons.updateCurrentStyle', this.$popover);
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      if (this.hidable) {
+        this.$popover.hide();
+      }
+    }
+  }]);
+
+  return AirPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HintPopover.js
+function HintPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HintPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HintPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) HintPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) HintPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var POPOVER_DIST = 5;
+
+var HintPopover = /*#__PURE__*/function () {
+  function HintPopover(context) {
+    var _this = this;
+
+    HintPopover_classCallCheck(this, HintPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.hint = this.options.hint || [];
+    this.direction = this.options.hintDirection || 'bottom';
+    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      },
+      'summernote.disable summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      }
+    };
+  }
+
+  HintPopover_createClass(HintPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.hints.length > 0;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.lastWordRange = null;
+      this.matchingWord = null;
+      this.$popover = this.ui.popover({
+        className: 'note-hint-popover',
+        hideArrow: true,
+        direction: ''
+      }).render().appendTo(this.options.container);
+      this.$popover.hide();
+      this.$content = this.$popover.find('.popover-content,.note-popover-content');
+      this.$content.on('click', '.note-hint-item', function (e) {
+        _this2.$content.find('.active').removeClass('active');
+
+        external_jQuery_default()(e.currentTarget).addClass('active');
+
+        _this2.replace();
+      });
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "selectItem",
+    value: function selectItem($item) {
+      this.$content.find('.active').removeClass('active');
+      $item.addClass('active');
+      this.$content[0].scrollTop = $item[0].offsetTop - this.$content.innerHeight() / 2;
+    }
+  }, {
+    key: "moveDown",
+    value: function moveDown() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $next = $current.next();
+
+      if ($next.length) {
+        this.selectItem($next);
+      } else {
+        var $nextGroup = $current.parent().next();
+
+        if (!$nextGroup.length) {
+          $nextGroup = this.$content.find('.note-hint-group').first();
+        }
+
+        this.selectItem($nextGroup.find('.note-hint-item').first());
+      }
+    }
+  }, {
+    key: "moveUp",
+    value: function moveUp() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $prev = $current.prev();
+
+      if ($prev.length) {
+        this.selectItem($prev);
+      } else {
+        var $prevGroup = $current.parent().prev();
+
+        if (!$prevGroup.length) {
+          $prevGroup = this.$content.find('.note-hint-group').last();
+        }
+
+        this.selectItem($prevGroup.find('.note-hint-item').last());
+      }
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      var $item = this.$content.find('.note-hint-item.active');
+
+      if ($item.length) {
+        var node = this.nodeFromItem($item); // If matchingWord length = 0 -> capture OK / open hint / but as mention capture "" (\w*)
+
+        if (this.matchingWord !== null && this.matchingWord.length === 0) {
+          this.lastWordRange.so = this.lastWordRange.eo; // Else si > 0 and normal case -> adjust range "before" for correct position of insertion
+        } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {
+          var rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;
+
+          if (rangeCompute > 0) {
+            this.lastWordRange.so += rangeCompute;
+          }
+        }
+
+        this.lastWordRange.insertNode(node);
+
+        if (this.options.hintSelect === 'next') {
+          var blank = document.createTextNode('');
+          external_jQuery_default()(node).after(blank);
+          range.createFromNodeBefore(blank).select();
+        } else {
+          range.createFromNodeAfter(node).select();
+        }
+
+        this.lastWordRange = null;
+        this.hide();
+        this.context.invoke('editor.focus');
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+  }, {
+    key: "nodeFromItem",
+    value: function nodeFromItem($item) {
+      var hint = this.hints[$item.data('index')];
+      var item = $item.data('item');
+      var node = hint.content ? hint.content(item) : item;
+
+      if (typeof node === 'string') {
+        node = dom.createText(node);
+      }
+
+      return node;
+    }
+  }, {
+    key: "createItemTemplates",
+    value: function createItemTemplates(hintIdx, items) {
+      var hint = this.hints[hintIdx];
+      return items.map(function (item
+      /*, idx */
+      ) {
+        var $item = external_jQuery_default()('<div class="note-hint-item"></div>');
+        $item.append(hint.template ? hint.template(item) : item + '');
+        $item.data({
+          'index': hintIdx,
+          'item': item
+        });
+        return $item;
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (!this.$popover.is(':visible')) {
+        return;
+      }
+
+      if (e.keyCode === key.code.ENTER) {
+        e.preventDefault();
+        this.replace();
+      } else if (e.keyCode === key.code.UP) {
+        e.preventDefault();
+        this.moveUp();
+      } else if (e.keyCode === key.code.DOWN) {
+        e.preventDefault();
+        this.moveDown();
+      }
+    }
+  }, {
+    key: "searchKeyword",
+    value: function searchKeyword(index, keyword, callback) {
+      var hint = this.hints[index];
+
+      if (hint && hint.match.test(keyword) && hint.search) {
+        var matches = hint.match.exec(keyword);
+        this.matchingWord = matches[0];
+        hint.search(matches[1], callback);
+      } else {
+        callback();
+      }
+    }
+  }, {
+    key: "createGroup",
+    value: function createGroup(idx, keyword) {
+      var _this3 = this;
+
+      var $group = external_jQuery_default()('<div class="note-hint-group note-hint-group-' + idx + '"></div>');
+      this.searchKeyword(idx, keyword, function (items) {
+        items = items || [];
+
+        if (items.length) {
+          $group.html(_this3.createItemTemplates(idx, items));
+
+          _this3.show();
+        }
+      });
+      return $group;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      var _this4 = this;
+
+      if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {
+        var _range = this.context.invoke('editor.getLastRange');
+
+        var wordRange, keyword;
+
+        if (this.options.hintMode === 'words') {
+          wordRange = _range.getWordsRange(_range);
+          keyword = wordRange.toString();
+          this.hints.forEach(function (hint) {
+            if (hint.match.test(keyword)) {
+              wordRange = _range.getWordsMatchRange(hint.match);
+              return false;
+            }
+          });
+
+          if (!wordRange) {
+            this.hide();
+            return;
+          }
+
+          keyword = wordRange.toString();
+        } else {
+          wordRange = _range.getWordRange();
+          keyword = wordRange.toString();
+        }
+
+        if (this.hints.length && keyword) {
+          this.$content.empty();
+          var bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));
+          var containerOffset = external_jQuery_default()(this.options.container).offset();
+
+          if (bnd) {
+            bnd.top -= containerOffset.top;
+            bnd.left -= containerOffset.left;
+            this.$popover.hide();
+            this.lastWordRange = wordRange;
+            this.hints.forEach(function (hint, idx) {
+              if (hint.match.test(keyword)) {
+                _this4.createGroup(idx, keyword).appendTo(_this4.$content);
+              }
+            }); // select first .note-hint-item
+
+            this.$content.find('.note-hint-item:first').addClass('active'); // set position for popover after group is created
+
+            if (this.direction === 'top') {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST
+              });
+            } else {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top + bnd.height + POPOVER_DIST
+              });
+            }
+          }
+        } else {
+          this.hide();
+        }
+      }
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      this.$popover.show();
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return HintPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/settings.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  version: '0.8.20',
+  plugins: {},
+  dom: dom,
+  range: range,
+  lists: lists,
+  options: {
+    langInfo: (external_jQuery_default()).summernote.lang["en-US"],
+    editing: true,
+    modules: {
+      'editor': Editor,
+      'clipboard': Clipboard,
+      'dropzone': Dropzone,
+      'codeview': CodeView,
+      'statusbar': Statusbar,
+      'fullscreen': Fullscreen,
+      'handle': Handle,
+      // FIXME: HintPopover must be front of autolink
+      //  - Script error about range when Enter key is pressed on hint popover
+      'hintPopover': HintPopover,
+      'autoLink': AutoLink,
+      'autoSync': AutoSync,
+      'autoReplace': AutoReplace,
+      'placeholder': Placeholder,
+      'buttons': Buttons,
+      'toolbar': Toolbar,
+      'linkDialog': LinkDialog,
+      'linkPopover': LinkPopover,
+      'imageDialog': ImageDialog,
+      'imagePopover': ImagePopover,
+      'tablePopover': TablePopover,
+      'videoDialog': VideoDialog,
+      'helpDialog': HelpDialog,
+      'airPopover': AirPopover
+    },
+    buttons: {},
+    lang: 'en-US',
+    followingToolbar: false,
+    toolbarPosition: 'top',
+    otherStaticBar: '',
+    // toolbar
+    codeviewKeepButton: false,
+    toolbar: [['style', ['style']], ['font', ['bold', 'underline', 'clear']], ['fontname', ['fontname']], ['color', ['color']], ['para', ['ul', 'ol', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture', 'video']], ['view', ['fullscreen', 'codeview', 'help']]],
+    // popover
+    popatmouse: true,
+    popover: {
+      image: [['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']], ['float', ['floatLeft', 'floatRight', 'floatNone']], ['remove', ['removeMedia']]],
+      link: [['link', ['linkDialogShow', 'unlink']]],
+      table: [['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']], ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]],
+      air: [['color', ['color']], ['font', ['bold', 'underline', 'clear']], ['para', ['ul', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture']], ['view', ['fullscreen', 'codeview']]]
+    },
+    // air mode: inline editor
+    airMode: false,
+    overrideContextMenu: false,
+    // TBD
+    width: null,
+    height: null,
+    linkTargetBlank: true,
+    useProtocol: true,
+    defaultProtocol: 'http://',
+    focus: false,
+    tabDisabled: false,
+    tabSize: 4,
+    styleWithCSS: false,
+    shortcuts: true,
+    textareaAutoSync: true,
+    tooltip: 'auto',
+    container: null,
+    maxTextLength: 0,
+    blockquoteBreakingLevel: 2,
+    spellCheck: true,
+    disableGrammar: false,
+    placeholder: null,
+    inheritPlaceholder: false,
+    // TODO: need to be documented
+    recordEveryKeystroke: false,
+    historyLimit: 200,
+    // TODO: need to be documented
+    showDomainOnlyForAutolink: false,
+    // TODO: need to be documented
+    hintMode: 'word',
+    hintSelect: 'after',
+    hintDirection: 'bottom',
+    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
+    fontNames: ['Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande', 'Tahoma', 'Times New Roman', 'Verdana'],
+    fontNamesIgnoreCheck: [],
+    addDefaultFonts: true,
+    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],
+    fontSizeUnits: ['px', 'pt'],
+    // pallete colors(n x n)
+    colors: [['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'], ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'], ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'], ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'], ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'], ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'], ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'], ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031']],
+    // http://chir.ag/projects/name-that-color/
+    colorsName: [['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'], ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'], ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'], ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'], ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'], ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'], ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'], ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou']],
+    colorButton: {
+      foreColor: '#000000',
+      backColor: '#FFFF00'
+    },
+    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],
+    tableClassName: 'table table-bordered',
+    insertTableMaxSize: {
+      col: 10,
+      row: 10
+    },
+    // By default, dialogs are attached in container.
+    dialogsInBody: false,
+    dialogsFade: false,
+    maximumImageFileSize: null,
+    acceptImageFileTypes: "image/*",
+    callbacks: {
+      onBeforeCommand: null,
+      onBlur: null,
+      onBlurCodeview: null,
+      onChange: null,
+      onChangeCodeview: null,
+      onDialogShown: null,
+      onEnter: null,
+      onFocus: null,
+      onImageLinkInsert: null,
+      onImageUpload: null,
+      onImageUploadError: null,
+      onInit: null,
+      onKeydown: null,
+      onKeyup: null,
+      onMousedown: null,
+      onMouseup: null,
+      onPaste: null,
+      onScroll: null
+    },
+    codemirror: {
+      mode: 'text/html',
+      htmlMode: true,
+      lineNumbers: true
+    },
+    codeviewFilter: true,
+    codeviewFilterRegex: /<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,
+    codeviewIframeFilter: true,
+    codeviewIframeWhitelistSrc: [],
+    codeviewIframeWhitelistSrcBase: ['www.youtube.com', 'www.youtube-nocookie.com', 'www.facebook.com', 'vine.co', 'instagram.com', 'player.vimeo.com', 'www.dailymotion.com', 'player.youku.com', 'jumpingbean.tv', 'v.qq.com'],
+    keyMap: {
+      pc: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CTRL+Z': 'undo',
+        'CTRL+Y': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CTRL+B': 'bold',
+        'CTRL+I': 'italic',
+        'CTRL+U': 'underline',
+        'CTRL+SHIFT+S': 'strikethrough',
+        'CTRL+BACKSLASH': 'removeFormat',
+        'CTRL+SHIFT+L': 'justifyLeft',
+        'CTRL+SHIFT+E': 'justifyCenter',
+        'CTRL+SHIFT+R': 'justifyRight',
+        'CTRL+SHIFT+J': 'justifyFull',
+        'CTRL+SHIFT+NUM7': 'insertUnorderedList',
+        'CTRL+SHIFT+NUM8': 'insertOrderedList',
+        'CTRL+LEFTBRACKET': 'outdent',
+        'CTRL+RIGHTBRACKET': 'indent',
+        'CTRL+NUM0': 'formatPara',
+        'CTRL+NUM1': 'formatH1',
+        'CTRL+NUM2': 'formatH2',
+        'CTRL+NUM3': 'formatH3',
+        'CTRL+NUM4': 'formatH4',
+        'CTRL+NUM5': 'formatH5',
+        'CTRL+NUM6': 'formatH6',
+        'CTRL+ENTER': 'insertHorizontalRule',
+        'CTRL+K': 'linkDialog.show'
+      },
+      mac: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CMD+Z': 'undo',
+        'CMD+SHIFT+Z': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CMD+B': 'bold',
+        'CMD+I': 'italic',
+        'CMD+U': 'underline',
+        'CMD+SHIFT+S': 'strikethrough',
+        'CMD+BACKSLASH': 'removeFormat',
+        'CMD+SHIFT+L': 'justifyLeft',
+        'CMD+SHIFT+E': 'justifyCenter',
+        'CMD+SHIFT+R': 'justifyRight',
+        'CMD+SHIFT+J': 'justifyFull',
+        'CMD+SHIFT+NUM7': 'insertUnorderedList',
+        'CMD+SHIFT+NUM8': 'insertOrderedList',
+        'CMD+LEFTBRACKET': 'outdent',
+        'CMD+RIGHTBRACKET': 'indent',
+        'CMD+NUM0': 'formatPara',
+        'CMD+NUM1': 'formatH1',
+        'CMD+NUM2': 'formatH2',
+        'CMD+NUM3': 'formatH3',
+        'CMD+NUM4': 'formatH4',
+        'CMD+NUM5': 'formatH5',
+        'CMD+NUM6': 'formatH6',
+        'CMD+ENTER': 'insertHorizontalRule',
+        'CMD+K': 'linkDialog.show'
+      }
+    },
+    icons: {
+      'align': 'note-icon-align',
+      'alignCenter': 'note-icon-align-center',
+      'alignJustify': 'note-icon-align-justify',
+      'alignLeft': 'note-icon-align-left',
+      'alignRight': 'note-icon-align-right',
+      'rowBelow': 'note-icon-row-below',
+      'colBefore': 'note-icon-col-before',
+      'colAfter': 'note-icon-col-after',
+      'rowAbove': 'note-icon-row-above',
+      'rowRemove': 'note-icon-row-remove',
+      'colRemove': 'note-icon-col-remove',
+      'indent': 'note-icon-align-indent',
+      'outdent': 'note-icon-align-outdent',
+      'arrowsAlt': 'note-icon-arrows-alt',
+      'bold': 'note-icon-bold',
+      'caret': 'note-icon-caret',
+      'circle': 'note-icon-circle',
+      'close': 'note-icon-close',
+      'code': 'note-icon-code',
+      'eraser': 'note-icon-eraser',
+      'floatLeft': 'note-icon-float-left',
+      'floatRight': 'note-icon-float-right',
+      'font': 'note-icon-font',
+      'frame': 'note-icon-frame',
+      'italic': 'note-icon-italic',
+      'link': 'note-icon-link',
+      'unlink': 'note-icon-chain-broken',
+      'magic': 'note-icon-magic',
+      'menuCheck': 'note-icon-menu-check',
+      'minus': 'note-icon-minus',
+      'orderedlist': 'note-icon-orderedlist',
+      'pencil': 'note-icon-pencil',
+      'picture': 'note-icon-picture',
+      'question': 'note-icon-question',
+      'redo': 'note-icon-redo',
+      'rollback': 'note-icon-rollback',
+      'square': 'note-icon-square',
+      'strikethrough': 'note-icon-strikethrough',
+      'subscript': 'note-icon-subscript',
+      'superscript': 'note-icon-superscript',
+      'table': 'note-icon-table',
+      'textHeight': 'note-icon-text-height',
+      'trash': 'note-icon-trash',
+      'underline': 'note-icon-underline',
+      'undo': 'note-icon-undo',
+      'unorderedlist': 'note-icon-unorderedlist',
+      'video': 'note-icon-video'
+    }
+  }
+});
+;// CONCATENATED MODULE: ./src/js/renderer.js
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function renderer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function renderer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function renderer_createClass(Constructor, protoProps, staticProps) { if (protoProps) renderer_defineProperties(Constructor.prototype, protoProps); if (staticProps) renderer_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Renderer = /*#__PURE__*/function () {
+  function Renderer(markup, children, options, callback) {
+    renderer_classCallCheck(this, Renderer);
+
+    this.markup = markup;
+    this.children = children;
+    this.options = options;
+    this.callback = callback;
+  }
+
+  renderer_createClass(Renderer, [{
+    key: "render",
+    value: function render($parent) {
+      var $node = external_jQuery_default()(this.markup);
+
+      if (this.options && this.options.contents) {
+        $node.html(this.options.contents);
+      }
+
+      if (this.options && this.options.className) {
+        $node.addClass(this.options.className);
+      }
+
+      if (this.options && this.options.data) {
+        external_jQuery_default().each(this.options.data, function (k, v) {
+          $node.attr('data-' + k, v);
+        });
+      }
+
+      if (this.options && this.options.click) {
+        $node.on('click', this.options.click);
+      }
+
+      if (this.children) {
+        var $container = $node.find('.note-children-container');
+        this.children.forEach(function (child) {
+          child.render($container.length ? $container : $node);
+        });
+      }
+
+      if (this.callback) {
+        this.callback($node, this.options);
+      }
+
+      if (this.options && this.options.callback) {
+        this.options.callback($node);
+      }
+
+      if ($parent) {
+        $parent.append($node);
+      }
+
+      return $node;
+    }
+  }]);
+
+  return Renderer;
+}();
+
+/* harmony default export */ const renderer = ({
+  create: function create(markup, callback) {
+    return function () {
+      var options = _typeof(arguments[1]) === 'object' ? arguments[1] : arguments[0];
+      var children = Array.isArray(arguments[0]) ? arguments[0] : [];
+
+      if (options && options.children) {
+        children = options.children;
+      }
+
+      return new Renderer(markup, children, options, callback);
+    };
+  }
+});
+;// CONCATENATED MODULE: ./src/styles/bs5/summernote-bs5.js
+function summernote_bs5_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { summernote_bs5_typeof = function _typeof(obj) { return typeof obj; }; } else { summernote_bs5_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return summernote_bs5_typeof(obj); }
+
+
+
+
+
+var editor = renderer.create('<div class="note-editor note-frame card"/>');
+var toolbar = renderer.create('<div class="note-toolbar card-header" role="toolbar"/>');
+var editingArea = renderer.create('<div class="note-editing-area"/>');
+var codable = renderer.create('<textarea class="note-codable" aria-multiline="true"/>');
+var editable = renderer.create('<div class="note-editable card-block" contentEditable="true" role="textbox" aria-multiline="true"/>');
+var statusbar = renderer.create(['<output class="note-status-output" role="status" aria-live="polite"></output>', '<div class="note-statusbar" role="status">', '<div class="note-resizebar" aria-label="Resize">', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '</div>', '</div>'].join(''));
+var airEditor = renderer.create('<div class="note-editor note-airframe"/>');
+var airEditable = renderer.create(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>', '<output class="note-status-output" role="status" aria-live="polite"></output>'].join(''));
+var buttonGroup = renderer.create('<div class="note-btn-group btn-group">');
+var dropdown = renderer.create('<div class="note-dropdown-menu dropdown-menu" role="list">', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    var option = summernote_bs5_typeof(item) === 'object' ? item.option : undefined;
+    var dataValue = 'data-value="' + value + '"';
+    var dataOption = option !== undefined ? ' data-option="' + option + '"' : '';
+    return '<a class="dropdown-item" href="#" ' + (dataValue + dataOption) + ' role="listitem" aria-label="' + value + '">' + content + '</a>';
+  }).join('') : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+
+var dropdownButtonContents = function dropdownButtonContents(contents) {
+  return contents;
+};
+
+var dropdownCheck = renderer.create('<div class="note-dropdown-menu dropdown-menu note-check" role="list">', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    return '<a class="dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + item + '">' + icon(options.checkClassName) + ' ' + content + '</a>';
+  }).join('') : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+var dialog = renderer.create('<div class="modal note-modal" aria-hidden="false" tabindex="-1" role="dialog"/>', function ($node, options) {
+  if (options.fade) {
+    $node.addClass('fade');
+  }
+
+  $node.attr({
+    'aria-label': options.title
+  });
+  $node.html(['<div class="modal-dialog">', '<div class="modal-content">', options.title ? '<div class="modal-header">' + '<h4 class="modal-title">' + options.title + '</h4>' + '<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" aria-hidden="true"></button>' + '</div>' : '', '<div class="modal-body">' + options.body + '</div>', options.footer ? '<div class="modal-footer">' + options.footer + '</div>' : '', '</div>', '</div>'].join(''));
+});
+var popover = renderer.create(['<div class="note-popover popover show">', '<div class="popover-arrow"></div>', '<div class="popover-body note-children-container"></div>', '</div>'].join(''), function ($node, options) {
+  var direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';
+  $node.attr('data-bs-placement', direction);
+
+  if (options.hideArrow) {
+    $node.find('.popover-arrow').hide();
+  }
+});
+var summernote_bs5_checkbox = renderer.create('<div class="form-check"></div>', function ($node, options) {
+  $node.html(['<label class="form-check-label"' + (options.id ? ' for="note-' + options.id + '"' : '') + '>', '<input type="checkbox" class="form-check-input"' + (options.id ? ' id="note-' + options.id + '"' : ''), options.checked ? ' checked' : '', ' aria-label="' + (options.text ? options.text : '') + '"', ' aria-checked="' + (options.checked ? 'true' : 'false') + '"/>', ' ' + (options.text ? options.text : '') + '</label>'].join(''));
+});
+
+var icon = function icon(iconClassName, tagName) {
+  if (iconClassName.match(/^</)) {
+    return iconClassName;
+  }
+
+  tagName = tagName || 'i';
+  return '<' + tagName + ' class="' + iconClassName + '"></' + tagName + '>';
+};
+
+var ui = function ui(editorOptions) {
+  return {
+    editor: editor,
+    toolbar: toolbar,
+    editingArea: editingArea,
+    codable: codable,
+    editable: editable,
+    statusbar: statusbar,
+    airEditor: airEditor,
+    airEditable: airEditable,
+    buttonGroup: buttonGroup,
+    dropdown: dropdown,
+    dropdownButtonContents: dropdownButtonContents,
+    dropdownCheck: dropdownCheck,
+    dialog: dialog,
+    popover: popover,
+    icon: icon,
+    checkbox: summernote_bs5_checkbox,
+    options: editorOptions,
+    palette: function palette($node, options) {
+      return renderer.create('<div class="note-color-palette"/>', function ($node, options) {
+        var contents = [];
+
+        for (var row = 0, rowSize = options.colors.length; row < rowSize; row++) {
+          var eventName = options.eventName;
+          var colors = options.colors[row];
+          var colorsName = options.colorsName[row];
+          var buttons = [];
+
+          for (var col = 0, colSize = colors.length; col < colSize; col++) {
+            var color = colors[col];
+            var colorName = colorsName[col];
+            buttons.push(['<button type="button" class="note-color-btn"', 'style="background-color:', color, '" ', 'data-event="', eventName, '" ', 'data-value="', color, '" ', 'title="', colorName, '" ', 'aria-label="', colorName, '" ', 'data-toggle="button" tabindex="-1"></button>'].join(''));
+          }
+
+          contents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
+        }
+
+        $node.html(contents.join(''));
+
+        if (options.tooltip) {
+          $node.find('.note-color-btn').tooltip({
+            container: options.container || editorOptions.container,
+            trigger: 'hover',
+            placement: 'bottom'
+          });
+        }
+      })($node, options);
+    },
+    button: function button($node, options) {
+      return renderer.create('<button type="button" class="note-btn btn btn-light btn-sm" tabindex="-1">', function ($node, options) {
+        if (options && options.tooltip) {
+          $node.attr({
+            title: options.tooltip,
+            'aria-label': options.tooltip
+          }).tooltip({
+            container: options.container || editorOptions.container,
+            trigger: 'hover',
+            placement: 'bottom'
+          }).on('click', function (e) {
+            external_jQuery_default()(e.currentTarget).tooltip('hide');
+          });
+        }
+
+        if (options && options.codeviewButton) {
+          $node.addClass('note-codeview-keep');
+        }
+      })($node, options);
+    },
+    toggleBtn: function toggleBtn($btn, isEnable) {
+      $btn.toggleClass('disabled', !isEnable);
+      $btn.attr('disabled', !isEnable);
+    },
+    toggleBtnActive: function toggleBtnActive($btn, isActive) {
+      $btn.toggleClass('active', isActive);
+    },
+    onDialogShown: function onDialogShown($dialog, handler) {
+      $dialog.one('shown.bs.modal', handler);
+    },
+    onDialogHidden: function onDialogHidden($dialog, handler) {
+      $dialog.one('hidden.bs.modal', handler);
+    },
+    showDialog: function showDialog($dialog) {
+      $dialog.modal('show');
+    },
+    hideDialog: function hideDialog($dialog) {
+      $dialog.modal('hide');
+    },
+    createLayout: function createLayout($note) {
+      var $editor = (editorOptions.airMode ? airEditor([editingArea([codable(), airEditable()])]) : editorOptions.toolbarPosition === 'bottom' ? editor([editingArea([codable(), editable()]), toolbar(), statusbar()]) : editor([toolbar(), editingArea([codable(), editable()]), statusbar()])).render();
+      $editor.insertAfter($note);
+      return {
+        note: $note,
+        editor: $editor,
+        toolbar: $editor.find('.note-toolbar'),
+        editingArea: $editor.find('.note-editing-area'),
+        editable: $editor.find('.note-editable'),
+        codable: $editor.find('.note-codable'),
+        statusbar: $editor.find('.note-statusbar')
+      };
+    },
+    removeLayout: function removeLayout($note, layoutInfo) {
+      $note.html(layoutInfo.editable.html());
+      layoutInfo.editor.remove();
+      $note.show();
+    }
+  };
+};
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  ui_template: ui,
+  "interface": 'bs5'
+});
+(external_jQuery_default()).summernote.options.styleTags = ['p', {
+  title: 'Blockquote',
+  tag: 'blockquote',
+  className: 'blockquote',
+  value: 'blockquote'
+}, 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
+})();
+
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-bs5.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js.map
new file mode 100644
index 0000000..39851d2
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote-bs5.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-en-US.js","webpack:///external umd \"jQuery\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/js/core/env.js","webpack:///./src/js/core/func.js","webpack:///./src/js/core/lists.js","webpack:///./src/js/core/dom.js","webpack:///./src/js/Context.js","webpack:///./src/js/summernote.js","webpack:///./src/js/core/range.js","webpack:///./src/js/core/key.js","webpack:///./src/js/core/async.js","webpack:///./src/js/editing/History.js","webpack:///./src/js/editing/Style.js","webpack:///./src/js/editing/Bullet.js","webpack:///./src/js/editing/Typing.js","webpack:///./src/js/editing/Table.js","webpack:///./src/js/module/Editor.js","webpack:///./src/js/module/Clipboard.js","webpack:///./src/js/module/Dropzone.js","webpack:///./src/js/module/Codeview.js","webpack:///./src/js/module/Statusbar.js","webpack:///./src/js/module/Fullscreen.js","webpack:///./src/js/module/Handle.js","webpack:///./src/js/module/AutoLink.js","webpack:///./src/js/module/AutoSync.js","webpack:///./src/js/module/AutoReplace.js","webpack:///./src/js/module/Placeholder.js","webpack:///./src/js/module/Buttons.js","webpack:///./src/js/module/Toolbar.js","webpack:///./src/js/module/LinkDialog.js","webpack:///./src/js/module/LinkPopover.js","webpack:///./src/js/module/ImageDialog.js","webpack:///./src/js/module/ImagePopover.js","webpack:///./src/js/module/TablePopover.js","webpack:///./src/js/module/VideoDialog.js","webpack:///./src/js/module/HelpDialog.js","webpack:///./src/js/module/AirPopover.js","webpack:///./src/js/module/HintPopover.js","webpack:///./src/js/settings.js","webpack:///./src/js/renderer.js","webpack:///./src/styles/bs5/summernote-bs5.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jQuery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jQuery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jQuery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {\nreturn ","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from 'jquery';\n\n/**\n * returns whether font is installed or not.\n *\n * @param {String} fontName\n * @return {Boolean}\n */\nconst genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];\n\nfunction validFontName(fontName) {\n  return ($.inArray(fontName.toLowerCase(), genericFontFamilies) === -1) ? `'${fontName}'` : fontName;\n}\n\nfunction isFontInstalled(fontName) {\n  const testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';\n  const testText = 'mmmmmmmmmmwwwww';\n  const testSize = '200px';\n\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n\n  context.font = testSize + \" '\" + testFontName + \"'\";\n  const originalWidth = context.measureText(testText).width;\n\n  context.font = testSize + ' ' + validFontName(fontName) + ', \"' + testFontName + '\"';\n  const width = context.measureText(testText).width;\n\n  return originalWidth !== width;\n}\n\nconst userAgent = navigator.userAgent;\nconst isMSIE = /MSIE|Trident/i.test(userAgent);\nlet browserVersion;\nif (isMSIE) {\n  let matches = /MSIE (\\d+[.]\\d+)/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n  matches = /Trident\\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n}\n\nconst isEdge = /Edge\\/\\d+/.test(userAgent);\n\nconst isSupportTouch =\n  (('ontouchstart' in window) ||\n   (navigator.MaxTouchPoints > 0) ||\n   (navigator.msMaxTouchPoints > 0));\n\n// [workaround] IE doesn't have input events for contentEditable\n// - see: https://goo.gl/4bfIvA\nconst inputEventName = (isMSIE) ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';\n\n/**\n * @class core.env\n *\n * Object which check platform and agent\n *\n * @singleton\n * @alternateClassName env\n */\nexport default {\n  isMac: navigator.appVersion.indexOf('Mac') > -1,\n  isMSIE,\n  isEdge,\n  isFF: !isEdge && /firefox/i.test(userAgent),\n  isPhantom: /PhantomJS/i.test(userAgent),\n  isWebkit: !isEdge && /webkit/i.test(userAgent),\n  isChrome: !isEdge && /chrome/i.test(userAgent),\n  isSafari: !isEdge && /safari/i.test(userAgent) && (!/chrome/i.test(userAgent)),\n  browserVersion,\n  isSupportTouch,\n  isFontInstalled,\n  isW3CRangeSupport: !!document.createRange,\n  inputEventName,\n  genericFontFamilies,\n  validFontName,\n};\n","import $ from 'jquery';\n\n/**\n * @class core.func\n *\n * func utils (for high-order func's arg)\n *\n * @singleton\n * @alternateClassName func\n */\nfunction eq(itemA) {\n  return function(itemB) {\n    return itemA === itemB;\n  };\n}\n\nfunction eq2(itemA, itemB) {\n  return itemA === itemB;\n}\n\nfunction peq2(propName) {\n  return function(itemA, itemB) {\n    return itemA[propName] === itemB[propName];\n  };\n}\n\nfunction ok() {\n  return true;\n}\n\nfunction fail() {\n  return false;\n}\n\nfunction not(f) {\n  return function() {\n    return !f.apply(f, arguments);\n  };\n}\n\nfunction and(fA, fB) {\n  return function(item) {\n    return fA(item) && fB(item);\n  };\n}\n\nfunction self(a) {\n  return a;\n}\n\nfunction invoke(obj, method) {\n  return function() {\n    return obj[method].apply(obj, arguments);\n  };\n}\n\nlet idCounter = 0;\n\n/**\n * reset globally-unique id\n *\n */\nfunction resetUniqueId() {\n  idCounter = 0;\n}\n\n/**\n * generate a globally-unique id\n *\n * @param {String} [prefix]\n */\nfunction uniqueId(prefix) {\n  const id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n/**\n * returns bnd (bounds) from rect\n *\n * - IE Compatibility Issue: http://goo.gl/sRLOAo\n * - Scroll Issue: http://goo.gl/sNjUc\n *\n * @param {Rect} rect\n * @return {Object} bounds\n * @return {Number} bounds.top\n * @return {Number} bounds.left\n * @return {Number} bounds.width\n * @return {Number} bounds.height\n */\nfunction rect2bnd(rect) {\n  const $document = $(document);\n  return {\n    top: rect.top + $document.scrollTop(),\n    left: rect.left + $document.scrollLeft(),\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n}\n\n/**\n * returns a copy of the object where the keys have become the values and the values the keys.\n * @param {Object} obj\n * @return {Object}\n */\nfunction invertObject(obj) {\n  const inverted = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      inverted[obj[key]] = key;\n    }\n  }\n  return inverted;\n}\n\n/**\n * @param {String} namespace\n * @param {String} [prefix]\n * @return {String}\n */\nfunction namespaceToCamel(namespace, prefix) {\n  prefix = prefix || '';\n  return prefix + namespace.split('.').map(function(name) {\n    return name.substring(0, 1).toUpperCase() + name.substring(1);\n  }).join('');\n}\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param {Function} func\n * @param {Number} wait\n * @param {Boolean} immediate\n * @return {Function}\n */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function() {\n    const context = this;\n    const args = arguments;\n    const later = () => {\n      timeout = null;\n      if (!immediate) {\n        func.apply(context, args);\n      }\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) {\n      func.apply(context, args);\n    }\n  };\n}\n\n/**\n *\n * @param {String} url\n * @return {Boolean}\n */\nfunction isValidUrl(url) {\n  const expression = /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/gi;\n  return expression.test(url);\n}\n\nexport default {\n  eq,\n  eq2,\n  peq2,\n  ok,\n  fail,\n  self,\n  not,\n  and,\n  invoke,\n  resetUniqueId,\n  uniqueId,\n  rect2bnd,\n  invertObject,\n  namespaceToCamel,\n  debounce,\n  isValidUrl,\n};\n","import func from './func';\n\n/**\n * returns the first item of an array.\n *\n * @param {Array} array\n */\nfunction head(array) {\n  return array[0];\n}\n\n/**\n * returns the last item of an array.\n *\n * @param {Array} array\n */\nfunction last(array) {\n  return array[array.length - 1];\n}\n\n/**\n * returns everything but the last entry of the array.\n *\n * @param {Array} array\n */\nfunction initial(array) {\n  return array.slice(0, array.length - 1);\n}\n\n/**\n * returns the rest of the items in an array.\n *\n * @param {Array} array\n */\nfunction tail(array) {\n  return array.slice(1);\n}\n\n/**\n * returns item of array\n */\nfunction find(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    const item = array[idx];\n    if (pred(item)) {\n      return item;\n    }\n  }\n}\n\n/**\n * returns true if all of the values in the array pass the predicate truth test.\n */\nfunction all(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!pred(array[idx])) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * returns true if the value is present in the list.\n */\nfunction contains(array, item) {\n  if (array && array.length && item) {\n    if (array.indexOf) {\n      return array.indexOf(item) !== -1;\n    } else if (array.contains) {\n      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`\n      return array.contains(item);\n    }\n  }\n  return false;\n}\n\n/**\n * get sum from a list\n *\n * @param {Array} array - array\n * @param {Function} fn - iterator\n */\nfunction sum(array, fn) {\n  fn = fn || func.self;\n  return array.reduce(function(memo, v) {\n    return memo + fn(v);\n  }, 0);\n}\n\n/**\n * returns a copy of the collection with array type.\n * @param {Collection} collection - collection eg) node.childNodes, ...\n */\nfunction from(collection) {\n  const result = [];\n  const length = collection.length;\n  let idx = -1;\n  while (++idx < length) {\n    result[idx] = collection[idx];\n  }\n  return result;\n}\n\n/**\n * returns whether list is empty or not\n */\nfunction isEmpty(array) {\n  return !array || !array.length;\n}\n\n/**\n * cluster elements by predicate function.\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n * @param {Array[]}\n */\nfunction clusterBy(array, fn) {\n  if (!array.length) { return []; }\n  const aTail = tail(array);\n  return aTail.reduce(function(memo, v) {\n    const aLast = last(memo);\n    if (fn(last(aLast), v)) {\n      aLast[aLast.length] = v;\n    } else {\n      memo[memo.length] = [v];\n    }\n    return memo;\n  }, [[head(array)]]);\n}\n\n/**\n * returns a copy of the array with all false values removed\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n */\nfunction compact(array) {\n  const aResult = [];\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (array[idx]) { aResult.push(array[idx]); }\n  }\n  return aResult;\n}\n\n/**\n * produces a duplicate-free version of the array\n *\n * @param {Array} array\n */\nfunction unique(array) {\n  const results = [];\n\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!contains(results, array[idx])) {\n      results.push(array[idx]);\n    }\n  }\n\n  return results;\n}\n\n/**\n * returns next item.\n * @param {Array} array\n */\nfunction next(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx + 1];\n  }\n  return null;\n}\n\n/**\n * returns prev item.\n * @param {Array} array\n */\nfunction prev(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx - 1];\n  }\n  return null;\n}\n\n/**\n * @class core.list\n *\n * list utils\n *\n * @singleton\n * @alternateClassName list\n */\nexport default {\n  head,\n  last,\n  initial,\n  tail,\n  prev,\n  next,\n  find,\n  contains,\n  all,\n  sum,\n  from,\n  isEmpty,\n  clusterBy,\n  compact,\n  unique,\n};\n","import $ from 'jquery';\nimport func from './func';\nimport lists from './lists';\nimport env from './env';\n\nconst NBSP_CHAR = String.fromCharCode(160);\nconst ZERO_WIDTH_NBSP_CHAR = '\\ufeff';\n\n/**\n * @method isEditable\n *\n * returns whether node is `note-editable` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEditable(node) {\n  return node && $(node).hasClass('note-editable');\n}\n\n/**\n * @method isControlSizing\n *\n * returns whether node is `note-control-sizing` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isControlSizing(node) {\n  return node && $(node).hasClass('note-control-sizing');\n}\n\n/**\n * @method makePredByNodeName\n *\n * returns predicate which judge whether nodeName is same\n *\n * @param {String} nodeName\n * @return {Function}\n */\nfunction makePredByNodeName(nodeName) {\n  nodeName = nodeName.toUpperCase();\n  return function(node) {\n    return node && node.nodeName.toUpperCase() === nodeName;\n  };\n}\n\n/**\n * @method isText\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is text(3)\n */\nfunction isText(node) {\n  return node && node.nodeType === 3;\n}\n\n/**\n * @method isElement\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is element(1)\n */\nfunction isElement(node) {\n  return node && node.nodeType === 1;\n}\n\n/**\n * ex) br, col, embed, hr, img, input, ...\n * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n */\nfunction isVoid(node) {\n  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());\n}\n\nfunction isPara(node) {\n  if (isEditable(node)) {\n    return false;\n  }\n\n  // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph\n  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nfunction isHeading(node) {\n  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nconst isPre = makePredByNodeName('PRE');\n\nconst isLi = makePredByNodeName('LI');\n\nfunction isPurePara(node) {\n  return isPara(node) && !isLi(node);\n}\n\nconst isTable = makePredByNodeName('TABLE');\n\nconst isData = makePredByNodeName('DATA');\n\nfunction isInline(node) {\n  return !isBodyContainer(node) &&\n         !isList(node) &&\n         !isHr(node) &&\n         !isPara(node) &&\n         !isTable(node) &&\n         !isBlockquote(node) &&\n         !isData(node);\n}\n\nfunction isList(node) {\n  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());\n}\n\nconst isHr = makePredByNodeName('HR');\n\nfunction isCell(node) {\n  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());\n}\n\nconst isBlockquote = makePredByNodeName('BLOCKQUOTE');\n\nfunction isBodyContainer(node) {\n  return isCell(node) || isBlockquote(node) || isEditable(node);\n}\n\nconst isAnchor = makePredByNodeName('A');\n\nfunction isParaInline(node) {\n  return isInline(node) && !!ancestor(node, isPara);\n}\n\nfunction isBodyInline(node) {\n  return isInline(node) && !ancestor(node, isPara);\n}\n\nconst isBody = makePredByNodeName('BODY');\n\n/**\n * returns whether nodeB is closest sibling of nodeA\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @return {Boolean}\n */\nfunction isClosestSibling(nodeA, nodeB) {\n  return nodeA.nextSibling === nodeB ||\n         nodeA.previousSibling === nodeB;\n}\n\n/**\n * returns array of closest siblings with node\n *\n * @param {Node} node\n * @param {function} [pred] - predicate function\n * @return {Node[]}\n */\nfunction withClosestSiblings(node, pred) {\n  pred = pred || func.ok;\n\n  const siblings = [];\n  if (node.previousSibling && pred(node.previousSibling)) {\n    siblings.push(node.previousSibling);\n  }\n  siblings.push(node);\n  if (node.nextSibling && pred(node.nextSibling)) {\n    siblings.push(node.nextSibling);\n  }\n  return siblings;\n}\n\n/**\n * blank HTML for cursor position\n * - [workaround] old IE only works with &nbsp;\n * - [workaround] IE11 and other browser works with bogus br\n */\nconst blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';\n\n/**\n * @method nodeLength\n *\n * returns #text's text size or element's childNodes size\n *\n * @param {Node} node\n */\nfunction nodeLength(node) {\n  if (isText(node)) {\n    return node.nodeValue.length;\n  }\n\n  if (node) {\n    return node.childNodes.length;\n  }\n\n  return 0;\n}\n\n/**\n * returns whether deepest child node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction deepestChildIsEmpty(node) {\n  do {\n    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;\n  } while ((node = node.firstElementChild));\n\n  return isEmpty(node);\n}\n\n/**\n * returns whether node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEmpty(node) {\n  const len = nodeLength(node);\n\n  if (len === 0) {\n    return true;\n  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {\n    // ex) <p><br></p>, <span><br></span>\n    return true;\n  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {\n    // ex) <p></p>, <span></span>\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * padding blankHTML if node is empty (for cursor position)\n */\nfunction paddingBlankHTML(node) {\n  if (!isVoid(node) && !nodeLength(node)) {\n    node.innerHTML = blankHTML;\n  }\n}\n\n/**\n * find nearest ancestor predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction ancestor(node, pred) {\n  while (node) {\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * find nearest ancestor only single child blood line and predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction singleChildAncestor(node, pred) {\n  node = node.parentNode;\n\n  while (node) {\n    if (nodeLength(node) !== 1) { break; }\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * returns new array of ancestor nodes (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listAncestor(node, pred) {\n  pred = pred || func.fail;\n\n  const ancestors = [];\n  ancestor(node, function(el) {\n    if (!isEditable(el)) {\n      ancestors.push(el);\n    }\n\n    return pred(el);\n  });\n  return ancestors;\n}\n\n/**\n * find farthest ancestor predicate hit\n */\nfunction lastAncestor(node, pred) {\n  const ancestors = listAncestor(node);\n  return lists.last(ancestors.filter(pred));\n}\n\n/**\n * returns common ancestor node between two nodes.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n */\nfunction commonAncestor(nodeA, nodeB) {\n  const ancestors = listAncestor(nodeA);\n  for (let n = nodeB; n; n = n.parentNode) {\n    if (ancestors.indexOf(n) > -1) return n;\n  }\n  return null; // difference document area\n}\n\n/**\n * listing all previous siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listPrev(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.previousSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing next siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listNext(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.nextSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing descendant nodes\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listDescendant(node, pred) {\n  const descendants = [];\n  pred = pred || func.ok;\n\n  // start DFS(depth first search) with node\n  (function fnWalk(current) {\n    if (node !== current && pred(current)) {\n      descendants.push(current);\n    }\n    for (let idx = 0, len = current.childNodes.length; idx < len; idx++) {\n      fnWalk(current.childNodes[idx]);\n    }\n  })(node);\n\n  return descendants;\n}\n\n/**\n * wrap node with new tag.\n *\n * @param {Node} node\n * @param {Node} tagName of wrapper\n * @return {Node} - wrapper\n */\nfunction wrap(node, wrapperName) {\n  const parent = node.parentNode;\n  const wrapper = $('<' + wrapperName + '>')[0];\n\n  parent.insertBefore(wrapper, node);\n  wrapper.appendChild(node);\n\n  return wrapper;\n}\n\n/**\n * insert node after preceding\n *\n * @param {Node} node\n * @param {Node} preceding - predicate function\n */\nfunction insertAfter(node, preceding) {\n  const next = preceding.nextSibling;\n  let parent = preceding.parentNode;\n  if (next) {\n    parent.insertBefore(node, next);\n  } else {\n    parent.appendChild(node);\n  }\n  return node;\n}\n\n/**\n * append elements.\n *\n * @param {Node} node\n * @param {Collection} aChild\n */\nfunction appendChildNodes(node, aChild) {\n  $.each(aChild, function(idx, child) {\n    node.appendChild(child);\n  });\n  return node;\n}\n\n/**\n * returns whether boundaryPoint is left edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isLeftEdgePoint(point) {\n  return point.offset === 0;\n}\n\n/**\n * returns whether boundaryPoint is right edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isRightEdgePoint(point) {\n  return point.offset === nodeLength(point.node);\n}\n\n/**\n * returns whether boundaryPoint is edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isEdgePoint(point) {\n  return isLeftEdgePoint(point) || isRightEdgePoint(point);\n}\n\n/**\n * returns whether node is left edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgeOf(node, ancestor) {\n  while (node && node !== ancestor) {\n    if (position(node) !== 0) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether node is right edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgeOf(node, ancestor) {\n  if (!ancestor) {\n    return false;\n  }\n  while (node && node !== ancestor) {\n    if (position(node) !== nodeLength(node.parentNode) - 1) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether point is left edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgePointOf(point, ancestor) {\n  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns whether point is right edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgePointOf(point, ancestor) {\n  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns offset from parent.\n *\n * @param {Node} node\n */\nfunction position(node) {\n  let offset = 0;\n  while ((node = node.previousSibling)) {\n    offset += 1;\n  }\n  return offset;\n}\n\nfunction hasChildren(node) {\n  return !!(node && node.childNodes && node.childNodes.length);\n}\n\n/**\n * returns previous boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction prevPoint(point, isSkipInnerOffset) {\n  let node;\n  let offset;\n\n  if (point.offset === 0) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node);\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset - 1];\n    offset = nodeLength(node);\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? 0 : point.offset - 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPoint(point, isSkipInnerOffset) {\n  let node, offset;\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint with empty node\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPointWithEmptyNode(point, isSkipInnerOffset) {\n  let node, offset = 0;\n\n  // if node is empty string node, return current node's sibling.\n  if (isEmpty(point.node)) {\n    if(point.node === null){\n      return null;\n    }\n\n    node = point.node.nextSibling;\n    offset = 0;\n\n    return {\n      node: node,\n      offset: offset,\n    };\n  }\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node) + 1;\n\n    // if next node is editable ,  return current node's sibling node.\n    if (isEditable(node)) {\n      node = point.node.nextSibling;\n      offset = 0;\n    }\n\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n    if (isEmpty(node)) {\n      if (!isEmpty(point.node.nextSibling)) {\n        return {\n          node: point.node.nextSibling,\n          offset: offset,\n        };\n      }\n      return null;\n    }\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n\n    if (isEmpty(node)) {\n      return null;\n    }\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/*\n* returns the next Text node index or 0 if not found.\n*/\nfunction getNextTextNode(actual) {\n  if(!actual.nextSibling) return undefined;\n  if(actual.parent !== actual.nextSibling.parent) return undefined;\n\n  if(isText(actual.nextSibling) ) return actual.nextSibling;\n  else return getNextTextNode(actual.nextSibling);\n}\n\n/**\n * returns whether pointA and pointB is same or not.\n *\n * @param {BoundaryPoint} pointA\n * @param {BoundaryPoint} pointB\n * @return {Boolean}\n */\nfunction isSamePoint(pointA, pointB) {\n  return pointA.node === pointB.node && pointA.offset === pointB.offset;\n}\n\n/**\n * returns whether point is visible (can set cursor) or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isVisiblePoint(point) {\n  if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {\n    return true;\n  }\n\n  const leftNode = point.node.childNodes[point.offset - 1];\n  const rightNode = point.node.childNodes[point.offset];\n  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * @method prevPointUtil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction prevPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = prevPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * @method nextPointUntil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction nextPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = nextPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * returns whether point has character or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isCharPoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch && (ch !== ' ' && ch !== NBSP_CHAR);\n}\n\n/**\n * returns whether point has space or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isSpacePoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch === ' ' || ch === NBSP_CHAR;\n}\n\n/**\n * @method walkPoint\n *\n * @param {BoundaryPoint} startPoint\n * @param {BoundaryPoint} endPoint\n * @param {Function} handler\n * @param {Boolean} isSkipInnerOffset\n */\nfunction walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {\n  let point = startPoint;\n\n  while (point) {\n    handler(point);\n\n    if (isSamePoint(point, endPoint)) {\n      break;\n    }\n\n    const isSkipOffset = isSkipInnerOffset &&\n                       startPoint.node !== point.node &&\n                       endPoint.node !== point.node;\n    point = nextPointWithEmptyNode(point, isSkipOffset);\n  }\n}\n\n/**\n * @method makeOffsetPath\n *\n * return offsetPath(array of offset) from ancestor\n *\n * @param {Node} ancestor - ancestor node\n * @param {Node} node\n */\nfunction makeOffsetPath(ancestor, node) {\n  const ancestors = listAncestor(node, func.eq(ancestor));\n  return ancestors.map(position).reverse();\n}\n\n/**\n * @method fromOffsetPath\n *\n * return element from offsetPath(array of offset)\n *\n * @param {Node} ancestor - ancestor node\n * @param {array} offsets - offsetPath\n */\nfunction fromOffsetPath(ancestor, offsets) {\n  let current = ancestor;\n  for (let i = 0, len = offsets.length; i < len; i++) {\n    if (current.childNodes.length <= offsets[i]) {\n      current = current.childNodes[current.childNodes.length - 1];\n    } else {\n      current = current.childNodes[offsets[i]];\n    }\n  }\n  return current;\n}\n\n/**\n * @method splitNode\n *\n * split element or #text\n *\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @param {Boolean} [options.isDiscardEmptySplits] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitNode(point, options) {\n  let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;\n  const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;\n  const isDiscardEmptySplits = options && options.isDiscardEmptySplits;\n\n  if (isDiscardEmptySplits) {\n    isSkipPaddingBlankHTML = true;\n  }\n\n  // edge case\n  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {\n    if (isLeftEdgePoint(point)) {\n      return point.node;\n    } else if (isRightEdgePoint(point)) {\n      return point.node.nextSibling;\n    }\n  }\n\n  // split #text\n  if (isText(point.node)) {\n    return point.node.splitText(point.offset);\n  } else {\n    const childNode = point.node.childNodes[point.offset];\n    const clone = insertAfter(point.node.cloneNode(false), point.node);\n    appendChildNodes(clone, listNext(childNode));\n\n    if (!isSkipPaddingBlankHTML) {\n      paddingBlankHTML(point.node);\n      paddingBlankHTML(clone);\n    }\n\n    if (isDiscardEmptySplits) {\n      if (isEmpty(point.node)) {\n        remove(point.node);\n      }\n      if (isEmpty(clone)) {\n        remove(clone);\n        return point.node.nextSibling;\n      }\n    }\n\n    return clone;\n  }\n}\n\n/**\n * @method splitTree\n *\n * split tree by point\n *\n * @param {Node} root - split root\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitTree(root, point, options) {\n  // ex) [#text, <span>, <p>]\n  const ancestors = listAncestor(point.node, func.eq(root));\n\n  if (!ancestors.length) {\n    return null;\n  } else if (ancestors.length === 1) {\n    return splitNode(point, options);\n  }\n\n  return ancestors.reduce(function(node, parent) {\n    if (node === point.node) {\n      node = splitNode(point, options);\n    }\n\n    return splitNode({\n      node: parent,\n      offset: node ? position(node) : nodeLength(parent),\n    }, options);\n  });\n}\n\n/**\n * split point\n *\n * @param {Point} point\n * @param {Boolean} isInline\n * @return {Object}\n */\nfunction splitPoint(point, isInline) {\n  // find splitRoot, container\n  //  - inline: splitRoot is a child of paragraph\n  //  - block: splitRoot is a child of bodyContainer\n  const pred = isInline ? isPara : isBodyContainer;\n  const ancestors = listAncestor(point.node, pred);\n  const topAncestor = lists.last(ancestors) || point.node;\n\n  let splitRoot, container;\n  if (pred(topAncestor)) {\n    splitRoot = ancestors[ancestors.length - 2];\n    container = topAncestor;\n  } else {\n    splitRoot = topAncestor;\n    container = splitRoot.parentNode;\n  }\n\n  // if splitRoot is exists, split with splitTree\n  let pivot = splitRoot && splitTree(splitRoot, point, {\n    isSkipPaddingBlankHTML: isInline,\n    isNotSplitEdgePoint: isInline,\n  });\n\n  // if container is point.node, find pivot with point.offset\n  if (!pivot && container === point.node) {\n    pivot = point.node.childNodes[point.offset];\n  }\n\n  return {\n    rightNode: pivot,\n    container: container,\n  };\n}\n\nfunction create(nodeName) {\n  return document.createElement(nodeName);\n}\n\nfunction createText(text) {\n  return document.createTextNode(text);\n}\n\n/**\n * @method remove\n *\n * remove node, (isRemoveChild: remove child or not)\n *\n * @param {Node} node\n * @param {Boolean} isRemoveChild\n */\nfunction remove(node, isRemoveChild) {\n  if (!node || !node.parentNode) { return; }\n  if (node.removeNode) { return node.removeNode(isRemoveChild); }\n\n  const parent = node.parentNode;\n  if (!isRemoveChild) {\n    const nodes = [];\n    for (let i = 0, len = node.childNodes.length; i < len; i++) {\n      nodes.push(node.childNodes[i]);\n    }\n\n    for (let i = 0, len = nodes.length; i < len; i++) {\n      parent.insertBefore(nodes[i], node);\n    }\n  }\n\n  parent.removeChild(node);\n}\n\n/**\n * @method removeWhile\n *\n * @param {Node} node\n * @param {Function} pred\n */\nfunction removeWhile(node, pred) {\n  while (node) {\n    if (isEditable(node) || !pred(node)) {\n      break;\n    }\n\n    const parent = node.parentNode;\n    remove(node);\n    node = parent;\n  }\n}\n\n/**\n * @method replace\n *\n * replace node with provided nodeName\n *\n * @param {Node} node\n * @param {String} nodeName\n * @return {Node} - new node\n */\nfunction replace(node, nodeName) {\n  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {\n    return node;\n  }\n\n  const newNode = create(nodeName);\n\n  if (node.style.cssText) {\n    newNode.style.cssText = node.style.cssText;\n  }\n\n  appendChildNodes(newNode, lists.from(node.childNodes));\n  insertAfter(newNode, node);\n  remove(node);\n\n  return newNode;\n}\n\nconst isTextarea = makePredByNodeName('TEXTAREA');\n\n/**\n * @param {jQuery} $node\n * @param {Boolean} [stripLinebreaks] - default: false\n */\nfunction value($node, stripLinebreaks) {\n  const val = isTextarea($node[0]) ? $node.val() : $node.html();\n  if (stripLinebreaks) {\n    return val.replace(/[\\n\\r]/g, '');\n  }\n  return val;\n}\n\n/**\n * @method html\n *\n * get the HTML contents of node\n *\n * @param {jQuery} $node\n * @param {Boolean} [isNewlineOnBlock]\n */\nfunction html($node, isNewlineOnBlock) {\n  let markup = value($node);\n\n  if (isNewlineOnBlock) {\n    const regexTag = /<(\\/?)(\\b(?!!)[^>\\s]*)(.*?)(\\s*\\/?>)/g;\n    markup = markup.replace(regexTag, function(match, endSlash, name) {\n      name = name.toUpperCase();\n      const isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&\n                                   !!endSlash;\n      const isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);\n\n      return match + ((isEndOfInlineContainer || isBlockNode) ? '\\n' : '');\n    });\n    markup = markup.trim();\n  }\n\n  return markup;\n}\n\nfunction posFromPlaceholder(placeholder) {\n  const $placeholder = $(placeholder);\n  const pos = $placeholder.offset();\n  const height = $placeholder.outerHeight(true); // include margin\n\n  return {\n    left: pos.left,\n    top: pos.top + height,\n  };\n}\n\nfunction attachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.on(key, events[key]);\n  });\n}\n\nfunction detachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.off(key, events[key]);\n  });\n}\n\n/**\n * @method isCustomStyleTag\n *\n * assert if a node contains a \"note-styletag\" class,\n * which implies that's a custom-made style tag node\n *\n * @param {Node} an HTML DOM node\n */\nfunction isCustomStyleTag(node) {\n  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');\n}\n\nexport default {\n  /** @property {String} NBSP_CHAR */\n  NBSP_CHAR,\n  /** @property {String} ZERO_WIDTH_NBSP_CHAR */\n  ZERO_WIDTH_NBSP_CHAR,\n  /** @property {String} blank */\n  blank: blankHTML,\n  /** @property {String} emptyPara */\n  emptyPara: `<p>${blankHTML}</p>`,\n  makePredByNodeName,\n  isEditable,\n  isControlSizing,\n  isText,\n  isElement,\n  isVoid,\n  isPara,\n  isPurePara,\n  isHeading,\n  isInline,\n  isBlock: func.not(isInline),\n  isBodyInline,\n  isBody,\n  isParaInline,\n  isPre,\n  isList,\n  isTable,\n  isData,\n  isCell,\n  isBlockquote,\n  isBodyContainer,\n  isAnchor,\n  isDiv: makePredByNodeName('DIV'),\n  isLi,\n  isBR: makePredByNodeName('BR'),\n  isSpan: makePredByNodeName('SPAN'),\n  isB: makePredByNodeName('B'),\n  isU: makePredByNodeName('U'),\n  isS: makePredByNodeName('S'),\n  isI: makePredByNodeName('I'),\n  isImg: makePredByNodeName('IMG'),\n  isTextarea,\n  deepestChildIsEmpty,\n  isEmpty,\n  isEmptyAnchor: func.and(isAnchor, isEmpty),\n  isClosestSibling,\n  withClosestSiblings,\n  nodeLength,\n  isLeftEdgePoint,\n  isRightEdgePoint,\n  isEdgePoint,\n  isLeftEdgeOf,\n  isRightEdgeOf,\n  isLeftEdgePointOf,\n  isRightEdgePointOf,\n  prevPoint,\n  nextPoint,\n  nextPointWithEmptyNode,\n  isSamePoint,\n  isVisiblePoint,\n  prevPointUntil,\n  nextPointUntil,\n  isCharPoint,\n  isSpacePoint,\n  walkPoint,\n  ancestor,\n  singleChildAncestor,\n  listAncestor,\n  lastAncestor,\n  listNext,\n  listPrev,\n  listDescendant,\n  commonAncestor,\n  wrap,\n  insertAfter,\n  appendChildNodes,\n  position,\n  hasChildren,\n  makeOffsetPath,\n  fromOffsetPath,\n  splitTree,\n  splitPoint,\n  create,\n  createText,\n  remove,\n  removeWhile,\n  replace,\n  html,\n  value,\n  posFromPlaceholder,\n  attachEvents,\n  detachEvents,\n  isCustomStyleTag,\n};\n","import $ from 'jquery';\nimport func from './core/func';\nimport lists from './core/lists';\nimport dom from './core/dom';\n\nexport default class Context {\n  /**\n   * @param {jQuery} $note\n   * @param {Object} options\n   */\n  constructor($note, options) {\n    this.$note = $note;\n\n    this.memos = {};\n    this.modules = {};\n    this.layoutInfo = {};\n    this.options = $.extend(true, {}, options);\n\n    // init ui with options\n    $.summernote.ui = $.summernote.ui_template(this.options);\n    this.ui = $.summernote.ui;\n\n    this.initialize();\n  }\n\n  /**\n   * create layout and initialize modules and other resources\n   */\n  initialize() {\n    this.layoutInfo = this.ui.createLayout(this.$note);\n    this._initialize();\n    this.$note.hide();\n    return this;\n  }\n\n  /**\n   * destroy modules and other resources and remove layout\n   */\n  destroy() {\n    this._destroy();\n    this.$note.removeData('summernote');\n    this.ui.removeLayout(this.$note, this.layoutInfo);\n  }\n\n  /**\n   * destory modules and other resources and initialize it again\n   */\n  reset() {\n    const disabled = this.isDisabled();\n    this.code(dom.emptyPara);\n    this._destroy();\n    this._initialize();\n\n    if (disabled) {\n      this.disable();\n    }\n  }\n\n  _initialize() {\n    // set own id\n    this.options.id = func.uniqueId($.now());\n    // set default container for tooltips, popovers, and dialogs\n    this.options.container = this.options.container || this.layoutInfo.editor;\n\n    // add optional buttons\n    const buttons = $.extend({}, this.options.buttons);\n    Object.keys(buttons).forEach((key) => {\n      this.memo('button.' + key, buttons[key]);\n    });\n\n    const modules = $.extend({}, this.options.modules, $.summernote.plugins || {});\n\n    // add and initialize modules\n    Object.keys(modules).forEach((key) => {\n      this.module(key, modules[key], true);\n    });\n\n    Object.keys(this.modules).forEach((key) => {\n      this.initializeModule(key);\n    });\n  }\n\n  _destroy() {\n    // destroy modules with reversed order\n    Object.keys(this.modules).reverse().forEach((key) => {\n      this.removeModule(key);\n    });\n\n    Object.keys(this.memos).forEach((key) => {\n      this.removeMemo(key);\n    });\n    // trigger custom onDestroy callback\n    this.triggerEvent('destroy', this);\n  }\n\n  code(html) {\n    const isActivated = this.invoke('codeview.isActivated');\n\n    if (html === undefined) {\n      this.invoke('codeview.sync');\n      return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();\n    } else {\n      if (isActivated) {\n        this.invoke('codeview.sync', html);\n      } else {\n        this.layoutInfo.editable.html(html);\n      }\n      this.$note.val(html);\n      this.triggerEvent('change', html, this.layoutInfo.editable);\n    }\n  }\n\n  isDisabled() {\n    return this.layoutInfo.editable.attr('contenteditable') === 'false';\n  }\n\n  enable() {\n    this.layoutInfo.editable.attr('contenteditable', true);\n    this.invoke('toolbar.activate', true);\n    this.triggerEvent('disable', false);\n    this.options.editing = true;\n  }\n\n  disable() {\n    // close codeview if codeview is opend\n    if (this.invoke('codeview.isActivated')) {\n      this.invoke('codeview.deactivate');\n    }\n    this.layoutInfo.editable.attr('contenteditable', false);\n    this.options.editing = false;\n    this.invoke('toolbar.deactivate', true);\n\n    this.triggerEvent('disable', true);\n  }\n\n  triggerEvent() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];\n    if (callback) {\n      callback.apply(this.$note[0], args);\n    }\n    this.$note.trigger('summernote.' + namespace, args);\n  }\n\n  initializeModule(key) {\n    const module = this.modules[key];\n    module.shouldInitialize = module.shouldInitialize || func.ok;\n    if (!module.shouldInitialize()) {\n      return;\n    }\n\n    // initialize module\n    if (module.initialize) {\n      module.initialize();\n    }\n\n    // attach events\n    if (module.events) {\n      dom.attachEvents(this.$note, module.events);\n    }\n  }\n\n  module(key, ModuleClass, withoutIntialize) {\n    if (arguments.length === 1) {\n      return this.modules[key];\n    }\n\n    this.modules[key] = new ModuleClass(this);\n\n    if (!withoutIntialize) {\n      this.initializeModule(key);\n    }\n  }\n\n  removeModule(key) {\n    const module = this.modules[key];\n    if (module.shouldInitialize()) {\n      if (module.events) {\n        dom.detachEvents(this.$note, module.events);\n      }\n\n      if (module.destroy) {\n        module.destroy();\n      }\n    }\n\n    delete this.modules[key];\n  }\n\n  memo(key, obj) {\n    if (arguments.length === 1) {\n      return this.memos[key];\n    }\n    this.memos[key] = obj;\n  }\n\n  removeMemo(key) {\n    if (this.memos[key] && this.memos[key].destroy) {\n      this.memos[key].destroy();\n    }\n\n    delete this.memos[key];\n  }\n\n  /**\n   * Some buttons need to change their visual style immediately once they get pressed\n   */\n  createInvokeHandlerAndUpdateState(namespace, value) {\n    return (event) => {\n      this.createInvokeHandler(namespace, value)(event);\n      this.invoke('buttons.updateCurrentStyle');\n    };\n  }\n\n  createInvokeHandler(namespace, value) {\n    return (event) => {\n      event.preventDefault();\n      const $target = $(event.target);\n      this.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);\n    };\n  }\n\n  invoke() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const splits = namespace.split('.');\n    const hasSeparator = splits.length > 1;\n    const moduleName = hasSeparator && lists.head(splits);\n    const methodName = hasSeparator ? lists.last(splits) : lists.head(splits);\n\n    const module = this.modules[moduleName || 'editor'];\n    if (!moduleName && this[methodName]) {\n      return this[methodName].apply(this, args);\n    } else if (module && module[methodName] && module.shouldInitialize()) {\n      return module[methodName].apply(module, args);\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from './core/env';\nimport lists from './core/lists';\nimport Context from './Context';\n\n$.fn.extend({\n  /**\n   * Summernote API\n   *\n   * @param {Object|String}\n   * @return {this}\n   */\n  summernote: function() {\n    const type = $.type(lists.head(arguments));\n    const isExternalAPICalled = type === 'string';\n    const hasInitOptions = type === 'object';\n\n    const options = $.extend({}, $.summernote.options, hasInitOptions ? lists.head(arguments) : {});\n\n    // Update options\n    options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);\n    options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons);\n    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;\n\n    this.each((idx, note) => {\n      const $note = $(note);\n      if (!$note.data('summernote')) {\n        const context = new Context($note, options);\n        $note.data('summernote', context);\n        $note.data('summernote').triggerEvent('init', context.layoutInfo);\n      }\n    });\n\n    const $note = this.first();\n    if ($note.length) {\n      const context = $note.data('summernote');\n      if (isExternalAPICalled) {\n        return context.invoke.apply(context, lists.from(arguments));\n      } else if (options.focus) {\n        context.invoke('editor.focus');\n      }\n    }\n\n    return this;\n  },\n});\n","import $ from 'jquery';\nimport env from './env';\nimport func from './func';\nimport lists from './lists';\nimport dom from './dom';\n\n/**\n * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js\n *\n * @param {TextRange} textRange\n * @param {Boolean} isStart\n * @return {BoundaryPoint}\n *\n * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx\n */\nfunction textRangeToPoint(textRange, isStart) {\n  let container = textRange.parentElement();\n  let offset;\n\n  const tester = document.body.createTextRange();\n  let prevContainer;\n  const childNodes = lists.from(container.childNodes);\n  for (offset = 0; offset < childNodes.length; offset++) {\n    if (dom.isText(childNodes[offset])) {\n      continue;\n    }\n    tester.moveToElementText(childNodes[offset]);\n    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {\n      break;\n    }\n    prevContainer = childNodes[offset];\n  }\n\n  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {\n    const textRangeStart = document.body.createTextRange();\n    let curTextNode = null;\n    textRangeStart.moveToElementText(prevContainer || container);\n    textRangeStart.collapse(!prevContainer);\n    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;\n\n    const pointTester = textRange.duplicate();\n    pointTester.setEndPoint('StartToStart', textRangeStart);\n    let textCount = pointTester.text.replace(/[\\r\\n]/g, '').length;\n\n    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    // [workaround] enforce IE to re-reference curTextNode, hack\n    const dummy = curTextNode.nodeValue; // eslint-disable-line\n\n    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&\n      textCount === curTextNode.nodeValue.length) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    container = curTextNode;\n    offset = textCount;\n  }\n\n  return {\n    cont: container,\n    offset: offset,\n  };\n}\n\n/**\n * return TextRange from boundary point (inspired by google closure-library)\n * @param {BoundaryPoint} point\n * @return {TextRange}\n */\nfunction pointToTextRange(point) {\n  const textRangeInfo = function(container, offset) {\n    let node, isCollapseToStart;\n\n    if (dom.isText(container)) {\n      const prevTextNodes = dom.listPrev(container, func.not(dom.isText));\n      const prevContainer = lists.last(prevTextNodes).previousSibling;\n      node = prevContainer || container.parentNode;\n      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);\n      isCollapseToStart = !prevContainer;\n    } else {\n      node = container.childNodes[offset] || container;\n      if (dom.isText(node)) {\n        return textRangeInfo(node, 0);\n      }\n\n      offset = 0;\n      isCollapseToStart = false;\n    }\n\n    return {\n      node: node,\n      collapseToStart: isCollapseToStart,\n      offset: offset,\n    };\n  };\n\n  const textRange = document.body.createTextRange();\n  const info = textRangeInfo(point.node, point.offset);\n\n  textRange.moveToElementText(info.node);\n  textRange.collapse(info.collapseToStart);\n  textRange.moveStart('character', info.offset);\n  return textRange;\n}\n\n/**\n   * Wrapped Range\n   *\n   * @constructor\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   */\nclass WrappedRange {\n  constructor(sc, so, ec, eo) {\n    this.sc = sc;\n    this.so = so;\n    this.ec = ec;\n    this.eo = eo;\n\n    // isOnEditable: judge whether range is on editable or not\n    this.isOnEditable = this.makeIsOn(dom.isEditable);\n    // isOnList: judge whether range is on list node or not\n    this.isOnList = this.makeIsOn(dom.isList);\n    // isOnAnchor: judge whether range is on anchor node or not\n    this.isOnAnchor = this.makeIsOn(dom.isAnchor);\n    // isOnCell: judge whether range is on cell node or not\n    this.isOnCell = this.makeIsOn(dom.isCell);\n    // isOnData: judge whether range is on data node or not\n    this.isOnData = this.makeIsOn(dom.isData);\n  }\n\n  // nativeRange: get nativeRange from sc, so, ec, eo\n  nativeRange() {\n    if (env.isW3CRangeSupport) {\n      const w3cRange = document.createRange();\n      w3cRange.setStart(this.sc, this.so);\n      w3cRange.setEnd(this.ec, this.eo);\n\n      return w3cRange;\n    } else {\n      const textRange = pointToTextRange({\n        node: this.sc,\n        offset: this.so,\n      });\n\n      textRange.setEndPoint('EndToEnd', pointToTextRange({\n        node: this.ec,\n        offset: this.eo,\n      }));\n\n      return textRange;\n    }\n  }\n\n  getPoints() {\n    return {\n      sc: this.sc,\n      so: this.so,\n      ec: this.ec,\n      eo: this.eo,\n    };\n  }\n\n  getStartPoint() {\n    return {\n      node: this.sc,\n      offset: this.so,\n    };\n  }\n\n  getEndPoint() {\n    return {\n      node: this.ec,\n      offset: this.eo,\n    };\n  }\n\n  /**\n   * select update visible range\n   */\n  select() {\n    const nativeRng = this.nativeRange();\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (selection.rangeCount > 0) {\n        selection.removeAllRanges();\n      }\n      selection.addRange(nativeRng);\n    } else {\n      nativeRng.select();\n    }\n\n    return this;\n  }\n\n  /**\n   * Moves the scrollbar to start container(sc) of current range\n   *\n   * @return {WrappedRange}\n   */\n  scrollIntoView(container) {\n    const height = $(container).height();\n    if (container.scrollTop + height < this.sc.offsetTop) {\n      container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);\n    }\n\n    return this;\n  }\n\n  /**\n   * @return {WrappedRange}\n   */\n  normalize() {\n    /**\n     * @param {BoundaryPoint} point\n     * @param {Boolean} isLeftToRight - true: prefer to choose right node\n     *                                - false: prefer to choose left node\n     * @return {BoundaryPoint}\n     */\n    const getVisiblePoint = function(point, isLeftToRight) {\n      if (!point) {\n        return point;\n      }\n\n      // Just use the given point [XXX:Adhoc]\n      //  - case 01. if the point is on the middle of the node\n      //  - case 02. if the point is on the right edge and prefer to choose left node\n      //  - case 03. if the point is on the left edge and prefer to choose right node\n      //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void\n      //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void\n      //  - case 06. if the point is on the block node and there is no children\n      if (dom.isVisiblePoint(point)) {\n        if (!dom.isEdgePoint(point) ||\n            (dom.isRightEdgePoint(point) && !isLeftToRight) ||\n            (dom.isLeftEdgePoint(point) && isLeftToRight) ||\n            (dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling)) ||\n            (dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling)) ||\n            (dom.isBlock(point.node) && dom.isEmpty(point.node))) {\n          return point;\n        }\n      }\n\n      // point on block's edge\n      const block = dom.ancestor(point.node, dom.isBlock);\n      let hasRightNode = false;\n\n      if (!hasRightNode) {\n        const prevPoint = dom.prevPoint(point) || { node: null };\n        hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;\n      }\n\n      let hasLeftNode = false;\n      if (!hasLeftNode) {\n        const nextPoint = dom.nextPoint(point) || { node: null };\n        hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(nextPoint.node)) && isLeftToRight;\n      }\n\n      if (hasRightNode || hasLeftNode) {\n        // returns point already on visible point\n        if (dom.isVisiblePoint(point)) {\n          return point;\n        }\n        // reverse direction\n        isLeftToRight = !isLeftToRight;\n      }\n\n      const nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint)\n        : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);\n      return nextPoint || point;\n    };\n\n    const endPoint = getVisiblePoint(this.getEndPoint(), false);\n    const startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns matched nodes on range\n   *\n   * @param {Function} [pred] - predicate function\n   * @param {Object} [options]\n   * @param {Boolean} [options.includeAncestor]\n   * @param {Boolean} [options.fullyContains]\n   * @return {Node[]}\n   */\n  nodes(pred, options) {\n    pred = pred || func.ok;\n\n    const includeAncestor = options && options.includeAncestor;\n    const fullyContains = options && options.fullyContains;\n\n    // TODO compare points and sort\n    const startPoint = this.getStartPoint();\n    const endPoint = this.getEndPoint();\n\n    const nodes = [];\n    const leftEdgeNodes = [];\n\n    dom.walkPoint(startPoint, endPoint, function(point) {\n      if (dom.isEditable(point.node)) {\n        return;\n      }\n\n      let node;\n      if (fullyContains) {\n        if (dom.isLeftEdgePoint(point)) {\n          leftEdgeNodes.push(point.node);\n        }\n        if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {\n          node = point.node;\n        }\n      } else if (includeAncestor) {\n        node = dom.ancestor(point.node, pred);\n      } else {\n        node = point.node;\n      }\n\n      if (node && pred(node)) {\n        nodes.push(node);\n      }\n    }, true);\n\n    return lists.unique(nodes);\n  }\n\n  /**\n   * returns commonAncestor of range\n   * @return {Element} - commonAncestor\n   */\n  commonAncestor() {\n    return dom.commonAncestor(this.sc, this.ec);\n  }\n\n  /**\n   * returns expanded range by pred\n   *\n   * @param {Function} pred - predicate function\n   * @return {WrappedRange}\n   */\n  expand(pred) {\n    const startAncestor = dom.ancestor(this.sc, pred);\n    const endAncestor = dom.ancestor(this.ec, pred);\n\n    if (!startAncestor && !endAncestor) {\n      return new WrappedRange(this.sc, this.so, this.ec, this.eo);\n    }\n\n    const boundaryPoints = this.getPoints();\n\n    if (startAncestor) {\n      boundaryPoints.sc = startAncestor;\n      boundaryPoints.so = 0;\n    }\n\n    if (endAncestor) {\n      boundaryPoints.ec = endAncestor;\n      boundaryPoints.eo = dom.nodeLength(endAncestor);\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * @param {Boolean} isCollapseToStart\n   * @return {WrappedRange}\n   */\n  collapse(isCollapseToStart) {\n    if (isCollapseToStart) {\n      return new WrappedRange(this.sc, this.so, this.sc, this.so);\n    } else {\n      return new WrappedRange(this.ec, this.eo, this.ec, this.eo);\n    }\n  }\n\n  /**\n   * splitText on range\n   */\n  splitText() {\n    const isSameContainer = this.sc === this.ec;\n    const boundaryPoints = this.getPoints();\n\n    if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {\n      this.ec.splitText(this.eo);\n    }\n\n    if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {\n      boundaryPoints.sc = this.sc.splitText(this.so);\n      boundaryPoints.so = 0;\n\n      if (isSameContainer) {\n        boundaryPoints.ec = boundaryPoints.sc;\n        boundaryPoints.eo = this.eo - this.so;\n      }\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * delete contents on range\n   * @return {WrappedRange}\n   */\n  deleteContents() {\n    if (this.isCollapsed()) {\n      return this;\n    }\n\n    const rng = this.splitText();\n    const nodes = rng.nodes(null, {\n      fullyContains: true,\n    });\n\n    // find new cursor point\n    const point = dom.prevPointUntil(rng.getStartPoint(), function(point) {\n      return !lists.contains(nodes, point.node);\n    });\n\n    const emptyParents = [];\n    $.each(nodes, function(idx, node) {\n      // find empty parents\n      const parent = node.parentNode;\n      if (point.node !== parent && dom.nodeLength(parent) === 1) {\n        emptyParents.push(parent);\n      }\n      dom.remove(node, false);\n    });\n\n    // remove empty parents\n    $.each(emptyParents, function(idx, node) {\n      dom.remove(node, false);\n    });\n\n    return new WrappedRange(\n      point.node,\n      point.offset,\n      point.node,\n      point.offset\n    ).normalize();\n  }\n\n  /**\n   * makeIsOn: return isOn(pred) function\n   */\n  makeIsOn(pred) {\n    return function() {\n      const ancestor = dom.ancestor(this.sc, pred);\n      return !!ancestor && (ancestor === dom.ancestor(this.ec, pred));\n    };\n  }\n\n  /**\n   * @param {Function} pred\n   * @return {Boolean}\n   */\n  isLeftEdgeOf(pred) {\n    if (!dom.isLeftEdgePoint(this.getStartPoint())) {\n      return false;\n    }\n\n    const node = dom.ancestor(this.sc, pred);\n    return node && dom.isLeftEdgeOf(this.sc, node);\n  }\n\n  /**\n   * returns whether range was collapsed or not\n   */\n  isCollapsed() {\n    return this.sc === this.ec && this.so === this.eo;\n  }\n\n  /**\n   * wrap inline nodes which children of body with paragraph\n   *\n   * @return {WrappedRange}\n   */\n  wrapBodyInlineWithPara() {\n    if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {\n      this.sc.innerHTML = dom.emptyPara;\n      return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);\n    }\n\n    /**\n     * [workaround] firefox often create range on not visible point. so normalize here.\n     *  - firefox: |<p>text</p>|\n     *  - chrome: <p>|text|</p>\n     */\n    const rng = this.normalize();\n    if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {\n      return rng;\n    }\n\n    // find inline top ancestor\n    let topAncestor;\n    if (dom.isInline(rng.sc)) {\n      const ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));\n      topAncestor = lists.last(ancestors);\n      if (!dom.isInline(topAncestor)) {\n        topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];\n      }\n    } else {\n      topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];\n    }\n\n    if (topAncestor) {\n      // siblings not in paragraph\n      let inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();\n      inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));\n\n      // wrap with paragraph\n      if (inlineSiblings.length) {\n        const para = dom.wrap(lists.head(inlineSiblings), 'p');\n        dom.appendChildNodes(para, lists.tail(inlineSiblings));\n      }\n    }\n\n    return this.normalize();\n  }\n\n  /**\n   * insert node at current cursor\n   *\n   * @param {Node} node\n   * @return {Node}\n   */\n  insertNode(node) {\n    let rng = this;\n\n    if (dom.isText(node) || dom.isInline(node)) {\n      rng = this.wrapBodyInlineWithPara().deleteContents();\n    }\n\n    const info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));\n    if (info.rightNode) {\n      info.rightNode.parentNode.insertBefore(node, info.rightNode);\n      if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {\n        info.rightNode.parentNode.removeChild(info.rightNode);\n      }\n    } else {\n      info.container.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * insert html at current cursor\n   */\n  pasteHTML(markup) {\n    markup = $.trim(markup);\n\n    const contentsContainer = $('<div></div>').html(markup)[0];\n    let childNodes = lists.from(contentsContainer.childNodes);\n\n    // const rng = this.wrapBodyInlineWithPara().deleteContents();\n    const rng = this;\n    let reversed = false;\n\n    if (rng.so >= 0) {\n      childNodes = childNodes.reverse();\n      reversed = true;\n    }\n\n    childNodes = childNodes.map(function(childNode) {\n      return rng.insertNode(childNode);\n    });\n\n    if (reversed) {\n      childNodes = childNodes.reverse();\n    }\n    return childNodes;\n  }\n\n  /**\n   * returns text in range\n   *\n   * @return {String}\n   */\n  toString() {\n    const nativeRng = this.nativeRange();\n    return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;\n  }\n\n  /**\n   * returns range for word before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordRange(findAfter) {\n    let endPoint = this.getEndPoint();\n\n    if (!dom.isCharPoint(endPoint)) {\n      return this;\n    }\n\n    const startPoint = dom.prevPointUntil(endPoint, function(point) {\n      return !dom.isCharPoint(point);\n    });\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, function(point) {\n        return !dom.isCharPoint(point);\n      });\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordsRange(findAfter) {\n    var endPoint = this.getEndPoint();\n\n    var isNotTextPoint = function(point) {\n      return !dom.isCharPoint(point) && !dom.isSpacePoint(point);\n    };\n\n    if (isNotTextPoint(endPoint)) {\n      return this;\n    }\n\n    var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor that match with a Regex\n   *\n   * example:\n   *  range: 'hi @Peter Pan'\n   *  regex: '/@[a-z ]+/i'\n   *  return range: '@Peter Pan'\n   *\n   * @param {RegExp} [regex]\n   * @return {WrappedRange|null}\n   */\n  getWordsMatchRange(regex) {\n    var endPoint = this.getEndPoint();\n\n    var startPoint = dom.prevPointUntil(endPoint, function(point) {\n      if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {\n        return true;\n      }\n      var rng = new WrappedRange(\n        point.node,\n        point.offset,\n        endPoint.node,\n        endPoint.offset\n      );\n      var result = regex.exec(rng.toString());\n      return result && result.index === 0;\n    });\n\n    var rng = new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n\n    var text = rng.toString();\n    var result = regex.exec(text);\n\n    if (result && result[0].length === text.length) {\n      return rng;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * create offsetPath bookmark\n   *\n   * @param {Node} editable\n   */\n  bookmark(editable) {\n    return {\n      s: {\n        path: dom.makeOffsetPath(editable, this.sc),\n        offset: this.so,\n      },\n      e: {\n        path: dom.makeOffsetPath(editable, this.ec),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * create offsetPath bookmark base on paragraph\n   *\n   * @param {Node[]} paras\n   */\n  paraBookmark(paras) {\n    return {\n      s: {\n        path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),\n        offset: this.so,\n      },\n      e: {\n        path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * getClientRects\n   * @return {Rect[]}\n   */\n  getClientRects() {\n    const nativeRng = this.nativeRange();\n    return nativeRng.getClientRects();\n  }\n}\n\n/**\n * Data structure\n *  * BoundaryPoint: a point of dom tree\n *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range\n *\n * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position\n */\nexport default {\n  /**\n   * create Range Object From arguments or Browser Selection\n   *\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   * @return {WrappedRange}\n   */\n  create: function(sc, so, ec, eo) {\n    if (arguments.length === 4) {\n      return new WrappedRange(sc, so, ec, eo);\n    } else if (arguments.length === 2) { // collapsed\n      ec = sc;\n      eo = so;\n      return new WrappedRange(sc, so, ec, eo);\n    } else {\n      let wrappedRange = this.createFromSelection();\n\n      if (!wrappedRange && arguments.length === 1) {\n        let bodyElement = arguments[0];\n        if (dom.isEditable(bodyElement)) {\n          bodyElement = bodyElement.lastChild;\n        }\n        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);\n      }\n      return wrappedRange;\n    }\n  },\n\n  createFromBodyElement: function(bodyElement, isCollapseToStart = false) {\n    var wrappedRange = this.createFromNode(bodyElement);\n    return wrappedRange.collapse(isCollapseToStart);\n  },\n\n  createFromSelection: function() {\n    let sc, so, ec, eo;\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (!selection || selection.rangeCount === 0) {\n        return null;\n      } else if (dom.isBody(selection.anchorNode)) {\n        // Firefox: returns entire body as range on initialization.\n        // We won't never need it.\n        return null;\n      }\n\n      const nativeRng = selection.getRangeAt(0);\n      sc = nativeRng.startContainer;\n      so = nativeRng.startOffset;\n      ec = nativeRng.endContainer;\n      eo = nativeRng.endOffset;\n    } else { // IE8: TextRange\n      const textRange = document.selection.createRange();\n      const textRangeEnd = textRange.duplicate();\n      textRangeEnd.collapse(false);\n      const textRangeStart = textRange;\n      textRangeStart.collapse(true);\n\n      let startPoint = textRangeToPoint(textRangeStart, true);\n      let endPoint = textRangeToPoint(textRangeEnd, false);\n\n      // same visible point case: range was collapsed.\n      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&\n        dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&\n        endPoint.node.nextSibling === startPoint.node) {\n        startPoint = endPoint;\n      }\n\n      sc = startPoint.cont;\n      so = startPoint.offset;\n      ec = endPoint.cont;\n      eo = endPoint.offset;\n    }\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from node\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNode: function(node) {\n    let sc = node;\n    let so = 0;\n    let ec = node;\n    let eo = dom.nodeLength(ec);\n\n    // browsers can't target a picture or void node\n    if (dom.isVoid(sc)) {\n      so = dom.listPrev(sc).length - 1;\n      sc = sc.parentNode;\n    }\n    if (dom.isBR(ec)) {\n      eo = dom.listPrev(ec).length - 1;\n      ec = ec.parentNode;\n    } else if (dom.isVoid(ec)) {\n      eo = dom.listPrev(ec).length;\n      ec = ec.parentNode;\n    }\n\n    return this.create(sc, so, ec, eo);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeBefore: function(node) {\n    return this.createFromNode(node).collapse(true);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeAfter: function(node) {\n    return this.createFromNode(node).collapse();\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from bookmark\n   *\n   * @param {Node} editable\n   * @param {Object} bookmark\n   * @return {WrappedRange}\n   */\n  createFromBookmark: function(editable, bookmark) {\n    const sc = dom.fromOffsetPath(editable, bookmark.s.path);\n    const so = bookmark.s.offset;\n    const ec = dom.fromOffsetPath(editable, bookmark.e.path);\n    const eo = bookmark.e.offset;\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from paraBookmark\n   *\n   * @param {Object} bookmark\n   * @param {Node[]} paras\n   * @return {WrappedRange}\n   */\n  createFromParaBookmark: function(bookmark, paras) {\n    const so = bookmark.s.offset;\n    const eo = bookmark.e.offset;\n    const sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);\n    const ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n};\n","import lists from './lists';\nimport func from './func';\n\nconst KEY_MAP = {\n  'BACKSPACE': 8,\n  'TAB': 9,\n  'ENTER': 13,\n  'ESCAPE': 27,\n  'SPACE': 32,\n  'DELETE': 46,\n\n  // Arrow\n  'LEFT': 37,\n  'UP': 38,\n  'RIGHT': 39,\n  'DOWN': 40,\n\n  // Number: 0-9\n  'NUM0': 48,\n  'NUM1': 49,\n  'NUM2': 50,\n  'NUM3': 51,\n  'NUM4': 52,\n  'NUM5': 53,\n  'NUM6': 54,\n  'NUM7': 55,\n  'NUM8': 56,\n\n  // Alphabet: a-z\n  'B': 66,\n  'E': 69,\n  'I': 73,\n  'J': 74,\n  'K': 75,\n  'L': 76,\n  'R': 82,\n  'S': 83,\n  'U': 85,\n  'V': 86,\n  'Y': 89,\n  'Z': 90,\n\n  'SLASH': 191,\n  'LEFTBRACKET': 219,\n  'BACKSLASH': 220,\n  'RIGHTBRACKET': 221,\n\n  // Navigation\n  'HOME': 36,\n  'END': 35,\n  'PAGEUP': 33,\n  'PAGEDOWN': 34,\n};\n\n/**\n * @class core.key\n *\n * Object for keycodes.\n *\n * @singleton\n * @alternateClassName key\n */\nexport default {\n  /**\n   * @method isEdit\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isEdit: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.BACKSPACE,\n      KEY_MAP.TAB,\n      KEY_MAP.ENTER,\n      KEY_MAP.SPACE,\n      KEY_MAP.DELETE,\n    ], keyCode);\n  },\n  /**\n   * @method isMove\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isMove: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.LEFT,\n      KEY_MAP.UP,\n      KEY_MAP.RIGHT,\n      KEY_MAP.DOWN,\n    ], keyCode);\n  },\n  /**\n   * @method isNavigation\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isNavigation: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.HOME,\n      KEY_MAP.END,\n      KEY_MAP.PAGEUP,\n      KEY_MAP.PAGEDOWN,\n    ], keyCode);\n  },\n  /**\n   * @property {Object} nameFromCode\n   * @property {String} nameFromCode.8 \"BACKSPACE\"\n   */\n  nameFromCode: func.invertObject(KEY_MAP),\n  code: KEY_MAP,\n};\n","import $ from 'jquery';\n\n/**\n * @method readFileAsDataURL\n *\n * read contents of file as representing URL\n *\n * @param {File} file\n * @return {Promise} - then: dataUrl\n */\nexport function readFileAsDataURL(file) {\n  return $.Deferred((deferred) => {\n    $.extend(new FileReader(), {\n      onload: (e) => {\n        const dataURL = e.target.result;\n        deferred.resolve(dataURL);\n      },\n      onerror: (err) => {\n        deferred.reject(err);\n      },\n    }).readAsDataURL(file);\n  }).promise();\n}\n\n/**\n * @method createImage\n *\n * create `<image>` from url string\n *\n * @param {String} url\n * @return {Promise} - then: $image\n */\nexport function createImage(url) {\n  return $.Deferred((deferred) => {\n    const $img = $('<img>');\n\n    $img.one('load', () => {\n      $img.off('error abort');\n      deferred.resolve($img);\n    }).one('error abort', () => {\n      $img.off('load').detach();\n      deferred.reject($img);\n    }).css({\n      display: 'none',\n    }).appendTo(document.body).attr('src', url);\n  }).promise();\n}\n","import range from '../core/range';\n\nexport default class History {\n  constructor(context) {\n    this.stack = [];\n    this.stackOffset = -1;\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n    this.editable = this.$editable[0];\n  }\n\n  makeSnapshot() {\n    const rng = range.create(this.editable);\n    const emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };\n\n    return {\n      contents: this.$editable.html(),\n      bookmark: ((rng && rng.isOnEditable()) ? rng.bookmark(this.editable) : emptyBookmark),\n    };\n  }\n\n  applySnapshot(snapshot) {\n    if (snapshot.contents !== null) {\n      this.$editable.html(snapshot.contents);\n    }\n    if (snapshot.bookmark !== null) {\n      range.createFromBookmark(this.editable, snapshot.bookmark).select();\n    }\n  }\n\n  /**\n  * @method rewind\n  * Rewinds the history stack back to the first snapshot taken.\n  * Leaves the stack intact, so that \"Redo\" can still be used.\n  */\n  rewind() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    // Return to the first available snapshot.\n    this.stackOffset = 0;\n\n    // Apply that snapshot.\n    this.applySnapshot(this.stack[this.stackOffset]);\n  }\n\n  /**\n  *  @method commit\n  *  Resets history stack, but keeps current editor's content.\n  */\n  commit() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n  * @method reset\n  * Resets the history stack completely; reverting to an empty editor.\n  */\n  reset() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Clear the editable area.\n    this.$editable.html('');\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    if (this.stackOffset > 0) {\n      this.stackOffset--;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    if (this.stack.length - 1 > this.stackOffset) {\n      this.stackOffset++;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * recorded undo\n   */\n  recordUndo() {\n    this.stackOffset++;\n\n    // Wash out stack after stackOffset\n    if (this.stack.length > this.stackOffset) {\n      this.stack = this.stack.slice(0, this.stackOffset);\n    }\n\n    // Create new snapshot and push it to the end\n    this.stack.push(this.makeSnapshot());\n\n    // If the stack size reachs to the limit, then slice it\n    if (this.stack.length > this.context.options.historyLimit) {\n      this.stack.shift();\n      this.stackOffset -= 1;\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class Style {\n  /**\n   * @method jQueryCSS\n   *\n   * [workaround] for old jQuery\n   * passing an array of style properties to .css()\n   * will result in an object of property-value pairs.\n   * (compability with version < 1.9)\n   *\n   * @private\n   * @param  {jQuery} $obj\n   * @param  {Array} propertyNames - An array of one or more CSS properties.\n   * @return {Object}\n   */\n  jQueryCSS($obj, propertyNames) {\n    const result = {};\n    $.each(propertyNames, (idx, propertyName) => {\n      result[propertyName] = $obj.css(propertyName);\n    });\n    return result;\n  }\n\n  /**\n   * returns style object from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  fromNode($node) {\n    const properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];\n    const styleInfo = this.jQueryCSS($node, properties) || {};\n\n    const fontSize = $node[0].style.fontSize || styleInfo['font-size'];\n\n    styleInfo['font-size'] = parseInt(fontSize, 10);\n    styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);\n\n    return styleInfo;\n  }\n\n  /**\n   * paragraph level style\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} styleInfo\n   */\n  stylePara(rng, styleInfo) {\n    $.each(rng.nodes(dom.isPara, {\n      includeAncestor: true,\n    }), (idx, para) => {\n      $(para).css(styleInfo);\n    });\n  }\n\n  /**\n   * insert and returns styleNodes on range.\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} [options] - options for styleNodes\n   * @param {String} [options.nodeName] - default: `SPAN`\n   * @param {Boolean} [options.expandClosestSibling] - default: `false`\n   * @param {Boolean} [options.onlyPartialContains] - default: `false`\n   * @return {Node[]}\n   */\n  styleNodes(rng, options) {\n    rng = rng.splitText();\n\n    const nodeName = (options && options.nodeName) || 'SPAN';\n    const expandClosestSibling = !!(options && options.expandClosestSibling);\n    const onlyPartialContains = !!(options && options.onlyPartialContains);\n\n    if (rng.isCollapsed()) {\n      return [rng.insertNode(dom.create(nodeName))];\n    }\n\n    let pred = dom.makePredByNodeName(nodeName);\n    const nodes = rng.nodes(dom.isText, {\n      fullyContains: true,\n    }).map((text) => {\n      return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);\n    });\n\n    if (expandClosestSibling) {\n      if (onlyPartialContains) {\n        const nodesInRange = rng.nodes();\n        // compose with partial contains predication\n        pred = func.and(pred, (node) => {\n          return lists.contains(nodesInRange, node);\n        });\n      }\n\n      return nodes.map((node) => {\n        const siblings = dom.withClosestSiblings(node, pred);\n        const head = lists.head(siblings);\n        const tails = lists.tail(siblings);\n        $.each(tails, (idx, elem) => {\n          dom.appendChildNodes(head, elem.childNodes);\n          dom.remove(elem);\n        });\n        return lists.head(siblings);\n      });\n    } else {\n      return nodes;\n    }\n  }\n\n  /**\n   * get current style on cursor\n   *\n   * @param {WrappedRange} rng\n   * @return {Object} - object contains style properties.\n   */\n  current(rng) {\n    const $cont = $(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);\n    let styleInfo = this.fromNode($cont);\n\n    // document.queryCommandState for toggle state\n    // [workaround] prevent Firefox nsresult: \"0x80004005 (NS_ERROR_FAILURE)\"\n    try {\n      styleInfo = $.extend(styleInfo, {\n        'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',\n        'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',\n        'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',\n        'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',\n        'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',\n        'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',\n        'font-family': document.queryCommandValue('fontname') || styleInfo['font-family'],\n      });\n    } catch (e) {\n      // eslint-disable-next-line\n    }\n\n    // list-style-type to list-style(unordered, ordered)\n    if (!rng.isOnList()) {\n      styleInfo['list-style'] = 'none';\n    } else {\n      const orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];\n      const isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;\n      styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';\n    }\n\n    const para = dom.ancestor(rng.sc, dom.isPara);\n    if (para && para.style['line-height']) {\n      styleInfo['line-height'] = para.style.lineHeight;\n    } else {\n      const lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);\n      styleInfo['line-height'] = lineHeight.toFixed(1);\n    }\n\n    styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);\n    styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);\n    styleInfo.range = rng;\n\n    return styleInfo;\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport func from '../core/func';\nimport dom from '../core/dom';\nimport range from '../core/range';\n\nexport default class Bullet {\n  /**\n   * toggle ordered list\n   */\n  insertOrderedList(editable) {\n    this.toggleList('OL', editable);\n  }\n\n  /**\n   * toggle unordered list\n   */\n  insertUnorderedList(editable) {\n    this.toggleList('UL', editable);\n  }\n\n  /**\n   * indent\n   */\n  indent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        const previousList = this.findList(head.previousSibling);\n        if (previousList) {\n          paras\n            .map(para => previousList.appendChild(para));\n        } else {\n          this.wrapList(paras, head.parentNode.nodeName);\n          paras\n            .map((para) => para.parentNode)\n            .map((para) => this.appendToPrevious(para));\n        }\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            return (parseInt(val, 10) || 0) + 25;\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * outdent\n   */\n  outdent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        this.releaseList([paras]);\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            val = (parseInt(val, 10) || 0);\n            return val > 25 ? val - 25 : '';\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * toggle list\n   *\n   * @param {String} listName - OL or UL\n   */\n  toggleList(listName, editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    let paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const bookmark = rng.paraBookmark(paras);\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    // paragraph to list\n    if (lists.find(paras, dom.isPurePara)) {\n      let wrappedParas = [];\n      $.each(clustereds, (idx, paras) => {\n        wrappedParas = wrappedParas.concat(this.wrapList(paras, listName));\n      });\n      paras = wrappedParas;\n    // list to paragraph or change list style\n    } else {\n      const diffLists = rng.nodes(dom.isList, {\n        includeAncestor: true,\n      }).filter((listNode) => {\n        return !$.nodeName(listNode, listName);\n      });\n\n      if (diffLists.length) {\n        $.each(diffLists, (idx, listNode) => {\n          dom.replace(listNode, listName);\n        });\n      } else {\n        paras = this.releaseList(clustereds, true);\n      }\n    }\n\n    range.createFromParaBookmark(bookmark, paras).select();\n  }\n\n  /**\n   * @param {Node[]} paras\n   * @param {String} listName\n   * @return {Node[]}\n   */\n  wrapList(paras, listName) {\n    const head = lists.head(paras);\n    const last = lists.last(paras);\n\n    const prevList = dom.isList(head.previousSibling) && head.previousSibling;\n    const nextList = dom.isList(last.nextSibling) && last.nextSibling;\n\n    const listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);\n\n    // P to LI\n    paras = paras.map((para) => {\n      return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;\n    });\n\n    // append to list(<ul>, <ol>)\n    dom.appendChildNodes(listNode, paras);\n\n    if (nextList) {\n      dom.appendChildNodes(listNode, lists.from(nextList.childNodes));\n      dom.remove(nextList);\n    }\n\n    return paras;\n  }\n\n  /**\n   * @method releaseList\n   *\n   * @param {Array[]} clustereds\n   * @param {Boolean} isEscapseToBody\n   * @return {Node[]}\n   */\n  releaseList(clustereds, isEscapseToBody) {\n    let releasedParas = [];\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      const last = lists.last(paras);\n\n      const headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;\n      const parentItem = headList.parentNode;\n\n      if (headList.parentNode.nodeName === 'LI') {\n        paras.map(para => {\n          const newList = this.findNextSiblings(para);\n\n          if (parentItem.nextSibling) {\n            parentItem.parentNode.insertBefore(\n              para,\n              parentItem.nextSibling\n            );\n          } else {\n            parentItem.parentNode.appendChild(para);\n          }\n\n          if (newList.length) {\n            this.wrapList(newList, headList.nodeName);\n            para.appendChild(newList[0].parentNode);\n          }\n        });\n\n        if (headList.children.length === 0) {\n          parentItem.removeChild(headList);\n        }\n\n        if (parentItem.childNodes.length === 0) {\n          parentItem.parentNode.removeChild(parentItem);\n        }\n      } else {\n        const lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {\n          node: last.parentNode,\n          offset: dom.position(last) + 1,\n        }, {\n          isSkipPaddingBlankHTML: true,\n        }) : null;\n\n        const middleList = dom.splitTree(headList, {\n          node: head.parentNode,\n          offset: dom.position(head),\n        }, {\n          isSkipPaddingBlankHTML: true,\n        });\n\n        paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi)\n          : lists.from(middleList.childNodes).filter(dom.isLi);\n\n        // LI to P\n        if (isEscapseToBody || !dom.isList(headList.parentNode)) {\n          paras = paras.map((para) => {\n            return dom.replace(para, 'P');\n          });\n        }\n\n        $.each(lists.from(paras).reverse(), (idx, para) => {\n          dom.insertAfter(para, headList);\n        });\n\n        // remove empty lists\n        const rootLists = lists.compact([headList, middleList, lastList]);\n        $.each(rootLists, (idx, rootList) => {\n          const listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));\n          $.each(listNodes.reverse(), (idx, listNode) => {\n            if (!dom.nodeLength(listNode)) {\n              dom.remove(listNode, true);\n            }\n          });\n        });\n      }\n\n      releasedParas = releasedParas.concat(paras);\n    });\n\n    return releasedParas;\n  }\n\n  /**\n   * @method appendToPrevious\n   *\n   * Appends list to previous list item, if\n   * none exist it wraps the list in a new list item.\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  appendToPrevious(node) {\n    return node.previousSibling\n      ? dom.appendChildNodes(node.previousSibling, [node])\n      : this.wrapList([node], 'LI');\n  }\n\n  /**\n   * @method findList\n   *\n   * Finds an existing list in list item\n   *\n   * @param {HTMLNode} ListItem\n   * @return {Array[]}\n   */\n  findList(node) {\n    return node\n      ? lists.find(node.children, child => ['OL', 'UL'].indexOf(child.nodeName) > -1)\n      : null;\n  }\n\n  /**\n   * @method findNextSiblings\n   *\n   * Finds all list item siblings that follow it\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  findNextSiblings(node) {\n    const siblings = [];\n    while (node.nextSibling) {\n      siblings.push(node.nextSibling);\n      node = node.nextSibling;\n    }\n    return siblings;\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport Bullet from '../editing/Bullet';\n\n/**\n * @class editing.Typing\n *\n * Typing\n *\n */\nexport default class Typing {\n  constructor(context) {\n    // a Bullet instance to toggle lists off\n    this.bullet = new Bullet();\n    this.options = context.options;\n  }\n\n  /**\n   * insert tab\n   *\n   * @param {WrappedRange} rng\n   * @param {Number} tabsize\n   */\n  insertTab(rng, tabsize) {\n    const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));\n    rng = rng.deleteContents();\n    rng.insertNode(tab, true);\n\n    rng = range.create(tab, tabsize);\n    rng.select();\n  }\n\n  /**\n   * insert paragraph\n   *\n   * @param {jQuery} $editable\n   * @param {WrappedRange} rng Can be used in unit tests to \"mock\" the range\n   *\n   * blockquoteBreakingLevel\n   *   0 - No break, the new paragraph remains inside the quote\n   *   1 - Break the first blockquote in the ancestors list\n   *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)\n   */\n  insertParagraph(editable, rng) {\n    rng = rng || range.create(editable);\n\n    // deleteContents on range.\n    rng = rng.deleteContents();\n\n    // Wrap range if it needs to be wrapped by paragraph\n    rng = rng.wrapBodyInlineWithPara();\n\n    // finding paragraph\n    const splitRoot = dom.ancestor(rng.sc, dom.isPara);\n\n    let nextPara;\n    // on paragraph: split paragraph\n    if (splitRoot) {\n      // if it is an empty line with li\n      if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {\n        // toggle UL/OL and escape\n        this.bullet.toggleList(splitRoot.parentNode.nodeName);\n        return;\n      } else {\n        let blockquote = null;\n        if (this.options.blockquoteBreakingLevel === 1) {\n          blockquote = dom.ancestor(splitRoot, dom.isBlockquote);\n        } else if (this.options.blockquoteBreakingLevel === 2) {\n          blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);\n        }\n\n        if (blockquote) {\n          // We're inside a blockquote and options ask us to break it\n          nextPara = $(dom.emptyPara)[0];\n          // If the split is right before a <br>, remove it so that there's no \"empty line\"\n          // after the split in the new blockquote created\n          if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {\n            $(rng.sc.nextSibling).remove();\n          }\n          const split = dom.splitTree(blockquote, rng.getStartPoint(), { isDiscardEmptySplits: true });\n          if (split) {\n            split.parentNode.insertBefore(nextPara, split);\n          } else {\n            dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote\n          }\n        } else {\n          nextPara = dom.splitTree(splitRoot, rng.getStartPoint());\n\n          // not a blockquote, just insert the paragraph\n          let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);\n          emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));\n\n          $.each(emptyAnchors, (idx, anchor) => {\n            dom.remove(anchor);\n          });\n\n          // replace empty heading, pre or custom-made styleTag with P tag\n          if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {\n            nextPara = dom.replace(nextPara, 'p');\n          }\n        }\n      }\n    // no paragraph: insert empty paragraph\n    } else {\n      const next = rng.sc.childNodes[rng.so];\n      nextPara = $(dom.emptyPara)[0];\n      if (next) {\n        rng.sc.insertBefore(nextPara, next);\n      } else {\n        rng.sc.appendChild(nextPara);\n      }\n    }\n\n    range.create(nextPara, 0).normalize().select().scrollIntoView(editable);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport lists from '../core/lists';\n\n/**\n * @class Create a virtual table to create what actions to do in change.\n * @param {object} startPoint Cell selected to apply change.\n * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where\n * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction\n * @param {object} domTable Dom element of table to make changes.\n */\nconst TableResultAction = function(startPoint, where, action, domTable) {\n  const _startPoint = { 'colPos': 0, 'rowPos': 0 };\n  const _virtualTable = [];\n  const _actionCellList = [];\n\n  /// ///////////////////////////////////////////\n  // Private functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Set the startPoint of action.\n   */\n  function setStartPoint() {\n    if (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {\n      // Impossible to identify start Cell point\n      return;\n    }\n    _startPoint.colPos = startPoint.cellIndex;\n    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {\n      // Impossible to identify start Row point\n      return;\n    }\n    _startPoint.rowPos = startPoint.parentElement.rowIndex;\n  }\n\n  /**\n   * Define virtual table position info object.\n   *\n   * @param {int} rowIndex Index position in line of virtual table.\n   * @param {int} cellIndex Index position in column of virtual table.\n   * @param {object} baseRow Row affected by this position.\n   * @param {object} baseCell Cell affected by this position.\n   * @param {bool} isSpan Inform if it is an span cell/row.\n   */\n  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {\n    const objPosition = {\n      'baseRow': baseRow,\n      'baseCell': baseCell,\n      'isRowSpan': isRowSpan,\n      'isColSpan': isColSpan,\n      'isVirtual': isVirtualCell,\n    };\n    if (!_virtualTable[rowIndex]) {\n      _virtualTable[rowIndex] = [];\n    }\n    _virtualTable[rowIndex][cellIndex] = objPosition;\n  }\n\n  /**\n   * Create action cell object.\n   *\n   * @param {object} virtualTableCellObj Object of specific position on virtual table.\n   * @param {enum} resultAction Action to be applied in that item.\n   */\n  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {\n    return {\n      'baseCell': virtualTableCellObj.baseCell,\n      'action': resultAction,\n      'virtualTable': {\n        'rowIndex': virtualRowPosition,\n        'cellIndex': virtualColPosition,\n      },\n    };\n  }\n\n  /**\n   * Recover free index of row to append Cell.\n   *\n   * @param {int} rowIndex Index of row to find free space.\n   * @param {int} cellIndex Index of cell to find free space in table.\n   */\n  function recoverCellIndex(rowIndex, cellIndex) {\n    if (!_virtualTable[rowIndex]) {\n      return cellIndex;\n    }\n    if (!_virtualTable[rowIndex][cellIndex]) {\n      return cellIndex;\n    }\n\n    let newCellIndex = cellIndex;\n    while (_virtualTable[rowIndex][newCellIndex]) {\n      newCellIndex++;\n      if (!_virtualTable[rowIndex][newCellIndex]) {\n        return newCellIndex;\n      }\n    }\n  }\n\n  /**\n   * Recover info about row and cell and add information to virtual table.\n   *\n   * @param {object} row Row to recover information.\n   * @param {object} cell Cell to recover information.\n   */\n  function addCellInfoToVirtual(row, cell) {\n    const cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);\n    const cellHasColspan = (cell.colSpan > 1);\n    const cellHasRowspan = (cell.rowSpan > 1);\n    const isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);\n    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);\n\n    // Add span rows to virtual Table.\n    const rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;\n    if (rowspanNumber > 1) {\n      for (let rp = 1; rp < rowspanNumber; rp++) {\n        const rowspanIndex = row.rowIndex + rp;\n        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);\n      }\n    }\n\n    // Add span cols to virtual table.\n    const colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;\n    if (colspanNumber > 1) {\n      for (let cp = 1; cp < colspanNumber; cp++) {\n        const cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));\n        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);\n      }\n    }\n  }\n\n  /**\n   * Process validation and adjust of start point if needed\n   *\n   * @param {int} rowIndex\n   * @param {int} cellIndex\n   * @param {object} cell\n   * @param {bool} isSelectedCell\n   */\n  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {\n    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {\n      _startPoint.colPos++;\n    }\n  }\n\n  /**\n   * Create virtual table of cells with all cells, including span cells.\n   */\n  function createVirtualTable() {\n    const rows = domTable.rows;\n    for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      const cells = rows[rowIndex].cells;\n      for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);\n      }\n    }\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getDeleteResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (!cell.isVirtual && cell.isRowSpan) {\n          return TableResultAction.resultAction.AddCell;\n        } else if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.RemoveCell;\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getAddResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isRowSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isColSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.AddCell;\n  }\n\n  function init() {\n    setStartPoint();\n    createVirtualTable();\n  }\n\n  /// ///////////////////////////////////////////\n  // Public functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Recover array os what to do in table.\n   */\n  this.getActionList = function() {\n    const fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;\n    const fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;\n\n    let actualPosition = 0;\n    let canContinue = true;\n    while (canContinue) {\n      const rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;\n      const colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;\n      const row = _virtualTable[rowPosition];\n      if (!row) {\n        canContinue = false;\n        return _actionCellList;\n      }\n      const cell = row[colPosition];\n      if (!cell) {\n        canContinue = false;\n        return _actionCellList;\n      }\n\n      // Define action to be applied in this cell\n      let resultAction = TableResultAction.resultAction.Ignore;\n      switch (action) {\n        case TableResultAction.requestAction.Add:\n          resultAction = getAddResultActionToCell(cell);\n          break;\n        case TableResultAction.requestAction.Delete:\n          resultAction = getDeleteResultActionToCell(cell);\n          break;\n      }\n      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));\n      actualPosition++;\n    }\n\n    return _actionCellList;\n  };\n\n  init();\n};\n/**\n*\n* Where action occours enum.\n*/\nTableResultAction.where = { 'Row': 0, 'Column': 1 };\n/**\n*\n* Requested action to apply enum.\n*/\nTableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };\n/**\n*\n* Result action to be executed enum.\n*/\nTableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };\n\n/**\n *\n * @class editing.Table\n *\n * Table\n *\n */\nexport default class Table {\n  /**\n   * handle tab key\n   *\n   * @param {WrappedRange} rng\n   * @param {Boolean} isShift\n   */\n  tab(rng, isShift) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const table = dom.ancestor(cell, dom.isTable);\n    const cells = dom.listDescendant(table, dom.isCell);\n\n    const nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);\n    if (nextCell) {\n      range.create(nextCell, 0).select();\n    }\n  }\n\n  /**\n   * Add a new row\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (top/bottom)\n   * @return {Node}\n   */\n  addRow(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n\n    const currentTr = $(cell).closest('tr');\n    const trAttributes = this.recoverAttributes(currentTr);\n    const html = $('<tr' + trAttributes + '></tr>');\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Add, $(currentTr).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let idCell = 0; idCell < actions.length; idCell++) {\n      const currentCell = actions[idCell];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          {\n            if (position === 'top') {\n              const baseCellTr = currentCell.baseCell.parent;\n              const isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;\n              if (isTopFromRowSpan) {\n                const newTd = $('<div></div>').append($('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();\n                html.append(newTd);\n                break;\n              }\n            }\n            let rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);\n            rowspanNumber++;\n            currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);\n          }\n          break;\n      }\n    }\n\n    if (position === 'top') {\n      currentTr.before(html);\n    } else {\n      const cellHasRowspan = (cell.rowSpan > 1);\n      if (cellHasRowspan) {\n        const lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);\n        $($(currentTr).parent().find('tr')[lastTrIndex]).after($(html));\n        return;\n      }\n      currentTr.after(html);\n    }\n  }\n\n  /**\n   * Add a new col\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (left/right)\n   * @return {Node}\n   */\n  addCol(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const rowsGroup = $(row).siblings();\n    rowsGroup.push(row);\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Add, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      const currentCell = actions[actionIndex];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          if (position === 'right') {\n            $(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          if (position === 'right') {\n            let colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);\n            colspanNumber++;\n            currentCell.baseCell.setAttribute('colSpan', colspanNumber);\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n      }\n    }\n  }\n\n  /*\n  * Copy attributes from element.\n  *\n  * @param {object} Element to recover attributes.\n  * @return {string} Copied string elements.\n  */\n  recoverAttributes(el) {\n    let resultStr = '';\n\n    if (!el) {\n      return resultStr;\n    }\n\n    const attrList = el.attributes || [];\n\n    for (let i = 0; i < attrList.length; i++) {\n      if (attrList[i].name.toLowerCase() === 'id') {\n        continue;\n      }\n\n      if (attrList[i].specified) {\n        resultStr += ' ' + attrList[i].name + '=\\'' + attrList[i].value + '\\'';\n      }\n    }\n\n    return resultStr;\n  }\n\n  /**\n   * Delete current row\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteRow(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n    const rowPos = row[0].rowIndex;\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n\n      const baseCell = actions[actionIndex].baseCell;\n      const virtualPosition = actions[actionIndex].virtualTable;\n      const hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);\n      let rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.AddCell:\n          {\n            const nextRow = row.next('tr')[0];\n            if (!nextRow) { continue; }\n            const cloneRow = row[0].cells[cellPos];\n            if (hasRowspan) {\n              if (rowspanNumber > 2) {\n                rowspanNumber--;\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);\n                nextRow.cells[cellPos].innerHTML = '';\n              } else if (rowspanNumber === 2) {\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].removeAttribute('rowSpan');\n                nextRow.cells[cellPos].innerHTML = '';\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          if (hasRowspan) {\n            if (rowspanNumber > 2) {\n              rowspanNumber--;\n              baseCell.setAttribute('rowSpan', rowspanNumber);\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            } else if (rowspanNumber === 2) {\n              baseCell.removeAttribute('rowSpan');\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          // Do not need remove cell because row will be deleted.\n          continue;\n      }\n    }\n    row.remove();\n  }\n\n  /**\n   * Delete current col\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteCol(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          {\n            const baseCell = actions[actionIndex].baseCell;\n            const hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);\n            if (hasColspan) {\n              let colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;\n              if (colspanNumber > 2) {\n                colspanNumber--;\n                baseCell.setAttribute('colSpan', colspanNumber);\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              } else if (colspanNumber === 2) {\n                baseCell.removeAttribute('colSpan');\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          dom.remove(actions[actionIndex].baseCell, true);\n          continue;\n      }\n    }\n  }\n\n  /**\n   * create empty table element\n   *\n   * @param {Number} rowCount\n   * @param {Number} colCount\n   * @return {Node}\n   */\n  createTable(colCount, rowCount, options) {\n    const tds = [];\n    let tdHTML;\n    for (let idxCol = 0; idxCol < colCount; idxCol++) {\n      tds.push('<td>' + dom.blank + '</td>');\n    }\n    tdHTML = tds.join('');\n\n    const trs = [];\n    let trHTML;\n    for (let idxRow = 0; idxRow < rowCount; idxRow++) {\n      trs.push('<tr>' + tdHTML + '</tr>');\n    }\n    trHTML = trs.join('');\n    const $table = $('<table>' + trHTML + '</table>');\n    if (options && options.tableClassName) {\n      $table.addClass(options.tableClassName);\n    }\n\n    return $table[0];\n  }\n\n  /**\n   * Delete current table\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteTable(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    $(cell).closest('table').remove();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport { readFileAsDataURL, createImage } from '../core/async';\nimport History from '../editing/History';\nimport Style from '../editing/Style';\nimport Typing from '../editing/Typing';\nimport Table from '../editing/Table';\nimport Bullet from '../editing/Bullet';\n\nconst KEY_BOGUS = 'bogus';\n\n/**\n * @class Editor\n */\nexport default class Editor {\n  constructor(context) {\n    this.context = context;\n\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.editable = this.$editable[0];\n    this.lastRange = null;\n    this.snapshot = null;\n\n    this.style = new Style();\n    this.table = new Table();\n    this.typing = new Typing(context);\n    this.bullet = new Bullet();\n    this.history = new History(context);\n\n    this.context.memo('help.escape', this.lang.help.escape);\n    this.context.memo('help.undo', this.lang.help.undo);\n    this.context.memo('help.redo', this.lang.help.redo);\n    this.context.memo('help.tab', this.lang.help.tab);\n    this.context.memo('help.untab', this.lang.help.untab);\n    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);\n    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);\n    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);\n    this.context.memo('help.indent', this.lang.help.indent);\n    this.context.memo('help.outdent', this.lang.help.outdent);\n    this.context.memo('help.formatPara', this.lang.help.formatPara);\n    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);\n    this.context.memo('help.fontName', this.lang.help.fontName);\n\n    // native commands(with execCommand), generate function for execCommand\n    const commands = [\n      'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',\n      'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n      'formatBlock', 'removeFormat', 'backColor',\n    ];\n\n    for (let idx = 0, len = commands.length; idx < len; idx++) {\n      this[commands[idx]] = ((sCmd) => {\n        return (value) => {\n          this.beforeCommand();\n          document.execCommand(sCmd, false, value);\n          this.afterCommand(true);\n        };\n      })(commands[idx]);\n      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);\n    }\n\n    this.fontName = this.wrapCommand((value) => {\n      return this.fontStyling('font-family', env.validFontName(value));\n    });\n\n    this.fontSize = this.wrapCommand((value) => {\n      const unit = this.currentStyle()['font-size-unit'];\n      return this.fontStyling('font-size', value + unit);\n    });\n\n    this.fontSizeUnit = this.wrapCommand((value) => {\n      const size = this.currentStyle()['font-size'];\n      return this.fontStyling('font-size', size + value);\n    });\n\n    for (let idx = 1; idx <= 6; idx++) {\n      this['formatH' + idx] = ((idx) => {\n        return () => {\n          this.formatBlock('H' + idx);\n        };\n      })(idx);\n      this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);\n    }\n\n    this.insertParagraph = this.wrapCommand(() => {\n      this.typing.insertParagraph(this.editable);\n    });\n\n    this.insertOrderedList = this.wrapCommand(() => {\n      this.bullet.insertOrderedList(this.editable);\n    });\n\n    this.insertUnorderedList = this.wrapCommand(() => {\n      this.bullet.insertUnorderedList(this.editable);\n    });\n\n    this.indent = this.wrapCommand(() => {\n      this.bullet.indent(this.editable);\n    });\n\n    this.outdent = this.wrapCommand(() => {\n      this.bullet.outdent(this.editable);\n    });\n\n    /**\n     * insertNode\n     * insert node\n     * @param {Node} node\n     */\n    this.insertNode = this.wrapCommand((node) => {\n      if (this.isLimited($(node).text().length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      rng.insertNode(node);\n      this.setLastRange(range.createFromNodeAfter(node).select());\n    });\n\n    /**\n     * insert text\n     * @param {String} text\n     */\n    this.insertText = this.wrapCommand((text) => {\n      if (this.isLimited(text.length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      const textNode = rng.insertNode(dom.createText(text));\n      this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());\n    });\n\n    /**\n     * paste HTML\n     * @param {String} markup\n     */\n    this.pasteHTML = this.wrapCommand((markup) => {\n      if (this.isLimited(markup.length)) {\n        return;\n      }\n      markup = this.context.invoke('codeview.purify', markup);\n      const contents = this.getLastRange().pasteHTML(markup);\n      this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());\n    });\n\n    /**\n     * formatBlock\n     *\n     * @param {String} tagName\n     */\n    this.formatBlock = this.wrapCommand((tagName, $target) => {\n      const onApplyCustomStyle = this.options.callbacks.onApplyCustomStyle;\n      if (onApplyCustomStyle) {\n        onApplyCustomStyle.call(this, $target, this.context, this.onFormatBlock);\n      } else {\n        this.onFormatBlock(tagName, $target);\n      }\n    });\n\n    /**\n     * insert horizontal rule\n     */\n    this.insertHorizontalRule = this.wrapCommand(() => {\n      const hrNode = this.getLastRange().insertNode(dom.create('HR'));\n      if (hrNode.nextSibling) {\n        this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());\n      }\n    });\n\n    /**\n     * lineHeight\n     * @param {String} value\n     */\n    this.lineHeight = this.wrapCommand((value) => {\n      this.style.stylePara(this.getLastRange(), {\n        lineHeight: value,\n      });\n    });\n\n    /**\n     * create link (command)\n     *\n     * @param {Object} linkInfo\n     */\n    this.createLink = this.wrapCommand((linkInfo) => {\n      let linkUrl = linkInfo.url;\n      const linkText = linkInfo.text;\n      const isNewWindow = linkInfo.isNewWindow;\n      const checkProtocol = linkInfo.checkProtocol;\n      let rng = linkInfo.range || this.getLastRange();\n      const additionalTextLength = linkText.length - rng.toString().length;\n      if (additionalTextLength > 0 && this.isLimited(additionalTextLength)) {\n        return;\n      }\n      const isTextChanged = rng.toString() !== linkText;\n\n      // handle spaced urls from input\n      if (typeof linkUrl === 'string') {\n        linkUrl = linkUrl.trim();\n      }\n\n      if (this.options.onCreateLink) {\n        linkUrl = this.options.onCreateLink(linkUrl);\n      } else if (checkProtocol) {\n        // if url doesn't have any protocol and not even a relative or a label, use http:// as default\n        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\\:|#|\\/)/.test(linkUrl)\n          ? linkUrl : this.options.defaultProtocol + linkUrl;\n      }\n\n      let anchors = [];\n      if (isTextChanged) {\n        rng = rng.deleteContents();\n        const anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);\n        anchors.push(anchor);\n      } else {\n        anchors = this.style.styleNodes(rng, {\n          nodeName: 'A',\n          expandClosestSibling: true,\n          onlyPartialContains: true,\n        });\n      }\n\n      $.each(anchors, (idx, anchor) => {\n        $(anchor).attr('href', linkUrl);\n        if (isNewWindow) {\n          $(anchor).attr('target', '_blank');\n        } else {\n          $(anchor).removeAttr('target');\n        }\n      });\n\n      this.setLastRange(\n        this.createRangeFromList(anchors).select()\n      );\n    });\n\n    /**\n     * setting color\n     *\n     * @param {Object} sObjColor  color code\n     * @param {String} sObjColor.foreColor foreground color\n     * @param {String} sObjColor.backColor background color\n     */\n    this.color = this.wrapCommand((colorInfo) => {\n      const foreColor = colorInfo.foreColor;\n      const backColor = colorInfo.backColor;\n\n      if (foreColor) { document.execCommand('foreColor', false, foreColor); }\n      if (backColor) { document.execCommand('backColor', false, backColor); }\n    });\n\n    /**\n     * Set foreground color\n     *\n     * @param {String} colorCode foreground color code\n     */\n    this.foreColor = this.wrapCommand((colorInfo) => {\n      document.execCommand('foreColor', false, colorInfo);\n    });\n\n    /**\n     * insert Table\n     *\n     * @param {String} dimension of table (ex : \"5x5\")\n     */\n    this.insertTable = this.wrapCommand((dim) => {\n      const dimension = dim.split('x');\n\n      const rng = this.getLastRange().deleteContents();\n      rng.insertNode(this.table.createTable(dimension[0], dimension[1], this.options));\n    });\n\n    /**\n     * remove media object and Figure Elements if media object is img with Figure.\n     */\n    this.removeMedia = this.wrapCommand(() => {\n      let $target = $(this.restoreTarget()).parent();\n      if ($target.closest('figure').length) {\n        $target.closest('figure').remove();\n      } else {\n        $target = $(this.restoreTarget()).detach();\n      }\n      this.context.triggerEvent('media.delete', $target, this.$editable);\n    });\n\n    /**\n     * float me\n     *\n     * @param {String} value\n     */\n    this.floatMe = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      $target.toggleClass('note-float-left', value === 'left');\n      $target.toggleClass('note-float-right', value === 'right');\n      $target.css('float', (value === 'none' ? '' : value));\n    });\n\n    /**\n     * resize overlay element\n     * @param {String} value\n     */\n    this.resize = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      value = parseFloat(value);\n      if (value === 0) {\n        $target.css('width', '');\n      } else {\n        $target.css({\n          width: value * 100 + '%',\n          height: '',\n        });\n      }\n    });\n  }\n\n  initialize() {\n    // bind custom events\n    this.$editable.on('keydown', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        this.context.triggerEvent('enter', event);\n      }\n      this.context.triggerEvent('keydown', event);\n\n      // keep a snapshot to limit text on input event\n      this.snapshot = this.history.makeSnapshot();\n      this.hasKeyShortCut = false;\n      if (!event.isDefaultPrevented()) {\n        if (this.options.shortcuts) {\n          this.hasKeyShortCut = this.handleKeyMap(event);\n        } else {\n          this.preventDefaultEditableShortCuts(event);\n        }\n      }\n      if (this.isLimited(1, event)) {\n        const lastRange = this.getLastRange();\n        if (lastRange.eo - lastRange.so === 0) {\n          return false;\n        }\n      }\n      this.setLastRange();\n\n      // record undo in the key event except keyMap.\n      if (this.options.recordEveryKeystroke) {\n        if (this.hasKeyShortCut === false) {\n          this.history.recordUndo();\n        }\n      }\n    }).on('keyup', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('keyup', event);\n    }).on('focus', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('focus', event);\n    }).on('blur', (event) => {\n      this.context.triggerEvent('blur', event);\n    }).on('mousedown', (event) => {\n      this.context.triggerEvent('mousedown', event);\n    }).on('mouseup', (event) => {\n      this.setLastRange();\n      this.history.recordUndo();\n      this.context.triggerEvent('mouseup', event);\n    }).on('scroll', (event) => {\n      this.context.triggerEvent('scroll', event);\n    }).on('paste', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('paste', event);\n    }).on('input', () => {\n      // To limit composition characters (e.g. Korean)\n      if (this.isLimited(0) && this.snapshot) {\n        this.history.applySnapshot(this.snapshot);\n      }\n    });\n\n    this.$editable.attr('spellcheck', this.options.spellCheck);\n\n    this.$editable.attr('autocorrect', this.options.spellCheck);\n\n    if (this.options.disableGrammar) {\n      this.$editable.attr('data-gramm', false);\n    }\n\n    // init content before set event\n    this.$editable.html(dom.html(this.$note) || dom.emptyPara);\n\n    this.$editable.on(env.inputEventName, func.debounce(() => {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }, 10));\n\n    this.$editable.on('focusin', (event) => {\n      this.context.triggerEvent('focusin', event);\n    }).on('focusout', (event) => {\n      this.context.triggerEvent('focusout', event);\n    });\n\n    if (this.options.airMode) {\n      if (this.options.overrideContextMenu) {\n        this.$editor.on('contextmenu', (event) => {\n          this.context.triggerEvent('contextmenu', event);\n          return false;\n        });\n      }\n    } else {\n      if (this.options.width) {\n        this.$editor.outerWidth(this.options.width);\n      }\n      if (this.options.height) {\n        this.$editable.outerHeight(this.options.height);\n      }\n      if (this.options.maxHeight) {\n        this.$editable.css('max-height', this.options.maxHeight);\n      }\n      if (this.options.minHeight) {\n        this.$editable.css('min-height', this.options.minHeight);\n      }\n    }\n\n    this.history.recordUndo();\n    this.setLastRange();\n  }\n\n  destroy() {\n    this.$editable.off();\n  }\n\n  handleKeyMap(event) {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    const keys = [];\n\n    if (event.metaKey) { keys.push('CMD'); }\n    if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }\n    if (event.shiftKey) { keys.push('SHIFT'); }\n\n    const keyName = key.nameFromCode[event.keyCode];\n    if (keyName) {\n      keys.push(keyName);\n    }\n\n    const eventName = keyMap[keys.join('+')];\n\n    if (keyName === 'TAB' && !this.options.tabDisable) {\n      this.afterCommand();\n    } else if (eventName) {\n      if (this.context.invoke(eventName) !== false) {\n        event.preventDefault();\n        // if keyMap action was invoked\n        return true;\n      }\n    } else if (key.isEdit(event.keyCode)) {\n      this.afterCommand();\n    }\n    return false;\n  }\n\n  preventDefaultEditableShortCuts(event) {\n    // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)\n    if ((event.ctrlKey || event.metaKey) &&\n      lists.contains([66, 73, 85], event.keyCode)) {\n      event.preventDefault();\n    }\n  }\n\n  isLimited(pad, event) {\n    pad = pad || 0;\n\n    if (typeof event !== 'undefined') {\n      if (key.isMove(event.keyCode) ||\n          key.isNavigation(event.keyCode) ||\n          (event.ctrlKey || event.metaKey) ||\n          lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {\n        return false;\n      }\n    }\n\n    if (this.options.maxTextLength > 0) {\n      if ((this.$editable.text().length + pad) > this.options.maxTextLength) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * create range\n   * @return {WrappedRange}\n   */\n  createRange() {\n    this.focus();\n    this.setLastRange();\n    return this.getLastRange();\n  }\n\n  /**\n   * create a new range from the list of elements\n   *\n   * @param {list} dom element list\n   * @return {WrappedRange}\n   */\n  createRangeFromList(lst) {\n    const startRange = range.createFromNodeBefore(lists.head(lst));\n    const startPoint = startRange.getStartPoint();\n    const endRange = range.createFromNodeAfter(lists.last(lst));\n    const endPoint = endRange.getEndPoint();\n\n    return range.create(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * set the last range\n   *\n   * if given rng is exist, set rng as the last range\n   * or create a new range at the end of the document\n   *\n   * @param {WrappedRange} rng\n   */\n  setLastRange(rng) {\n    if (rng) {\n      this.lastRange = rng;\n    } else {\n      this.lastRange = range.create(this.editable);\n\n      if ($(this.lastRange.sc).closest('.note-editable').length === 0) {\n        this.lastRange = range.createFromBodyElement(this.editable);\n      }\n    }\n  }\n\n  /**\n   * get the last range\n   *\n   * if there is a saved last range, return it\n   * or create a new range and return it\n   *\n   * @return {WrappedRange}\n   */\n  getLastRange() {\n    if (!this.lastRange) {\n      this.setLastRange();\n    }\n    return this.lastRange;\n  }\n\n  /**\n   * saveRange\n   *\n   * save current range\n   *\n   * @param {Boolean} [thenCollapse=false]\n   */\n  saveRange(thenCollapse) {\n    if (thenCollapse) {\n      this.getLastRange().collapse().select();\n    }\n  }\n\n  /**\n   * restoreRange\n   *\n   * restore lately range\n   */\n  restoreRange() {\n    if (this.lastRange) {\n      this.lastRange.select();\n      this.focus();\n    }\n  }\n\n  saveTarget(node) {\n    this.$editable.data('target', node);\n  }\n\n  clearTarget() {\n    this.$editable.removeData('target');\n  }\n\n  restoreTarget() {\n    return this.$editable.data('target');\n  }\n\n  /**\n   * currentStyle\n   *\n   * current style\n   * @return {Object|Boolean} unfocus\n   */\n  currentStyle() {\n    let rng = range.create();\n    if (rng) {\n      rng = rng.normalize();\n    }\n    return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);\n  }\n\n  /**\n   * style from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  styleFromNode($node) {\n    return this.style.fromNode($node);\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.undo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /*\n  * commit\n  */\n  commit() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.commit();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.redo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * before command\n   */\n  beforeCommand() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n\n    // Set styleWithCSS before run a command\n    document.execCommand('styleWithCSS', false, this.options.styleWithCSS);\n\n    // keep focus on editable before command execution\n    this.focus();\n  }\n\n  /**\n   * after command\n   * @param {Boolean} isPreventTrigger\n   */\n  afterCommand(isPreventTrigger) {\n    this.normalizeContent();\n    this.history.recordUndo();\n    if (!isPreventTrigger) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  /**\n   * handle tab key\n   */\n  tab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n\n      if (!this.isLimited(this.options.tabSize)) {\n        this.beforeCommand();\n        this.typing.insertTab(rng, this.options.tabSize);\n        this.afterCommand();\n      }\n    }\n  }\n\n  /**\n   * handle shift+tab key\n   */\n  untab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng, true);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * run given function between beforeCommand and afterCommand\n   */\n  wrapCommand(fn) {\n    return function() {\n      this.beforeCommand();\n      fn.apply(this, arguments);\n      this.afterCommand();\n    };\n  }\n\n  /**\n   * insert image\n   *\n   * @param {String} src\n   * @param {String|Function} param\n   * @return {Promise}\n   */\n  insertImage(src, param) {\n    return createImage(src, param).then(($image) => {\n      this.beforeCommand();\n\n      if (typeof param === 'function') {\n        param($image);\n      } else {\n        if (typeof param === 'string') {\n          $image.attr('data-filename', param);\n        }\n        $image.css('width', Math.min(this.$editable.width(), $image.width()));\n      }\n\n      $image.show();\n      this.getLastRange().insertNode($image[0]);\n      this.setLastRange(range.createFromNodeAfter($image[0]).select());\n      this.afterCommand();\n    }).fail((e) => {\n      this.context.triggerEvent('image.upload.error', e);\n    });\n  }\n\n  /**\n   * insertImages\n   * @param {File[]} files\n   */\n  insertImagesAsDataURL(files) {\n    $.each(files, (idx, file) => {\n      const filename = file.name;\n      if (this.options.maximumImageFileSize && this.options.maximumImageFileSize < file.size) {\n        this.context.triggerEvent('image.upload.error', this.lang.image.maximumFileSizeError);\n      } else {\n        readFileAsDataURL(file).then((dataURL) => {\n          return this.insertImage(dataURL, filename);\n        }).fail(() => {\n          this.context.triggerEvent('image.upload.error');\n        });\n      }\n    });\n  }\n\n  /**\n   * insertImagesOrCallback\n   * @param {File[]} files\n   */\n  insertImagesOrCallback(files) {\n    const callbacks = this.options.callbacks;\n    // If onImageUpload set,\n    if (callbacks.onImageUpload) {\n      this.context.triggerEvent('image.upload', files);\n      // else insert Image as dataURL\n    } else {\n      this.insertImagesAsDataURL(files);\n    }\n  }\n\n  /**\n   * return selected plain text\n   * @return {String} text\n   */\n  getSelectedText() {\n    let rng = this.getLastRange();\n\n    // if range on anchor, expand range with anchor\n    if (rng.isOnAnchor()) {\n      rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));\n    }\n\n    return rng.toString();\n  }\n\n  onFormatBlock(tagName, $target) {\n    // [workaround] for MSIE, IE need `<`\n    document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName);\n\n    // support custom class\n    if ($target && $target.length) {\n      // find the exact element has given tagName\n      if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {\n        $target = $target.find(tagName);\n      }\n\n      if ($target && $target.length) {\n        const currentRange = this.createRange();\n        const $parent = $([currentRange.sc, currentRange.ec]).closest(tagName);\n        // remove class added for current block\n        $parent.removeClass();\n        const className = $target[0].className || '';\n        if (className) {\n          $parent.addClass(className);\n        }\n      }\n    }\n  }\n\n  formatPara() {\n    this.formatBlock('P');\n  }\n\n  fontStyling(target, value) {\n    const rng = this.getLastRange();\n\n    if (rng !== '') {\n      const spans = this.style.styleNodes(rng);\n      this.$editor.find('.note-status-output').html('');\n      $(spans).css(target, value);\n\n      // [workaround] added styled bogus span for style\n      //  - also bogus character needed for cursor position\n      if (rng.isCollapsed()) {\n        const firstSpan = lists.head(spans);\n        if (firstSpan && !dom.nodeLength(firstSpan)) {\n          firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;\n          range.createFromNode(firstSpan.firstChild).select();\n          this.setLastRange();\n          this.$editable.data(KEY_BOGUS, firstSpan);\n        }\n      } else {\n        this.setLastRange(\n          this.createRangeFromList(spans).select()\n        );\n      }\n    } else {\n      const noteStatusOutput = $.now();\n      this.$editor.find('.note-status-output').html('<div id=\"note-status-output-' + noteStatusOutput + '\" class=\"alert alert-info\">' + this.lang.output.noSelection + '</div>');\n      setTimeout(function() { $('#note-status-output-' + noteStatusOutput).remove(); }, 5000);\n    }\n  }\n\n  /**\n   * unlink\n   *\n   * @type command\n   */\n  unlink() {\n    let rng = this.getLastRange();\n    if (rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      rng = range.createFromNode(anchor);\n      rng.select();\n      this.setLastRange();\n\n      this.beforeCommand();\n      document.execCommand('unlink');\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * returns link info\n   *\n   * @return {Object}\n   * @return {WrappedRange} return.range\n   * @return {String} return.text\n   * @return {Boolean} [return.isNewWindow=true]\n   * @return {String} [return.url=\"\"]\n   */\n  getLinkInfo() {\n    const rng = this.getLastRange().expand(dom.isAnchor);\n    // Get the first anchor on range(for edit).\n    const $anchor = $(lists.head(rng.nodes(dom.isAnchor)));\n    const linkInfo = {\n      range: rng,\n      text: rng.toString(),\n      url: $anchor.length ? $anchor.attr('href') : '',\n    };\n\n    // When anchor exists,\n    if ($anchor.length) {\n      // Set isNewWindow by checking its target.\n      linkInfo.isNewWindow = $anchor.attr('target') === '_blank';\n    }\n\n    return linkInfo;\n  }\n\n  addRow(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addRow(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  addCol(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addCol(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  deleteRow() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteRow(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteCol() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteCol(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteTable() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteTable(rng);\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * @param {Position} pos\n   * @param {jQuery} $target - target element\n   * @param {Boolean} [bKeepRatio] - keep ratio\n   */\n  resizeTo(pos, $target, bKeepRatio) {\n    let imageSize;\n    if (bKeepRatio) {\n      const newRatio = pos.y / pos.x;\n      const ratio = $target.data('ratio');\n      imageSize = {\n        width: ratio > newRatio ? pos.x : pos.y / ratio,\n        height: ratio > newRatio ? pos.x * ratio : pos.y,\n      };\n    } else {\n      imageSize = {\n        width: pos.x,\n        height: pos.y,\n      };\n    }\n\n    $target.css(imageSize);\n  }\n\n  /**\n   * returns whether editable area has focus or not.\n   */\n  hasFocus() {\n    return this.$editable.is(':focus');\n  }\n\n  /**\n   * set focus\n   */\n  focus() {\n    // [workaround] Screen will move when page is scolled in IE.\n    //  - do focus when not focused\n    if (!this.hasFocus()) {\n      this.$editable.focus();\n    }\n  }\n\n  /**\n   * returns whether contents is empty or not.\n   * @return {Boolean}\n   */\n  isEmpty() {\n    return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();\n  }\n\n  /**\n   * Removes all contents and restores the editable instance to an _emptyPara_.\n   */\n  empty() {\n    this.context.invoke('code', dom.emptyPara);\n  }\n\n  /**\n   * normalize content\n   */\n  normalizeContent() {\n    this.$editable[0].normalize();\n  }\n}\n","import lists from '../core/lists';\n\nexport default class Clipboard {\n  constructor(context) {\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n  }\n\n  initialize() {\n    this.$editable.on('paste', this.pasteByEvent.bind(this));\n  }\n\n  /**\n   * paste by clipboard event\n   *\n   * @param {Event} event\n   */\n  pasteByEvent(event) {\n    const clipboardData = event.originalEvent.clipboardData;\n\n    if (clipboardData && clipboardData.items && clipboardData.items.length) {\n      const item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);\n      if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {\n        // paste img file\n        this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);\n        event.preventDefault();\n      } else if (item.kind === 'string') {\n        // paste text with maxTextLength check\n        if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {\n          event.preventDefault();\n        }\n      }\n    } else if (window.clipboardData) {\n      // for IE\n      let text = window.clipboardData.getData('text');\n      if (this.context.invoke('editor.isLimited', text.length)) {\n        event.preventDefault();\n      }\n    }\n    // Call editor.afterCommand after proceeding default event handler\n    setTimeout(() => {\n      this.context.invoke('editor.afterCommand');\n    }, 10);\n  }\n}\n","import $ from 'jquery';\n\nexport default class Dropzone {\n  constructor(context) {\n    this.context = context;\n    this.$eventListener = $(document);\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.documentEventHandlers = {};\n\n    this.$dropzone = $([\n      '<div class=\"note-dropzone\">',\n        '<div class=\"note-dropzone-message\"></div>',\n      '</div>',\n    ].join('')).prependTo(this.$editor);\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  initialize() {\n    if (this.options.disableDragAndDrop) {\n      // prevent default drop event\n      this.documentEventHandlers.onDrop = (e) => {\n        e.preventDefault();\n      };\n      // do not consider outside of dropzone\n      this.$eventListener = this.$dropzone;\n      this.$eventListener.on('drop', this.documentEventHandlers.onDrop);\n    } else {\n      this.attachDragAndDropEvent();\n    }\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  attachDragAndDropEvent() {\n    let collection = $();\n    const $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');\n\n    this.documentEventHandlers.onDragenter = (e) => {\n      const isCodeview = this.context.invoke('codeview.isActivated');\n      const hasEditorSize = this.$editor.width() > 0 && this.$editor.height() > 0;\n      if (!isCodeview && !collection.length && hasEditorSize) {\n        this.$editor.addClass('dragover');\n        this.$dropzone.width(this.$editor.width());\n        this.$dropzone.height(this.$editor.height());\n        $dropzoneMessage.text(this.lang.image.dragImageHere);\n      }\n      collection = collection.add(e.target);\n    };\n\n    this.documentEventHandlers.onDragleave = (e) => {\n      collection = collection.not(e.target);\n\n      // If nodeName is BODY, then just make it over (fix for IE)\n      if (!collection.length || e.target.nodeName === 'BODY') {\n        collection = $();\n        this.$editor.removeClass('dragover');\n      }\n    };\n\n    this.documentEventHandlers.onDrop = () => {\n      collection = $();\n      this.$editor.removeClass('dragover');\n    };\n\n    // show dropzone on dragenter when dragging a object to document\n    // -but only if the editor is visible, i.e. has a positive width and height\n    this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter)\n      .on('dragleave', this.documentEventHandlers.onDragleave)\n      .on('drop', this.documentEventHandlers.onDrop);\n\n    // change dropzone's message on hover.\n    this.$dropzone.on('dragenter', () => {\n      this.$dropzone.addClass('hover');\n      $dropzoneMessage.text(this.lang.image.dropImage);\n    }).on('dragleave', () => {\n      this.$dropzone.removeClass('hover');\n      $dropzoneMessage.text(this.lang.image.dragImageHere);\n    });\n\n    // attach dropImage\n    this.$dropzone.on('drop', (event) => {\n      const dataTransfer = event.originalEvent.dataTransfer;\n\n      // stop the browser from opening the dropped content\n      event.preventDefault();\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        this.$editable.focus();\n        this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);\n      } else {\n        $.each(dataTransfer.types, (idx, type) => {\n          // skip moz-specific types\n          if (type.toLowerCase().indexOf('_moz_') > -1) {\n            return;\n          }\n          const content = dataTransfer.getData(type);\n\n          if (type.toLowerCase().indexOf('text') > -1) {\n            this.context.invoke('editor.pasteHTML', content);\n          } else {\n            $(content).each((idx, item) => {\n              this.context.invoke('editor.insertNode', item);\n            });\n          }\n        });\n      }\n    }).on('dragover', false); // prevent default dragover event\n  }\n\n  destroy() {\n    Object.keys(this.documentEventHandlers).forEach((key) => {\n      this.$eventListener.off(key.substr(2).toLowerCase(), this.documentEventHandlers[key]);\n    });\n    this.documentEventHandlers = {};\n  }\n}\n","import dom from '../core/dom';\nimport key from '../core/key';\n\n/**\n * @class Codeview\n */\nexport default class CodeView {\n  constructor(context) {\n    this.context = context;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n    this.CodeMirrorConstructor = window.CodeMirror;\n\n    if (this.options.codemirror.CodeMirrorConstructor) {\n      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;\n    }\n  }\n\n  sync(html) {\n    const isCodeview = this.isActivated();\n    const CodeMirror = this.CodeMirrorConstructor;\n\n    if (isCodeview) {\n      if (html) {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').getDoc().setValue(html);\n        } else {\n          this.$codable.val(html);\n        }\n      } else {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').save();\n        }\n      }\n    }\n  }\n\n  initialize() {\n    this.$codable.on('keyup', (event) => {\n      if (event.keyCode === key.code.ESCAPE) {\n        this.deactivate();\n      }\n    });\n  }\n\n  /**\n   * @return {Boolean}\n   */\n  isActivated() {\n    return this.$editor.hasClass('codeview');\n  }\n\n  /**\n   * toggle codeview\n   */\n  toggle() {\n    if (this.isActivated()) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n    this.context.triggerEvent('codeview.toggled');\n  }\n\n  /**\n   * purify input value\n   * @param value\n   * @returns {*}\n   */\n  purify(value) {\n    if (this.options.codeviewFilter) {\n      // filter code view regex\n      value = value.replace(this.options.codeviewFilterRegex, '');\n      // allow specific iframe tag\n      if (this.options.codeviewIframeFilter) {\n        const whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);\n        value = value.replace(/(<iframe.*?>.*?(?:<\\/iframe>)?)/gi, function(tag) {\n          // remove if src attribute is duplicated\n          if (/<.+src(?==?('|\"|\\s)?)[\\s\\S]+src(?=('|\"|\\s)?)[^>]*?>/i.test(tag)) {\n            return '';\n          }\n          for (const src of whitelist) {\n            // pass if src is trusted\n            if ((new RegExp('src=\"(https?:)?\\/\\/' + src.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '\\/(.+)\"')).test(tag)) {\n              return tag;\n            }\n          }\n          return '';\n        });\n      }\n    }\n    return value;\n  }\n\n  /**\n   * activate code view\n   */\n  activate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));\n    this.$codable.height(this.$editable.height());\n\n    this.context.invoke('toolbar.updateCodeview', true);\n    this.context.invoke('airPopover.updateCodeview', true);\n\n    this.$editor.addClass('codeview');\n    this.$codable.focus();\n\n    // activate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror);\n\n      // CodeMirror TernServer\n      if (this.options.codemirror.tern) {\n        const server = new CodeMirror.TernServer(this.options.codemirror.tern);\n        cmEditor.ternServer = server;\n        cmEditor.on('cursorActivity', (cm) => {\n          server.updateArgHints(cm);\n        });\n      }\n\n      cmEditor.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);\n      });\n      cmEditor.on('change', () => {\n        this.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);\n      });\n\n      // CodeMirror hasn't Padding.\n      cmEditor.setSize(null, this.$editable.outerHeight());\n      this.$codable.data('cmEditor', cmEditor);\n    } else {\n      this.$codable.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', this.$codable.val(), event);\n      });\n      this.$codable.on('input', () => {\n        this.context.triggerEvent('change.codeview', this.$codable.val(), this.$codable);\n      });\n    }\n  }\n\n  /**\n   * deactivate code view\n   */\n  deactivate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    // deactivate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = this.$codable.data('cmEditor');\n      this.$codable.val(cmEditor.getValue());\n      cmEditor.toTextArea();\n    }\n\n    const value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);\n    const isChange = this.$editable.html() !== value;\n\n    this.$editable.html(value);\n    this.$editable.height(this.options.height ? this.$codable.height() : 'auto');\n    this.$editor.removeClass('codeview');\n\n    if (isChange) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n\n    this.$editable.focus();\n\n    this.context.invoke('toolbar.updateCodeview', false);\n    this.context.invoke('airPopover.updateCodeview', false);\n  }\n\n  destroy() {\n    if (this.isActivated()) {\n      this.deactivate();\n    }\n  }\n}\n","import $ from 'jquery';\nconst EDITABLE_PADDING = 24;\n\nexport default class Statusbar {\n  constructor(context) {\n    this.$document = $(document);\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n  }\n\n  initialize() {\n    if (this.options.airMode || this.options.disableResizeEditor) {\n      this.destroy();\n      return;\n    }\n\n    this.$statusbar.on('mousedown', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const editableTop = this.$editable.offset().top - this.$document.scrollTop();\n      const editableCodeTop = this.$codable.offset().top - this.$document.scrollTop();\n\n      const onMouseMove = (event) => {\n        let height = event.clientY - (editableTop + EDITABLE_PADDING);\n        let heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);\n\n        height = (this.options.minheight > 0) ? Math.max(height, this.options.minheight) : height;\n        height = (this.options.maxHeight > 0) ? Math.min(height, this.options.maxHeight) : height;\n        heightCode = (this.options.minheight > 0) ? Math.max(heightCode, this.options.minheight) : heightCode;\n        heightCode = (this.options.maxHeight > 0) ? Math.min(heightCode, this.options.maxHeight) : heightCode;\n\n\n        this.$editable.height(height);\n        this.$codable.height(heightCode);\n      };\n\n      this.$document.on('mousemove', onMouseMove).one('mouseup', () => {\n        this.$document.off('mousemove', onMouseMove);\n      });\n    });\n  }\n\n  destroy() {\n    this.$statusbar.off();\n    this.$statusbar.addClass('locked');\n  }\n}\n","import $ from 'jquery';\n\nexport default class Fullscreen {\n  constructor(context) {\n    this.context = context;\n\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n\n    this.$window = $(window);\n    this.$scrollbar = $('html, body');\n    this.scrollbarClassName = 'note-fullscreen-body';\n\n    this.onResize = () => {\n      this.resizeTo({\n        h: this.$window.height() - this.$toolbar.outerHeight(),\n      });\n    };\n  }\n\n  resizeTo(size) {\n    this.$editable.css('height', size.h);\n    this.$codable.css('height', size.h);\n    if (this.$codable.data('cmeditor')) {\n      this.$codable.data('cmeditor').setsize(null, size.h);\n    }\n  }\n\n  /**\n   * toggle fullscreen\n   */\n  toggle() {\n    this.$editor.toggleClass('fullscreen');\n    const isFullscreen = this.isFullscreen();\n    this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);\n    if (isFullscreen) {\n      this.$editable.data('orgHeight', this.$editable.css('height'));\n      this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));\n      this.$editable.css('maxHeight', '');\n      this.$window.on('resize', this.onResize).trigger('resize');\n    } else {\n      this.$window.off('resize', this.onResize);\n      this.resizeTo({ h: this.$editable.data('orgHeight') });\n      this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));\n    }\n\n    this.context.invoke('toolbar.updateFullscreen', isFullscreen);\n  }\n\n  isFullscreen() {\n    return this.$editor.hasClass('fullscreen');\n  }\n\n  destroy() {\n    this.$scrollbar.removeClass(this.scrollbarClassName);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\n\nexport default class Handle {\n  constructor(context) {\n    this.context = context;\n    this.$document = $(document);\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        if (this.update(e.target, e)) {\n          e.preventDefault();\n        }\n      },\n      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  initialize() {\n    this.$handle = $([\n      '<div class=\"note-handle\">',\n        '<div class=\"note-control-selection\">',\n          '<div class=\"note-control-selection-bg\"></div>',\n          '<div class=\"note-control-holder note-control-nw\"></div>',\n          '<div class=\"note-control-holder note-control-ne\"></div>',\n          '<div class=\"note-control-holder note-control-sw\"></div>',\n          '<div class=\"',\n            (this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),\n          ' note-control-se\"></div>',\n          (this.options.disableResizeImage ? '' : '<div class=\"note-control-selection-info\"></div>'),\n        '</div>',\n      '</div>',\n    ].join('')).prependTo(this.$editingArea);\n\n    this.$handle.on('mousedown', (event) => {\n      if (dom.isControlSizing(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const $target = this.$handle.find('.note-control-selection').data('target');\n        const posStart = $target.offset();\n        const scrollTop = this.$document.scrollTop();\n\n        const onMouseMove = (event) => {\n          this.context.invoke('editor.resizeTo', {\n            x: event.clientX - posStart.left,\n            y: event.clientY - (posStart.top - scrollTop),\n          }, $target, !event.shiftKey);\n\n          this.update($target[0], event);\n        };\n\n        this.$document\n          .on('mousemove', onMouseMove)\n          .one('mouseup', (e) => {\n            e.preventDefault();\n            this.$document.off('mousemove', onMouseMove);\n            this.context.invoke('editor.afterCommand');\n          });\n\n        if (!$target.data('ratio')) { // original ratio.\n          $target.data('ratio', $target.height() / $target.width());\n        }\n      }\n    });\n\n    // Listen for scrolling on the handle overlay.\n    this.$handle.on('wheel', (e) => {\n      e.preventDefault();\n      this.update();\n    });\n  }\n\n  destroy() {\n    this.$handle.remove();\n  }\n\n  update(target, event) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isImage = dom.isImg(target);\n    const $selection = this.$handle.find('.note-control-selection');\n\n    this.context.invoke('imagePopover.update', target, event);\n\n    if (isImage) {\n      const $image = $(target);\n      const position = $image.position();\n      const pos = {\n        left: position.left + parseInt($image.css('marginLeft'), 10),\n        top: position.top + parseInt($image.css('marginTop'), 10),\n      };\n\n      // exclude margin\n      const imageSize = {\n        w: $image.outerWidth(false),\n        h: $image.outerHeight(false),\n      };\n\n      $selection.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n        width: imageSize.w,\n        height: imageSize.h,\n      }).data('target', $image); // save current image element.\n\n      const origImageObj = new Image();\n      origImageObj.src = $image.attr('src');\n\n      const sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';\n      $selection.find('.note-control-selection-info').text(sizingText);\n      this.context.invoke('editor.saveTarget', target);\n    } else {\n      this.hide();\n    }\n\n    return isImage;\n  }\n\n  /**\n   * hide\n   *\n   * @param {jQuery} $handle\n   */\n  hide() {\n    this.context.invoke('editor.clearTarget');\n    this.$handle.children().hide();\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport key from '../core/key';\n\nconst defaultScheme = 'http://';\nconst linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\\:[\\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\\.)?(.+)$/i;\n\nexport default class AutoLink {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n  }\n\n  destroy() {\n    this.lastWordRange = null;\n  }\n\n  replace() {\n    if (!this.lastWordRange) {\n      return;\n    }\n\n    const keyword = this.lastWordRange.toString();\n    const match = keyword.match(linkPattern);\n\n    if (match && (match[1] || match[2])) {\n      const link = match[1] ? keyword : defaultScheme + keyword;\n      const urlText = this.options.showDomainOnlyForAutolink ?\n        keyword.replace(/^(?:https?:\\/\\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\\.)?/i, '').split('/')[0]\n        : keyword;\n      const node = $('<a></a>').html(urlText).attr('href', link)[0];\n      if (this.context.options.linkTargetBlank) {\n        $(node).attr('target', '_blank');\n      }\n\n      this.lastWordRange.insertNode(node);\n      this.lastWordRange = null;\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  handleKeydown(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWordRange = wordRange;\n    }\n  }\n\n  handleKeyup(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import dom from '../core/dom';\n\n/**\n * textarea auto sync.\n */\nexport default class AutoSync {\n  constructor(context) {\n    this.$note = context.layoutInfo.note;\n    this.events = {\n      'summernote.change': () => {\n        this.$note.val(context.invoke('code'));\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return dom.isTextarea(this.$note[0]);\n  }\n}\n","import lists from '../core/lists';\nimport dom from '../core/dom';\nimport key from '../core/key';\n\nexport default class AutoReplace {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options.replace || {};\n\n    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];\n    this.previousKeydownCode = null;\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.match;\n  }\n\n  initialize() {\n    this.lastWord = null;\n  }\n\n  destroy() {\n    this.lastWord = null;\n  }\n\n  replace() {\n    if (!this.lastWord) {\n      return;\n    }\n\n    const self = this;\n    const keyword = this.lastWord.toString();\n    this.options.match(keyword, function(match) {\n      if (match) {\n        let node = '';\n\n        if (typeof match === 'string') {\n          node = dom.createText(match);\n        } else if (match instanceof jQuery) {\n          node = match[0];\n        } else if (match instanceof Node) {\n          node = match;\n        }\n\n        if (!node) return;\n        self.lastWord.insertNode(node);\n        self.lastWord = null;\n        self.context.invoke('editor.focus');\n      }\n    });\n  }\n\n  handleKeydown(e) {\n    // this forces it to remember the last whole word, even if multiple termination keys are pressed\n    // before the previous key is let go.\n    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {\n      this.previousKeydownCode = e.keyCode;\n      return;\n    }\n\n    if (lists.contains(this.keys, e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWord = wordRange;\n    }\n    this.previousKeydownCode = e.keyCode;\n  }\n\n  handleKeyup(e) {\n    if (lists.contains(this.keys, e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import $ from 'jquery';\nexport default class Placeholder {\n  constructor(context) {\n    this.context = context;\n\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n\n    if (this.options.inheritPlaceholder === true) {\n      // get placeholder value from the original element\n      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;\n    }\n\n    this.events = {\n      'summernote.init summernote.change': () => {\n        this.update();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.placeholder;\n  }\n\n  initialize() {\n    this.$placeholder = $('<div class=\"note-placeholder\"></div>');\n    this.$placeholder.on('click', () => {\n      this.context.invoke('focus');\n    }).html(this.options.placeholder).prependTo(this.$editingArea);\n\n    this.update();\n  }\n\n  destroy() {\n    this.$placeholder.remove();\n  }\n\n  update() {\n    const isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');\n    this.$placeholder.toggle(isShow);\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport env from '../core/env';\n\nexport default class Buttons {\n  constructor(context) {\n    this.ui = $.summernote.ui;\n    this.context = context;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.invertedKeyMap = func.invertObject(\n      this.options.keyMap[env.isMac ? 'mac' : 'pc']\n    );\n  }\n\n  representShortcut(editorMethod) {\n    let shortcut = this.invertedKeyMap[editorMethod];\n    if (!this.options.shortcuts || !shortcut) {\n      return '';\n    }\n\n    if (env.isMac) {\n      shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');\n    }\n\n    shortcut = shortcut.replace('BACKSLASH', '\\\\')\n      .replace('SLASH', '/')\n      .replace('LEFTBRACKET', '[')\n      .replace('RIGHTBRACKET', ']');\n\n    return ' (' + shortcut + ')';\n  }\n\n  button(o) {\n    if (!this.options.tooltip && o.tooltip) {\n      delete o.tooltip;\n    }\n    o.container = this.options.container;\n    return this.ui.button(o);\n  }\n\n  initialize() {\n    this.addToolbarButtons();\n    this.addImagePopoverButtons();\n    this.addLinkPopoverButtons();\n    this.addTablePopoverButtons();\n    this.fontInstalledMap = {};\n  }\n\n  destroy() {\n    delete this.fontInstalledMap;\n  }\n\n  isFontInstalled(name) {\n    if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {\n      this.fontInstalledMap[name] = env.isFontInstalled(name) ||\n        lists.contains(this.options.fontNamesIgnoreCheck, name);\n    }\n    return this.fontInstalledMap[name];\n  }\n\n  isFontDeservedToAdd(name) {\n    name = name.toLowerCase();\n    return (name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1);\n  }\n\n  colorPalette(className, tooltip, backColor, foreColor) {\n    return this.ui.buttonGroup({\n      className: 'note-color ' + className,\n      children: [\n        this.button({\n          className: 'note-current-color-button',\n          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),\n          tooltip: tooltip,\n          click: (e) => {\n            const $button = $(e.currentTarget);\n            if (backColor && foreColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n                foreColor: $button.attr('data-foreColor'),\n              });\n            } else if (backColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n              });\n            } else if (foreColor) {\n              this.context.invoke('editor.color', {\n                foreColor: $button.attr('data-foreColor'),\n              });\n            }\n          },\n          callback: ($button) => {\n            const $recentColor = $button.find('.note-recent-color');\n            if (backColor) {\n              $recentColor.css('background-color', this.options.colorButton.backColor);\n              $button.attr('data-backColor', this.options.colorButton.backColor);\n            }\n            if (foreColor) {\n              $recentColor.css('color', this.options.colorButton.foreColor);\n              $button.attr('data-foreColor', this.options.colorButton.foreColor);\n            } else {\n              $recentColor.css('color', 'transparent');\n            }\n          },\n        }),\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('', this.options),\n          tooltip: this.lang.color.more,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          items: (backColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.background + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"backColor\" data-value=\"transparent\">',\n                  this.lang.color.transparent,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"backColor\"><!-- back colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"backColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"backColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.backColor + '\" data-event=\"backColorPalette-'+this.options.id+'\">',\n              '</div>',\n              '<div class=\"note-holder-custom\" id=\"backColorPalette-'+this.options.id+'\" data-event=\"backColor\"></div>',\n            '</div>',\n          ].join('') : '') +\n          (foreColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.foreground + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                  this.lang.color.resetToDefault,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"foreColor\"><!-- fore colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"foreColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"foreColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.foreColor + '\" data-event=\"foreColorPalette-'+this.options.id+'\">',\n              '</div>', // Fix missing Div, Commented to find easily if it's wrong\n              '<div class=\"note-holder-custom\" id=\"foreColorPalette-'+this.options.id+'\" data-event=\"foreColor\"></div>',\n            '</div>',\n          ].join('') : ''),\n          callback: ($dropdown) => {\n            $dropdown.find('.note-holder').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: this.options.colors,\n                colorsName: this.options.colorsName,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            /* TODO: do we have to record recent custom colors within cookies? */\n            var customColors = [\n              ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF'],\n            ];\n            $dropdown.find('.note-holder-custom').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: customColors,\n                colorsName: customColors,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            $dropdown.find('input[type=color]').each((idx, item) => {\n              $(item).change(function() {\n                const $chip = $dropdown.find('#' + $(this).data('event')).find('.note-color-btn').first();\n                const color = this.value.toUpperCase();\n                $chip.css('background-color', color)\n                  .attr('aria-label', color)\n                  .attr('data-value', color)\n                  .attr('data-original-title', color);\n                $chip.click();\n              });\n            });\n          },\n          click: (event) => {\n            event.stopPropagation();\n\n            const $parent = $('.' + className).find('.note-dropdown-menu');\n            const $button = $(event.target);\n            const eventName = $button.data('event');\n            const value = $button.attr('data-value');\n\n            if (eventName === 'openPalette') {\n              const $picker = $parent.find('#' + value);\n              const $palette = $($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]);\n\n              // Shift palette chips\n              const $chip = $palette.find('.note-color-btn').last().detach();\n\n              // Set chip attributes\n              const color = $picker.val();\n              $chip.css('background-color', color)\n                .attr('aria-label', color)\n                .attr('data-value', color)\n                .attr('data-original-title', color);\n              $palette.prepend($chip);\n              $picker.click();\n            } else {\n              if (lists.contains(['backColor', 'foreColor'], eventName)) {\n                const key = eventName === 'backColor' ? 'background-color' : 'color';\n                const $color = $button.closest('.note-color').find('.note-recent-color');\n                const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n                $color.css(key, value);\n                $currentButton.attr('data-' + eventName, value);\n              }\n              this.context.invoke('editor.' + eventName, value);\n            }\n          },\n        }),\n      ],\n    }).render();\n  }\n\n  addToolbarButtons() {\n    this.context.memo('button.style', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            this.ui.icon(this.options.icons.magic), this.options\n          ),\n          tooltip: this.lang.style.style,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          className: 'dropdown-style',\n          items: this.options.styleTags,\n          title: this.lang.style.style,\n          template: (item) => {\n            // TBD: need to be simplified\n            if (typeof item === 'string') {\n              item = {\n                tag: item,\n                title: (Object.prototype.hasOwnProperty.call(this.lang.style, item) ? this.lang.style[item] : item),\n              };\n            }\n\n            const tag = item.tag;\n            const title = item.title;\n            const style = item.style ? ' style=\"' + item.style + '\" ' : '';\n            const className = item.className ? ' class=\"' + item.className + '\"' : '';\n\n            return '<' + tag + style + className + '>' + title + '</' + tag + '>';\n          },\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }),\n      ]).render();\n    });\n\n    for (let styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {\n      const item = this.options.styleTags[styleIdx];\n\n      this.context.memo('button.style.' + item, () => {\n        return this.button({\n          className: 'note-btn-style-' + item,\n          contents: '<div data-value=\"' + item + '\">' + item.toUpperCase() + '</div>',\n          tooltip: this.lang.style[item],\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }).render();\n      });\n    }\n\n    this.context.memo('button.bold', () => {\n      return this.button({\n        className: 'note-btn-bold',\n        contents: this.ui.icon(this.options.icons.bold),\n        tooltip: this.lang.font.bold + this.representShortcut('bold'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.bold'),\n      }).render();\n    });\n\n    this.context.memo('button.italic', () => {\n      return this.button({\n        className: 'note-btn-italic',\n        contents: this.ui.icon(this.options.icons.italic),\n        tooltip: this.lang.font.italic + this.representShortcut('italic'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.italic'),\n      }).render();\n    });\n\n    this.context.memo('button.underline', () => {\n      return this.button({\n        className: 'note-btn-underline',\n        contents: this.ui.icon(this.options.icons.underline),\n        tooltip: this.lang.font.underline + this.representShortcut('underline'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.underline'),\n      }).render();\n    });\n\n    this.context.memo('button.clear', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.eraser),\n        tooltip: this.lang.font.clear + this.representShortcut('removeFormat'),\n        click: this.context.createInvokeHandler('editor.removeFormat'),\n      }).render();\n    });\n\n    this.context.memo('button.strikethrough', () => {\n      return this.button({\n        className: 'note-btn-strikethrough',\n        contents: this.ui.icon(this.options.icons.strikethrough),\n        tooltip: this.lang.font.strikethrough + this.representShortcut('strikethrough'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.strikethrough'),\n      }).render();\n    });\n\n    this.context.memo('button.superscript', () => {\n      return this.button({\n        className: 'note-btn-superscript',\n        contents: this.ui.icon(this.options.icons.superscript),\n        tooltip: this.lang.font.superscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.superscript'),\n      }).render();\n    });\n\n    this.context.memo('button.subscript', () => {\n      return this.button({\n        className: 'note-btn-subscript',\n        contents: this.ui.icon(this.options.icons.subscript),\n        tooltip: this.lang.font.subscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.subscript'),\n      }).render();\n    });\n\n    this.context.memo('button.fontname', () => {\n      const styleInfo = this.context.invoke('editor.currentStyle');\n\n      if (this.options.addDefaultFonts) {\n        // Add 'default' fonts into the fontnames array if not exist\n        $.each(styleInfo['font-family'].split(','), (idx, fontname) => {\n          fontname = fontname.trim().replace(/['\"]+/g, '');\n          if (this.isFontDeservedToAdd(fontname)) {\n            if (this.options.fontNames.indexOf(fontname) === -1) {\n              this.options.fontNames.push(fontname);\n            }\n          }\n        });\n      }\n\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            '<span class=\"note-current-fontname\"></span>', this.options\n          ),\n          tooltip: this.lang.font.name,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontname',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontNames.filter(this.isFontInstalled.bind(this)),\n          title: this.lang.font.name,\n          template: (item) => {\n            return '<span style=\"font-family: ' + env.validFontName(item) + '\">' + item + '</span>';\n          },\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontName'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsize', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsize\"></span>', this.options),\n          tooltip: this.lang.font.size,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsize',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizes,\n          title: this.lang.font.size,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSize'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsizeunit', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsizeunit\"></span>', this.options),\n          tooltip: this.lang.font.sizeunit,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsizeunit',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizeUnits,\n          title: this.lang.font.sizeunit,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.color', () => {\n      return this.colorPalette('note-color-all', this.lang.color.recent, true, true);\n    });\n\n    this.context.memo('button.forecolor', () => {\n      return this.colorPalette('note-color-fore', this.lang.color.foreground, false, true);\n    });\n\n    this.context.memo('button.backcolor', () => {\n      return this.colorPalette('note-color-back', this.lang.color.background, true, false);\n    });\n\n    this.context.memo('button.ul', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unorderedlist),\n        tooltip: this.lang.lists.unordered + this.representShortcut('insertUnorderedList'),\n        click: this.context.createInvokeHandler('editor.insertUnorderedList'),\n      }).render();\n    });\n\n    this.context.memo('button.ol', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.orderedlist),\n        tooltip: this.lang.lists.ordered + this.representShortcut('insertOrderedList'),\n        click: this.context.createInvokeHandler('editor.insertOrderedList'),\n      }).render();\n    });\n\n    const justifyLeft = this.button({\n      contents: this.ui.icon(this.options.icons.alignLeft),\n      tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),\n      click: this.context.createInvokeHandler('editor.justifyLeft'),\n    });\n\n    const justifyCenter = this.button({\n      contents: this.ui.icon(this.options.icons.alignCenter),\n      tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),\n      click: this.context.createInvokeHandler('editor.justifyCenter'),\n    });\n\n    const justifyRight = this.button({\n      contents: this.ui.icon(this.options.icons.alignRight),\n      tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),\n      click: this.context.createInvokeHandler('editor.justifyRight'),\n    });\n\n    const justifyFull = this.button({\n      contents: this.ui.icon(this.options.icons.alignJustify),\n      tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),\n      click: this.context.createInvokeHandler('editor.justifyFull'),\n    });\n\n    const outdent = this.button({\n      contents: this.ui.icon(this.options.icons.outdent),\n      tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),\n      click: this.context.createInvokeHandler('editor.outdent'),\n    });\n\n    const indent = this.button({\n      contents: this.ui.icon(this.options.icons.indent),\n      tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),\n      click: this.context.createInvokeHandler('editor.indent'),\n    });\n\n    this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));\n    this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));\n    this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));\n    this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));\n    this.context.memo('button.outdent', func.invoke(outdent, 'render'));\n    this.context.memo('button.indent', func.invoke(indent, 'render'));\n\n    this.context.memo('button.paragraph', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.alignLeft), this.options),\n          tooltip: this.lang.paragraph.paragraph,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown([\n          this.ui.buttonGroup({\n            className: 'note-align',\n            children: [justifyLeft, justifyCenter, justifyRight, justifyFull],\n          }),\n          this.ui.buttonGroup({\n            className: 'note-list',\n            children: [outdent, indent],\n          }),\n        ]),\n      ]).render();\n    });\n\n    this.context.memo('button.height', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.textHeight), this.options),\n          tooltip: this.lang.font.height,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          items: this.options.lineHeights,\n          checkClassName: this.options.icons.menuCheck,\n          className: 'dropdown-line-height',\n          title: this.lang.font.height,\n          click: this.context.createInvokeHandler('editor.lineHeight'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.table', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.table), this.options),\n          tooltip: this.lang.table.table,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          title: this.lang.table.table,\n          className: 'note-table',\n          items: [\n            '<div class=\"note-dimension-picker\">',\n              '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n              '<div class=\"note-dimension-picker-highlighted\"></div>',\n              '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n            '</div>',\n            '<div class=\"note-dimension-display\">1 x 1</div>',\n          ].join(''),\n        }),\n      ], {\n        callback: ($node) => {\n          const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n          $catcher.css({\n            width: this.options.insertTableMaxSize.col + 'em',\n            height: this.options.insertTableMaxSize.row + 'em',\n          }).mouseup(this.context.createInvokeHandler('editor.insertTable'))\n            .on('mousemove', this.tableMoveHandler.bind(this));\n        },\n      }).render();\n    });\n\n    this.context.memo('button.link', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.link + this.representShortcut('linkDialog.show'),\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.picture', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.picture),\n        tooltip: this.lang.image.image,\n        click: this.context.createInvokeHandler('imageDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.video', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.video),\n        tooltip: this.lang.video.video,\n        click: this.context.createInvokeHandler('videoDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.hr', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.minus),\n        tooltip: this.lang.hr.insert + this.representShortcut('insertHorizontalRule'),\n        click: this.context.createInvokeHandler('editor.insertHorizontalRule'),\n      }).render();\n    });\n\n    this.context.memo('button.fullscreen', () => {\n      return this.button({\n        className: 'btn-fullscreen note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.arrowsAlt),\n        tooltip: this.lang.options.fullscreen,\n        click: this.context.createInvokeHandler('fullscreen.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.codeview', () => {\n      return this.button({\n        className: 'btn-codeview note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.code),\n        tooltip: this.lang.options.codeview,\n        click: this.context.createInvokeHandler('codeview.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.redo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.redo),\n        tooltip: this.lang.history.redo + this.representShortcut('redo'),\n        click: this.context.createInvokeHandler('editor.redo'),\n      }).render();\n    });\n\n    this.context.memo('button.undo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.undo),\n        tooltip: this.lang.history.undo + this.representShortcut('undo'),\n        click: this.context.createInvokeHandler('editor.undo'),\n      }).render();\n    });\n\n    this.context.memo('button.help', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.question),\n        tooltip: this.lang.options.help,\n        click: this.context.createInvokeHandler('helpDialog.show'),\n      }).render();\n    });\n  }\n\n  /**\n   * image: [\n   *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n   *   ['float', ['floatLeft', 'floatRight', 'floatNone']],\n   *   ['remove', ['removeMedia']],\n   * ],\n   */\n  addImagePopoverButtons() {\n    // Image Size Buttons\n    this.context.memo('button.resizeFull', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">100%</span>',\n        tooltip: this.lang.image.resizeFull,\n        click: this.context.createInvokeHandler('editor.resize', '1'),\n      }).render();\n    });\n    this.context.memo('button.resizeHalf', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">50%</span>',\n        tooltip: this.lang.image.resizeHalf,\n        click: this.context.createInvokeHandler('editor.resize', '0.5'),\n      }).render();\n    });\n    this.context.memo('button.resizeQuarter', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">25%</span>',\n        tooltip: this.lang.image.resizeQuarter,\n        click: this.context.createInvokeHandler('editor.resize', '0.25'),\n      }).render();\n    });\n    this.context.memo('button.resizeNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.resizeNone,\n        click: this.context.createInvokeHandler('editor.resize', '0'),\n      }).render();\n    });\n\n    // Float Buttons\n    this.context.memo('button.floatLeft', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatLeft),\n        tooltip: this.lang.image.floatLeft,\n        click: this.context.createInvokeHandler('editor.floatMe', 'left'),\n      }).render();\n    });\n\n    this.context.memo('button.floatRight', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatRight),\n        tooltip: this.lang.image.floatRight,\n        click: this.context.createInvokeHandler('editor.floatMe', 'right'),\n      }).render();\n    });\n\n    this.context.memo('button.floatNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.floatNone,\n        click: this.context.createInvokeHandler('editor.floatMe', 'none'),\n      }).render();\n    });\n\n    // Remove Buttons\n    this.context.memo('button.removeMedia', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.image.remove,\n        click: this.context.createInvokeHandler('editor.removeMedia'),\n      }).render();\n    });\n  }\n\n  addLinkPopoverButtons() {\n    this.context.memo('button.linkDialogShow', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.edit,\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.unlink', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unlink),\n        tooltip: this.lang.link.unlink,\n        click: this.context.createInvokeHandler('editor.unlink'),\n      }).render();\n    });\n  }\n\n  /**\n   * table : [\n   *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n   *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]\n   * ],\n   */\n  addTablePopoverButtons() {\n    this.context.memo('button.addRowUp', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowAbove),\n        tooltip: this.lang.table.addRowAbove,\n        click: this.context.createInvokeHandler('editor.addRow', 'top'),\n      }).render();\n    });\n    this.context.memo('button.addRowDown', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowBelow),\n        tooltip: this.lang.table.addRowBelow,\n        click: this.context.createInvokeHandler('editor.addRow', 'bottom'),\n      }).render();\n    });\n    this.context.memo('button.addColLeft', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colBefore),\n        tooltip: this.lang.table.addColLeft,\n        click: this.context.createInvokeHandler('editor.addCol', 'left'),\n      }).render();\n    });\n    this.context.memo('button.addColRight', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colAfter),\n        tooltip: this.lang.table.addColRight,\n        click: this.context.createInvokeHandler('editor.addCol', 'right'),\n      }).render();\n    });\n    this.context.memo('button.deleteRow', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowRemove),\n        tooltip: this.lang.table.delRow,\n        click: this.context.createInvokeHandler('editor.deleteRow'),\n      }).render();\n    });\n    this.context.memo('button.deleteCol', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colRemove),\n        tooltip: this.lang.table.delCol,\n        click: this.context.createInvokeHandler('editor.deleteCol'),\n      }).render();\n    });\n    this.context.memo('button.deleteTable', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.table.delTable,\n        click: this.context.createInvokeHandler('editor.deleteTable'),\n      }).render();\n    });\n  }\n\n  build($container, groups) {\n    for (let groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {\n      const group = groups[groupIdx];\n      const groupName = Array.isArray(group) ? group[0] : group;\n      const buttons = Array.isArray(group) ? ((group.length === 1) ? [group[0]] : group[1]) : [group];\n\n      const $group = this.ui.buttonGroup({\n        className: 'note-' + groupName,\n      }).render();\n\n      for (let idx = 0, len = buttons.length; idx < len; idx++) {\n        const btn = this.context.memo('button.' + buttons[idx]);\n        if (btn) {\n          $group.append(typeof btn === 'function' ? btn(this.context) : btn);\n        }\n      }\n      $group.appendTo($container);\n    }\n  }\n\n  /**\n   * @param {jQuery} [$container]\n   */\n  updateCurrentStyle($container) {\n    const $cont = $container || this.$toolbar;\n\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    this.updateBtnStates($cont, {\n      '.note-btn-bold': () => {\n        return styleInfo['font-bold'] === 'bold';\n      },\n      '.note-btn-italic': () => {\n        return styleInfo['font-italic'] === 'italic';\n      },\n      '.note-btn-underline': () => {\n        return styleInfo['font-underline'] === 'underline';\n      },\n      '.note-btn-subscript': () => {\n        return styleInfo['font-subscript'] === 'subscript';\n      },\n      '.note-btn-superscript': () => {\n        return styleInfo['font-superscript'] === 'superscript';\n      },\n      '.note-btn-strikethrough': () => {\n        return styleInfo['font-strikethrough'] === 'strikethrough';\n      },\n    });\n\n    if (styleInfo['font-family']) {\n      const fontNames = styleInfo['font-family'].split(',').map((name) => {\n        return name.replace(/[\\'\\\"]/g, '')\n          .replace(/\\s+$/, '')\n          .replace(/^\\s+/, '');\n      });\n      const fontName = lists.find(fontNames, this.isFontInstalled.bind(this));\n\n      $cont.find('.dropdown-fontname a').each((idx, item) => {\n        const $item = $(item);\n        // always compare string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontName + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);\n    }\n\n    if (styleInfo['font-size']) {\n      const fontSize = styleInfo['font-size'];\n      $cont.find('.dropdown-fontsize a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontSize + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsize').text(fontSize);\n\n      const fontSizeUnit = styleInfo['font-size-unit'];\n      $cont.find('.dropdown-fontsizeunit a').each((idx, item) => {\n        const $item = $(item);\n        const isChecked = ($item.data('value') + '') === (fontSizeUnit + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);\n    }\n\n    if (styleInfo['line-height']) {\n      const lineHeight = styleInfo['line-height'];\n      $cont.find('.dropdown-line-height a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($(item).data('value') + '') === (lineHeight + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-line-height').text(lineHeight);\n    }\n  }\n\n  updateBtnStates($container, infos) {\n    $.each(infos, (selector, pred) => {\n      this.ui.toggleBtnActive($container.find(selector), pred());\n    });\n  }\n\n  tableMoveHandler(event) {\n    const PX_PER_EM = 18;\n    const $picker = $(event.target.parentNode); // target is mousecatcher\n    const $dimensionDisplay = $picker.next();\n    const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n    const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n    const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n    let posOffset;\n    // HTML5 with jQuery - e.offsetX is undefined in Firefox\n    if (event.offsetX === undefined) {\n      const posCatcher = $(event.target).offset();\n      posOffset = {\n        x: event.pageX - posCatcher.left,\n        y: event.pageY - posCatcher.top,\n      };\n    } else {\n      posOffset = {\n        x: event.offsetX,\n        y: event.offsetY,\n      };\n    }\n\n    const dim = {\n      c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n      r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n    };\n\n    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n    $catcher.data('value', dim.c + 'x' + dim.r);\n\n    if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {\n      $unhighlighted.css({ width: dim.c + 1 + 'em' });\n    }\n\n    if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {\n      $unhighlighted.css({ height: dim.r + 1 + 'em' });\n    }\n\n    $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n  }\n}\n","import $ from 'jquery';\nexport default class Toolbar {\n  constructor(context) {\n    this.context = context;\n\n    this.$window = $(window);\n    this.$document = $(document);\n\n    this.ui = $.summernote.ui;\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.options = context.options;\n\n    this.isFollowing = false;\n    this.followScroll = this.followScroll.bind(this);\n  }\n\n  shouldInitialize() {\n    return !this.options.airMode;\n  }\n\n  initialize() {\n    this.options.toolbar = this.options.toolbar || [];\n\n    if (!this.options.toolbar.length) {\n      this.$toolbar.hide();\n    } else {\n      this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);\n    }\n\n    if (this.options.toolbarContainer) {\n      this.$toolbar.appendTo(this.options.toolbarContainer);\n    }\n\n    this.changeContainer(false);\n\n    this.$note.on('summernote.keyup summernote.mouseup summernote.change', () => {\n      this.context.invoke('buttons.updateCurrentStyle');\n    });\n\n    this.context.invoke('buttons.updateCurrentStyle');\n    if (this.options.followingToolbar) {\n      this.$window.on('scroll resize', this.followScroll);\n    }\n  }\n\n  destroy() {\n    this.$toolbar.children().remove();\n\n    if (this.options.followingToolbar) {\n      this.$window.off('scroll resize', this.followScroll);\n    }\n  }\n\n  followScroll() {\n    if (this.$editor.hasClass('fullscreen')) {\n      return false;\n    }\n\n    const editorHeight = this.$editor.outerHeight();\n    const editorWidth = this.$editor.width();\n    const toolbarHeight = this.$toolbar.height();\n    const statusbarHeight = this.$statusbar.height();\n\n    // check if the web app is currently using another static bar\n    let otherBarHeight = 0;\n    if (this.options.otherStaticBar) {\n      otherBarHeight = $(this.options.otherStaticBar).outerHeight();\n    }\n\n    const currentOffset = this.$document.scrollTop();\n    const editorOffsetTop = this.$editor.offset().top;\n    const editorOffsetBottom = editorOffsetTop + editorHeight;\n    const activateOffset = editorOffsetTop - otherBarHeight;\n    const deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;\n\n    if (!this.isFollowing &&\n      (currentOffset > activateOffset) && (currentOffset < deactivateOffsetBottom - toolbarHeight)) {\n      this.isFollowing = true;\n      this.$editable.css({\n        marginTop: this.$toolbar.outerHeight(),\n      });\n      this.$toolbar.css({\n        position: 'fixed',\n        top: otherBarHeight,\n        width: editorWidth,\n        zIndex: 1000,\n      });\n    } else if (this.isFollowing &&\n      ((currentOffset < activateOffset) || (currentOffset > deactivateOffsetBottom))) {\n      this.isFollowing = false;\n      this.$toolbar.css({\n        position: 'relative',\n        top: 0,\n        width: '100%',\n        zIndex: 'auto',\n      });\n      this.$editable.css({\n        marginTop: '',\n      });\n    }\n  }\n\n  changeContainer(isFullscreen) {\n    if (isFullscreen) {\n      this.$toolbar.prependTo(this.$editor);\n    } else {\n      if (this.options.toolbarContainer) {\n        this.$toolbar.appendTo(this.options.toolbarContainer);\n      }\n    }\n    if (this.options.followingToolbar) {\n      this.followScroll();\n    }\n  }\n\n  updateFullscreen(isFullscreen) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);\n\n    this.changeContainer(isFullscreen);\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  }\n\n  activate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, true);\n  }\n\n  deactivate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, false);\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\n\nexport default class LinkDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-txt-${this.options.id}\" class=\"note-form-label\">${this.lang.link.textToDisplay}</label>`,\n        `<input id=\"note-dialog-link-txt-${this.options.id}\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-url-${this.options.id}\" class=\"note-form-label\">${this.lang.link.url}</label>`,\n        `<input id=\"note-dialog-link-url-${this.options.id}\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>`,\n      '</div>',\n      !this.options.disableLinkTarget\n        ? $('<div></div>').append(this.ui.checkbox({\n          className: 'sn-checkbox-open-in-new-window',\n          text: this.lang.link.openInNewWindow,\n          checked: true,\n        }).render()).html()\n        : '',\n      $('<div></div>').append(this.ui.checkbox({\n        className: 'sn-checkbox-use-protocol',\n        text: this.lang.link.useProtocol,\n        checked: true,\n      }).render()).html(),\n    ].join('');\n\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.link.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      className: 'link-dialog',\n      title: this.lang.link.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  /**\n   * toggle update button\n   */\n  toggleLinkBtn($linkBtn, $linkText, $linkUrl) {\n    this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());\n  }\n\n  /**\n   * Show link dialog and set event handlers on dialog controls.\n   *\n   * @param {Object} linkInfo\n   * @return {Promise}\n   */\n  showLinkDialog(linkInfo) {\n    return $.Deferred((deferred) => {\n      const $linkText = this.$dialog.find('.note-link-text');\n      const $linkUrl = this.$dialog.find('.note-link-url');\n      const $linkBtn = this.$dialog.find('.note-link-btn');\n      const $openInNewWindow = this.$dialog\n        .find('.sn-checkbox-open-in-new-window input[type=checkbox]');\n      const $useProtocol = this.$dialog\n        .find('.sn-checkbox-use-protocol input[type=checkbox]');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // If no url was given and given text is valid URL then copy that into URL Field\n        if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {\n          linkInfo.url = linkInfo.text;\n        }\n\n        $linkText.on('input paste propertychange', () => {\n          // If linktext was modified by input events,\n          // cloning text from linkUrl will be stopped.\n          linkInfo.text = $linkText.val();\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.text);\n\n        $linkUrl.on('input paste propertychange', () => {\n          // Display same text on `Text to display` as default\n          // when linktext has no text\n          if (!linkInfo.text) {\n            $linkText.val($linkUrl.val());\n          }\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.url);\n\n        if (!env.isSupportTouch) {\n          $linkUrl.trigger('focus');\n        }\n\n        this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        this.bindEnterKey($linkUrl, $linkBtn);\n        this.bindEnterKey($linkText, $linkBtn);\n\n        const isNewWindowChecked = linkInfo.isNewWindow !== undefined\n          ? linkInfo.isNewWindow : this.context.options.linkTargetBlank;\n\n        $openInNewWindow.prop('checked', isNewWindowChecked);\n\n        const useProtocolChecked = linkInfo.url\n          ? false : this.context.options.useProtocol;\n\n        $useProtocol.prop('checked', useProtocolChecked);\n\n        $linkBtn.one('click', (event) => {\n          event.preventDefault();\n\n          deferred.resolve({\n            range: linkInfo.range,\n            url: $linkUrl.val(),\n            text: $linkText.val(),\n            isNewWindow: $openInNewWindow.is(':checked'),\n            checkProtocol: $useProtocol.is(':checked'),\n          });\n          this.ui.hideDialog(this.$dialog);\n        });\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        // detach events\n        $linkText.off();\n        $linkUrl.off();\n        $linkBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  /**\n   * @param {Object} layoutInfo\n   */\n  show() {\n    const linkInfo = this.context.invoke('editor.getLinkInfo');\n\n    this.context.invoke('editor.saveRange');\n    this.showLinkDialog(linkInfo).then((linkInfo) => {\n      this.context.invoke('editor.restoreRange');\n      this.context.invoke('editor.createLink', linkInfo);\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class LinkPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.link);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-link-popover',\n      callback: ($node) => {\n        const $content = $node.find('.popover-content,.note-popover-content');\n        $content.prepend('<span><a target=\"_blank\"></a>&nbsp;</span>');\n      },\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.link);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update() {\n    // Prevent focusing on editable when invoke('code') is executed\n    if (!this.context.invoke('editor.hasFocus')) {\n      this.hide();\n      return;\n    }\n\n    const rng = this.context.invoke('editor.getLastRange');\n    if (rng.isCollapsed() && rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      const href = $(anchor).attr('href');\n      this.$popover.find('a').attr('href', href).text(href);\n\n      const pos = dom.posFromPlaceholder(anchor);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class ImageDialog {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    let imageLimitation = '';\n    if (this.options.maximumImageFileSize) {\n      const unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));\n      const readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +\n                         ' ' + ' KMGTP'[unit] + 'B';\n      imageLimitation = `<small>${this.lang.image.maximumFileSize + ' : ' + readableSize}</small>`;\n    }\n\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group note-group-select-from-files\">',\n        '<label for=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.selectFromFiles + '</label>',\n        '<input id=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-image-input form-control-file note-form-control note-input\" ',\n        ' type=\"file\" name=\"files\" accept=\"'+this.options.acceptImageFileTypes+'\" multiple=\"multiple\"/>',\n        imageLimitation,\n      '</div>',\n      '<div class=\"form-group note-group-image-url\">',\n        '<label for=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.url + '</label>',\n        '<input id=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-image-url form-control note-form-control note-input\" type=\"text\"/>',\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.image.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.image.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showImageDialog().then((data) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      if (typeof data === 'string') { // image url\n        // If onImageLinkInsert set,\n        if (this.options.callbacks.onImageLinkInsert) {\n          this.context.triggerEvent('image.link.insert', data);\n        } else {\n          this.context.invoke('editor.insertImage', data);\n        }\n      } else { // array of files\n        this.context.invoke('editor.insertImagesOrCallback', data);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show image dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showImageDialog() {\n    return $.Deferred((deferred) => {\n      const $imageInput = this.$dialog.find('.note-image-input');\n      const $imageUrl = this.$dialog.find('.note-image-url');\n      const $imageBtn = this.$dialog.find('.note-image-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // Cloning imageInput to clear element.\n        $imageInput.replaceWith($imageInput.clone().on('change', (event) => {\n          deferred.resolve(event.target.files || event.target.value);\n        }).val(''));\n\n        $imageUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($imageBtn, $imageUrl.val());\n        }).val('');\n\n        if (!env.isSupportTouch) {\n          $imageUrl.trigger('focus');\n        }\n\n        $imageBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($imageUrl.val());\n        });\n\n        this.bindEnterKey($imageUrl, $imageBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $imageInput.off();\n        $imageUrl.off();\n        $imageBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\n/**\n * Image popover module\n *  mouse events that show/hide popover will be handled by Handle.js.\n *  Handle.js will receive the events and invoke 'imagePopover.update'.\n */\nexport default class ImagePopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n\n    this.editable = context.layoutInfo.editable[0];\n    this.options = context.options;\n\n    this.events = {\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.image);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-image-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n    this.context.invoke('buttons.build', $content, this.options.popover.image);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target, event) {\n    if (dom.isImg(target)) {\n      const position = $(target).offset();\n      const containerOffset = $(this.options.container).offset();\n      let pos = {};\n      if (this.options.popatmouse) {\n        pos.left = event.pageX - 20;\n        pos.top = event.pageY;\n      } else {\n        pos = position;\n      }\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class TablePopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        this.update(e.target);\n      },\n      'summernote.keyup summernote.scroll summernote.change': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.table);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-table-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.table);\n\n    // [workaround] Disable Firefox's default table editor\n    if (env.isFF) {\n      document.execCommand('enableInlineTableEditing', false, false);\n    }\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isCell = dom.isCell(target) || dom.isCell(target?.parentElement);\n\n    if (isCell) {\n      const pos = dom.posFromPlaceholder(target);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n\n    return isCell;\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class VideoDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group row-fluid\">',\n        `<label for=\"note-dialog-video-url-${this.options.id}\" class=\"note-form-label\">${this.lang.video.url} <small class=\"text-muted\">${this.lang.video.providers}</small></label>`,\n        `<input id=\"note-dialog-video-url-${this.options.id}\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.video.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.video.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  createVideoNode(url) {\n    // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)\n    const ytRegExp = /\\/\\/(?:(?:www|m)\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))([\\w|-]{11})(?:(?:[\\?&]t=)(\\S+))?$/;\n    const ytRegExpForStart = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n    const ytMatch = url.match(ytRegExp);\n\n    const gdRegExp = /(?:\\.|\\/\\/)drive\\.google\\.com\\/file\\/d\\/(.[a-zA-Z0-9_-]*)\\/view/;\n    const gdMatch = url.match(gdRegExp);\n\n    const igRegExp = /(?:www\\.|\\/\\/)instagram\\.com\\/p\\/(.[a-zA-Z0-9_-]*)/;\n    const igMatch = url.match(igRegExp);\n\n    const vRegExp = /\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9]+)/;\n    const vMatch = url.match(vRegExp);\n\n    const vimRegExp = /\\/\\/(player\\.)?vimeo\\.com\\/([a-z]*\\/)*(\\d+)[?]?.*/;\n    const vimMatch = url.match(vimRegExp);\n\n    const dmRegExp = /.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?/;\n    const dmMatch = url.match(dmRegExp);\n\n    const youkuRegExp = /\\/\\/v\\.youku\\.com\\/v_show\\/id_(\\w+)=*\\.html/;\n    const youkuMatch = url.match(youkuRegExp);\n\n    const peerTubeRegExp =/\\/\\/(.*)\\/videos\\/watch\\/([^?]*)(?:\\?(?:start=(\\w*))?(?:&stop=(\\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/; \n    const peerTubeMatch = url.match(peerTubeRegExp);\n\n    const qqRegExp = /\\/\\/v\\.qq\\.com.*?vid=(.+)/;\n    const qqMatch = url.match(qqRegExp);\n\n    const qqRegExp2 = /\\/\\/v\\.qq\\.com\\/x?\\/?(page|cover).*?\\/([^\\/]+)\\.html\\??.*/;\n    const qqMatch2 = url.match(qqRegExp2);\n\n    const mp4RegExp = /^.+.(mp4|m4v)$/;\n    const mp4Match = url.match(mp4RegExp);\n\n    const oggRegExp = /^.+.(ogg|ogv)$/;\n    const oggMatch = url.match(oggRegExp);\n\n    const webmRegExp = /^.+.(webm)$/;\n    const webmMatch = url.match(webmRegExp);\n\n    const fbRegExp = /(?:www\\.|\\/\\/)facebook\\.com\\/([^\\/]+)\\/videos\\/([0-9]+)/;\n    const fbMatch = url.match(fbRegExp);\n\n    let $video;\n    if (ytMatch && ytMatch[1].length === 11) {\n      const youtubeId = ytMatch[1];\n      var start = 0;\n      if (typeof ytMatch[2] !== 'undefined') {\n        const ytMatchForStart = ytMatch[2].match(ytRegExpForStart);\n        if (ytMatchForStart) {\n          for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {\n            start += (typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0);\n          }\n        }\n      }\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : ''))\n        .attr('width', '640').attr('height', '360');\n    } else if (gdMatch && gdMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview')\n        .attr('width', '640').attr('height', '480');\n    } else if (igMatch && igMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/')\n        .attr('width', '612').attr('height', '710')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else if (vMatch && vMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', vMatch[0] + '/embed/simple')\n        .attr('width', '600').attr('height', '600')\n        .attr('class', 'vine-embed');\n    } else if (vimMatch && vimMatch[3].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('src', '//player.vimeo.com/video/' + vimMatch[3])\n        .attr('width', '640').attr('height', '360');\n    } else if (dmMatch && dmMatch[2].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2])\n        .attr('width', '640').attr('height', '360');\n    } else if (youkuMatch && youkuMatch[1].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '498')\n        .attr('width', '510')\n        .attr('src', '//player.youku.com/embed/' + youkuMatch[1]);\n    } else if (peerTubeMatch && peerTubeMatch[0].length){\n      var begin = 0;\n      if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];\n      var end =0;\n      if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];\n      var loop = 0;\n      if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];\n      var autoplay = 0;\n      if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];\n      var muted = 0;\n      if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];\n      $video = $('<iframe allowfullscreen sandbox=\"allow-same-origin allow-scripts allow-popups\">')\n        .attr('frameborder', 0)\n        .attr('src', '//'+ peerTubeMatch[1] +'/videos/embed/' + peerTubeMatch[2]+\"?loop=\"+loop\n      +\"&autoplay=\"+autoplay+\"&muted=\"+muted +(begin > 0 ? '&start=' + begin : '')+(end > 0 ? '&end=' + start : ''))\n        .attr('width', '560')\n        .attr('height', '315');\n    }else if ((qqMatch && qqMatch[1].length) || (qqMatch2 && qqMatch2[2].length)) {\n      const vid = ((qqMatch && qqMatch[1].length) ? qqMatch[1] : qqMatch2[2]);\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '310')\n        .attr('width', '500')\n        .attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');\n    } else if (mp4Match || oggMatch || webmMatch) {\n      $video = $('<video controls>')\n        .attr('src', url)\n        .attr('width', '640').attr('height', '360');\n    } else if (fbMatch && fbMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560')\n        .attr('width', '560').attr('height', '301')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else {\n      // this is not a known video link. Now what, Cat? Now what?\n      return false;\n    }\n\n    $video.addClass('note-video-clip');\n\n    return $video[0];\n  }\n\n  show() {\n    const text = this.context.invoke('editor.getSelectedText');\n    this.context.invoke('editor.saveRange');\n    this.showVideoDialog(text).then((url) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      // build node\n      const $node = this.createVideoNode(url);\n\n      if ($node) {\n        // insert video node\n        this.context.invoke('editor.insertNode', $node);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show video dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showVideoDialog(/* text */) {\n    return $.Deferred((deferred) => {\n      const $videoUrl = this.$dialog.find('.note-video-url');\n      const $videoBtn = this.$dialog.find('.note-video-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        $videoUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($videoBtn, $videoUrl.val());\n        });\n\n        if (!env.isSupportTouch) {\n          $videoUrl.trigger('focus');\n        }\n\n        $videoBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($videoUrl.val());\n        });\n\n        this.bindEnterKey($videoUrl, $videoBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $videoUrl.off();\n        $videoBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\n\nexport default class HelpDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<p class=\"text-center\">',\n        '<a href=\"http://summernote.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Summernote @@VERSION@@</a> · ',\n        '<a href=\"https://github.com/summernote/summernote\" target=\"_blank\" rel=\"noopener noreferrer\">Project</a> · ',\n        '<a href=\"https://github.com/summernote/summernote/issues\" target=\"_blank\" rel=\"noopener noreferrer\">Issues</a>',\n      '</p>',\n    ].join('');\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.options.help,\n      fade: this.options.dialogsFade,\n      body: this.createShortcutList(),\n      footer: body,\n      callback: ($node) => {\n        $node.find('.modal-body,.note-modal-body').css({\n          'max-height': 300,\n          'overflow': 'scroll',\n        });\n      },\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  createShortcutList() {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    return Object.keys(keyMap).map((key) => {\n      const command = keyMap[key];\n      const $row = $('<div><div class=\"help-list-item\"></div></div>');\n      $row.append($('<label><kbd>' + key + '</kdb></label>').css({\n        'width': 180,\n        'margin-right': 10,\n      })).append($('<span></span>').html(this.context.memo('help.' + command) || command));\n      return $row.html();\n    }).join('');\n  }\n\n  /**\n   * show help dialog\n   *\n   * @return {Promise}\n   */\n  showHelpDialog() {\n    return $.Deferred((deferred) => {\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n        deferred.resolve();\n      });\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showHelpDialog().then(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\n\nconst AIRMODE_POPOVER_X_OFFSET = -5;\nconst AIRMODE_POPOVER_Y_OFFSET = 5;\n\nexport default class AirPopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n\n    this.hidable = true;\n    this.onContextmenu = false;\n    this.pageX = null;\n    this.pageY = null;\n\n    this.events = {\n      'summernote.contextmenu': (e) => {\n        if (this.options.editing) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.onContextmenu = true;\n          this.update(true);\n        }\n      },\n      'summernote.mousedown': (we, e) => {\n        this.pageX = e.pageX;\n        this.pageY = e.pageY;\n      },\n      'summernote.keyup summernote.mouseup summernote.scroll': (we, e) => {\n        if (this.options.editing && !this.onContextmenu) {\n          this.pageX = e.pageX;\n          this.pageY = e.pageY;\n          this.update();\n        }\n        this.onContextmenu = false;\n      },\n      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.focusout': () => {\n        if (!this.$popover.is(':active,:focus')) {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.options.airMode && !lists.isEmpty(this.options.popover.air);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-air-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.air);\n\n    // disable hiding this popover preemptively by 'summernote.blur' event.\n    this.$popover.on('mousedown', () => { this.hidable = false; });\n    // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).\n    this.$popover.on('mouseup', () => { this.hidable = true; });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(forcelyOpen) {\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {\n      let rect = {\n        left: this.pageX,\n        top: this.pageY,\n      };\n\n      const containerOffset = $(this.options.container).offset();\n      rect.top -= containerOffset.top;\n      rect.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,\n        top: rect.top + AIRMODE_POPOVER_Y_OFFSET,\n      });\n      this.context.invoke('buttons.updateCurrentStyle', this.$popover);\n    } else {\n      this.hide();\n    }\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.hide();\n    } \n  }\n\n  hide() {\n    if (this.hidable) {\n      this.$popover.hide();\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport key from '../core/key';\n\nconst POPOVER_DIST = 5;\n\nexport default class HintPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.hint = this.options.hint || [];\n    this.direction = this.options.hintDirection || 'bottom';\n    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.hints.length > 0;\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n    this.matchingWord = null;\n    this.$popover = this.ui.popover({\n      className: 'note-hint-popover',\n      hideArrow: true,\n      direction: '',\n    }).render().appendTo(this.options.container);\n\n    this.$popover.hide();\n    this.$content = this.$popover.find('.popover-content,.note-popover-content');\n    this.$content.on('click', '.note-hint-item', (e) => {\n      this.$content.find('.active').removeClass('active');\n      $(e.currentTarget).addClass('active');\n      this.replace();\n    });\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  selectItem($item) {\n    this.$content.find('.active').removeClass('active');\n    $item.addClass('active');\n\n    this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);\n  }\n\n  moveDown() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $next = $current.next();\n\n    if ($next.length) {\n      this.selectItem($next);\n    } else {\n      let $nextGroup = $current.parent().next();\n\n      if (!$nextGroup.length) {\n        $nextGroup = this.$content.find('.note-hint-group').first();\n      }\n\n      this.selectItem($nextGroup.find('.note-hint-item').first());\n    }\n  }\n\n  moveUp() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $prev = $current.prev();\n\n    if ($prev.length) {\n      this.selectItem($prev);\n    } else {\n      let $prevGroup = $current.parent().prev();\n\n      if (!$prevGroup.length) {\n        $prevGroup = this.$content.find('.note-hint-group').last();\n      }\n\n      this.selectItem($prevGroup.find('.note-hint-item').last());\n    }\n  }\n\n  replace() {\n    const $item = this.$content.find('.note-hint-item.active');\n\n    if ($item.length) {\n      var node = this.nodeFromItem($item);\n      // If matchingWord length = 0 -> capture OK / open hint / but as mention capture \"\" (\\w*)\n      if (this.matchingWord !== null && this.matchingWord.length === 0) {\n        this.lastWordRange.so = this.lastWordRange.eo;\n      // Else si > 0 and normal case -> adjust range \"before\" for correct position of insertion\n      } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {\n        let rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;\n        if (rangeCompute > 0) {\n          this.lastWordRange.so += rangeCompute;\n        }\n      }\n      this.lastWordRange.insertNode(node);\n\n      if (this.options.hintSelect === 'next') {\n        var blank = document.createTextNode('');\n        $(node).after(blank);\n        range.createFromNodeBefore(blank).select();\n      } else {\n        range.createFromNodeAfter(node).select();\n      }\n\n      this.lastWordRange = null;\n      this.hide();\n      this.context.invoke('editor.focus');\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  nodeFromItem($item) {\n    const hint = this.hints[$item.data('index')];\n    const item = $item.data('item');\n    let node = hint.content ? hint.content(item) : item;\n    if (typeof node === 'string') {\n      node = dom.createText(node);\n    }\n    return node;\n  }\n\n  createItemTemplates(hintIdx, items) {\n    const hint = this.hints[hintIdx];\n    return items.map((item /*, idx */) => {\n      const $item = $('<div class=\"note-hint-item\"></div>');\n      $item.append(hint.template ? hint.template(item) : item + '');\n      $item.data({\n        'index': hintIdx,\n        'item': item,\n      });\n      return $item;\n    });\n  }\n\n  handleKeydown(e) {\n    if (!this.$popover.is(':visible')) {\n      return;\n    }\n\n    if (e.keyCode === key.code.ENTER) {\n      e.preventDefault();\n      this.replace();\n    } else if (e.keyCode === key.code.UP) {\n      e.preventDefault();\n      this.moveUp();\n    } else if (e.keyCode === key.code.DOWN) {\n      e.preventDefault();\n      this.moveDown();\n    }\n  }\n\n  searchKeyword(index, keyword, callback) {\n    const hint = this.hints[index];\n    if (hint && hint.match.test(keyword) && hint.search) {\n      const matches = hint.match.exec(keyword);\n      this.matchingWord = matches[0];\n      hint.search(matches[1], callback);\n    } else {\n      callback();\n    }\n  }\n\n  createGroup(idx, keyword) {\n    const $group = $('<div class=\"note-hint-group note-hint-group-' + idx + '\"></div>');\n    this.searchKeyword(idx, keyword, (items) => {\n      items = items || [];\n      if (items.length) {\n        $group.html(this.createItemTemplates(idx, items));\n        this.show();\n      }\n    });\n\n    return $group;\n  }\n\n  handleKeyup(e) {\n    if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {\n      let range = this.context.invoke('editor.getLastRange');\n      let wordRange, keyword;\n      if (this.options.hintMode === 'words') {\n        wordRange = range.getWordsRange(range);\n        keyword = wordRange.toString();\n\n        this.hints.forEach((hint) => {\n          if (hint.match.test(keyword)) {\n            wordRange = range.getWordsMatchRange(hint.match);\n            return false;\n          }\n        });\n\n        if (!wordRange) {\n          this.hide();\n          return;\n        }\n\n        keyword = wordRange.toString();\n      } else {\n        wordRange = range.getWordRange();\n        keyword = wordRange.toString();\n      }\n\n      if (this.hints.length && keyword) {\n        this.$content.empty();\n\n        const bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));\n        const containerOffset = $(this.options.container).offset();\n        if (bnd) {\n          bnd.top -= containerOffset.top;\n          bnd.left -= containerOffset.left;\n\n          this.$popover.hide();\n          this.lastWordRange = wordRange;\n          this.hints.forEach((hint, idx) => {\n            if (hint.match.test(keyword)) {\n              this.createGroup(idx, keyword).appendTo(this.$content);\n            }\n          });\n          // select first .note-hint-item\n          this.$content.find('.note-hint-item:first').addClass('active');\n\n          // set position for popover after group is created\n          if (this.direction === 'top') {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST,\n            });\n          } else {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top + bnd.height + POPOVER_DIST,\n            });\n          }\n        }\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  show() {\n    this.$popover.show();\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport '../lang/summernote-en-US';\nimport './summernote';\nimport dom from './core/dom';\nimport range from './core/range';\nimport lists from './core/lists';\nimport Editor from './module/Editor';\nimport Clipboard from './module/Clipboard';\nimport Dropzone from './module/Dropzone';\nimport Codeview from './module/Codeview';\nimport Statusbar from './module/Statusbar';\nimport Fullscreen from './module/Fullscreen';\nimport Handle from './module/Handle';\nimport AutoLink from './module/AutoLink';\nimport AutoSync from './module/AutoSync';\nimport AutoReplace from './module/AutoReplace';\nimport Placeholder from './module/Placeholder';\nimport Buttons from './module/Buttons';\nimport Toolbar from './module/Toolbar';\nimport LinkDialog from './module/LinkDialog';\nimport LinkPopover from './module/LinkPopover';\nimport ImageDialog from './module/ImageDialog';\nimport ImagePopover from './module/ImagePopover';\nimport TablePopover from './module/TablePopover';\nimport VideoDialog from './module/VideoDialog';\nimport HelpDialog from './module/HelpDialog';\nimport AirPopover from './module/AirPopover';\nimport HintPopover from './module/HintPopover';\n\n$.summernote = $.extend($.summernote, {\n  version: '@@VERSION@@',\n  plugins: {},\n\n  dom: dom,\n  range: range,\n  lists: lists,\n\n  options: {\n    langInfo: $.summernote.lang['en-US'],\n    editing: true,\n    modules: {\n      'editor': Editor,\n      'clipboard': Clipboard,\n      'dropzone': Dropzone,\n      'codeview': Codeview,\n      'statusbar': Statusbar,\n      'fullscreen': Fullscreen,\n      'handle': Handle,\n      // FIXME: HintPopover must be front of autolink\n      //  - Script error about range when Enter key is pressed on hint popover\n      'hintPopover': HintPopover,\n      'autoLink': AutoLink,\n      'autoSync': AutoSync,\n      'autoReplace': AutoReplace,\n      'placeholder': Placeholder,\n      'buttons': Buttons,\n      'toolbar': Toolbar,\n      'linkDialog': LinkDialog,\n      'linkPopover': LinkPopover,\n      'imageDialog': ImageDialog,\n      'imagePopover': ImagePopover,\n      'tablePopover': TablePopover,\n      'videoDialog': VideoDialog,\n      'helpDialog': HelpDialog,\n      'airPopover': AirPopover,\n    },\n\n    buttons: {},\n\n    lang: 'en-US',\n\n    followingToolbar: false,\n    toolbarPosition: 'top',\n    otherStaticBar: '',\n\n    // toolbar\n    codeviewKeepButton: false,\n    toolbar: [\n      ['style', ['style']],\n      ['font', ['bold', 'underline', 'clear']],\n      ['fontname', ['fontname']],\n      ['color', ['color']],\n      ['para', ['ul', 'ol', 'paragraph']],\n      ['table', ['table']],\n      ['insert', ['link', 'picture', 'video']],\n      ['view', ['fullscreen', 'codeview', 'help']],\n    ],\n\n    // popover\n    popatmouse: true,\n    popover: {\n      image: [\n        ['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n        ['float', ['floatLeft', 'floatRight', 'floatNone']],\n        ['remove', ['removeMedia']],\n      ],\n      link: [\n        ['link', ['linkDialogShow', 'unlink']],\n      ],\n      table: [\n        ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n        ['delete', ['deleteRow', 'deleteCol', 'deleteTable']],\n      ],\n      air: [\n        ['color', ['color']],\n        ['font', ['bold', 'underline', 'clear']],\n        ['para', ['ul', 'paragraph']],\n        ['table', ['table']],\n        ['insert', ['link', 'picture']],\n        ['view', ['fullscreen', 'codeview']],\n      ],\n    },\n\n    // air mode: inline editor\n    airMode: false,\n    overrideContextMenu: false, // TBD\n\n    width: null,\n    height: null,\n    linkTargetBlank: true,\n    useProtocol: true,\n    defaultProtocol: 'http://',\n\n    focus: false,\n    tabDisabled: false,\n    tabSize: 4,\n    styleWithCSS: false,\n    shortcuts: true,\n    textareaAutoSync: true,\n    tooltip: 'auto',\n    container: null,\n    maxTextLength: 0,\n    blockquoteBreakingLevel: 2,\n    spellCheck: true,\n    disableGrammar: false,\n    placeholder: null,\n    inheritPlaceholder: false,\n    // TODO: need to be documented\n    recordEveryKeystroke: false,\n    historyLimit: 200,\n\n    // TODO: need to be documented\n    showDomainOnlyForAutolink: false,\n\n    // TODO: need to be documented\n    hintMode: 'word',\n    hintSelect: 'after',\n    hintDirection: 'bottom',\n\n    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n\n    fontNames: [\n      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',\n      'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',\n      'Tahoma', 'Times New Roman', 'Verdana',\n    ],\n    fontNamesIgnoreCheck: [],\n    addDefaultFonts: true,\n\n    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],\n\n    fontSizeUnits: ['px', 'pt'],\n\n    // pallete colors(n x n)\n    colors: [\n      ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],\n      ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],\n      ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],\n      ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],\n      ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],\n      ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],\n      ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],\n      ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'],\n    ],\n\n    // http://chir.ag/projects/name-that-color/\n    colorsName: [\n      ['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'],\n      ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'],\n      ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'],\n      ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'],\n      ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'],\n      ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'],\n      ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'],\n      ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou'],\n    ],\n\n    colorButton: {\n      foreColor: '#000000',\n      backColor: '#FFFF00',\n    },\n\n    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],\n\n    tableClassName: 'table table-bordered',\n\n    insertTableMaxSize: {\n      col: 10,\n      row: 10,\n    },\n\n    // By default, dialogs are attached in container.\n    dialogsInBody: false,\n    dialogsFade: false,\n\n    maximumImageFileSize: null,\n    acceptImageFileTypes: \"image/*\",\n\n    callbacks: {\n      onBeforeCommand: null,\n      onBlur: null,\n      onBlurCodeview: null,\n      onChange: null,\n      onChangeCodeview: null,\n      onDialogShown: null,\n      onEnter: null,\n      onFocus: null,\n      onImageLinkInsert: null,\n      onImageUpload: null,\n      onImageUploadError: null,\n      onInit: null,\n      onKeydown: null,\n      onKeyup: null,\n      onMousedown: null,\n      onMouseup: null,\n      onPaste: null,\n      onScroll: null,\n    },\n\n    codemirror: {\n      mode: 'text/html',\n      htmlMode: true,\n      lineNumbers: true,\n    },\n\n    codeviewFilter: true,\n    codeviewFilterRegex: /<\\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,\n    codeviewIframeFilter: true,\n    codeviewIframeWhitelistSrc: [],\n    codeviewIframeWhitelistSrcBase: [\n      'www.youtube.com',\n      'www.youtube-nocookie.com',\n      'www.facebook.com',\n      'vine.co',\n      'instagram.com',\n      'player.vimeo.com',\n      'www.dailymotion.com',\n      'player.youku.com',\n      'jumpingbean.tv',\n      'v.qq.com',\n    ],\n\n    keyMap: {\n      pc: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CTRL+Z': 'undo',\n        'CTRL+Y': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CTRL+B': 'bold',\n        'CTRL+I': 'italic',\n        'CTRL+U': 'underline',\n        'CTRL+SHIFT+S': 'strikethrough',\n        'CTRL+BACKSLASH': 'removeFormat',\n        'CTRL+SHIFT+L': 'justifyLeft',\n        'CTRL+SHIFT+E': 'justifyCenter',\n        'CTRL+SHIFT+R': 'justifyRight',\n        'CTRL+SHIFT+J': 'justifyFull',\n        'CTRL+SHIFT+NUM7': 'insertUnorderedList',\n        'CTRL+SHIFT+NUM8': 'insertOrderedList',\n        'CTRL+LEFTBRACKET': 'outdent',\n        'CTRL+RIGHTBRACKET': 'indent',\n        'CTRL+NUM0': 'formatPara',\n        'CTRL+NUM1': 'formatH1',\n        'CTRL+NUM2': 'formatH2',\n        'CTRL+NUM3': 'formatH3',\n        'CTRL+NUM4': 'formatH4',\n        'CTRL+NUM5': 'formatH5',\n        'CTRL+NUM6': 'formatH6',\n        'CTRL+ENTER': 'insertHorizontalRule',\n        'CTRL+K': 'linkDialog.show',\n      },\n\n      mac: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CMD+Z': 'undo',\n        'CMD+SHIFT+Z': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CMD+B': 'bold',\n        'CMD+I': 'italic',\n        'CMD+U': 'underline',\n        'CMD+SHIFT+S': 'strikethrough',\n        'CMD+BACKSLASH': 'removeFormat',\n        'CMD+SHIFT+L': 'justifyLeft',\n        'CMD+SHIFT+E': 'justifyCenter',\n        'CMD+SHIFT+R': 'justifyRight',\n        'CMD+SHIFT+J': 'justifyFull',\n        'CMD+SHIFT+NUM7': 'insertUnorderedList',\n        'CMD+SHIFT+NUM8': 'insertOrderedList',\n        'CMD+LEFTBRACKET': 'outdent',\n        'CMD+RIGHTBRACKET': 'indent',\n        'CMD+NUM0': 'formatPara',\n        'CMD+NUM1': 'formatH1',\n        'CMD+NUM2': 'formatH2',\n        'CMD+NUM3': 'formatH3',\n        'CMD+NUM4': 'formatH4',\n        'CMD+NUM5': 'formatH5',\n        'CMD+NUM6': 'formatH6',\n        'CMD+ENTER': 'insertHorizontalRule',\n        'CMD+K': 'linkDialog.show',\n      },\n    },\n    icons: {\n      'align': 'note-icon-align',\n      'alignCenter': 'note-icon-align-center',\n      'alignJustify': 'note-icon-align-justify',\n      'alignLeft': 'note-icon-align-left',\n      'alignRight': 'note-icon-align-right',\n      'rowBelow': 'note-icon-row-below',\n      'colBefore': 'note-icon-col-before',\n      'colAfter': 'note-icon-col-after',\n      'rowAbove': 'note-icon-row-above',\n      'rowRemove': 'note-icon-row-remove',\n      'colRemove': 'note-icon-col-remove',\n      'indent': 'note-icon-align-indent',\n      'outdent': 'note-icon-align-outdent',\n      'arrowsAlt': 'note-icon-arrows-alt',\n      'bold': 'note-icon-bold',\n      'caret': 'note-icon-caret',\n      'circle': 'note-icon-circle',\n      'close': 'note-icon-close',\n      'code': 'note-icon-code',\n      'eraser': 'note-icon-eraser',\n      'floatLeft': 'note-icon-float-left',\n      'floatRight': 'note-icon-float-right',\n      'font': 'note-icon-font',\n      'frame': 'note-icon-frame',\n      'italic': 'note-icon-italic',\n      'link': 'note-icon-link',\n      'unlink': 'note-icon-chain-broken',\n      'magic': 'note-icon-magic',\n      'menuCheck': 'note-icon-menu-check',\n      'minus': 'note-icon-minus',\n      'orderedlist': 'note-icon-orderedlist',\n      'pencil': 'note-icon-pencil',\n      'picture': 'note-icon-picture',\n      'question': 'note-icon-question',\n      'redo': 'note-icon-redo',\n      'rollback': 'note-icon-rollback',\n      'square': 'note-icon-square',\n      'strikethrough': 'note-icon-strikethrough',\n      'subscript': 'note-icon-subscript',\n      'superscript': 'note-icon-superscript',\n      'table': 'note-icon-table',\n      'textHeight': 'note-icon-text-height',\n      'trash': 'note-icon-trash',\n      'underline': 'note-icon-underline',\n      'undo': 'note-icon-undo',\n      'unorderedlist': 'note-icon-unorderedlist',\n      'video': 'note-icon-video',\n    },\n  },\n});\n","import $ from 'jquery';\n\nclass Renderer {\n  constructor(markup, children, options, callback) {\n    this.markup = markup;\n    this.children = children;\n    this.options = options;\n    this.callback = callback;\n  }\n\n  render($parent) {\n    const $node = $(this.markup);\n\n    if (this.options && this.options.contents) {\n      $node.html(this.options.contents);\n    }\n\n    if (this.options && this.options.className) {\n      $node.addClass(this.options.className);\n    }\n\n    if (this.options && this.options.data) {\n      $.each(this.options.data, (k, v) => {\n        $node.attr('data-' + k, v);\n      });\n    }\n\n    if (this.options && this.options.click) {\n      $node.on('click', this.options.click);\n    }\n\n    if (this.children) {\n      const $container = $node.find('.note-children-container');\n      this.children.forEach((child) => {\n        child.render($container.length ? $container : $node);\n      });\n    }\n\n    if (this.callback) {\n      this.callback($node, this.options);\n    }\n\n    if (this.options && this.options.callback) {\n      this.options.callback($node);\n    }\n\n    if ($parent) {\n      $parent.append($node);\n    }\n\n    return $node;\n  }\n}\n\nexport default {\n  create: (markup, callback) => {\n    return function() {\n      const options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];\n      let children = Array.isArray(arguments[0]) ? arguments[0] : [];\n      if (options && options.children) {\n        children = options.children;\n      }\n      return new Renderer(markup, children, options, callback);\n    };\n  },\n};\n","import $ from 'jquery';\nimport '/js/settings';\nimport renderer from '/js/renderer';\nimport './summernote-bs5.scss';\n\nconst editor = renderer.create('<div class=\"note-editor note-frame card\"/>');\nconst toolbar = renderer.create('<div class=\"note-toolbar card-header\" role=\"toolbar\"/>');\nconst editingArea = renderer.create('<div class=\"note-editing-area\"/>');\nconst codable = renderer.create('<textarea class=\"note-codable\" aria-multiline=\"true\"/>');\nconst editable = renderer.create('<div class=\"note-editable card-block\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"/>');\nconst statusbar = renderer.create([\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n  '<div class=\"note-statusbar\" role=\"status\">',\n    '<div class=\"note-resizebar\" aria-label=\"Resize\">',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n    '</div>',\n  '</div>',\n].join(''));\n\nconst airEditor = renderer.create('<div class=\"note-editor note-airframe\"/>');\nconst airEditable = renderer.create([\n  '<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>',\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n].join(''));\n\nconst buttonGroup = renderer.create('<div class=\"note-btn-group btn-group\">');\n\nconst dropdown = renderer.create('<div class=\"note-dropdown-menu dropdown-menu\" role=\"list\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    const option = (typeof item === 'object') ? item.option : undefined;\n\n    const dataValue = 'data-value=\"' + value + '\"';\n    const dataOption = (option !== undefined) ? ' data-option=\"' + option + '\"' : '';\n    return '<a class=\"dropdown-item\" href=\"#\" ' + (dataValue + dataOption) + ' role=\"listitem\" aria-label=\"' + value + '\">' + content + '</a>';\n  }).join('') : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownButtonContents = function(contents) {\n  return contents;\n};\n\nconst dropdownCheck = renderer.create('<div class=\"note-dropdown-menu dropdown-menu note-check\" role=\"list\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    return '<a class=\"dropdown-item\" href=\"#\" data-value=\"' + value + '\" role=\"listitem\" aria-label=\"' + item + '\">' + icon(options.checkClassName) + ' ' + content + '</a>';\n  }).join('') : options.items;\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dialog = renderer.create('<div class=\"modal note-modal\" aria-hidden=\"false\" tabindex=\"-1\" role=\"dialog\"/>', function($node, options) {\n  if (options.fade) {\n    $node.addClass('fade');\n  }\n  $node.attr({\n    'aria-label': options.title,\n  });\n  $node.html([\n    '<div class=\"modal-dialog\">',\n      '<div class=\"modal-content\">',\n        (options.title ? '<div class=\"modal-header\">' +\n          '<h4 class=\"modal-title\">' + options.title + '</h4>' +\n          '<button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\" aria-hidden=\"true\"></button>' +\n        '</div>' : ''),\n        '<div class=\"modal-body\">' + options.body + '</div>',\n        (options.footer ? '<div class=\"modal-footer\">' + options.footer + '</div>' : ''),\n      '</div>',\n    '</div>',\n  ].join(''));\n});\n\nconst popover = renderer.create([\n  '<div class=\"note-popover popover show\">',\n    '<div class=\"popover-arrow\"></div>',\n    '<div class=\"popover-body note-children-container\"></div>',\n  '</div>',\n].join(''), function($node, options) {\n  const direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';\n\n  $node.attr('data-bs-placement', direction);\n\n  if (options.hideArrow) {\n    $node.find('.popover-arrow').hide();\n  }\n});\n\nconst checkbox = renderer.create('<div class=\"form-check\"></div>', function($node, options) {\n  $node.html([\n    '<label class=\"form-check-label\"' + (options.id ? ' for=\"note-' + options.id + '\"' : '') + '>',\n      '<input type=\"checkbox\" class=\"form-check-input\"' + (options.id ? ' id=\"note-' + options.id + '\"' : ''),\n        (options.checked ? ' checked' : ''),\n        ' aria-label=\"' + (options.text ? options.text : '') + '\"',\n        ' aria-checked=\"' + (options.checked ? 'true' : 'false') + '\"/>',\n      ' ' + (options.text ? options.text : '') +\n    '</label>',\n  ].join(''));\n});\n\nconst icon = function(iconClassName, tagName) {\n  if (iconClassName.match(/^</)) {\n    return iconClassName;\n  }\n  tagName = tagName || 'i';\n  return '<' + tagName + ' class=\"' + iconClassName + '\"></' + tagName+'>';\n};\n\nconst ui = function(editorOptions) {\n  return {\n    editor: editor,\n    toolbar: toolbar,\n    editingArea: editingArea,\n    codable: codable,\n    editable: editable,\n    statusbar: statusbar,\n    airEditor: airEditor,\n    airEditable: airEditable,\n    buttonGroup: buttonGroup,\n    dropdown: dropdown,\n    dropdownButtonContents: dropdownButtonContents,\n    dropdownCheck: dropdownCheck,\n    dialog: dialog,\n    popover: popover,\n    icon: icon,\n    checkbox: checkbox,\n    options: editorOptions,\n\n    palette: function($node, options) {\n      return renderer.create('<div class=\"note-color-palette\"/>', function($node, options) {\n        const contents = [];\n        for (let row = 0, rowSize = options.colors.length; row < rowSize; row++) {\n          const eventName = options.eventName;\n          const colors = options.colors[row];\n          const colorsName = options.colorsName[row];\n          const buttons = [];\n          for (let col = 0, colSize = colors.length; col < colSize; col++) {\n            const color = colors[col];\n            const colorName = colorsName[col];\n            buttons.push([\n              '<button type=\"button\" class=\"note-color-btn\"',\n              'style=\"background-color:', color, '\" ',\n              'data-event=\"', eventName, '\" ',\n              'data-value=\"', color, '\" ',\n              'title=\"', colorName, '\" ',\n              'aria-label=\"', colorName, '\" ',\n              'data-toggle=\"button\" tabindex=\"-1\"></button>',\n            ].join(''));\n          }\n          contents.push('<div class=\"note-color-row\">' + buttons.join('') + '</div>');\n        }\n        $node.html(contents.join(''));\n\n        if (options.tooltip) {\n          $node.find('.note-color-btn').tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          });\n        }\n      })($node, options);\n    },\n\n    button: function($node, options) {\n      return renderer.create('<button type=\"button\" class=\"note-btn btn btn-light btn-sm\" tabindex=\"-1\">', function($node, options) {\n        if (options && options.tooltip) {\n          $node.attr({\n            title: options.tooltip,\n            'aria-label': options.tooltip,\n          }).tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          }).on('click', (e) => {\n            $(e.currentTarget).tooltip('hide');\n          });\n        }\n        if (options && options.codeviewButton) {\n          $node.addClass('note-codeview-keep');\n        }\n      })($node, options);\n    },\n\n    toggleBtn: function($btn, isEnable) {\n      $btn.toggleClass('disabled', !isEnable);\n      $btn.attr('disabled', !isEnable);\n    },\n\n    toggleBtnActive: function($btn, isActive) {\n      $btn.toggleClass('active', isActive);\n    },\n\n    onDialogShown: function($dialog, handler) {\n      $dialog.one('shown.bs.modal', handler);\n    },\n\n    onDialogHidden: function($dialog, handler) {\n      $dialog.one('hidden.bs.modal', handler);\n    },\n\n    showDialog: function($dialog) {\n      $dialog.modal('show');\n    },\n\n    hideDialog: function($dialog) {\n      $dialog.modal('hide');\n    },\n\n    createLayout: function($note) {\n      const $editor = (editorOptions.airMode ? airEditor([\n        editingArea([\n          codable(),\n          airEditable(),\n        ]),\n      ]) : (editorOptions.toolbarPosition === 'bottom'\n        ? editor([\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          toolbar(),\n          statusbar(),\n        ])\n        : editor([\n          toolbar(),\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          statusbar(),\n        ])\n      )).render();\n\n      $editor.insertAfter($note);\n\n      return {\n        note: $note,\n        editor: $editor,\n        toolbar: $editor.find('.note-toolbar'),\n        editingArea: $editor.find('.note-editing-area'),\n        editable: $editor.find('.note-editable'),\n        codable: $editor.find('.note-codable'),\n        statusbar: $editor.find('.note-statusbar'),\n      };\n    },\n\n    removeLayout: function($note, layoutInfo) {\n      $note.html(layoutInfo.editable.html());\n      layoutInfo.editor.remove();\n      $note.show();\n    },\n  };\n};\n\n$.summernote = $.extend($.summernote, {\n  ui_template: ui,\n  interface: 'bs5',\n});\n\n$.summernote.options.styleTags = [\n  'p',\n  { title: 'Blockquote', tag: 'blockquote', className: 'blockquote', value: 'blockquote' },\n  'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n];\n"],"names":["$","summernote","lang","extend","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","genericFontFamilies","validFontName","fontName","inArray","toLowerCase","isFontInstalled","testFontName","testText","testSize","canvas","document","createElement","context","getContext","originalWidth","measureText","width","userAgent","navigator","isMSIE","test","browserVersion","matches","exec","parseFloat","isEdge","isSupportTouch","window","MaxTouchPoints","msMaxTouchPoints","inputEventName","isMac","appVersion","indexOf","isFF","isPhantom","isWebkit","isChrome","isSafari","isW3CRangeSupport","createRange","eq","itemA","itemB","eq2","peq2","propName","ok","fail","not","f","apply","arguments","and","fA","fB","item","self","a","invoke","obj","method","idCounter","resetUniqueId","uniqueId","prefix","id","rect2bnd","rect","$document","top","scrollTop","scrollLeft","bottom","invertObject","inverted","key","Object","prototype","hasOwnProperty","call","namespaceToCamel","namespace","split","map","substring","toUpperCase","join","debounce","func","wait","immediate","timeout","args","later","callNow","clearTimeout","setTimeout","isValidUrl","expression","head","array","last","length","initial","slice","tail","find","pred","idx","len","all","contains","sum","fn","reduce","memo","v","from","collection","result","isEmpty","clusterBy","aTail","aLast","compact","aResult","push","unique","results","next","prev","env","NBSP_CHAR","String","fromCharCode","ZERO_WIDTH_NBSP_CHAR","isEditable","node","hasClass","isControlSizing","makePredByNodeName","nodeName","isText","nodeType","isElement","isVoid","isPara","isHeading","isPre","isLi","isPurePara","isTable","isData","isInline","isBodyContainer","isList","isHr","isBlockquote","isCell","isAnchor","isParaInline","ancestor","isBodyInline","isBody","isClosestSibling","nodeA","nodeB","nextSibling","previousSibling","withClosestSiblings","siblings","blankHTML","nodeLength","nodeValue","childNodes","deepestChildIsEmpty","firstElementChild","innerHTML","paddingBlankHTML","parentNode","singleChildAncestor","listAncestor","ancestors","el","lastAncestor","filter","commonAncestor","n","listPrev","nodes","listNext","listDescendant","descendants","fnWalk","current","wrap","wrapperName","parent","wrapper","insertBefore","appendChild","insertAfter","preceding","appendChildNodes","aChild","each","child","isLeftEdgePoint","point","offset","isRightEdgePoint","isEdgePoint","isLeftEdgeOf","position","isRightEdgeOf","isLeftEdgePointOf","isRightEdgePointOf","hasChildren","prevPoint","isSkipInnerOffset","nextPoint","nextTextNode","getNextTextNode","nextPointWithEmptyNode","actual","undefined","isSamePoint","pointA","pointB","isVisiblePoint","leftNode","rightNode","prevPointUntil","nextPointUntil","isCharPoint","ch","charAt","isSpacePoint","walkPoint","startPoint","endPoint","handler","isSkipOffset","makeOffsetPath","reverse","fromOffsetPath","offsets","i","splitNode","isSkipPaddingBlankHTML","isNotSplitEdgePoint","isDiscardEmptySplits","splitText","childNode","clone","cloneNode","splitTree","root","splitPoint","topAncestor","splitRoot","container","pivot","create","createText","text","createTextNode","isRemoveChild","removeNode","removeChild","removeWhile","replace","newNode","cssText","isTextarea","value","$node","stripLinebreaks","val","html","isNewlineOnBlock","markup","regexTag","match","endSlash","isEndOfInlineContainer","isBlockNode","trim","posFromPlaceholder","placeholder","$placeholder","pos","outerHeight","attachEvents","events","keys","forEach","on","detachEvents","off","isCustomStyleTag","classList","blank","emptyPara","isBlock","isDiv","isBR","isSpan","isB","isU","isS","isI","isImg","isEmptyAnchor","dom","Context","$note","memos","modules","layoutInfo","ui","ui_template","initialize","createLayout","_initialize","hide","_destroy","removeData","removeLayout","disabled","isDisabled","code","disable","now","editor","buttons","plugins","module","initializeModule","removeModule","removeMemo","triggerEvent","isActivated","codable","editable","attr","editing","callback","callbacks","trigger","shouldInitialize","ModuleClass","withoutIntialize","destroy","event","createInvokeHandler","preventDefault","$target","target","closest","data","splits","hasSeparator","moduleName","methodName","type","isExternalAPICalled","hasInitOptions","langInfo","icons","tooltip","note","first","focus","textRangeToPoint","textRange","isStart","parentElement","tester","body","createTextRange","prevContainer","moveToElementText","compareEndPoints","textRangeStart","curTextNode","collapse","firstChild","pointTester","duplicate","setEndPoint","textCount","dummy","cont","pointToTextRange","textRangeInfo","isCollapseToStart","prevTextNodes","collapseToStart","info","moveStart","WrappedRange","sc","so","ec","eo","isOnEditable","makeIsOn","isOnList","isOnAnchor","isOnCell","isOnData","w3cRange","setStart","setEnd","nativeRng","nativeRange","selection","getSelection","rangeCount","removeAllRanges","addRange","offsetTop","Math","abs","getVisiblePoint","isLeftToRight","block","hasRightNode","hasLeftNode","getEndPoint","isCollapsed","getStartPoint","includeAncestor","fullyContains","leftEdgeNodes","startAncestor","endAncestor","boundaryPoints","getPoints","isSameContainer","rng","emptyParents","normalize","inlineSiblings","concat","para","wrapBodyInlineWithPara","deleteContents","contentsContainer","reversed","insertNode","toString","findAfter","isNotTextPoint","regex","index","s","path","e","paras","getClientRects","wrappedRange","createFromSelection","bodyElement","lastChild","createFromBodyElement","createFromNode","anchorNode","getRangeAt","startContainer","startOffset","endContainer","endOffset","textRangeEnd","isTextNode","createFromNodeBefore","createFromNodeAfter","createFromBookmark","bookmark","createFromParaBookmark","KEY_MAP","isEdit","keyCode","BACKSPACE","TAB","ENTER","SPACE","DELETE","isMove","LEFT","UP","RIGHT","DOWN","isNavigation","HOME","END","PAGEUP","PAGEDOWN","nameFromCode","readFileAsDataURL","file","Deferred","deferred","FileReader","onload","dataURL","resolve","onerror","err","reject","readAsDataURL","promise","createImage","$img","one","detach","css","display","appendTo","range","History","stack","stackOffset","$editable","emptyBookmark","contents","snapshot","recordUndo","applySnapshot","makeSnapshot","historyLimit","shift","Style","$obj","propertyNames","propertyName","properties","styleInfo","jQueryCSS","fontSize","parseInt","expandClosestSibling","onlyPartialContains","nodesInRange","tails","elem","$cont","fromNode","queryCommandState","queryCommandValue","orderedTypes","isUnordered","lineHeight","toFixed","anchor","Bullet","toggleList","clustereds","previousList","findList","wrapList","appendToPrevious","releaseList","listName","paraBookmark","wrappedParas","diffLists","listNode","prevList","nextList","isEscapseToBody","releasedParas","headList","parentItem","newList","findNextSiblings","children","lastList","middleList","rootLists","rootList","listNodes","Typing","bullet","tabsize","tab","Array","nextPara","blockquoteBreakingLevel","emptyAnchors","scrollIntoView","TableResultAction","where","domTable","_startPoint","_virtualTable","_actionCellList","setStartPoint","tagName","colPos","cellIndex","rowPos","rowIndex","setVirtualTablePosition","baseRow","baseCell","isRowSpan","isColSpan","isVirtualCell","objPosition","getActionCell","virtualTableCellObj","resultAction","virtualRowPosition","virtualColPosition","recoverCellIndex","newCellIndex","addCellInfoToVirtual","row","cell","cellHasColspan","colSpan","cellHasRowspan","rowSpan","isThisSelectedCell","rowspanNumber","attributes","rp","rowspanIndex","adjustStartPoint","colspanNumber","cp","cellspanIndex","isSelectedCell","createVirtualTable","rows","cells","getDeleteResultActionToCell","Column","SubtractSpanCount","Row","isVirtual","AddCell","RemoveCell","getAddResultActionToCell","SumSpanCount","Ignore","init","getActionList","fixedRow","fixedCol","actualPosition","canContinue","rowPosition","colPosition","requestAction","Add","Delete","Table","isShift","nextCell","currentTr","trAttributes","recoverAttributes","vTable","actions","idCell","currentCell","tdAttributes","append","baseCellTr","isTopFromRowSpan","newTd","removeAttr","setAttribute","before","lastTrIndex","after","rowsGroup","actionIndex","resultStr","attrList","specified","cellPos","virtualPosition","virtualTable","hasRowspan","nextRow","cloneRow","removeAttribute","hasColspan","colCount","rowCount","tds","tdHTML","idxCol","trs","trHTML","idxRow","$table","tableClassName","addClass","KEY_BOGUS","Editor","$editor","lastRange","typing","escape","untab","insertParagraph","insertOrderedList","insertUnorderedList","formatPara","insertHorizontalRule","commands","sCmd","beforeCommand","execCommand","afterCommand","wrapCommand","fontStyling","unit","currentStyle","fontSizeUnit","formatBlock","isLimited","getLastRange","setLastRange","insertText","textNode","pasteHTML","onApplyCustomStyle","onFormatBlock","hrNode","stylePara","createLink","linkInfo","linkUrl","linkText","isNewWindow","checkProtocol","additionalTextLength","isTextChanged","onCreateLink","defaultProtocol","anchors","styleNodes","createRangeFromList","colorInfo","foreColor","backColor","insertTable","dim","dimension","createTable","removeMedia","restoreTarget","floatMe","toggleClass","resize","hasKeyShortCut","isDefaultPrevented","handleKeyMap","preventDefaultEditableShortCuts","recordEveryKeystroke","spellCheck","disableGrammar","airMode","overrideContextMenu","outerWidth","maxHeight","minHeight","keyMap","metaKey","ctrlKey","altKey","shiftKey","keyName","eventName","tabDisable","pad","maxTextLength","lst","startRange","endRange","thenCollapse","commit","styleWithCSS","isPreventTrigger","normalizeContent","tabSize","insertTab","src","param","then","$image","min","show","files","filename","maximumImageFileSize","insertImage","onImageUpload","insertImagesAsDataURL","currentRange","$parent","removeClass","className","spans","firstSpan","noteStatusOutput","expand","$anchor","addRow","addCol","deleteRow","deleteCol","deleteTable","bKeepRatio","imageSize","newRatio","y","x","ratio","is","hasFocus","Clipboard","pasteByEvent","bind","clipboardData","originalEvent","items","kind","getAsFile","getData","Dropzone","$eventListener","documentEventHandlers","$dropzone","prependTo","disableDragAndDrop","onDrop","attachDragAndDropEvent","$dropzoneMessage","onDragenter","isCodeview","hasEditorSize","add","onDragleave","dataTransfer","types","content","substr","CodeView","$codable","CodeMirrorConstructor","CodeMirror","codemirror","getDoc","setValue","save","ESCAPE","deactivate","activate","codeviewFilter","codeviewFilterRegex","codeviewIframeFilter","whitelist","codeviewIframeWhitelistSrc","codeviewIframeWhitelistSrcBase","tag","RegExp","prettifyHtml","cmEditor","fromTextArea","tern","server","TernServer","ternServer","cm","updateArgHints","getValue","setSize","toTextArea","purify","isChange","EDITABLE_PADDING","Statusbar","$statusbar","statusbar","disableResizeEditor","stopPropagation","editableTop","editableCodeTop","onMouseMove","clientY","heightCode","minheight","max","Fullscreen","$toolbar","toolbar","$window","$scrollbar","scrollbarClassName","onResize","resizeTo","h","setsize","isFullscreen","Handle","$editingArea","editingArea","we","update","$handle","disableResizeImage","posStart","clientX","isImage","$selection","w","origImageObj","Image","sizingText","defaultScheme","linkPattern","AutoLink","handleKeyup","handleKeydown","lastWordRange","keyword","urlText","showDomainOnlyForAutolink","linkTargetBlank","wordRange","getWordRange","AutoSync","AutoReplace","PERIOD","COMMA","SEMICOLON","SLASH","previousKeydownCode","lastWord","jQuery","Node","Placeholder","inheritPlaceholder","isShow","toggle","Buttons","invertedKeyMap","editorMethod","o","button","addToolbarButtons","addImagePopoverButtons","addLinkPopoverButtons","addTablePopoverButtons","fontInstalledMap","fontNamesIgnoreCheck","buttonGroup","icon","click","$button","currentTarget","$recentColor","colorButton","dropdownButtonContents","dropdown","$dropdown","$holder","palette","colors","colorsName","render","customColors","change","$chip","$picker","$palette","prepend","$color","$currentButton","magic","styleTags","title","template","styleIdx","styleLen","representShortcut","createInvokeHandlerAndUpdateState","eraser","addDefaultFonts","fontname","isFontDeservedToAdd","fontNames","dropdownCheck","checkClassName","menuCheck","fontSizes","fontSizeUnits","colorPalette","unorderedlist","orderedlist","justifyLeft","alignLeft","justifyCenter","alignCenter","justifyRight","alignRight","justifyFull","alignJustify","textHeight","lineHeights","$catcher","insertTableMaxSize","col","mouseup","tableMoveHandler","picture","minus","arrowsAlt","question","rollback","trash","rowAbove","rowBelow","colBefore","colAfter","rowRemove","colRemove","$container","groups","groupIdx","groupLen","group","groupName","isArray","$group","btn","updateBtnStates","$item","isChecked","infos","selector","toggleBtnActive","PX_PER_EM","$dimensionDisplay","$highlighted","$unhighlighted","posOffset","offsetX","posCatcher","pageX","pageY","offsetY","c","ceil","r","Toolbar","isFollowing","followScroll","toolbarContainer","changeContainer","followingToolbar","editorHeight","editorWidth","toolbarHeight","statusbarHeight","otherBarHeight","otherStaticBar","currentOffset","editorOffsetTop","editorOffsetBottom","activateOffset","deactivateOffsetBottom","marginTop","zIndex","isIncludeCodeview","$btn","toggleBtn","LinkDialog","$body","dialogsInBody","disableLinkTarget","checkbox","checked","buttonClass","footer","$dialog","dialog","fade","dialogsFade","hideDialog","$input","$linkBtn","$linkText","$linkUrl","$openInNewWindow","$useProtocol","onDialogShown","toggleLinkBtn","bindEnterKey","isNewWindowChecked","prop","useProtocolChecked","onDialogHidden","state","showDialog","showLinkDialog","LinkPopover","relatedTarget","$popover","popover","$content","href","containerOffset","ImageDialog","imageLimitation","floor","log","readableSize","pow","acceptImageFileTypes","showImageDialog","onImageLinkInsert","$imageInput","$imageUrl","$imageBtn","replaceWith","ImagePopover","popatmouse","TablePopover","VideoDialog","ytRegExp","ytRegExpForStart","ytMatch","gdRegExp","gdMatch","igRegExp","igMatch","vRegExp","vMatch","vimRegExp","vimMatch","dmRegExp","dmMatch","youkuRegExp","youkuMatch","peerTubeRegExp","peerTubeMatch","qqRegExp","qqMatch","qqRegExp2","qqMatch2","mp4RegExp","mp4Match","oggRegExp","oggMatch","webmRegExp","webmMatch","fbRegExp","fbMatch","$video","youtubeId","start","ytMatchForStart","begin","end","loop","autoplay","muted","vid","encodeURIComponent","showVideoDialog","createVideoNode","$videoUrl","$videoBtn","HelpDialog","createShortcutList","command","$row","showHelpDialog","AIRMODE_POPOVER_X_OFFSET","AIRMODE_POPOVER_Y_OFFSET","AirPopover","hidable","onContextmenu","air","forcelyOpen","POPOVER_DIST","HintPopover","hint","direction","hintDirection","hints","matchingWord","hideArrow","innerHeight","$current","$next","selectItem","$nextGroup","$prev","$prevGroup","nodeFromItem","rangeCompute","hintSelect","hintIdx","moveUp","moveDown","search","searchKeyword","createItemTemplates","hintMode","getWordsRange","getWordsMatchRange","empty","bnd","createGroup","Codeview","version","toolbarPosition","codeviewKeepButton","tabDisabled","textareaAutoSync","onBeforeCommand","onBlur","onBlurCodeview","onChange","onChangeCodeview","onEnter","onFocus","onImageUploadError","onInit","onKeydown","onKeyup","onMousedown","onMouseup","onPaste","onScroll","mode","htmlMode","lineNumbers","pc","mac","Renderer","k","renderer","airEditor","airEditable","option","dataValue","dataOption","iconClassName","editorOptions","rowSize","colSize","colorName","placement","codeviewButton","isEnable","isActive","modal"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.css b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.css
new file mode 100644
index 0000000..b7fd037
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.css
@@ -0,0 +1 @@
+@font-face{font-display:auto;font-family:summernote;font-style:normal;font-weight:400;src:url(font/summernote.eot?#iefix) format("embedded-opentype"),url(font/summernote.woff2) format("woff2"),url(font/summernote.woff) format("woff"),url(font/summernote.ttf) format("truetype")}[class*=" note-icon"]:before,[class^=note-icon]:before{text-rendering:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;speak:none;display:inline-block;font-family:summernote;font-size:inherit;font-style:normal;text-decoration:inherit;text-transform:none;vertical-align:middle}.note-icon-fw{text-align:center;width:1.25em}.note-icon-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.note-icon-pull-left{float:left}.note-icon-pull-right{float:right}.note-icon.note-icon-pull-left{margin-right:.3em}.note-icon.note-icon-pull-right{margin-left:.3em}.note-icon-align:before{content:"\ea01"}.note-icon-align-center:before{content:"\ea02"}.note-icon-align-indent:before{content:"\ea03"}.note-icon-align-justify:before{content:"\ea04"}.note-icon-align-left:before{content:"\ea05"}.note-icon-align-outdent:before{content:"\ea06"}.note-icon-align-right:before{content:"\ea07"}.note-icon-arrow-circle-down:before{content:"\ea08"}.note-icon-arrow-circle-left:before{content:"\ea09"}.note-icon-arrow-circle-right:before{content:"\ea0a"}.note-icon-arrow-circle-up:before{content:"\ea0b"}.note-icon-arrows-alt:before{content:"\ea0c"}.note-icon-arrows-h:before{content:"\ea0d"}.note-icon-arrows-v:before{content:"\ea0e"}.note-icon-bold:before{content:"\ea0f"}.note-icon-caret:before{content:"\ea10"}.note-icon-chain-broken:before{content:"\ea11"}.note-icon-circle:before{content:"\ea12"}.note-icon-close:before{content:"\ea13"}.note-icon-code:before{content:"\ea14"}.note-icon-col-after:before{content:"\ea15"}.note-icon-col-before:before{content:"\ea16"}.note-icon-col-remove:before{content:"\ea17"}.note-icon-eraser:before{content:"\ea18"}.note-icon-float-left:before{content:"\ea19"}.note-icon-float-none:before{content:"\ea1a"}.note-icon-float-right:before{content:"\ea1b"}.note-icon-font:before{content:"\ea1c"}.note-icon-frame:before{content:"\ea1d"}.note-icon-italic:before{content:"\ea1e"}.note-icon-link:before{content:"\ea1f"}.note-icon-magic:before{content:"\ea20"}.note-icon-menu-check:before{content:"\ea21"}.note-icon-minus:before{content:"\ea22"}.note-icon-orderedlist:before{content:"\ea23"}.note-icon-pencil:before{content:"\ea24"}.note-icon-picture:before{content:"\ea25"}.note-icon-question:before{content:"\ea26"}.note-icon-redo:before{content:"\ea27"}.note-icon-rollback:before{content:"\ea28"}.note-icon-row-above:before{content:"\ea29"}.note-icon-row-below:before{content:"\ea2a"}.note-icon-row-remove:before{content:"\ea2b"}.note-icon-special-character:before{content:"\ea2c"}.note-icon-square:before{content:"\ea2d"}.note-icon-strikethrough:before{content:"\ea2e"}.note-icon-subscript:before{content:"\ea2f"}.note-icon-summernote:before{content:"\ea30"}.note-icon-superscript:before{content:"\ea31"}.note-icon-table:before{content:"\ea32"}.note-icon-text-height:before{content:"\ea33"}.note-icon-trash:before{content:"\ea34"}.note-icon-underline:before{content:"\ea35"}.note-icon-undo:before{content:"\ea36"}.note-icon-unorderedlist:before{content:"\ea37"}.note-icon-video:before{content:"\ea38"}.note-editor{position:relative}.note-editor .note-dropzone{background-color:#fff;color:#87cefa;display:none;opacity:.95;position:absolute;z-index:100}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-airframe,.note-editor.note-frame{border:1px solid #00000032}.note-editor.note-airframe.codeview .note-editing-area .note-editable,.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-airframe.codeview .note-editing-area .note-codable,.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-airframe .note-editing-area,.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-airframe .note-editing-area .note-editable,.note-editor.note-frame .note-editing-area .note-editable{word-wrap:break-word;overflow:auto;padding:10px}.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false],.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false]{background-color:#8080801d}.note-editor.note-airframe .note-editing-area .note-codable,.note-editor.note-frame .note-editing-area .note-codable{background-color:#222;border:none;border-radius:0;box-shadow:none;-ms-box-sizing:border-box;box-sizing:border-box;color:#ccc;display:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;margin-bottom:0;outline:none;padding:10px;resize:none;width:100%}.note-editor.note-airframe.fullscreen,.note-editor.note-frame.fullscreen{left:0;position:fixed;top:0;width:100%!important;z-index:1050}.note-editor.note-airframe.fullscreen .note-resizebar,.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-airframe .note-status-output,.note-editor.note-frame .note-status-output{border:0;border-top:1px solid #e2e2e2;color:#000;display:block;font-size:14px;height:20px;line-height:1.42857143;margin-bottom:0;width:100%}.note-editor.note-airframe .note-status-output:empty,.note-editor.note-frame .note-status-output:empty{border-top:0 solid transparent;height:0}.note-editor.note-airframe .note-status-output .pull-right,.note-editor.note-frame .note-status-output .pull-right{float:right!important}.note-editor.note-airframe .note-status-output .text-muted,.note-editor.note-frame .note-status-output .text-muted{color:#777}.note-editor.note-airframe .note-status-output .text-primary,.note-editor.note-frame .note-status-output .text-primary{color:#286090}.note-editor.note-airframe .note-status-output .text-success,.note-editor.note-frame .note-status-output .text-success{color:#3c763d}.note-editor.note-airframe .note-status-output .text-info,.note-editor.note-frame .note-status-output .text-info{color:#31708f}.note-editor.note-airframe .note-status-output .text-warning,.note-editor.note-frame .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-airframe .note-status-output .text-danger,.note-editor.note-frame .note-status-output .text-danger{color:#a94442}.note-editor.note-airframe .note-status-output .alert,.note-editor.note-frame .note-status-output .alert{background-color:#f5f5f5;border-radius:0;color:#000;margin:-7px 0 0;padding:7px 10px 2px}.note-editor.note-airframe .note-status-output .alert .note-icon,.note-editor.note-frame .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-airframe .note-status-output .alert-success,.note-editor.note-frame .note-status-output .alert-success{background-color:#dff0d8!important;color:#3c763d!important}.note-editor.note-airframe .note-status-output .alert-info,.note-editor.note-frame .note-status-output .alert-info{background-color:#d9edf7!important;color:#31708f!important}.note-editor.note-airframe .note-status-output .alert-warning,.note-editor.note-frame .note-status-output .alert-warning{background-color:#fcf8e3!important;color:#8a6d3b!important}.note-editor.note-airframe .note-status-output .alert-danger,.note-editor.note-frame .note-status-output .alert-danger{background-color:#f2dede!important;color:#a94442!important}.note-editor.note-airframe .note-statusbar,.note-editor.note-frame .note-statusbar{background-color:#8080801d;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #00000032}.note-editor.note-airframe .note-statusbar .note-resizebar,.note-editor.note-frame .note-statusbar .note-resizebar{cursor:ns-resize;height:9px;padding-top:1px;width:100%}.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{border-top:1px solid #00000032;margin:1px auto;width:20px}.note-editor.note-airframe .note-statusbar.locked .note-resizebar,.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-airframe .note-placeholder,.note-editor.note-frame .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.note-popover.popover .arrow{left:20px!important}.note-toolbar{position:relative}.note-editor .note-toolbar,.note-popover .popover-content{margin:0;padding:0 0 5px 5px}.note-editor .note-toolbar>.note-btn-group,.note-popover .popover-content>.note-btn-group{margin-left:0;margin-right:5px;margin-top:5px}.note-editor .note-toolbar .note-btn-group .note-table,.note-popover .popover-content .note-btn-group .note-table{min-width:0;padding:5px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{cursor:pointer;height:10em;position:absolute!important;width:10em;z-index:3}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:5em;position:relative!important;width:5em;z-index:1}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:1em;position:absolute!important;width:1em;z-index:2}.note-editor .note-toolbar .note-style .dropdown-style blockquote,.note-editor .note-toolbar .note-style .dropdown-style pre,.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre{margin:0;padding:5px 10px}.note-editor .note-toolbar .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h4,.note-editor .note-toolbar .note-style .dropdown-style h5,.note-editor .note-toolbar .note-style .dropdown-style h6,.note-editor .note-toolbar .note-style .dropdown-style p,.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p{margin:0;padding:0}.note-editor .note-toolbar .note-color-all .note-dropdown-menu,.note-popover .popover-content .note-color-all .note-dropdown-menu{min-width:337px}.note-editor .note-toolbar .note-color .dropdown-toggle,.note-popover .popover-content .note-color .dropdown-toggle{padding-left:5px;width:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:160px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child{margin:0 5px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title{border-bottom:1px solid #eee;font-size:12px;margin:2px 7px;text-align:center}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select{border-radius:5px;cursor:pointer;font-size:11px;margin:3px;padding:0 3px;width:100%}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover{background:#eee}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row{height:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-editor .note-toolbar .note-para .note-dropdown-menu,.note-popover .popover-content .note-para .note-dropdown-menu{min-width:228px;padding:5px}.note-editor .note-toolbar .note-para .note-dropdown-menu>div+div,.note-popover .popover-content .note-para .note-dropdown-menu>div+div{margin-left:5px}.note-editor .note-toolbar .note-dropdown-menu,.note-popover .popover-content .note-dropdown-menu{min-width:160px}.note-editor .note-toolbar .note-dropdown-menu.right,.note-popover .popover-content .note-dropdown-menu.right{left:auto;right:0}.note-editor .note-toolbar .note-dropdown-menu.right:before,.note-popover .popover-content .note-dropdown-menu.right:before{left:auto!important;right:9px}.note-editor .note-toolbar .note-dropdown-menu.right:after,.note-popover .popover-content .note-dropdown-menu.right:after{left:auto!important;right:10px}.note-editor .note-toolbar .note-dropdown-menu.note-check a i,.note-popover .popover-content .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i,.note-popover .popover-content .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-editor .note-toolbar .note-fontsize-10,.note-popover .popover-content .note-fontsize-10{font-size:10px}.note-editor .note-toolbar .note-color-palette,.note-popover .popover-content .note-color-palette{line-height:1}.note-editor .note-toolbar .note-color-palette div .note-color-btn,.note-popover .popover-content .note-color-palette div .note-color-btn{border:0;border-radius:0;height:20px;margin:0;padding:0;width:20px}.note-editor .note-toolbar .note-color-palette div .note-color-btn:hover,.note-popover .popover-content .note-color-palette div .note-color-btn:hover{transform:scale(1.2);transition:all .2s}.note-modal .modal-dialog{border-radius:5px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{border:4px dashed #d3d3d3;color:#d3d3d3;font-size:30px;line-height:4;margin-bottom:10px;min-height:100px;text-align:center}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.note-placeholder{color:gray;display:none;position:absolute}.note-handle .note-control-selection{border:1px solid #000;display:none;position:absolute}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{background-color:#000;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30);height:100%;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;width:100%}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-holder,.note-handle .note-control-selection .note-control-sizing{border:1px solid #000;height:7px;width:7px}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{border-bottom:none;border-right:none;left:-5px;top:-5px}.note-handle .note-control-selection .note-control-ne{border-bottom:none;border-left:none;right:-5px;top:-5px}.note-handle .note-control-selection .note-control-sw{border-right:none;border-top:none;bottom:-5px;left:-5px}.note-handle .note-control-selection .note-control-se{bottom:-5px;cursor:se-resize;right:-5px}.note-handle .note-control-selection .note-control-se.note-control-holder{border-left:none;border-top:none;cursor:default}.note-handle .note-control-selection .note-control-selection-info{background-color:#000;border-radius:5px;bottom:0;color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70);font-size:12px;margin:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;padding:5px;right:0}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;overflow:auto;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{background-color:#428bca;clear:both;color:#fff;cursor:pointer;display:block;font-weight:400;line-height:1.4;outline:0;text-decoration:none;white-space:nowrap}body .note-fullscreen-body,html .note-fullscreen-body{overflow:hidden!important}.note-toolbar{background:#8080801d}.note-btn-group .note-btn{border-color:#00000032;font-size:13px;padding:.28rem .65rem}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.js b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.js
new file mode 100644
index 0000000..8f61679
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-bs5.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("jQuery"));else if("function"==typeof define&&define.amd)define(["jQuery"],e);else{var n="object"==typeof exports?e(require("jQuery")):e(t.jQuery);for(var o in n)("object"==typeof exports?exports:t)[o]=n[o]}}(self,(function(t){return(()=>{"use strict";var e={9770:(t,e,n)=>{var o=n(1145),i=n.n(o);i().summernote=i().summernote||{lang:{}},i().extend(i().summernote.lang,{"en-US":{font:{bold:"Bold",italic:"Italic",underline:"Underline",clear:"Remove Font Style",height:"Line Height",name:"Font Family",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript",size:"Font Size",sizeunit:"Font Size Unit"},image:{image:"Picture",insert:"Insert Image",resizeFull:"Resize full",resizeHalf:"Resize half",resizeQuarter:"Resize quarter",resizeNone:"Original size",floatLeft:"Float Left",floatRight:"Float Right",floatNone:"Remove float",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Drag image or text here",dropImage:"Drop image or Text",selectFromFiles:"Select from files",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Image URL",remove:"Remove Image",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Insert Video",url:"Video URL",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)"},link:{link:"Link",insert:"Insert Link",unlink:"Unlink",edit:"Edit",textToDisplay:"Text to display",url:"To what URL should this link go?",openInNewWindow:"Open in new window",useProtocol:"Use default protocol"},table:{table:"Table",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Insert Horizontal Rule"},style:{style:"Style",p:"Normal",blockquote:"Quote",pre:"Code",h1:"Header 1",h2:"Header 2",h3:"Header 3",h4:"Header 4",h5:"Header 5",h6:"Header 6"},lists:{unordered:"Unordered list",ordered:"Ordered list"},options:{help:"Help",fullscreen:"Full Screen",codeview:"Code View"},paragraph:{paragraph:"Paragraph",outdent:"Outdent",indent:"Indent",left:"Align left",center:"Align center",right:"Align right",justify:"Justify full"},color:{recent:"Recent Color",more:"More Color",background:"Background Color",foreground:"Text Color",transparent:"Transparent",setTransparent:"Set transparent",reset:"Reset",resetToDefault:"Reset to default",cpSelect:"Select"},shortcut:{shortcuts:"Keyboard shortcuts",close:"Close",textFormatting:"Text formatting",action:"Action",paragraphFormatting:"Paragraph formatting",documentStyle:"Document Style",extraKeys:"Extra keys"},help:{escape:"Escape",insertParagraph:"Insert Paragraph",undo:"Undo the last command",redo:"Redo the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Undo",redo:"Redo"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"},output:{noSelection:"No Selection Made!"}}})},1145:e=>{e.exports=t}},n={};function o(t){var i=n[t];if(void 0!==i)return i.exports;var r=n[t]={exports:{}};return e[t](r,r.exports,o),r.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};return(()=>{o.r(i);var t=o(1145),e=o.n(t),n=(o(9770),["sans-serif","serif","monospace","cursive","fantasy"]);function r(t){return-1===e().inArray(t.toLowerCase(),n)?"'".concat(t,"'"):t}var a,s=navigator.userAgent,l=/MSIE|Trident/i.test(s);if(l){var c=/MSIE (\d+[.]\d+)/.exec(s);c&&(a=parseFloat(c[1])),(c=/Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(s))&&(a=parseFloat(c[1]))}var u=/Edge\/\d+/.test(s),d="ontouchstart"in window||navigator.MaxTouchPoints>0||navigator.msMaxTouchPoints>0,h=l?"DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted":"input";const f={isMac:navigator.appVersion.indexOf("Mac")>-1,isMSIE:l,isEdge:u,isFF:!u&&/firefox/i.test(s),isPhantom:/PhantomJS/i.test(s),isWebkit:!u&&/webkit/i.test(s),isChrome:!u&&/chrome/i.test(s),isSafari:!u&&/safari/i.test(s)&&!/chrome/i.test(s),browserVersion:a,isSupportTouch:d,isFontInstalled:function(t){var e="Comic Sans MS"===t?"Courier New":"Comic Sans MS",n="mmmmmmmmmmwwwww",o=document.createElement("canvas").getContext("2d");o.font="200px '"+e+"'";var i=o.measureText(n).width;return o.font="200px "+r(t)+', "'+e+'"',i!==o.measureText(n).width},isW3CRangeSupport:!!document.createRange,inputEventName:h,genericFontFamilies:n,validFontName:r};var p=0;const m={eq:function(t){return function(e){return t===e}},eq2:function(t,e){return t===e},peq2:function(t){return function(e,n){return e[t]===n[t]}},ok:function(){return!0},fail:function(){return!1},self:function(t){return t},not:function(t){return function(){return!t.apply(t,arguments)}},and:function(t,e){return function(n){return t(n)&&e(n)}},invoke:function(t,e){return function(){return t[e].apply(t,arguments)}},resetUniqueId:function(){p=0},uniqueId:function(t){var e=++p+"";return t?t+e:e},rect2bnd:function(t){var n=e()(document);return{top:t.top+n.scrollTop(),left:t.left+n.scrollLeft(),width:t.right-t.left,height:t.bottom-t.top}},invertObject:function(t){var e={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[t[n]]=n);return e},namespaceToCamel:function(t,e){return(e=e||"")+t.split(".").map((function(t){return t.substring(0,1).toUpperCase()+t.substring(1)})).join("")},debounce:function(t,e,n){var o;return function(){var i=this,r=arguments,a=function(){o=null,n||t.apply(i,r)},s=n&&!o;clearTimeout(o),o=setTimeout(a,e),s&&t.apply(i,r)}},isValidUrl:function(t){return/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi.test(t)}};function v(t){return t[0]}function g(t){return t[t.length-1]}function b(t){return t.slice(1)}function y(t,e){if(t&&t.length&&e){if(t.indexOf)return-1!==t.indexOf(e);if(t.contains)return t.contains(e)}return!1}const k={head:v,last:g,initial:function(t){return t.slice(0,t.length-1)},tail:b,prev:function(t,e){if(t&&t.length&&e){var n=t.indexOf(e);return-1===n?null:t[n-1]}return null},next:function(t,e){if(t&&t.length&&e){var n=t.indexOf(e);return-1===n?null:t[n+1]}return null},find:function(t,e){for(var n=0,o=t.length;n<o;n++){var i=t[n];if(e(i))return i}},contains:y,all:function(t,e){for(var n=0,o=t.length;n<o;n++)if(!e(t[n]))return!1;return!0},sum:function(t,e){return e=e||m.self,t.reduce((function(t,n){return t+e(n)}),0)},from:function(t){for(var e=[],n=t.length,o=-1;++o<n;)e[o]=t[o];return e},isEmpty:function(t){return!t||!t.length},clusterBy:function(t,e){return t.length?b(t).reduce((function(t,n){var o=g(t);return e(g(o),n)?o[o.length]=n:t[t.length]=[n],t}),[[v(t)]]):[]},compact:function(t){for(var e=[],n=0,o=t.length;n<o;n++)t[n]&&e.push(t[n]);return e},unique:function(t){for(var e=[],n=0,o=t.length;n<o;n++)y(e,t[n])||e.push(t[n]);return e}};var w=String.fromCharCode(160);function C(t){return t&&e()(t).hasClass("note-editable")}function x(t){return t=t.toUpperCase(),function(e){return e&&e.nodeName.toUpperCase()===t}}function S(t){return t&&3===t.nodeType}function T(t){return t&&/^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(t.nodeName.toUpperCase())}function E(t){return!C(t)&&(t&&/^DIV|^P|^LI|^H[1-7]/.test(t.nodeName.toUpperCase()))}var I=x("PRE"),$=x("LI");var N=x("TABLE"),P=x("DATA");function R(t){return!(H(t)||L(t)||A(t)||E(t)||N(t)||D(t)||P(t))}function L(t){return t&&/^UL|^OL/.test(t.nodeName.toUpperCase())}var A=x("HR");function F(t){return t&&/^TD|^TH/.test(t.nodeName.toUpperCase())}var D=x("BLOCKQUOTE");function H(t){return F(t)||D(t)||C(t)}var z=x("A");var B=x("BODY");var M=f.isMSIE&&f.browserVersion<11?"&nbsp;":"<br>";function O(t){return S(t)?t.nodeValue.length:t?t.childNodes.length:0}function U(t){var e=O(t);return 0===e||(!S(t)&&1===e&&t.innerHTML===M||!(!k.all(t.childNodes,S)||""!==t.innerHTML))}function j(t){T(t)||O(t)||(t.innerHTML=M)}function W(t,e){for(;t;){if(e(t))return t;if(C(t))break;t=t.parentNode}return null}function K(t,e){e=e||m.fail;var n=[];return W(t,(function(t){return C(t)||n.push(t),e(t)})),n}function V(t,e){e=e||m.fail;for(var n=[];t&&!e(t);)n.push(t),t=t.nextSibling;return n}function q(t,e){var n=e.nextSibling,o=e.parentNode;return n?o.insertBefore(t,n):o.appendChild(t),t}function _(t,n){return e().each(n,(function(e,n){t.appendChild(n)})),t}function G(t){return 0===t.offset}function Y(t){return t.offset===O(t.node)}function Z(t){return G(t)||Y(t)}function Q(t,e){for(;t&&t!==e;){if(0!==J(t))return!1;t=t.parentNode}return!0}function X(t,e){if(!e)return!1;for(;t&&t!==e;){if(J(t)!==O(t.parentNode)-1)return!1;t=t.parentNode}return!0}function J(t){for(var e=0;t=t.previousSibling;)e+=1;return e}function tt(t){return!!(t&&t.childNodes&&t.childNodes.length)}function et(t,e){var n,o;if(0===t.offset){if(C(t.node))return null;n=t.node.parentNode,o=J(t.node)}else tt(t.node)?o=O(n=t.node.childNodes[t.offset-1]):(n=t.node,o=e?0:t.offset-1);return{node:n,offset:o}}function nt(t,e){var n,o;if(O(t.node)===t.offset){if(C(t.node))return null;var i=it(t.node);i?(n=i,o=0):(n=t.node.parentNode,o=J(t.node)+1)}else tt(t.node)?(n=t.node.childNodes[t.offset],o=0):(n=t.node,o=e?O(t.node):t.offset+1);return{node:n,offset:o}}function ot(t,e){var n,o=0;if(U(t.node))return null===t.node?null:{node:n=t.node.nextSibling,offset:o=0};if(O(t.node)===t.offset){if(C(t.node))return null;n=t.node.parentNode,o=J(t.node)+1,C(n)&&(n=t.node.nextSibling,o=0)}else if(tt(t.node)){if(o=0,U(n=t.node.childNodes[t.offset]))return U(t.node.nextSibling)?null:{node:t.node.nextSibling,offset:o}}else if(n=t.node,o=e?O(t.node):t.offset+1,U(n))return null;return{node:n,offset:o}}function it(t){if(t.nextSibling&&t.parent===t.nextSibling.parent)return S(t.nextSibling)?t.nextSibling:it(t.nextSibling)}function rt(t,e){return t.node===e.node&&t.offset===e.offset}function at(t,e){var n=e&&e.isSkipPaddingBlankHTML,o=e&&e.isNotSplitEdgePoint,i=e&&e.isDiscardEmptySplits;if(i&&(n=!0),Z(t)&&(S(t.node)||o)){if(G(t))return t.node;if(Y(t))return t.node.nextSibling}if(S(t.node))return t.node.splitText(t.offset);var r=t.node.childNodes[t.offset],a=q(t.node.cloneNode(!1),t.node);return _(a,V(r)),n||(j(t.node),j(a)),i&&(U(t.node)&&ct(t.node),U(a))?(ct(a),t.node.nextSibling):a}function st(t,e,n){var o=K(e.node,m.eq(t));return o.length?1===o.length?at(e,n):o.reduce((function(t,o){return t===e.node&&(t=at(e,n)),at({node:o,offset:t?J(t):O(o)},n)})):null}function lt(t){return document.createElement(t)}function ct(t,e){if(t&&t.parentNode){if(t.removeNode)return t.removeNode(e);var n=t.parentNode;if(!e){for(var o=[],i=0,r=t.childNodes.length;i<r;i++)o.push(t.childNodes[i]);for(var a=0,s=o.length;a<s;a++)n.insertBefore(o[a],t)}n.removeChild(t)}}var ut=x("TEXTAREA");function dt(t,e){var n=ut(t[0])?t.val():t.html();return e?n.replace(/[\n\r]/g,""):n}const ht={NBSP_CHAR:w,ZERO_WIDTH_NBSP_CHAR:"\ufeff",blank:M,emptyPara:"<p>".concat(M,"</p>"),makePredByNodeName:x,isEditable:C,isControlSizing:function(t){return t&&e()(t).hasClass("note-control-sizing")},isText:S,isElement:function(t){return t&&1===t.nodeType},isVoid:T,isPara:E,isPurePara:function(t){return E(t)&&!$(t)},isHeading:function(t){return t&&/^H[1-7]/.test(t.nodeName.toUpperCase())},isInline:R,isBlock:m.not(R),isBodyInline:function(t){return R(t)&&!W(t,E)},isBody:B,isParaInline:function(t){return R(t)&&!!W(t,E)},isPre:I,isList:L,isTable:N,isData:P,isCell:F,isBlockquote:D,isBodyContainer:H,isAnchor:z,isDiv:x("DIV"),isLi:$,isBR:x("BR"),isSpan:x("SPAN"),isB:x("B"),isU:x("U"),isS:x("S"),isI:x("I"),isImg:x("IMG"),isTextarea:ut,deepestChildIsEmpty:function(t){do{if(null===t.firstElementChild||""===t.firstElementChild.innerHTML)break}while(t=t.firstElementChild);return U(t)},isEmpty:U,isEmptyAnchor:m.and(z,U),isClosestSibling:function(t,e){return t.nextSibling===e||t.previousSibling===e},withClosestSiblings:function(t,e){e=e||m.ok;var n=[];return t.previousSibling&&e(t.previousSibling)&&n.push(t.previousSibling),n.push(t),t.nextSibling&&e(t.nextSibling)&&n.push(t.nextSibling),n},nodeLength:O,isLeftEdgePoint:G,isRightEdgePoint:Y,isEdgePoint:Z,isLeftEdgeOf:Q,isRightEdgeOf:X,isLeftEdgePointOf:function(t,e){return G(t)&&Q(t.node,e)},isRightEdgePointOf:function(t,e){return Y(t)&&X(t.node,e)},prevPoint:et,nextPoint:nt,nextPointWithEmptyNode:ot,isSamePoint:rt,isVisiblePoint:function(t){if(S(t.node)||!tt(t.node)||U(t.node))return!0;var e=t.node.childNodes[t.offset-1],n=t.node.childNodes[t.offset];return!((e&&!T(e)||n&&!T(n))&&!N(n))},prevPointUntil:function(t,e){for(;t;){if(e(t))return t;t=et(t)}return null},nextPointUntil:function(t,e){for(;t;){if(e(t))return t;t=nt(t)}return null},isCharPoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return e&&" "!==e&&e!==w},isSpacePoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return" "===e||e===w},walkPoint:function(t,e,n,o){for(var i=t;i&&(n(i),!rt(i,e));){i=ot(i,o&&t.node!==i.node&&e.node!==i.node)}},ancestor:W,singleChildAncestor:function(t,e){for(t=t.parentNode;t&&1===O(t);){if(e(t))return t;if(C(t))break;t=t.parentNode}return null},listAncestor:K,lastAncestor:function(t,e){var n=K(t);return k.last(n.filter(e))},listNext:V,listPrev:function(t,e){e=e||m.fail;for(var n=[];t&&!e(t);)n.push(t),t=t.previousSibling;return n},listDescendant:function(t,e){var n=[];return e=e||m.ok,function o(i){t!==i&&e(i)&&n.push(i);for(var r=0,a=i.childNodes.length;r<a;r++)o(i.childNodes[r])}(t),n},commonAncestor:function(t,e){for(var n=K(t),o=e;o;o=o.parentNode)if(n.indexOf(o)>-1)return o;return null},wrap:function(t,n){var o=t.parentNode,i=e()("<"+n+">")[0];return o.insertBefore(i,t),i.appendChild(t),i},insertAfter:q,appendChildNodes:_,position:J,hasChildren:tt,makeOffsetPath:function(t,e){return K(e,m.eq(t)).map(J).reverse()},fromOffsetPath:function(t,e){for(var n=t,o=0,i=e.length;o<i;o++)n=n.childNodes.length<=e[o]?n.childNodes[n.childNodes.length-1]:n.childNodes[e[o]];return n},splitTree:st,splitPoint:function(t,e){var n,o,i=e?E:H,r=K(t.node,i),a=k.last(r)||t.node;i(a)?(n=r[r.length-2],o=a):o=(n=a).parentNode;var s=n&&st(n,t,{isSkipPaddingBlankHTML:e,isNotSplitEdgePoint:e});return s||o!==t.node||(s=t.node.childNodes[t.offset]),{rightNode:s,container:o}},create:lt,createText:function(t){return document.createTextNode(t)},remove:ct,removeWhile:function(t,e){for(;t&&!C(t)&&e(t);){var n=t.parentNode;ct(t),t=n}},replace:function(t,e){if(t.nodeName.toUpperCase()===e.toUpperCase())return t;var n=lt(e);return t.style.cssText&&(n.style.cssText=t.style.cssText),_(n,k.from(t.childNodes)),q(n,t),ct(t),n},html:function(t,e){var n=dt(t);if(e){n=(n=n.replace(/<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g,(function(t,e,n){n=n.toUpperCase();var o=/^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(n)&&!!e,i=/^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(n);return t+(o||i?"\n":"")}))).trim()}return n},value:dt,posFromPlaceholder:function(t){var n=e()(t),o=n.offset(),i=n.outerHeight(!0);return{left:o.left,top:o.top+i}},attachEvents:function(t,e){Object.keys(e).forEach((function(n){t.on(n,e[n])}))},detachEvents:function(t,e){Object.keys(e).forEach((function(n){t.off(n,e[n])}))},isCustomStyleTag:function(t){return t&&!S(t)&&k.contains(t.classList,"note-styletag")}};function ft(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var pt=function(){function t(n,o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=n,this.memos={},this.modules={},this.layoutInfo={},this.options=e().extend(!0,{},o),e().summernote.ui=e().summernote.ui_template(this.options),this.ui=e().summernote.ui,this.initialize()}var n,o,i;return n=t,o=[{key:"initialize",value:function(){return this.layoutInfo=this.ui.createLayout(this.$note),this._initialize(),this.$note.hide(),this}},{key:"destroy",value:function(){this._destroy(),this.$note.removeData("summernote"),this.ui.removeLayout(this.$note,this.layoutInfo)}},{key:"reset",value:function(){var t=this.isDisabled();this.code(ht.emptyPara),this._destroy(),this._initialize(),t&&this.disable()}},{key:"_initialize",value:function(){var t=this;this.options.id=m.uniqueId(e().now()),this.options.container=this.options.container||this.layoutInfo.editor;var n=e().extend({},this.options.buttons);Object.keys(n).forEach((function(e){t.memo("button."+e,n[e])}));var o=e().extend({},this.options.modules,e().summernote.plugins||{});Object.keys(o).forEach((function(e){t.module(e,o[e],!0)})),Object.keys(this.modules).forEach((function(e){t.initializeModule(e)}))}},{key:"_destroy",value:function(){var t=this;Object.keys(this.modules).reverse().forEach((function(e){t.removeModule(e)})),Object.keys(this.memos).forEach((function(e){t.removeMemo(e)})),this.triggerEvent("destroy",this)}},{key:"code",value:function(t){var e=this.invoke("codeview.isActivated");if(void 0===t)return this.invoke("codeview.sync"),e?this.layoutInfo.codable.val():this.layoutInfo.editable.html();e?this.invoke("codeview.sync",t):this.layoutInfo.editable.html(t),this.$note.val(t),this.triggerEvent("change",t,this.layoutInfo.editable)}},{key:"isDisabled",value:function(){return"false"===this.layoutInfo.editable.attr("contenteditable")}},{key:"enable",value:function(){this.layoutInfo.editable.attr("contenteditable",!0),this.invoke("toolbar.activate",!0),this.triggerEvent("disable",!1),this.options.editing=!0}},{key:"disable",value:function(){this.invoke("codeview.isActivated")&&this.invoke("codeview.deactivate"),this.layoutInfo.editable.attr("contenteditable",!1),this.options.editing=!1,this.invoke("toolbar.deactivate",!0),this.triggerEvent("disable",!0)}},{key:"triggerEvent",value:function(){var t=k.head(arguments),e=k.tail(k.from(arguments)),n=this.options.callbacks[m.namespaceToCamel(t,"on")];n&&n.apply(this.$note[0],e),this.$note.trigger("summernote."+t,e)}},{key:"initializeModule",value:function(t){var e=this.modules[t];e.shouldInitialize=e.shouldInitialize||m.ok,e.shouldInitialize()&&(e.initialize&&e.initialize(),e.events&&ht.attachEvents(this.$note,e.events))}},{key:"module",value:function(t,e,n){if(1===arguments.length)return this.modules[t];this.modules[t]=new e(this),n||this.initializeModule(t)}},{key:"removeModule",value:function(t){var e=this.modules[t];e.shouldInitialize()&&(e.events&&ht.detachEvents(this.$note,e.events),e.destroy&&e.destroy()),delete this.modules[t]}},{key:"memo",value:function(t,e){if(1===arguments.length)return this.memos[t];this.memos[t]=e}},{key:"removeMemo",value:function(t){this.memos[t]&&this.memos[t].destroy&&this.memos[t].destroy(),delete this.memos[t]}},{key:"createInvokeHandlerAndUpdateState",value:function(t,e){var n=this;return function(o){n.createInvokeHandler(t,e)(o),n.invoke("buttons.updateCurrentStyle")}}},{key:"createInvokeHandler",value:function(t,n){var o=this;return function(i){i.preventDefault();var r=e()(i.target);o.invoke(t,n||r.closest("[data-value]").data("value"),r)}}},{key:"invoke",value:function(){var t=k.head(arguments),e=k.tail(k.from(arguments)),n=t.split("."),o=n.length>1,i=o&&k.head(n),r=o?k.last(n):k.head(n),a=this.modules[i||"editor"];return!i&&this[r]?this[r].apply(this,e):a&&a[r]&&a.shouldInitialize()?a[r].apply(a,e):void 0}}],o&&ft(n.prototype,o),i&&ft(n,i),t}();function mt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function vt(t,e){var n,o,i=t.parentElement(),r=document.body.createTextRange(),a=k.from(i.childNodes);for(n=0;n<a.length;n++)if(!ht.isText(a[n])){if(r.moveToElementText(a[n]),r.compareEndPoints("StartToStart",t)>=0)break;o=a[n]}if(0!==n&&ht.isText(a[n-1])){var s=document.body.createTextRange(),l=null;s.moveToElementText(o||i),s.collapse(!o),l=o?o.nextSibling:i.firstChild;var c=t.duplicate();c.setEndPoint("StartToStart",s);for(var u=c.text.replace(/[\r\n]/g,"").length;u>l.nodeValue.length&&l.nextSibling;)u-=l.nodeValue.length,l=l.nextSibling;l.nodeValue;e&&l.nextSibling&&ht.isText(l.nextSibling)&&u===l.nodeValue.length&&(u-=l.nodeValue.length,l=l.nextSibling),i=l,n=u}return{cont:i,offset:n}}function gt(t){var e=document.body.createTextRange(),n=function t(e,n){var o,i;if(ht.isText(e)){var r=ht.listPrev(e,m.not(ht.isText)),a=k.last(r).previousSibling;o=a||e.parentNode,n+=k.sum(k.tail(r),ht.nodeLength),i=!a}else{if(o=e.childNodes[n]||e,ht.isText(o))return t(o,0);n=0,i=!1}return{node:o,collapseToStart:i,offset:n}}(t.node,t.offset);return e.moveToElementText(n.node),e.collapse(n.collapseToStart),e.moveStart("character",n.offset),e}e().fn.extend({summernote:function(){var t=e().type(k.head(arguments)),n="string"===t,o="object"===t,i=e().extend({},e().summernote.options,o?k.head(arguments):{});i.langInfo=e().extend(!0,{},e().summernote.lang["en-US"],e().summernote.lang[i.lang]),i.icons=e().extend(!0,{},e().summernote.options.icons,i.icons),i.tooltip="auto"===i.tooltip?!f.isSupportTouch:i.tooltip,this.each((function(t,n){var o=e()(n);if(!o.data("summernote")){var r=new pt(o,i);o.data("summernote",r),o.data("summernote").triggerEvent("init",r.layoutInfo)}}));var r=this.first();if(r.length){var a=r.data("summernote");if(n)return a.invoke.apply(a,k.from(arguments));i.focus&&a.invoke("editor.focus")}return this}});var bt=function(){function t(e,n,o,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sc=e,this.so=n,this.ec=o,this.eo=i,this.isOnEditable=this.makeIsOn(ht.isEditable),this.isOnList=this.makeIsOn(ht.isList),this.isOnAnchor=this.makeIsOn(ht.isAnchor),this.isOnCell=this.makeIsOn(ht.isCell),this.isOnData=this.makeIsOn(ht.isData)}var n,o,i;return n=t,o=[{key:"nativeRange",value:function(){if(f.isW3CRangeSupport){var t=document.createRange();return t.setStart(this.sc,this.so),t.setEnd(this.ec,this.eo),t}var e=gt({node:this.sc,offset:this.so});return e.setEndPoint("EndToEnd",gt({node:this.ec,offset:this.eo})),e}},{key:"getPoints",value:function(){return{sc:this.sc,so:this.so,ec:this.ec,eo:this.eo}}},{key:"getStartPoint",value:function(){return{node:this.sc,offset:this.so}}},{key:"getEndPoint",value:function(){return{node:this.ec,offset:this.eo}}},{key:"select",value:function(){var t=this.nativeRange();if(f.isW3CRangeSupport){var e=document.getSelection();e.rangeCount>0&&e.removeAllRanges(),e.addRange(t)}else t.select();return this}},{key:"scrollIntoView",value:function(t){var n=e()(t).height();return t.scrollTop+n<this.sc.offsetTop&&(t.scrollTop+=Math.abs(t.scrollTop+n-this.sc.offsetTop)),this}},{key:"normalize",value:function(){var e=function(t,e){if(!t)return t;if(ht.isVisiblePoint(t)&&(!ht.isEdgePoint(t)||ht.isRightEdgePoint(t)&&!e||ht.isLeftEdgePoint(t)&&e||ht.isRightEdgePoint(t)&&e&&ht.isVoid(t.node.nextSibling)||ht.isLeftEdgePoint(t)&&!e&&ht.isVoid(t.node.previousSibling)||ht.isBlock(t.node)&&ht.isEmpty(t.node)))return t;var n=ht.ancestor(t.node,ht.isBlock),o=!1;if(!o){var i=ht.prevPoint(t)||{node:null};o=(ht.isLeftEdgePointOf(t,n)||ht.isVoid(i.node))&&!e}var r=!1;if(!r){var a=ht.nextPoint(t)||{node:null};r=(ht.isRightEdgePointOf(t,n)||ht.isVoid(a.node))&&e}if(o||r){if(ht.isVisiblePoint(t))return t;e=!e}return(e?ht.nextPointUntil(ht.nextPoint(t),ht.isVisiblePoint):ht.prevPointUntil(ht.prevPoint(t),ht.isVisiblePoint))||t},n=e(this.getEndPoint(),!1),o=this.isCollapsed()?n:e(this.getStartPoint(),!0);return new t(o.node,o.offset,n.node,n.offset)}},{key:"nodes",value:function(t,e){t=t||m.ok;var n=e&&e.includeAncestor,o=e&&e.fullyContains,i=this.getStartPoint(),r=this.getEndPoint(),a=[],s=[];return ht.walkPoint(i,r,(function(e){var i;ht.isEditable(e.node)||(o?(ht.isLeftEdgePoint(e)&&s.push(e.node),ht.isRightEdgePoint(e)&&k.contains(s,e.node)&&(i=e.node)):i=n?ht.ancestor(e.node,t):e.node,i&&t(i)&&a.push(i))}),!0),k.unique(a)}},{key:"commonAncestor",value:function(){return ht.commonAncestor(this.sc,this.ec)}},{key:"expand",value:function(e){var n=ht.ancestor(this.sc,e),o=ht.ancestor(this.ec,e);if(!n&&!o)return new t(this.sc,this.so,this.ec,this.eo);var i=this.getPoints();return n&&(i.sc=n,i.so=0),o&&(i.ec=o,i.eo=ht.nodeLength(o)),new t(i.sc,i.so,i.ec,i.eo)}},{key:"collapse",value:function(e){return e?new t(this.sc,this.so,this.sc,this.so):new t(this.ec,this.eo,this.ec,this.eo)}},{key:"splitText",value:function(){var e=this.sc===this.ec,n=this.getPoints();return ht.isText(this.ec)&&!ht.isEdgePoint(this.getEndPoint())&&this.ec.splitText(this.eo),ht.isText(this.sc)&&!ht.isEdgePoint(this.getStartPoint())&&(n.sc=this.sc.splitText(this.so),n.so=0,e&&(n.ec=n.sc,n.eo=this.eo-this.so)),new t(n.sc,n.so,n.ec,n.eo)}},{key:"deleteContents",value:function(){if(this.isCollapsed())return this;var n=this.splitText(),o=n.nodes(null,{fullyContains:!0}),i=ht.prevPointUntil(n.getStartPoint(),(function(t){return!k.contains(o,t.node)})),r=[];return e().each(o,(function(t,e){var n=e.parentNode;i.node!==n&&1===ht.nodeLength(n)&&r.push(n),ht.remove(e,!1)})),e().each(r,(function(t,e){ht.remove(e,!1)})),new t(i.node,i.offset,i.node,i.offset).normalize()}},{key:"makeIsOn",value:function(t){return function(){var e=ht.ancestor(this.sc,t);return!!e&&e===ht.ancestor(this.ec,t)}}},{key:"isLeftEdgeOf",value:function(t){if(!ht.isLeftEdgePoint(this.getStartPoint()))return!1;var e=ht.ancestor(this.sc,t);return e&&ht.isLeftEdgeOf(this.sc,e)}},{key:"isCollapsed",value:function(){return this.sc===this.ec&&this.so===this.eo}},{key:"wrapBodyInlineWithPara",value:function(){if(ht.isBodyContainer(this.sc)&&ht.isEmpty(this.sc))return this.sc.innerHTML=ht.emptyPara,new t(this.sc.firstChild,0,this.sc.firstChild,0);var e,n=this.normalize();if(ht.isParaInline(this.sc)||ht.isPara(this.sc))return n;if(ht.isInline(n.sc)){var o=ht.listAncestor(n.sc,m.not(ht.isInline));e=k.last(o),ht.isInline(e)||(e=o[o.length-2]||n.sc.childNodes[n.so])}else e=n.sc.childNodes[n.so>0?n.so-1:0];if(e){var i=ht.listPrev(e,ht.isParaInline).reverse();if((i=i.concat(ht.listNext(e.nextSibling,ht.isParaInline))).length){var r=ht.wrap(k.head(i),"p");ht.appendChildNodes(r,k.tail(i))}}return this.normalize()}},{key:"insertNode",value:function(t){var e=this;(ht.isText(t)||ht.isInline(t))&&(e=this.wrapBodyInlineWithPara().deleteContents());var n=ht.splitPoint(e.getStartPoint(),ht.isInline(t));return n.rightNode?(n.rightNode.parentNode.insertBefore(t,n.rightNode),ht.isEmpty(n.rightNode)&&ht.isPara(t)&&n.rightNode.parentNode.removeChild(n.rightNode)):n.container.appendChild(t),t}},{key:"pasteHTML",value:function(t){t=e().trim(t);var n=e()("<div></div>").html(t)[0],o=k.from(n.childNodes),i=this,r=!1;return i.so>=0&&(o=o.reverse(),r=!0),o=o.map((function(t){return i.insertNode(t)})),r&&(o=o.reverse()),o}},{key:"toString",value:function(){var t=this.nativeRange();return f.isW3CRangeSupport?t.toString():t.text}},{key:"getWordRange",value:function(e){var n=this.getEndPoint();if(!ht.isCharPoint(n))return this;var o=ht.prevPointUntil(n,(function(t){return!ht.isCharPoint(t)}));return e&&(n=ht.nextPointUntil(n,(function(t){return!ht.isCharPoint(t)}))),new t(o.node,o.offset,n.node,n.offset)}},{key:"getWordsRange",value:function(e){var n=this.getEndPoint(),o=function(t){return!ht.isCharPoint(t)&&!ht.isSpacePoint(t)};if(o(n))return this;var i=ht.prevPointUntil(n,o);return e&&(n=ht.nextPointUntil(n,o)),new t(i.node,i.offset,n.node,n.offset)}},{key:"getWordsMatchRange",value:function(e){var n=this.getEndPoint(),o=ht.prevPointUntil(n,(function(o){if(!ht.isCharPoint(o)&&!ht.isSpacePoint(o))return!0;var i=new t(o.node,o.offset,n.node,n.offset),r=e.exec(i.toString());return r&&0===r.index})),i=new t(o.node,o.offset,n.node,n.offset),r=i.toString(),a=e.exec(r);return a&&a[0].length===r.length?i:null}},{key:"bookmark",value:function(t){return{s:{path:ht.makeOffsetPath(t,this.sc),offset:this.so},e:{path:ht.makeOffsetPath(t,this.ec),offset:this.eo}}}},{key:"paraBookmark",value:function(t){return{s:{path:k.tail(ht.makeOffsetPath(k.head(t),this.sc)),offset:this.so},e:{path:k.tail(ht.makeOffsetPath(k.last(t),this.ec)),offset:this.eo}}}},{key:"getClientRects",value:function(){return this.nativeRange().getClientRects()}}],o&&mt(n.prototype,o),i&&mt(n,i),t}();const yt={create:function(t,e,n,o){if(4===arguments.length)return new bt(t,e,n,o);if(2===arguments.length)return new bt(t,e,n=t,o=e);var i=this.createFromSelection();if(!i&&1===arguments.length){var r=arguments[0];return ht.isEditable(r)&&(r=r.lastChild),this.createFromBodyElement(r,ht.emptyPara===arguments[0].innerHTML)}return i},createFromBodyElement:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.createFromNode(t);return n.collapse(e)},createFromSelection:function(){var t,e,n,o;if(f.isW3CRangeSupport){var i=document.getSelection();if(!i||0===i.rangeCount)return null;if(ht.isBody(i.anchorNode))return null;var r=i.getRangeAt(0);t=r.startContainer,e=r.startOffset,n=r.endContainer,o=r.endOffset}else{var a=document.selection.createRange(),s=a.duplicate();s.collapse(!1);var l=a;l.collapse(!0);var c=vt(l,!0),u=vt(s,!1);ht.isText(c.node)&&ht.isLeftEdgePoint(c)&&ht.isTextNode(u.node)&&ht.isRightEdgePoint(u)&&u.node.nextSibling===c.node&&(c=u),t=c.cont,e=c.offset,n=u.cont,o=u.offset}return new bt(t,e,n,o)},createFromNode:function(t){var e=t,n=0,o=t,i=ht.nodeLength(o);return ht.isVoid(e)&&(n=ht.listPrev(e).length-1,e=e.parentNode),ht.isBR(o)?(i=ht.listPrev(o).length-1,o=o.parentNode):ht.isVoid(o)&&(i=ht.listPrev(o).length,o=o.parentNode),this.create(e,n,o,i)},createFromNodeBefore:function(t){return this.createFromNode(t).collapse(!0)},createFromNodeAfter:function(t){return this.createFromNode(t).collapse()},createFromBookmark:function(t,e){var n=ht.fromOffsetPath(t,e.s.path),o=e.s.offset,i=ht.fromOffsetPath(t,e.e.path),r=e.e.offset;return new bt(n,o,i,r)},createFromParaBookmark:function(t,e){var n=t.s.offset,o=t.e.offset,i=ht.fromOffsetPath(k.head(e),t.s.path),r=ht.fromOffsetPath(k.last(e),t.e.path);return new bt(i,n,r,o)}};var kt={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,SPACE:32,DELETE:46,LEFT:37,UP:38,RIGHT:39,DOWN:40,NUM0:48,NUM1:49,NUM2:50,NUM3:51,NUM4:52,NUM5:53,NUM6:54,NUM7:55,NUM8:56,B:66,E:69,I:73,J:74,K:75,L:76,R:82,S:83,U:85,V:86,Y:89,Z:90,SLASH:191,LEFTBRACKET:219,BACKSLASH:220,RIGHTBRACKET:221,HOME:36,END:35,PAGEUP:33,PAGEDOWN:34};const wt={isEdit:function(t){return k.contains([kt.BACKSPACE,kt.TAB,kt.ENTER,kt.SPACE,kt.DELETE],t)},isMove:function(t){return k.contains([kt.LEFT,kt.UP,kt.RIGHT,kt.DOWN],t)},isNavigation:function(t){return k.contains([kt.HOME,kt.END,kt.PAGEUP,kt.PAGEDOWN],t)},nameFromCode:m.invertObject(kt),code:kt};function Ct(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var xt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.stack=[],this.stackOffset=-1,this.context=e,this.$editable=e.layoutInfo.editable,this.editable=this.$editable[0]}var e,n,o;return e=t,(n=[{key:"makeSnapshot",value:function(){var t=yt.create(this.editable);return{contents:this.$editable.html(),bookmark:t&&t.isOnEditable()?t.bookmark(this.editable):{s:{path:[],offset:0},e:{path:[],offset:0}}}}},{key:"applySnapshot",value:function(t){null!==t.contents&&this.$editable.html(t.contents),null!==t.bookmark&&yt.createFromBookmark(this.editable,t.bookmark).select()}},{key:"rewind",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset=0,this.applySnapshot(this.stack[this.stackOffset])}},{key:"commit",value:function(){this.stack=[],this.stackOffset=-1,this.recordUndo()}},{key:"reset",value:function(){this.stack=[],this.stackOffset=-1,this.$editable.html(""),this.recordUndo()}},{key:"undo",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset>0&&(this.stackOffset--,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"redo",value:function(){this.stack.length-1>this.stackOffset&&(this.stackOffset++,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"recordUndo",value:function(){this.stackOffset++,this.stack.length>this.stackOffset&&(this.stack=this.stack.slice(0,this.stackOffset)),this.stack.push(this.makeSnapshot()),this.stack.length>this.context.options.historyLimit&&(this.stack.shift(),this.stackOffset-=1)}}])&&Ct(e.prototype,n),o&&Ct(e,o),t}();function St(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Tt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"jQueryCSS",value:function(t,n){var o={};return e().each(n,(function(e,n){o[n]=t.css(n)})),o}},{key:"fromNode",value:function(t){var e=this.jQueryCSS(t,["font-family","font-size","text-align","list-style-type","line-height"])||{},n=t[0].style.fontSize||e["font-size"];return e["font-size"]=parseInt(n,10),e["font-size-unit"]=n.match(/[a-z%]+$/),e}},{key:"stylePara",value:function(t,n){e().each(t.nodes(ht.isPara,{includeAncestor:!0}),(function(t,o){e()(o).css(n)}))}},{key:"styleNodes",value:function(t,n){t=t.splitText();var o=n&&n.nodeName||"SPAN",i=!(!n||!n.expandClosestSibling),r=!(!n||!n.onlyPartialContains);if(t.isCollapsed())return[t.insertNode(ht.create(o))];var a=ht.makePredByNodeName(o),s=t.nodes(ht.isText,{fullyContains:!0}).map((function(t){return ht.singleChildAncestor(t,a)||ht.wrap(t,o)}));if(i){if(r){var l=t.nodes();a=m.and(a,(function(t){return k.contains(l,t)}))}return s.map((function(t){var n=ht.withClosestSiblings(t,a),o=k.head(n),i=k.tail(n);return e().each(i,(function(t,e){ht.appendChildNodes(o,e.childNodes),ht.remove(e)})),k.head(n)}))}return s}},{key:"current",value:function(t){var n=e()(ht.isElement(t.sc)?t.sc:t.sc.parentNode),o=this.fromNode(n);try{o=e().extend(o,{"font-bold":document.queryCommandState("bold")?"bold":"normal","font-italic":document.queryCommandState("italic")?"italic":"normal","font-underline":document.queryCommandState("underline")?"underline":"normal","font-subscript":document.queryCommandState("subscript")?"subscript":"normal","font-superscript":document.queryCommandState("superscript")?"superscript":"normal","font-strikethrough":document.queryCommandState("strikethrough")?"strikethrough":"normal","font-family":document.queryCommandValue("fontname")||o["font-family"]})}catch(t){}if(t.isOnList()){var i=["circle","disc","disc-leading-zero","square"].indexOf(o["list-style-type"])>-1;o["list-style"]=i?"unordered":"ordered"}else o["list-style"]="none";var r=ht.ancestor(t.sc,ht.isPara);if(r&&r.style["line-height"])o["line-height"]=r.style.lineHeight;else{var a=parseInt(o["line-height"],10)/parseInt(o["font-size"],10);o["line-height"]=a.toFixed(1)}return o.anchor=t.isOnAnchor()&&ht.ancestor(t.sc,ht.isAnchor),o.ancestors=ht.listAncestor(t.sc,ht.isEditable),o.range=t,o}}],o&&St(n.prototype,o),i&&St(n,i),t}();function Et(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var It=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"insertOrderedList",value:function(t){this.toggleList("OL",t)}},{key:"insertUnorderedList",value:function(t){this.toggleList("UL",t)}},{key:"indent",value:function(t){var n=this,o=yt.create(t).wrapBodyInlineWithPara(),i=o.nodes(ht.isPara,{includeAncestor:!0}),r=k.clusterBy(i,m.peq2("parentNode"));e().each(r,(function(t,o){var i=k.head(o);if(ht.isLi(i)){var r=n.findList(i.previousSibling);r?o.map((function(t){return r.appendChild(t)})):(n.wrapList(o,i.parentNode.nodeName),o.map((function(t){return t.parentNode})).map((function(t){return n.appendToPrevious(t)})))}else e().each(o,(function(t,n){e()(n).css("marginLeft",(function(t,e){return(parseInt(e,10)||0)+25}))}))})),o.select()}},{key:"outdent",value:function(t){var n=this,o=yt.create(t).wrapBodyInlineWithPara(),i=o.nodes(ht.isPara,{includeAncestor:!0}),r=k.clusterBy(i,m.peq2("parentNode"));e().each(r,(function(t,o){var i=k.head(o);ht.isLi(i)?n.releaseList([o]):e().each(o,(function(t,n){e()(n).css("marginLeft",(function(t,e){return(e=parseInt(e,10)||0)>25?e-25:""}))}))})),o.select()}},{key:"toggleList",value:function(t,n){var o=this,i=yt.create(n).wrapBodyInlineWithPara(),r=i.nodes(ht.isPara,{includeAncestor:!0}),a=i.paraBookmark(r),s=k.clusterBy(r,m.peq2("parentNode"));if(k.find(r,ht.isPurePara)){var l=[];e().each(s,(function(e,n){l=l.concat(o.wrapList(n,t))})),r=l}else{var c=i.nodes(ht.isList,{includeAncestor:!0}).filter((function(n){return!e().nodeName(n,t)}));c.length?e().each(c,(function(e,n){ht.replace(n,t)})):r=this.releaseList(s,!0)}yt.createFromParaBookmark(a,r).select()}},{key:"wrapList",value:function(t,e){var n=k.head(t),o=k.last(t),i=ht.isList(n.previousSibling)&&n.previousSibling,r=ht.isList(o.nextSibling)&&o.nextSibling,a=i||ht.insertAfter(ht.create(e||"UL"),o);return t=t.map((function(t){return ht.isPurePara(t)?ht.replace(t,"LI"):t})),ht.appendChildNodes(a,t),r&&(ht.appendChildNodes(a,k.from(r.childNodes)),ht.remove(r)),t}},{key:"releaseList",value:function(t,n){var o=this,i=[];return e().each(t,(function(t,r){var a=k.head(r),s=k.last(r),l=n?ht.lastAncestor(a,ht.isList):a.parentNode,c=l.parentNode;if("LI"===l.parentNode.nodeName)r.map((function(t){var e=o.findNextSiblings(t);c.nextSibling?c.parentNode.insertBefore(t,c.nextSibling):c.parentNode.appendChild(t),e.length&&(o.wrapList(e,l.nodeName),t.appendChild(e[0].parentNode))})),0===l.children.length&&c.removeChild(l),0===c.childNodes.length&&c.parentNode.removeChild(c);else{var u=l.childNodes.length>1?ht.splitTree(l,{node:s.parentNode,offset:ht.position(s)+1},{isSkipPaddingBlankHTML:!0}):null,d=ht.splitTree(l,{node:a.parentNode,offset:ht.position(a)},{isSkipPaddingBlankHTML:!0});r=n?ht.listDescendant(d,ht.isLi):k.from(d.childNodes).filter(ht.isLi),!n&&ht.isList(l.parentNode)||(r=r.map((function(t){return ht.replace(t,"P")}))),e().each(k.from(r).reverse(),(function(t,e){ht.insertAfter(e,l)}));var h=k.compact([l,d,u]);e().each(h,(function(t,n){var o=[n].concat(ht.listDescendant(n,ht.isList));e().each(o.reverse(),(function(t,e){ht.nodeLength(e)||ht.remove(e,!0)}))}))}i=i.concat(r)})),i}},{key:"appendToPrevious",value:function(t){return t.previousSibling?ht.appendChildNodes(t.previousSibling,[t]):this.wrapList([t],"LI")}},{key:"findList",value:function(t){return t?k.find(t.children,(function(t){return["OL","UL"].indexOf(t.nodeName)>-1})):null}},{key:"findNextSiblings",value:function(t){for(var e=[];t.nextSibling;)e.push(t.nextSibling),t=t.nextSibling;return e}}],o&&Et(n.prototype,o),i&&Et(n,i),t}();function $t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Nt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.bullet=new It,this.options=e.options}var n,o,i;return n=t,o=[{key:"insertTab",value:function(t,e){var n=ht.createText(new Array(e+1).join(ht.NBSP_CHAR));(t=t.deleteContents()).insertNode(n,!0),(t=yt.create(n,e)).select()}},{key:"insertParagraph",value:function(t,n){n=(n=(n=n||yt.create(t)).deleteContents()).wrapBodyInlineWithPara();var o,i=ht.ancestor(n.sc,ht.isPara);if(i){if(ht.isLi(i)&&(ht.isEmpty(i)||ht.deepestChildIsEmpty(i)))return void this.bullet.toggleList(i.parentNode.nodeName);var r=null;if(1===this.options.blockquoteBreakingLevel?r=ht.ancestor(i,ht.isBlockquote):2===this.options.blockquoteBreakingLevel&&(r=ht.lastAncestor(i,ht.isBlockquote)),r){o=e()(ht.emptyPara)[0],ht.isRightEdgePoint(n.getStartPoint())&&ht.isBR(n.sc.nextSibling)&&e()(n.sc.nextSibling).remove();var a=ht.splitTree(r,n.getStartPoint(),{isDiscardEmptySplits:!0});a?a.parentNode.insertBefore(o,a):ht.insertAfter(o,r)}else{o=ht.splitTree(i,n.getStartPoint());var s=ht.listDescendant(i,ht.isEmptyAnchor);s=s.concat(ht.listDescendant(o,ht.isEmptyAnchor)),e().each(s,(function(t,e){ht.remove(e)})),(ht.isHeading(o)||ht.isPre(o)||ht.isCustomStyleTag(o))&&ht.isEmpty(o)&&(o=ht.replace(o,"p"))}}else{var l=n.sc.childNodes[n.so];o=e()(ht.emptyPara)[0],l?n.sc.insertBefore(o,l):n.sc.appendChild(o)}yt.create(o,0).normalize().select().scrollIntoView(t)}}],o&&$t(n.prototype,o),i&&$t(n,i),t}();function Pt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Rt=function t(e,n,o,i){var r={colPos:0,rowPos:0},a=[],s=[];function l(t,e,n,o,i,r,s){var l={baseRow:n,baseCell:o,isRowSpan:i,isColSpan:r,isVirtual:s};a[t]||(a[t]=[]),a[t][e]=l}function c(t,e,n,o){return{baseCell:t.baseCell,action:e,virtualTable:{rowIndex:n,cellIndex:o}}}function u(t,e){if(!a[t])return e;if(!a[t][e])return e;for(var n=e;a[t][n];)if(n++,!a[t][n])return n}function d(t,e){var n=u(t.rowIndex,e.cellIndex),o=e.colSpan>1,i=e.rowSpan>1,a=t.rowIndex===r.rowPos&&e.cellIndex===r.colPos;l(t.rowIndex,n,t,e,i,o,!1);var s=e.attributes.rowSpan?parseInt(e.attributes.rowSpan.value,10):0;if(s>1)for(var c=1;c<s;c++){var d=t.rowIndex+c;h(d,n,e,a),l(d,n,t,e,!0,o,!0)}var f=e.attributes.colSpan?parseInt(e.attributes.colSpan.value,10):0;if(f>1)for(var p=1;p<f;p++){var m=u(t.rowIndex,n+p);h(t.rowIndex,m,e,a),l(t.rowIndex,m,t,e,i,!0,!0)}}function h(t,e,n,o){t===r.rowPos&&r.colPos>=n.cellIndex&&n.cellIndex<=e&&!o&&r.colPos++}function f(e){switch(n){case t.where.Column:if(e.isColSpan)return t.resultAction.SubtractSpanCount;break;case t.where.Row:if(!e.isVirtual&&e.isRowSpan)return t.resultAction.AddCell;if(e.isRowSpan)return t.resultAction.SubtractSpanCount}return t.resultAction.RemoveCell}function p(e){switch(n){case t.where.Column:if(e.isColSpan)return t.resultAction.SumSpanCount;if(e.isRowSpan&&e.isVirtual)return t.resultAction.Ignore;break;case t.where.Row:if(e.isRowSpan)return t.resultAction.SumSpanCount;if(e.isColSpan&&e.isVirtual)return t.resultAction.Ignore}return t.resultAction.AddCell}this.getActionList=function(){for(var e=n===t.where.Row?r.rowPos:-1,i=n===t.where.Column?r.colPos:-1,l=0,u=!0;u;){var d=e>=0?e:l,h=i>=0?i:l,m=a[d];if(!m)return u=!1,s;var v=m[h];if(!v)return u=!1,s;var g=t.resultAction.Ignore;switch(o){case t.requestAction.Add:g=p(v);break;case t.requestAction.Delete:g=f(v)}s.push(c(v,g,d,h)),l++}return s},e&&e.tagName&&("td"===e.tagName.toLowerCase()||"th"===e.tagName.toLowerCase())&&(r.colPos=e.cellIndex,e.parentElement&&e.parentElement.tagName&&"tr"===e.parentElement.tagName.toLowerCase()&&(r.rowPos=e.parentElement.rowIndex)),function(){for(var t=i.rows,e=0;e<t.length;e++)for(var n=t[e].cells,o=0;o<n.length;o++)d(t[e],n[o])}()};Rt.where={Row:0,Column:1},Rt.requestAction={Add:0,Delete:1},Rt.resultAction={Ignore:0,SubtractSpanCount:1,RemoveCell:2,AddCell:3,SumSpanCount:4};var Lt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"tab",value:function(t,e){var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=ht.ancestor(n,ht.isTable),i=ht.listDescendant(o,ht.isCell),r=k[e?"prev":"next"](i,n);r&&yt.create(r,0).select()}},{key:"addRow",value:function(t,n){for(var o=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(o).closest("tr"),r=this.recoverAttributes(i),a=e()("<tr"+r+"></tr>"),s=new Rt(o,Rt.where.Row,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),l=0;l<s.length;l++){var c=s[l],u=this.recoverAttributes(c.baseCell);switch(c.action){case Rt.resultAction.AddCell:a.append("<td"+u+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("top"===n&&(c.baseCell.parent?c.baseCell.closest("tr").rowIndex:0)<=i[0].rowIndex){var d=e()("<div></div>").append(e()("<td"+u+">"+ht.blank+"</td>").removeAttr("rowspan")).html();a.append(d);break}var h=parseInt(c.baseCell.rowSpan,10);h++,c.baseCell.setAttribute("rowSpan",h)}}if("top"===n)i.before(a);else{if(o.rowSpan>1){var f=i[0].rowIndex+(o.rowSpan-2);return void e()(e()(i).parent().find("tr")[f]).after(e()(a))}i.after(a)}}},{key:"addCol",value:function(t,n){var o=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(o).closest("tr");e()(i).siblings().push(i);for(var r=new Rt(o,Rt.where.Column,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),a=0;a<r.length;a++){var s=r[a],l=this.recoverAttributes(s.baseCell);switch(s.action){case Rt.resultAction.AddCell:"right"===n?e()(s.baseCell).after("<td"+l+">"+ht.blank+"</td>"):e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("right"===n){var c=parseInt(s.baseCell.colSpan,10);c++,s.baseCell.setAttribute("colSpan",c)}else e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>")}}}},{key:"recoverAttributes",value:function(t){var e="";if(!t)return e;for(var n=t.attributes||[],o=0;o<n.length;o++)"id"!==n[o].name.toLowerCase()&&n[o].specified&&(e+=" "+n[o].name+"='"+n[o].value+"'");return e}},{key:"deleteRow",value:function(t){for(var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=e()(n).closest("tr"),i=o.children("td, th").index(e()(n)),r=o[0].rowIndex,a=new Rt(n,Rt.where.Row,Rt.requestAction.Delete,e()(o).closest("table")[0]).getActionList(),s=0;s<a.length;s++)if(a[s]){var l=a[s].baseCell,c=a[s].virtualTable,u=l.rowSpan&&l.rowSpan>1,d=u?parseInt(l.rowSpan,10):0;switch(a[s].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.AddCell:var h=o.next("tr")[0];if(!h)continue;var f=o[0].cells[i];u&&(d>2?(d--,h.insertBefore(f,h.cells[i]),h.cells[i].setAttribute("rowSpan",d),h.cells[i].innerHTML=""):2===d&&(h.insertBefore(f,h.cells[i]),h.cells[i].removeAttribute("rowSpan"),h.cells[i].innerHTML=""));continue;case Rt.resultAction.SubtractSpanCount:u&&(d>2?(d--,l.setAttribute("rowSpan",d),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")):2===d&&(l.removeAttribute("rowSpan"),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")));continue;case Rt.resultAction.RemoveCell:continue}}o.remove()}},{key:"deleteCol",value:function(t){for(var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=e()(n).closest("tr"),i=o.children("td, th").index(e()(n)),r=new Rt(n,Rt.where.Column,Rt.requestAction.Delete,e()(o).closest("table")[0]).getActionList(),a=0;a<r.length;a++)if(r[a])switch(r[a].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.SubtractSpanCount:var s=r[a].baseCell;if(s.colSpan&&s.colSpan>1){var l=s.colSpan?parseInt(s.colSpan,10):0;l>2?(l--,s.setAttribute("colSpan",l),s.cellIndex===i&&(s.innerHTML="")):2===l&&(s.removeAttribute("colSpan"),s.cellIndex===i&&(s.innerHTML=""))}continue;case Rt.resultAction.RemoveCell:ht.remove(r[a].baseCell,!0);continue}}},{key:"createTable",value:function(t,n,o){for(var i,r=[],a=0;a<t;a++)r.push("<td>"+ht.blank+"</td>");i=r.join("");for(var s,l=[],c=0;c<n;c++)l.push("<tr>"+i+"</tr>");s=l.join("");var u=e()("<table>"+s+"</table>");return o&&o.tableClassName&&u.addClass(o.tableClassName),u[0]}},{key:"deleteTable",value:function(t){var n=ht.ancestor(t.commonAncestor(),ht.isCell);e()(n).closest("table").remove()}}],o&&Pt(n.prototype,o),i&&Pt(n,i),t}();function At(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Ft=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$note=n.layoutInfo.note,this.$editor=n.layoutInfo.editor,this.$editable=n.layoutInfo.editable,this.options=n.options,this.lang=this.options.langInfo,this.editable=this.$editable[0],this.lastRange=null,this.snapshot=null,this.style=new Tt,this.table=new Lt,this.typing=new Nt(n),this.bullet=new It,this.history=new xt(n),this.context.memo("help.escape",this.lang.help.escape),this.context.memo("help.undo",this.lang.help.undo),this.context.memo("help.redo",this.lang.help.redo),this.context.memo("help.tab",this.lang.help.tab),this.context.memo("help.untab",this.lang.help.untab),this.context.memo("help.insertParagraph",this.lang.help.insertParagraph),this.context.memo("help.insertOrderedList",this.lang.help.insertOrderedList),this.context.memo("help.insertUnorderedList",this.lang.help.insertUnorderedList),this.context.memo("help.indent",this.lang.help.indent),this.context.memo("help.outdent",this.lang.help.outdent),this.context.memo("help.formatPara",this.lang.help.formatPara),this.context.memo("help.insertHorizontalRule",this.lang.help.insertHorizontalRule),this.context.memo("help.fontName",this.lang.help.fontName);for(var i=["bold","italic","underline","strikethrough","superscript","subscript","justifyLeft","justifyCenter","justifyRight","justifyFull","formatBlock","removeFormat","backColor"],r=0,a=i.length;r<a;r++)this[i[r]]=function(t){return function(e){o.beforeCommand(),document.execCommand(t,!1,e),o.afterCommand(!0)}}(i[r]),this.context.memo("help."+i[r],this.lang.help[i[r]]);this.fontName=this.wrapCommand((function(t){return o.fontStyling("font-family",f.validFontName(t))})),this.fontSize=this.wrapCommand((function(t){var e=o.currentStyle()["font-size-unit"];return o.fontStyling("font-size",t+e)})),this.fontSizeUnit=this.wrapCommand((function(t){var e=o.currentStyle()["font-size"];return o.fontStyling("font-size",e+t)}));for(var s=1;s<=6;s++)this["formatH"+s]=function(t){return function(){o.formatBlock("H"+t)}}(s),this.context.memo("help.formatH"+s,this.lang.help["formatH"+s]);this.insertParagraph=this.wrapCommand((function(){o.typing.insertParagraph(o.editable)})),this.insertOrderedList=this.wrapCommand((function(){o.bullet.insertOrderedList(o.editable)})),this.insertUnorderedList=this.wrapCommand((function(){o.bullet.insertUnorderedList(o.editable)})),this.indent=this.wrapCommand((function(){o.bullet.indent(o.editable)})),this.outdent=this.wrapCommand((function(){o.bullet.outdent(o.editable)})),this.insertNode=this.wrapCommand((function(t){o.isLimited(e()(t).text().length)||(o.getLastRange().insertNode(t),o.setLastRange(yt.createFromNodeAfter(t).select()))})),this.insertText=this.wrapCommand((function(t){if(!o.isLimited(t.length)){var e=o.getLastRange().insertNode(ht.createText(t));o.setLastRange(yt.create(e,ht.nodeLength(e)).select())}})),this.pasteHTML=this.wrapCommand((function(t){if(!o.isLimited(t.length)){t=o.context.invoke("codeview.purify",t);var e=o.getLastRange().pasteHTML(t);o.setLastRange(yt.createFromNodeAfter(k.last(e)).select())}})),this.formatBlock=this.wrapCommand((function(t,e){var n=o.options.callbacks.onApplyCustomStyle;n?n.call(o,e,o.context,o.onFormatBlock):o.onFormatBlock(t,e)})),this.insertHorizontalRule=this.wrapCommand((function(){var t=o.getLastRange().insertNode(ht.create("HR"));t.nextSibling&&o.setLastRange(yt.create(t.nextSibling,0).normalize().select())})),this.lineHeight=this.wrapCommand((function(t){o.style.stylePara(o.getLastRange(),{lineHeight:t})})),this.createLink=this.wrapCommand((function(t){var n=t.url,i=t.text,r=t.isNewWindow,a=t.checkProtocol,s=t.range||o.getLastRange(),l=i.length-s.toString().length;if(!(l>0&&o.isLimited(l))){var c=s.toString()!==i;"string"==typeof n&&(n=n.trim()),o.options.onCreateLink?n=o.options.onCreateLink(n):a&&(n=/^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(n)?n:o.options.defaultProtocol+n);var u=[];if(c){var d=(s=s.deleteContents()).insertNode(e()("<A>"+i+"</A>")[0]);u.push(d)}else u=o.style.styleNodes(s,{nodeName:"A",expandClosestSibling:!0,onlyPartialContains:!0});e().each(u,(function(t,o){e()(o).attr("href",n),r?e()(o).attr("target","_blank"):e()(o).removeAttr("target")})),o.setLastRange(o.createRangeFromList(u).select())}})),this.color=this.wrapCommand((function(t){var e=t.foreColor,n=t.backColor;e&&document.execCommand("foreColor",!1,e),n&&document.execCommand("backColor",!1,n)})),this.foreColor=this.wrapCommand((function(t){document.execCommand("foreColor",!1,t)})),this.insertTable=this.wrapCommand((function(t){var e=t.split("x");o.getLastRange().deleteContents().insertNode(o.table.createTable(e[0],e[1],o.options))})),this.removeMedia=this.wrapCommand((function(){var t=e()(o.restoreTarget()).parent();t.closest("figure").length?t.closest("figure").remove():t=e()(o.restoreTarget()).detach(),o.context.triggerEvent("media.delete",t,o.$editable)})),this.floatMe=this.wrapCommand((function(t){var n=e()(o.restoreTarget());n.toggleClass("note-float-left","left"===t),n.toggleClass("note-float-right","right"===t),n.css("float","none"===t?"":t)})),this.resize=this.wrapCommand((function(t){var n=e()(o.restoreTarget());0===(t=parseFloat(t))?n.css("width",""):n.css({width:100*t+"%",height:""})}))}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this;this.$editable.on("keydown",(function(e){if(e.keyCode===wt.code.ENTER&&t.context.triggerEvent("enter",e),t.context.triggerEvent("keydown",e),t.snapshot=t.history.makeSnapshot(),t.hasKeyShortCut=!1,e.isDefaultPrevented()||(t.options.shortcuts?t.hasKeyShortCut=t.handleKeyMap(e):t.preventDefaultEditableShortCuts(e)),t.isLimited(1,e)){var n=t.getLastRange();if(n.eo-n.so==0)return!1}t.setLastRange(),t.options.recordEveryKeystroke&&!1===t.hasKeyShortCut&&t.history.recordUndo()})).on("keyup",(function(e){t.setLastRange(),t.context.triggerEvent("keyup",e)})).on("focus",(function(e){t.setLastRange(),t.context.triggerEvent("focus",e)})).on("blur",(function(e){t.context.triggerEvent("blur",e)})).on("mousedown",(function(e){t.context.triggerEvent("mousedown",e)})).on("mouseup",(function(e){t.setLastRange(),t.history.recordUndo(),t.context.triggerEvent("mouseup",e)})).on("scroll",(function(e){t.context.triggerEvent("scroll",e)})).on("paste",(function(e){t.setLastRange(),t.context.triggerEvent("paste",e)})).on("input",(function(){t.isLimited(0)&&t.snapshot&&t.history.applySnapshot(t.snapshot)})),this.$editable.attr("spellcheck",this.options.spellCheck),this.$editable.attr("autocorrect",this.options.spellCheck),this.options.disableGrammar&&this.$editable.attr("data-gramm",!1),this.$editable.html(ht.html(this.$note)||ht.emptyPara),this.$editable.on(f.inputEventName,m.debounce((function(){t.context.triggerEvent("change",t.$editable.html(),t.$editable)}),10)),this.$editable.on("focusin",(function(e){t.context.triggerEvent("focusin",e)})).on("focusout",(function(e){t.context.triggerEvent("focusout",e)})),this.options.airMode?this.options.overrideContextMenu&&this.$editor.on("contextmenu",(function(e){return t.context.triggerEvent("contextmenu",e),!1})):(this.options.width&&this.$editor.outerWidth(this.options.width),this.options.height&&this.$editable.outerHeight(this.options.height),this.options.maxHeight&&this.$editable.css("max-height",this.options.maxHeight),this.options.minHeight&&this.$editable.css("min-height",this.options.minHeight)),this.history.recordUndo(),this.setLastRange()}},{key:"destroy",value:function(){this.$editable.off()}},{key:"handleKeyMap",value:function(t){var e=this.options.keyMap[f.isMac?"mac":"pc"],n=[];t.metaKey&&n.push("CMD"),t.ctrlKey&&!t.altKey&&n.push("CTRL"),t.shiftKey&&n.push("SHIFT");var o=wt.nameFromCode[t.keyCode];o&&n.push(o);var i=e[n.join("+")];if("TAB"!==o||this.options.tabDisable)if(i){if(!1!==this.context.invoke(i))return t.preventDefault(),!0}else wt.isEdit(t.keyCode)&&this.afterCommand();else this.afterCommand();return!1}},{key:"preventDefaultEditableShortCuts",value:function(t){(t.ctrlKey||t.metaKey)&&k.contains([66,73,85],t.keyCode)&&t.preventDefault()}},{key:"isLimited",value:function(t,e){return t=t||0,(void 0===e||!(wt.isMove(e.keyCode)||wt.isNavigation(e.keyCode)||e.ctrlKey||e.metaKey||k.contains([wt.code.BACKSPACE,wt.code.DELETE],e.keyCode)))&&this.options.maxTextLength>0&&this.$editable.text().length+t>this.options.maxTextLength}},{key:"createRange",value:function(){return this.focus(),this.setLastRange(),this.getLastRange()}},{key:"createRangeFromList",value:function(t){var e=yt.createFromNodeBefore(k.head(t)).getStartPoint(),n=yt.createFromNodeAfter(k.last(t)).getEndPoint();return yt.create(e.node,e.offset,n.node,n.offset)}},{key:"setLastRange",value:function(t){t?this.lastRange=t:(this.lastRange=yt.create(this.editable),0===e()(this.lastRange.sc).closest(".note-editable").length&&(this.lastRange=yt.createFromBodyElement(this.editable)))}},{key:"getLastRange",value:function(){return this.lastRange||this.setLastRange(),this.lastRange}},{key:"saveRange",value:function(t){t&&this.getLastRange().collapse().select()}},{key:"restoreRange",value:function(){this.lastRange&&(this.lastRange.select(),this.focus())}},{key:"saveTarget",value:function(t){this.$editable.data("target",t)}},{key:"clearTarget",value:function(){this.$editable.removeData("target")}},{key:"restoreTarget",value:function(){return this.$editable.data("target")}},{key:"currentStyle",value:function(){var t=yt.create();return t&&(t=t.normalize()),t?this.style.current(t):this.style.fromNode(this.$editable)}},{key:"styleFromNode",value:function(t){return this.style.fromNode(t)}},{key:"undo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.undo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"commit",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.commit(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"redo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.redo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"beforeCommand",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),document.execCommand("styleWithCSS",!1,this.options.styleWithCSS),this.focus()}},{key:"afterCommand",value:function(t){this.normalizeContent(),this.history.recordUndo(),t||this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"tab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t);else{if(0===this.options.tabSize)return!1;this.isLimited(this.options.tabSize)||(this.beforeCommand(),this.typing.insertTab(t,this.options.tabSize),this.afterCommand())}}},{key:"untab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t,!0);else if(0===this.options.tabSize)return!1}},{key:"wrapCommand",value:function(t){return function(){this.beforeCommand(),t.apply(this,arguments),this.afterCommand()}}},{key:"insertImage",value:function(t,n){var o,i=this;return(o=t,e().Deferred((function(t){var n=e()("<img>");n.one("load",(function(){n.off("error abort"),t.resolve(n)})).one("error abort",(function(){n.off("load").detach(),t.reject(n)})).css({display:"none"}).appendTo(document.body).attr("src",o)})).promise()).then((function(t){i.beforeCommand(),"function"==typeof n?n(t):("string"==typeof n&&t.attr("data-filename",n),t.css("width",Math.min(i.$editable.width(),t.width()))),t.show(),i.getLastRange().insertNode(t[0]),i.setLastRange(yt.createFromNodeAfter(t[0]).select()),i.afterCommand()})).fail((function(t){i.context.triggerEvent("image.upload.error",t)}))}},{key:"insertImagesAsDataURL",value:function(t){var n=this;e().each(t,(function(t,o){var i=o.name;n.options.maximumImageFileSize&&n.options.maximumImageFileSize<o.size?n.context.triggerEvent("image.upload.error",n.lang.image.maximumFileSizeError):function(t){return e().Deferred((function(n){e().extend(new FileReader,{onload:function(t){var e=t.target.result;n.resolve(e)},onerror:function(t){n.reject(t)}}).readAsDataURL(t)})).promise()}(o).then((function(t){return n.insertImage(t,i)})).fail((function(){n.context.triggerEvent("image.upload.error")}))}))}},{key:"insertImagesOrCallback",value:function(t){this.options.callbacks.onImageUpload?this.context.triggerEvent("image.upload",t):this.insertImagesAsDataURL(t)}},{key:"getSelectedText",value:function(){var t=this.getLastRange();return t.isOnAnchor()&&(t=yt.createFromNode(ht.ancestor(t.sc,ht.isAnchor))),t.toString()}},{key:"onFormatBlock",value:function(t,n){if(document.execCommand("FormatBlock",!1,f.isMSIE?"<"+t+">":t),n&&n.length&&(n[0].tagName.toUpperCase()!==t.toUpperCase()&&(n=n.find(t)),n&&n.length)){var o=this.createRange(),i=e()([o.sc,o.ec]).closest(t);i.removeClass();var r=n[0].className||"";r&&i.addClass(r)}}},{key:"formatPara",value:function(){this.formatBlock("P")}},{key:"fontStyling",value:function(t,n){var o=this.getLastRange();if(""!==o){var i=this.style.styleNodes(o);if(this.$editor.find(".note-status-output").html(""),e()(i).css(t,n),o.isCollapsed()){var r=k.head(i);r&&!ht.nodeLength(r)&&(r.innerHTML=ht.ZERO_WIDTH_NBSP_CHAR,yt.createFromNode(r.firstChild).select(),this.setLastRange(),this.$editable.data("bogus",r))}else this.setLastRange(this.createRangeFromList(i).select())}else{var a=e().now();this.$editor.find(".note-status-output").html('<div id="note-status-output-'+a+'" class="alert alert-info">'+this.lang.output.noSelection+"</div>"),setTimeout((function(){e()("#note-status-output-"+a).remove()}),5e3)}}},{key:"unlink",value:function(){var t=this.getLastRange();if(t.isOnAnchor()){var e=ht.ancestor(t.sc,ht.isAnchor);(t=yt.createFromNode(e)).select(),this.setLastRange(),this.beforeCommand(),document.execCommand("unlink"),this.afterCommand()}}},{key:"getLinkInfo",value:function(){var t=this.getLastRange().expand(ht.isAnchor),n=e()(k.head(t.nodes(ht.isAnchor))),o={range:t,text:t.toString(),url:n.length?n.attr("href"):""};return n.length&&(o.isNewWindow="_blank"===n.attr("target")),o}},{key:"addRow",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addRow(e,t),this.afterCommand())}},{key:"addCol",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addCol(e,t),this.afterCommand())}},{key:"deleteRow",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteRow(t),this.afterCommand())}},{key:"deleteCol",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteCol(t),this.afterCommand())}},{key:"deleteTable",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteTable(t),this.afterCommand())}},{key:"resizeTo",value:function(t,e,n){var o;if(n){var i=t.y/t.x,r=e.data("ratio");o={width:r>i?t.x:t.y/r,height:r>i?t.x*r:t.y}}else o={width:t.x,height:t.y};e.css(o)}},{key:"hasFocus",value:function(){return this.$editable.is(":focus")}},{key:"focus",value:function(){this.hasFocus()||this.$editable.focus()}},{key:"isEmpty",value:function(){return ht.isEmpty(this.$editable[0])||ht.emptyPara===this.$editable.html()}},{key:"empty",value:function(){this.context.invoke("code",ht.emptyPara)}},{key:"normalizeContent",value:function(){this.$editable[0].normalize()}}],o&&At(n.prototype,o),i&&At(n,i),t}();function Dt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Ht=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editable=e.layoutInfo.editable}var e,n,o;return e=t,(n=[{key:"initialize",value:function(){this.$editable.on("paste",this.pasteByEvent.bind(this))}},{key:"pasteByEvent",value:function(t){var e=this,n=t.originalEvent.clipboardData;if(n&&n.items&&n.items.length){var o=n.items.length>1?n.items[1]:k.head(n.items);"file"===o.kind&&-1!==o.type.indexOf("image/")?(this.context.invoke("editor.insertImagesOrCallback",[o.getAsFile()]),t.preventDefault()):"string"===o.kind&&this.context.invoke("editor.isLimited",n.getData("Text").length)&&t.preventDefault()}else if(window.clipboardData){var i=window.clipboardData.getData("text");this.context.invoke("editor.isLimited",i.length)&&t.preventDefault()}setTimeout((function(){e.context.invoke("editor.afterCommand")}),10)}}])&&Dt(e.prototype,n),o&&Dt(e,o),t}();function zt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Bt=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$eventListener=e()(document),this.$editor=n.layoutInfo.editor,this.$editable=n.layoutInfo.editable,this.options=n.options,this.lang=this.options.langInfo,this.documentEventHandlers={},this.$dropzone=e()(['<div class="note-dropzone">','<div class="note-dropzone-message"></div>',"</div>"].join("")).prependTo(this.$editor)}var n,o,i;return n=t,o=[{key:"initialize",value:function(){this.options.disableDragAndDrop?(this.documentEventHandlers.onDrop=function(t){t.preventDefault()},this.$eventListener=this.$dropzone,this.$eventListener.on("drop",this.documentEventHandlers.onDrop)):this.attachDragAndDropEvent()}},{key:"attachDragAndDropEvent",value:function(){var t=this,n=e()(),o=this.$dropzone.find(".note-dropzone-message");this.documentEventHandlers.onDragenter=function(e){var i=t.context.invoke("codeview.isActivated"),r=t.$editor.width()>0&&t.$editor.height()>0;i||n.length||!r||(t.$editor.addClass("dragover"),t.$dropzone.width(t.$editor.width()),t.$dropzone.height(t.$editor.height()),o.text(t.lang.image.dragImageHere)),n=n.add(e.target)},this.documentEventHandlers.onDragleave=function(o){(n=n.not(o.target)).length&&"BODY"!==o.target.nodeName||(n=e()(),t.$editor.removeClass("dragover"))},this.documentEventHandlers.onDrop=function(){n=e()(),t.$editor.removeClass("dragover")},this.$eventListener.on("dragenter",this.documentEventHandlers.onDragenter).on("dragleave",this.documentEventHandlers.onDragleave).on("drop",this.documentEventHandlers.onDrop),this.$dropzone.on("dragenter",(function(){t.$dropzone.addClass("hover"),o.text(t.lang.image.dropImage)})).on("dragleave",(function(){t.$dropzone.removeClass("hover"),o.text(t.lang.image.dragImageHere)})),this.$dropzone.on("drop",(function(n){var o=n.originalEvent.dataTransfer;n.preventDefault(),o&&o.files&&o.files.length?(t.$editable.focus(),t.context.invoke("editor.insertImagesOrCallback",o.files)):e().each(o.types,(function(n,i){if(!(i.toLowerCase().indexOf("_moz_")>-1)){var r=o.getData(i);i.toLowerCase().indexOf("text")>-1?t.context.invoke("editor.pasteHTML",r):e()(r).each((function(e,n){t.context.invoke("editor.insertNode",n)}))}}))})).on("dragover",!1)}},{key:"destroy",value:function(){var t=this;Object.keys(this.documentEventHandlers).forEach((function(e){t.$eventListener.off(e.substr(2).toLowerCase(),t.documentEventHandlers[e])})),this.documentEventHandlers={}}}],o&&zt(n.prototype,o),i&&zt(n,i),t}();function Mt(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return Ot(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ot(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,r=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw r}}}}function Ot(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n<e;n++)o[n]=t[n];return o}function Ut(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var jt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editor=e.layoutInfo.editor,this.$editable=e.layoutInfo.editable,this.$codable=e.layoutInfo.codable,this.options=e.options,this.CodeMirrorConstructor=window.CodeMirror,this.options.codemirror.CodeMirrorConstructor&&(this.CodeMirrorConstructor=this.options.codemirror.CodeMirrorConstructor)}var e,n,o;return e=t,n=[{key:"sync",value:function(t){var e=this.isActivated(),n=this.CodeMirrorConstructor;e&&(t?n?this.$codable.data("cmEditor").getDoc().setValue(t):this.$codable.val(t):n&&this.$codable.data("cmEditor").save())}},{key:"initialize",value:function(){var t=this;this.$codable.on("keyup",(function(e){e.keyCode===wt.code.ESCAPE&&t.deactivate()}))}},{key:"isActivated",value:function(){return this.$editor.hasClass("codeview")}},{key:"toggle",value:function(){this.isActivated()?this.deactivate():this.activate(),this.context.triggerEvent("codeview.toggled")}},{key:"purify",value:function(t){if(this.options.codeviewFilter&&(t=t.replace(this.options.codeviewFilterRegex,""),this.options.codeviewIframeFilter)){var e=this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);t=t.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi,(function(t){if(/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(t))return"";var n,o=Mt(e);try{for(o.s();!(n=o.n()).done;){var i=n.value;if(new RegExp('src="(https?:)?//'+i.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+'/(.+)"').test(t))return t}}catch(t){o.e(t)}finally{o.f()}return""}))}return t}},{key:"activate",value:function(){var t=this,e=this.CodeMirrorConstructor;if(this.$codable.val(ht.html(this.$editable,this.options.prettifyHtml)),this.$codable.height(this.$editable.height()),this.context.invoke("toolbar.updateCodeview",!0),this.context.invoke("airPopover.updateCodeview",!0),this.$editor.addClass("codeview"),this.$codable.focus(),e){var n=e.fromTextArea(this.$codable[0],this.options.codemirror);if(this.options.codemirror.tern){var o=new e.TernServer(this.options.codemirror.tern);n.ternServer=o,n.on("cursorActivity",(function(t){o.updateArgHints(t)}))}n.on("blur",(function(e){t.context.triggerEvent("blur.codeview",n.getValue(),e)})),n.on("change",(function(){t.context.triggerEvent("change.codeview",n.getValue(),n)})),n.setSize(null,this.$editable.outerHeight()),this.$codable.data("cmEditor",n)}else this.$codable.on("blur",(function(e){t.context.triggerEvent("blur.codeview",t.$codable.val(),e)})),this.$codable.on("input",(function(){t.context.triggerEvent("change.codeview",t.$codable.val(),t.$codable)}))}},{key:"deactivate",value:function(){if(this.CodeMirrorConstructor){var t=this.$codable.data("cmEditor");this.$codable.val(t.getValue()),t.toTextArea()}var e=this.purify(ht.value(this.$codable,this.options.prettifyHtml)||ht.emptyPara),n=this.$editable.html()!==e;this.$editable.html(e),this.$editable.height(this.options.height?this.$codable.height():"auto"),this.$editor.removeClass("codeview"),n&&this.context.triggerEvent("change",this.$editable.html(),this.$editable),this.$editable.focus(),this.context.invoke("toolbar.updateCodeview",!1),this.context.invoke("airPopover.updateCodeview",!1)}},{key:"destroy",value:function(){this.isActivated()&&this.deactivate()}}],n&&Ut(e.prototype,n),o&&Ut(e,o),t}();function Wt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Kt=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$document=e()(document),this.$statusbar=n.layoutInfo.statusbar,this.$editable=n.layoutInfo.editable,this.$codable=n.layoutInfo.codable,this.options=n.options}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this;this.options.airMode||this.options.disableResizeEditor?this.destroy():this.$statusbar.on("mousedown",(function(e){e.preventDefault(),e.stopPropagation();var n=t.$editable.offset().top-t.$document.scrollTop(),o=t.$codable.offset().top-t.$document.scrollTop(),i=function(e){var i=e.clientY-(n+24),r=e.clientY-(o+24);i=t.options.minheight>0?Math.max(i,t.options.minheight):i,i=t.options.maxHeight>0?Math.min(i,t.options.maxHeight):i,r=t.options.minheight>0?Math.max(r,t.options.minheight):r,r=t.options.maxHeight>0?Math.min(r,t.options.maxHeight):r,t.$editable.height(i),t.$codable.height(r)};t.$document.on("mousemove",i).one("mouseup",(function(){t.$document.off("mousemove",i)}))}))}},{key:"destroy",value:function(){this.$statusbar.off(),this.$statusbar.addClass("locked")}}])&&Wt(n.prototype,o),i&&Wt(n,i),t}();function Vt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var qt=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$editor=n.layoutInfo.editor,this.$toolbar=n.layoutInfo.toolbar,this.$editable=n.layoutInfo.editable,this.$codable=n.layoutInfo.codable,this.$window=e()(window),this.$scrollbar=e()("html, body"),this.scrollbarClassName="note-fullscreen-body",this.onResize=function(){o.resizeTo({h:o.$window.height()-o.$toolbar.outerHeight()})}}var n,o,i;return n=t,(o=[{key:"resizeTo",value:function(t){this.$editable.css("height",t.h),this.$codable.css("height",t.h),this.$codable.data("cmeditor")&&this.$codable.data("cmeditor").setsize(null,t.h)}},{key:"toggle",value:function(){this.$editor.toggleClass("fullscreen");var t=this.isFullscreen();this.$scrollbar.toggleClass(this.scrollbarClassName,t),t?(this.$editable.data("orgHeight",this.$editable.css("height")),this.$editable.data("orgMaxHeight",this.$editable.css("maxHeight")),this.$editable.css("maxHeight",""),this.$window.on("resize",this.onResize).trigger("resize")):(this.$window.off("resize",this.onResize),this.resizeTo({h:this.$editable.data("orgHeight")}),this.$editable.css("maxHeight",this.$editable.css("orgMaxHeight"))),this.context.invoke("toolbar.updateFullscreen",t)}},{key:"isFullscreen",value:function(){return this.$editor.hasClass("fullscreen")}},{key:"destroy",value:function(){this.$scrollbar.removeClass(this.scrollbarClassName)}}])&&Vt(n.prototype,o),i&&Vt(n,i),t}();function _t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Gt=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$document=e()(document),this.$editingArea=n.layoutInfo.editingArea,this.options=n.options,this.lang=this.options.langInfo,this.events={"summernote.mousedown":function(t,e){o.update(e.target,e)&&e.preventDefault()},"summernote.keyup summernote.scroll summernote.change summernote.dialog.shown":function(){o.update()},"summernote.disable summernote.blur":function(){o.hide()},"summernote.codeview.toggled":function(){o.update()}}}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this;this.$handle=e()(['<div class="note-handle">','<div class="note-control-selection">','<div class="note-control-selection-bg"></div>','<div class="note-control-holder note-control-nw"></div>','<div class="note-control-holder note-control-ne"></div>','<div class="note-control-holder note-control-sw"></div>','<div class="',this.options.disableResizeImage?"note-control-holder":"note-control-sizing",' note-control-se"></div>',this.options.disableResizeImage?"":'<div class="note-control-selection-info"></div>',"</div>","</div>"].join("")).prependTo(this.$editingArea),this.$handle.on("mousedown",(function(e){if(ht.isControlSizing(e.target)){e.preventDefault(),e.stopPropagation();var n=t.$handle.find(".note-control-selection").data("target"),o=n.offset(),i=t.$document.scrollTop(),r=function(e){t.context.invoke("editor.resizeTo",{x:e.clientX-o.left,y:e.clientY-(o.top-i)},n,!e.shiftKey),t.update(n[0],e)};t.$document.on("mousemove",r).one("mouseup",(function(e){e.preventDefault(),t.$document.off("mousemove",r),t.context.invoke("editor.afterCommand")})),n.data("ratio")||n.data("ratio",n.height()/n.width())}})),this.$handle.on("wheel",(function(e){e.preventDefault(),t.update()}))}},{key:"destroy",value:function(){this.$handle.remove()}},{key:"update",value:function(t,n){if(this.context.isDisabled())return!1;var o=ht.isImg(t),i=this.$handle.find(".note-control-selection");if(this.context.invoke("imagePopover.update",t,n),o){var r=e()(t),a=r.position(),s={left:a.left+parseInt(r.css("marginLeft"),10),top:a.top+parseInt(r.css("marginTop"),10)},l={w:r.outerWidth(!1),h:r.outerHeight(!1)};i.css({display:"block",left:s.left,top:s.top,width:l.w,height:l.h}).data("target",r);var c=new Image;c.src=r.attr("src");var u=l.w+"x"+l.h+" ("+this.lang.image.original+": "+c.width+"x"+c.height+")";i.find(".note-control-selection-info").text(u),this.context.invoke("editor.saveTarget",t)}else this.hide();return o}},{key:"hide",value:function(){this.context.invoke("editor.clearTarget"),this.$handle.children().hide()}}],o&&_t(n.prototype,o),i&&_t(n,i),t}();function Yt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Zt=/^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i,Qt=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||n.handleKeyup(e)},"summernote.keydown":function(t,e){n.handleKeydown(e)}}}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){this.lastWordRange=null}},{key:"destroy",value:function(){this.lastWordRange=null}},{key:"replace",value:function(){if(this.lastWordRange){var t=this.lastWordRange.toString(),n=t.match(Zt);if(n&&(n[1]||n[2])){var o=n[1]?t:"http://"+t,i=this.options.showDomainOnlyForAutolink?t.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i,"").split("/")[0]:t,r=e()("<a></a>").html(i).attr("href",o)[0];this.context.options.linkTargetBlank&&e()(r).attr("target","_blank"),this.lastWordRange.insertNode(r),this.lastWordRange=null,this.context.invoke("editor.focus")}}}},{key:"handleKeydown",value:function(t){if(k.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWordRange=e}}},{key:"handleKeyup",value:function(t){k.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)&&this.replace()}}])&&Yt(n.prototype,o),i&&Yt(n,i),t}();function Xt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Jt=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=e.layoutInfo.note,this.events={"summernote.change":function(){n.$note.val(e.invoke("code"))}}}var e,n,o;return e=t,(n=[{key:"shouldInitialize",value:function(){return ht.isTextarea(this.$note[0])}}])&&Xt(e.prototype,n),o&&Xt(e,o),t}();function te(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ee=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options.replace||{},this.keys=[wt.code.ENTER,wt.code.SPACE,wt.code.PERIOD,wt.code.COMMA,wt.code.SEMICOLON,wt.code.SLASH],this.previousKeydownCode=null,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||n.handleKeyup(e)},"summernote.keydown":function(t,e){n.handleKeydown(e)}}}var e,n,o;return e=t,(n=[{key:"shouldInitialize",value:function(){return!!this.options.match}},{key:"initialize",value:function(){this.lastWord=null}},{key:"destroy",value:function(){this.lastWord=null}},{key:"replace",value:function(){if(this.lastWord){var t=this,e=this.lastWord.toString();this.options.match(e,(function(e){if(e){var n="";if("string"==typeof e?n=ht.createText(e):e instanceof jQuery?n=e[0]:e instanceof Node&&(n=e),!n)return;t.lastWord.insertNode(n),t.lastWord=null,t.context.invoke("editor.focus")}}))}}},{key:"handleKeydown",value:function(t){if(this.previousKeydownCode&&k.contains(this.keys,this.previousKeydownCode))this.previousKeydownCode=t.keyCode;else{if(k.contains(this.keys,t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWord=e}this.previousKeydownCode=t.keyCode}}},{key:"handleKeyup",value:function(t){k.contains(this.keys,t.keyCode)&&this.replace()}}])&&te(e.prototype,n),o&&te(e,o),t}();function ne(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var oe=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editingArea=e.layoutInfo.editingArea,this.options=e.options,!0===this.options.inheritPlaceholder&&(this.options.placeholder=this.context.$note.attr("placeholder")||this.options.placeholder),this.events={"summernote.init summernote.change":function(){n.update()},"summernote.codeview.toggled":function(){n.update()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!!this.options.placeholder}},{key:"initialize",value:function(){var t=this;this.$placeholder=e()('<div class="note-placeholder"></div>'),this.$placeholder.on("click",(function(){t.context.invoke("focus")})).html(this.options.placeholder).prependTo(this.$editingArea),this.update()}},{key:"destroy",value:function(){this.$placeholder.remove()}},{key:"update",value:function(){var t=!this.context.invoke("codeview.isActivated")&&this.context.invoke("editor.isEmpty");this.$placeholder.toggle(t)}}])&&ne(n.prototype,o),i&&ne(n,i),t}();function ie(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var re=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.ui=e().summernote.ui,this.context=n,this.$toolbar=n.layoutInfo.toolbar,this.options=n.options,this.lang=this.options.langInfo,this.invertedKeyMap=m.invertObject(this.options.keyMap[f.isMac?"mac":"pc"])}var n,o,i;return n=t,o=[{key:"representShortcut",value:function(t){var e=this.invertedKeyMap[t];return this.options.shortcuts&&e?(f.isMac&&(e=e.replace("CMD","⌘").replace("SHIFT","⇧"))," ("+(e=e.replace("BACKSLASH","\\").replace("SLASH","/").replace("LEFTBRACKET","[").replace("RIGHTBRACKET","]"))+")"):""}},{key:"button",value:function(t){return!this.options.tooltip&&t.tooltip&&delete t.tooltip,t.container=this.options.container,this.ui.button(t)}},{key:"initialize",value:function(){this.addToolbarButtons(),this.addImagePopoverButtons(),this.addLinkPopoverButtons(),this.addTablePopoverButtons(),this.fontInstalledMap={}}},{key:"destroy",value:function(){delete this.fontInstalledMap}},{key:"isFontInstalled",value:function(t){return Object.prototype.hasOwnProperty.call(this.fontInstalledMap,t)||(this.fontInstalledMap[t]=f.isFontInstalled(t)||k.contains(this.options.fontNamesIgnoreCheck,t)),this.fontInstalledMap[t]}},{key:"isFontDeservedToAdd",value:function(t){return""!==(t=t.toLowerCase())&&this.isFontInstalled(t)&&-1===f.genericFontFamilies.indexOf(t)}},{key:"colorPalette",value:function(t,n,o,i){var r=this;return this.ui.buttonGroup({className:"note-color "+t,children:[this.button({className:"note-current-color-button",contents:this.ui.icon(this.options.icons.font+" note-recent-color"),tooltip:n,click:function(t){var n=e()(t.currentTarget);o&&i?r.context.invoke("editor.color",{backColor:n.attr("data-backColor"),foreColor:n.attr("data-foreColor")}):o?r.context.invoke("editor.color",{backColor:n.attr("data-backColor")}):i&&r.context.invoke("editor.color",{foreColor:n.attr("data-foreColor")})},callback:function(t){var e=t.find(".note-recent-color");o&&(e.css("background-color",r.options.colorButton.backColor),t.attr("data-backColor",r.options.colorButton.backColor)),i?(e.css("color",r.options.colorButton.foreColor),t.attr("data-foreColor",r.options.colorButton.foreColor)):e.css("color","transparent")}}),this.button({className:"dropdown-toggle",contents:this.ui.dropdownButtonContents("",this.options),tooltip:this.lang.color.more,data:{toggle:"dropdown"}}),this.ui.dropdown({items:(o?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.background+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">',this.lang.color.transparent,"</button>","</div>",'<div class="note-holder" data-event="backColor">\x3c!-- back colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="backColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.backColor+'" data-event="backColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="backColorPalette-'+this.options.id+'" data-event="backColor"></div>',"</div>"].join(""):"")+(i?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.foreground+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">',this.lang.color.resetToDefault,"</button>","</div>",'<div class="note-holder" data-event="foreColor">\x3c!-- fore colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="foreColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.foreColor+'" data-event="foreColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="foreColorPalette-'+this.options.id+'" data-event="foreColor"></div>',"</div>"].join(""):""),callback:function(t){t.find(".note-holder").each((function(t,n){var o=e()(n);o.append(r.ui.palette({colors:r.options.colors,colorsName:r.options.colorsName,eventName:o.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())}));var n=[["#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF"]];t.find(".note-holder-custom").each((function(t,o){var i=e()(o);i.append(r.ui.palette({colors:n,colorsName:n,eventName:i.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())})),t.find("input[type=color]").each((function(n,o){e()(o).change((function(){var n=t.find("#"+e()(this).data("event")).find(".note-color-btn").first(),o=this.value.toUpperCase();n.css("background-color",o).attr("aria-label",o).attr("data-value",o).attr("data-original-title",o),n.click()}))}))},click:function(n){n.stopPropagation();var o=e()("."+t).find(".note-dropdown-menu"),i=e()(n.target),a=i.data("event"),s=i.attr("data-value");if("openPalette"===a){var l=o.find("#"+s),c=e()(o.find("#"+l.data("event")).find(".note-color-row")[0]),u=c.find(".note-color-btn").last().detach(),d=l.val();u.css("background-color",d).attr("aria-label",d).attr("data-value",d).attr("data-original-title",d),c.prepend(u),l.click()}else{if(k.contains(["backColor","foreColor"],a)){var h="backColor"===a?"background-color":"color",f=i.closest(".note-color").find(".note-recent-color"),p=i.closest(".note-color").find(".note-current-color-button");f.css(h,s),p.attr("data-"+a,s)}r.context.invoke("editor."+a,s)}}})]}).render()}},{key:"addToolbarButtons",value:function(){var t=this;this.context.memo("button.style",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.magic),t.options),tooltip:t.lang.style.style,data:{toggle:"dropdown"}}),t.ui.dropdown({className:"dropdown-style",items:t.options.styleTags,title:t.lang.style.style,template:function(e){"string"==typeof e&&(e={tag:e,title:Object.prototype.hasOwnProperty.call(t.lang.style,e)?t.lang.style[e]:e});var n=e.tag,o=e.title;return"<"+n+(e.style?' style="'+e.style+'" ':"")+(e.className?' class="'+e.className+'"':"")+">"+o+"</"+n+">"},click:t.context.createInvokeHandler("editor.formatBlock")})]).render()}));for(var n=function(e,n){var o=t.options.styleTags[e];t.context.memo("button.style."+o,(function(){return t.button({className:"note-btn-style-"+o,contents:'<div data-value="'+o+'">'+o.toUpperCase()+"</div>",tooltip:t.lang.style[o],click:t.context.createInvokeHandler("editor.formatBlock")}).render()}))},o=0,i=this.options.styleTags.length;o<i;o++)n(o);this.context.memo("button.bold",(function(){return t.button({className:"note-btn-bold",contents:t.ui.icon(t.options.icons.bold),tooltip:t.lang.font.bold+t.representShortcut("bold"),click:t.context.createInvokeHandlerAndUpdateState("editor.bold")}).render()})),this.context.memo("button.italic",(function(){return t.button({className:"note-btn-italic",contents:t.ui.icon(t.options.icons.italic),tooltip:t.lang.font.italic+t.representShortcut("italic"),click:t.context.createInvokeHandlerAndUpdateState("editor.italic")}).render()})),this.context.memo("button.underline",(function(){return t.button({className:"note-btn-underline",contents:t.ui.icon(t.options.icons.underline),tooltip:t.lang.font.underline+t.representShortcut("underline"),click:t.context.createInvokeHandlerAndUpdateState("editor.underline")}).render()})),this.context.memo("button.clear",(function(){return t.button({contents:t.ui.icon(t.options.icons.eraser),tooltip:t.lang.font.clear+t.representShortcut("removeFormat"),click:t.context.createInvokeHandler("editor.removeFormat")}).render()})),this.context.memo("button.strikethrough",(function(){return t.button({className:"note-btn-strikethrough",contents:t.ui.icon(t.options.icons.strikethrough),tooltip:t.lang.font.strikethrough+t.representShortcut("strikethrough"),click:t.context.createInvokeHandlerAndUpdateState("editor.strikethrough")}).render()})),this.context.memo("button.superscript",(function(){return t.button({className:"note-btn-superscript",contents:t.ui.icon(t.options.icons.superscript),tooltip:t.lang.font.superscript,click:t.context.createInvokeHandlerAndUpdateState("editor.superscript")}).render()})),this.context.memo("button.subscript",(function(){return t.button({className:"note-btn-subscript",contents:t.ui.icon(t.options.icons.subscript),tooltip:t.lang.font.subscript,click:t.context.createInvokeHandlerAndUpdateState("editor.subscript")}).render()})),this.context.memo("button.fontname",(function(){var n=t.context.invoke("editor.currentStyle");return t.options.addDefaultFonts&&e().each(n["font-family"].split(","),(function(e,n){n=n.trim().replace(/['"]+/g,""),t.isFontDeservedToAdd(n)&&-1===t.options.fontNames.indexOf(n)&&t.options.fontNames.push(n)})),t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontname"></span>',t.options),tooltip:t.lang.font.name,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontname",checkClassName:t.options.icons.menuCheck,items:t.options.fontNames.filter(t.isFontInstalled.bind(t)),title:t.lang.font.name,template:function(t){return'<span style="font-family: '+f.validFontName(t)+'">'+t+"</span>"},click:t.context.createInvokeHandlerAndUpdateState("editor.fontName")})]).render()})),this.context.memo("button.fontsize",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>',t.options),tooltip:t.lang.font.size,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsize",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizes,title:t.lang.font.size,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSize")})]).render()})),this.context.memo("button.fontsizeunit",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>',t.options),tooltip:t.lang.font.sizeunit,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsizeunit",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizeUnits,title:t.lang.font.sizeunit,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSizeUnit")})]).render()})),this.context.memo("button.color",(function(){return t.colorPalette("note-color-all",t.lang.color.recent,!0,!0)})),this.context.memo("button.forecolor",(function(){return t.colorPalette("note-color-fore",t.lang.color.foreground,!1,!0)})),this.context.memo("button.backcolor",(function(){return t.colorPalette("note-color-back",t.lang.color.background,!0,!1)})),this.context.memo("button.ul",(function(){return t.button({contents:t.ui.icon(t.options.icons.unorderedlist),tooltip:t.lang.lists.unordered+t.representShortcut("insertUnorderedList"),click:t.context.createInvokeHandler("editor.insertUnorderedList")}).render()})),this.context.memo("button.ol",(function(){return t.button({contents:t.ui.icon(t.options.icons.orderedlist),tooltip:t.lang.lists.ordered+t.representShortcut("insertOrderedList"),click:t.context.createInvokeHandler("editor.insertOrderedList")}).render()}));var r=this.button({contents:this.ui.icon(this.options.icons.alignLeft),tooltip:this.lang.paragraph.left+this.representShortcut("justifyLeft"),click:this.context.createInvokeHandler("editor.justifyLeft")}),a=this.button({contents:this.ui.icon(this.options.icons.alignCenter),tooltip:this.lang.paragraph.center+this.representShortcut("justifyCenter"),click:this.context.createInvokeHandler("editor.justifyCenter")}),s=this.button({contents:this.ui.icon(this.options.icons.alignRight),tooltip:this.lang.paragraph.right+this.representShortcut("justifyRight"),click:this.context.createInvokeHandler("editor.justifyRight")}),l=this.button({contents:this.ui.icon(this.options.icons.alignJustify),tooltip:this.lang.paragraph.justify+this.representShortcut("justifyFull"),click:this.context.createInvokeHandler("editor.justifyFull")}),c=this.button({contents:this.ui.icon(this.options.icons.outdent),tooltip:this.lang.paragraph.outdent+this.representShortcut("outdent"),click:this.context.createInvokeHandler("editor.outdent")}),u=this.button({contents:this.ui.icon(this.options.icons.indent),tooltip:this.lang.paragraph.indent+this.representShortcut("indent"),click:this.context.createInvokeHandler("editor.indent")});this.context.memo("button.justifyLeft",m.invoke(r,"render")),this.context.memo("button.justifyCenter",m.invoke(a,"render")),this.context.memo("button.justifyRight",m.invoke(s,"render")),this.context.memo("button.justifyFull",m.invoke(l,"render")),this.context.memo("button.outdent",m.invoke(c,"render")),this.context.memo("button.indent",m.invoke(u,"render")),this.context.memo("button.paragraph",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.alignLeft),t.options),tooltip:t.lang.paragraph.paragraph,data:{toggle:"dropdown"}}),t.ui.dropdown([t.ui.buttonGroup({className:"note-align",children:[r,a,s,l]}),t.ui.buttonGroup({className:"note-list",children:[c,u]})])]).render()})),this.context.memo("button.height",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.textHeight),t.options),tooltip:t.lang.font.height,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({items:t.options.lineHeights,checkClassName:t.options.icons.menuCheck,className:"dropdown-line-height",title:t.lang.font.height,click:t.context.createInvokeHandler("editor.lineHeight")})]).render()})),this.context.memo("button.table",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.table),t.options),tooltip:t.lang.table.table,data:{toggle:"dropdown"}}),t.ui.dropdown({title:t.lang.table.table,className:"note-table",items:['<div class="note-dimension-picker">','<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>','<div class="note-dimension-picker-highlighted"></div>','<div class="note-dimension-picker-unhighlighted"></div>',"</div>",'<div class="note-dimension-display">1 x 1</div>'].join("")})],{callback:function(e){e.find(".note-dimension-picker-mousecatcher").css({width:t.options.insertTableMaxSize.col+"em",height:t.options.insertTableMaxSize.row+"em"}).mouseup(t.context.createInvokeHandler("editor.insertTable")).on("mousemove",t.tableMoveHandler.bind(t))}}).render()})),this.context.memo("button.link",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.link+t.representShortcut("linkDialog.show"),click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.picture",(function(){return t.button({contents:t.ui.icon(t.options.icons.picture),tooltip:t.lang.image.image,click:t.context.createInvokeHandler("imageDialog.show")}).render()})),this.context.memo("button.video",(function(){return t.button({contents:t.ui.icon(t.options.icons.video),tooltip:t.lang.video.video,click:t.context.createInvokeHandler("videoDialog.show")}).render()})),this.context.memo("button.hr",(function(){return t.button({contents:t.ui.icon(t.options.icons.minus),tooltip:t.lang.hr.insert+t.representShortcut("insertHorizontalRule"),click:t.context.createInvokeHandler("editor.insertHorizontalRule")}).render()})),this.context.memo("button.fullscreen",(function(){return t.button({className:"btn-fullscreen note-codeview-keep",contents:t.ui.icon(t.options.icons.arrowsAlt),tooltip:t.lang.options.fullscreen,click:t.context.createInvokeHandler("fullscreen.toggle")}).render()})),this.context.memo("button.codeview",(function(){return t.button({className:"btn-codeview note-codeview-keep",contents:t.ui.icon(t.options.icons.code),tooltip:t.lang.options.codeview,click:t.context.createInvokeHandler("codeview.toggle")}).render()})),this.context.memo("button.redo",(function(){return t.button({contents:t.ui.icon(t.options.icons.redo),tooltip:t.lang.history.redo+t.representShortcut("redo"),click:t.context.createInvokeHandler("editor.redo")}).render()})),this.context.memo("button.undo",(function(){return t.button({contents:t.ui.icon(t.options.icons.undo),tooltip:t.lang.history.undo+t.representShortcut("undo"),click:t.context.createInvokeHandler("editor.undo")}).render()})),this.context.memo("button.help",(function(){return t.button({contents:t.ui.icon(t.options.icons.question),tooltip:t.lang.options.help,click:t.context.createInvokeHandler("helpDialog.show")}).render()}))}},{key:"addImagePopoverButtons",value:function(){var t=this;this.context.memo("button.resizeFull",(function(){return t.button({contents:'<span class="note-fontsize-10">100%</span>',tooltip:t.lang.image.resizeFull,click:t.context.createInvokeHandler("editor.resize","1")}).render()})),this.context.memo("button.resizeHalf",(function(){return t.button({contents:'<span class="note-fontsize-10">50%</span>',tooltip:t.lang.image.resizeHalf,click:t.context.createInvokeHandler("editor.resize","0.5")}).render()})),this.context.memo("button.resizeQuarter",(function(){return t.button({contents:'<span class="note-fontsize-10">25%</span>',tooltip:t.lang.image.resizeQuarter,click:t.context.createInvokeHandler("editor.resize","0.25")}).render()})),this.context.memo("button.resizeNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.resizeNone,click:t.context.createInvokeHandler("editor.resize","0")}).render()})),this.context.memo("button.floatLeft",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatLeft),tooltip:t.lang.image.floatLeft,click:t.context.createInvokeHandler("editor.floatMe","left")}).render()})),this.context.memo("button.floatRight",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatRight),tooltip:t.lang.image.floatRight,click:t.context.createInvokeHandler("editor.floatMe","right")}).render()})),this.context.memo("button.floatNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.floatNone,click:t.context.createInvokeHandler("editor.floatMe","none")}).render()})),this.context.memo("button.removeMedia",(function(){return t.button({contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.image.remove,click:t.context.createInvokeHandler("editor.removeMedia")}).render()}))}},{key:"addLinkPopoverButtons",value:function(){var t=this;this.context.memo("button.linkDialogShow",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.edit,click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.unlink",(function(){return t.button({contents:t.ui.icon(t.options.icons.unlink),tooltip:t.lang.link.unlink,click:t.context.createInvokeHandler("editor.unlink")}).render()}))}},{key:"addTablePopoverButtons",value:function(){var t=this;this.context.memo("button.addRowUp",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowAbove),tooltip:t.lang.table.addRowAbove,click:t.context.createInvokeHandler("editor.addRow","top")}).render()})),this.context.memo("button.addRowDown",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowBelow),tooltip:t.lang.table.addRowBelow,click:t.context.createInvokeHandler("editor.addRow","bottom")}).render()})),this.context.memo("button.addColLeft",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colBefore),tooltip:t.lang.table.addColLeft,click:t.context.createInvokeHandler("editor.addCol","left")}).render()})),this.context.memo("button.addColRight",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colAfter),tooltip:t.lang.table.addColRight,click:t.context.createInvokeHandler("editor.addCol","right")}).render()})),this.context.memo("button.deleteRow",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowRemove),tooltip:t.lang.table.delRow,click:t.context.createInvokeHandler("editor.deleteRow")}).render()})),this.context.memo("button.deleteCol",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colRemove),tooltip:t.lang.table.delCol,click:t.context.createInvokeHandler("editor.deleteCol")}).render()})),this.context.memo("button.deleteTable",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.table.delTable,click:t.context.createInvokeHandler("editor.deleteTable")}).render()}))}},{key:"build",value:function(t,e){for(var n=0,o=e.length;n<o;n++){for(var i=e[n],r=Array.isArray(i)?i[0]:i,a=Array.isArray(i)?1===i.length?[i[0]]:i[1]:[i],s=this.ui.buttonGroup({className:"note-"+r}).render(),l=0,c=a.length;l<c;l++){var u=this.context.memo("button."+a[l]);u&&s.append("function"==typeof u?u(this.context):u)}s.appendTo(t)}}},{key:"updateCurrentStyle",value:function(t){var n=t||this.$toolbar,o=this.context.invoke("editor.currentStyle");if(this.updateBtnStates(n,{".note-btn-bold":function(){return"bold"===o["font-bold"]},".note-btn-italic":function(){return"italic"===o["font-italic"]},".note-btn-underline":function(){return"underline"===o["font-underline"]},".note-btn-subscript":function(){return"subscript"===o["font-subscript"]},".note-btn-superscript":function(){return"superscript"===o["font-superscript"]},".note-btn-strikethrough":function(){return"strikethrough"===o["font-strikethrough"]}}),o["font-family"]){var i=o["font-family"].split(",").map((function(t){return t.replace(/[\'\"]/g,"").replace(/\s+$/,"").replace(/^\s+/,"")})),r=k.find(i,this.isFontInstalled.bind(this));n.find(".dropdown-fontname a").each((function(t,n){var o=e()(n),i=o.data("value")+""==r+"";o.toggleClass("checked",i)})),n.find(".note-current-fontname").text(r).css("font-family",r)}if(o["font-size"]){var a=o["font-size"];n.find(".dropdown-fontsize a").each((function(t,n){var o=e()(n),i=o.data("value")+""==a+"";o.toggleClass("checked",i)})),n.find(".note-current-fontsize").text(a);var s=o["font-size-unit"];n.find(".dropdown-fontsizeunit a").each((function(t,n){var o=e()(n),i=o.data("value")+""==s+"";o.toggleClass("checked",i)})),n.find(".note-current-fontsizeunit").text(s)}if(o["line-height"]){var l=o["line-height"];n.find(".dropdown-line-height a").each((function(t,n){var o=e()(n),i=e()(n).data("value")+""==l+"";o.toggleClass("checked",i)})),n.find(".note-current-line-height").text(l)}}},{key:"updateBtnStates",value:function(t,n){var o=this;e().each(n,(function(e,n){o.ui.toggleBtnActive(t.find(e),n())}))}},{key:"tableMoveHandler",value:function(t){var n,o=e()(t.target.parentNode),i=o.next(),r=o.find(".note-dimension-picker-mousecatcher"),a=o.find(".note-dimension-picker-highlighted"),s=o.find(".note-dimension-picker-unhighlighted");if(void 0===t.offsetX){var l=e()(t.target).offset();n={x:t.pageX-l.left,y:t.pageY-l.top}}else n={x:t.offsetX,y:t.offsetY};var c=Math.ceil(n.x/18)||1,u=Math.ceil(n.y/18)||1;a.css({width:c+"em",height:u+"em"}),r.data("value",c+"x"+u),c>3&&c<this.options.insertTableMaxSize.col&&s.css({width:c+1+"em"}),u>3&&u<this.options.insertTableMaxSize.row&&s.css({height:u+1+"em"}),i.html(c+" x "+u)}}],o&&ie(n.prototype,o),i&&ie(n,i),t}();function ae(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var se=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$window=e()(window),this.$document=e()(document),this.ui=e().summernote.ui,this.$note=n.layoutInfo.note,this.$editor=n.layoutInfo.editor,this.$toolbar=n.layoutInfo.toolbar,this.$editable=n.layoutInfo.editable,this.$statusbar=n.layoutInfo.statusbar,this.options=n.options,this.isFollowing=!1,this.followScroll=this.followScroll.bind(this)}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!this.options.airMode}},{key:"initialize",value:function(){var t=this;this.options.toolbar=this.options.toolbar||[],this.options.toolbar.length?this.context.invoke("buttons.build",this.$toolbar,this.options.toolbar):this.$toolbar.hide(),this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.changeContainer(!1),this.$note.on("summernote.keyup summernote.mouseup summernote.change",(function(){t.context.invoke("buttons.updateCurrentStyle")})),this.context.invoke("buttons.updateCurrentStyle"),this.options.followingToolbar&&this.$window.on("scroll resize",this.followScroll)}},{key:"destroy",value:function(){this.$toolbar.children().remove(),this.options.followingToolbar&&this.$window.off("scroll resize",this.followScroll)}},{key:"followScroll",value:function(){if(this.$editor.hasClass("fullscreen"))return!1;var t=this.$editor.outerHeight(),n=this.$editor.width(),o=this.$toolbar.height(),i=this.$statusbar.height(),r=0;this.options.otherStaticBar&&(r=e()(this.options.otherStaticBar).outerHeight());var a=this.$document.scrollTop(),s=this.$editor.offset().top,l=s-r,c=s+t-r-o-i;!this.isFollowing&&a>l&&a<c-o?(this.isFollowing=!0,this.$editable.css({marginTop:this.$toolbar.outerHeight()}),this.$toolbar.css({position:"fixed",top:r,width:n,zIndex:1e3})):this.isFollowing&&(a<l||a>c)&&(this.isFollowing=!1,this.$toolbar.css({position:"relative",top:0,width:"100%",zIndex:"auto"}),this.$editable.css({marginTop:""}))}},{key:"changeContainer",value:function(t){t?this.$toolbar.prependTo(this.$editor):this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.options.followingToolbar&&this.followScroll()}},{key:"updateFullscreen",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-fullscreen"),t),this.changeContainer(t)}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-codeview"),t),t?this.deactivate():this.activate()}},{key:"activate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!0)}},{key:"deactivate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!1)}}])&&ae(n.prototype,o),i&&ae(n,i),t}();function le(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ce=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo,n.memo("help.linkDialog.show",this.options.langInfo.help["linkDialog.show"])}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,n=['<div class="form-group note-form-group">','<label for="note-dialog-link-txt-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.textToDisplay,"</label>"),'<input id="note-dialog-link-txt-'.concat(this.options.id,'" class="note-link-text form-control note-form-control note-input" type="text"/>'),"</div>",'<div class="form-group note-form-group">','<label for="note-dialog-link-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.url,"</label>"),'<input id="note-dialog-link-url-'.concat(this.options.id,'" class="note-link-url form-control note-form-control note-input" type="text" value="http://"/>'),"</div>",this.options.disableLinkTarget?"":e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-open-in-new-window",text:this.lang.link.openInNewWindow,checked:!0}).render()).html(),e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-use-protocol",text:this.lang.link.useProtocol,checked:!0}).render()).html()].join(""),o='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-link-btn",'" value="').concat(this.lang.link.insert,'" disabled>');this.$dialog=this.ui.dialog({className:"link-dialog",title:this.lang.link.insert,fade:this.options.dialogsFade,body:n,footer:o}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"toggleLinkBtn",value:function(t,e,n){this.ui.toggleBtn(t,e.val()&&n.val())}},{key:"showLinkDialog",value:function(t){var n=this;return e().Deferred((function(e){var o=n.$dialog.find(".note-link-text"),i=n.$dialog.find(".note-link-url"),r=n.$dialog.find(".note-link-btn"),a=n.$dialog.find(".sn-checkbox-open-in-new-window input[type=checkbox]"),s=n.$dialog.find(".sn-checkbox-use-protocol input[type=checkbox]");n.ui.onDialogShown(n.$dialog,(function(){n.context.triggerEvent("dialog.shown"),!t.url&&m.isValidUrl(t.text)&&(t.url=t.text),o.on("input paste propertychange",(function(){t.text=o.val(),n.toggleLinkBtn(r,o,i)})).val(t.text),i.on("input paste propertychange",(function(){t.text||o.val(i.val()),n.toggleLinkBtn(r,o,i)})).val(t.url),f.isSupportTouch||i.trigger("focus"),n.toggleLinkBtn(r,o,i),n.bindEnterKey(i,r),n.bindEnterKey(o,r);var l=void 0!==t.isNewWindow?t.isNewWindow:n.context.options.linkTargetBlank;a.prop("checked",l);var c=!t.url&&n.context.options.useProtocol;s.prop("checked",c),r.one("click",(function(r){r.preventDefault(),e.resolve({range:t.range,url:i.val(),text:o.val(),isNewWindow:a.is(":checked"),checkProtocol:s.is(":checked")}),n.ui.hideDialog(n.$dialog)}))})),n.ui.onDialogHidden(n.$dialog,(function(){o.off(),i.off(),r.off(),"pending"===e.state()&&e.reject()})),n.ui.showDialog(n.$dialog)})).promise()}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getLinkInfo");this.context.invoke("editor.saveRange"),this.showLinkDialog(e).then((function(e){t.context.invoke("editor.restoreRange"),t.context.invoke("editor.createLink",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}}])&&le(n.prototype,o),i&&le(n,i),t}();function ue(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var de=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.events={"summernote.keyup summernote.mouseup summernote.change summernote.scroll":function(){o.update()},"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.link)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-link-popover",callback:function(t){t.find(".popover-content,.note-popover-content").prepend('<span><a target="_blank"></a>&nbsp;</span>')}}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.link),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(){if(this.context.invoke("editor.hasFocus")){var t=this.context.invoke("editor.getLastRange");if(t.isCollapsed()&&t.isOnAnchor()){var n=ht.ancestor(t.sc,ht.isAnchor),o=e()(n).attr("href");this.$popover.find("a").attr("href",o).text(o);var i=ht.posFromPlaceholder(n),r=e()(this.options.container).offset();i.top-=r.top,i.left-=r.left,this.$popover.css({display:"block",left:i.left,top:i.top})}else this.hide()}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}])&&ue(n.prototype,o),i&&ue(n,i),t}();function he(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var fe=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t="";if(this.options.maximumImageFileSize){var e=Math.floor(Math.log(this.options.maximumImageFileSize)/Math.log(1024)),n=1*(this.options.maximumImageFileSize/Math.pow(1024,e)).toFixed(2)+" "+" KMGTP"[e]+"B";t="<small>".concat(this.lang.image.maximumFileSize+" : "+n,"</small>")}var o=this.options.dialogsInBody?this.$body:this.options.container,i=['<div class="form-group note-form-group note-group-select-from-files">','<label for="note-dialog-image-file-'+this.options.id+'" class="note-form-label">'+this.lang.image.selectFromFiles+"</label>",'<input id="note-dialog-image-file-'+this.options.id+'" class="note-image-input form-control-file note-form-control note-input" ',' type="file" name="files" accept="'+this.options.acceptImageFileTypes+'" multiple="multiple"/>',t,"</div>",'<div class="form-group note-group-image-url">','<label for="note-dialog-image-url-'+this.options.id+'" class="note-form-label">'+this.lang.image.url+"</label>",'<input id="note-dialog-image-url-'+this.options.id+'" class="note-image-url form-control note-form-control note-input" type="text"/>',"</div>"].join(""),r='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-image-btn",'" value="').concat(this.lang.image.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.image.insert,fade:this.options.dialogsFade,body:i,footer:r}).render().appendTo(o)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showImageDialog().then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange"),"string"==typeof e?t.options.callbacks.onImageLinkInsert?t.context.triggerEvent("image.link.insert",e):t.context.invoke("editor.insertImage",e):t.context.invoke("editor.insertImagesOrCallback",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showImageDialog",value:function(){var t=this;return e().Deferred((function(e){var n=t.$dialog.find(".note-image-input"),o=t.$dialog.find(".note-image-url"),i=t.$dialog.find(".note-image-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),n.replaceWith(n.clone().on("change",(function(t){e.resolve(t.target.files||t.target.value)})).val("")),o.on("input paste propertychange",(function(){t.ui.toggleBtn(i,o.val())})).val(""),f.isSupportTouch||o.trigger("focus"),i.click((function(t){t.preventDefault(),e.resolve(o.val())})),t.bindEnterKey(o,i)})),t.ui.onDialogHidden(t.$dialog,(function(){n.off(),o.off(),i.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&he(n.prototype,o),i&&he(n,i),t}();function pe(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var me=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.editable=n.layoutInfo.editable[0],this.options=n.options,this.events={"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.image)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-image-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.image),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t,n){if(ht.isImg(t)){var o=e()(t).offset(),i=e()(this.options.container).offset(),r={};this.options.popatmouse?(r.left=n.pageX-20,r.top=n.pageY):r=o,r.top-=i.top,r.left-=i.left,this.$popover.css({display:"block",left:r.left,top:r.top})}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}],o&&pe(n.prototype,o),i&&pe(n,i),t}();function ve(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ge=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.events={"summernote.mousedown":function(t,e){o.update(e.target)},"summernote.keyup summernote.scroll summernote.change":function(){o.update()},"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.table)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-table-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.table),f.isFF&&document.execCommand("enableInlineTableEditing",!1,!1),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){if(this.context.isDisabled())return!1;var n=ht.isCell(t)||ht.isCell(null==t?void 0:t.parentElement);if(n){var o=ht.posFromPlaceholder(t),i=e()(this.options.container).offset();o.top-=i.top,o.left-=i.left,this.$popover.css({display:"block",left:o.left,top:o.top})}else this.hide();return n}},{key:"hide",value:function(){this.$popover.hide()}}],o&&ve(n.prototype,o),i&&ve(n,i),t}();function be(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ye=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<div class="form-group note-form-group row-fluid">','<label for="note-dialog-video-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.video.url,' <small class="text-muted">').concat(this.lang.video.providers,"</small></label>"),'<input id="note-dialog-video-url-'.concat(this.options.id,'" class="note-video-url form-control note-form-control note-input" type="text"/>'),"</div>"].join(""),n='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-video-btn",'" value="').concat(this.lang.video.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.video.insert,fade:this.options.dialogsFade,body:e,footer:n}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"createVideoNode",value:function(t){var n,o=t.match(/\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/),i=t.match(/(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/),r=t.match(/(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/),a=t.match(/\/\/vine\.co\/v\/([a-zA-Z0-9]+)/),s=t.match(/\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/),l=t.match(/.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/),c=t.match(/\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/),u=t.match(/\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/),d=t.match(/\/\/v\.qq\.com.*?vid=(.+)/),h=t.match(/\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/),f=t.match(/^.+.(mp4|m4v)$/),p=t.match(/^.+.(ogg|ogv)$/),m=t.match(/^.+.(webm)$/),v=t.match(/(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/);if(o&&11===o[1].length){var g=o[1],b=0;if(void 0!==o[2]){var y=o[2].match(/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/);if(y)for(var k=[3600,60,1],w=0,C=k.length;w<C;w++)b+=void 0!==y[w+1]?k[w]*parseInt(y[w+1],10):0}n=e()("<iframe>").attr("frameborder",0).attr("src","//www.youtube.com/embed/"+g+(b>0?"?start="+b:"")).attr("width","640").attr("height","360")}else if(i&&i[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src","https://drive.google.com/file/d/"+i[1]+"/preview").attr("width","640").attr("height","480");else if(r&&r[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src","https://instagram.com/p/"+r[1]+"/embed/").attr("width","612").attr("height","710").attr("scrolling","no").attr("allowtransparency","true");else if(a&&a[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src",a[0]+"/embed/simple").attr("width","600").attr("height","600").attr("class","vine-embed");else if(s&&s[3].length)n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("src","//player.vimeo.com/video/"+s[3]).attr("width","640").attr("height","360");else if(l&&l[2].length)n=e()("<iframe>").attr("frameborder",0).attr("src","//www.dailymotion.com/embed/video/"+l[2]).attr("width","640").attr("height","360");else if(c&&c[1].length)n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","498").attr("width","510").attr("src","//player.youku.com/embed/"+c[1]);else if(u&&u[0].length){var x=0;"undefined"!==u[2]&&(x=u[2]);var S=0;"undefined"!==u[3]&&(S=u[3]);var T=0;"undefined"!==u[4]&&(T=u[4]);var E=0;"undefined"!==u[5]&&(E=u[5]);var I=0;"undefined"!==u[6]&&(I=u[6]),n=e()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr("frameborder",0).attr("src","//"+u[1]+"/videos/embed/"+u[2]+"?loop="+T+"&autoplay="+E+"&muted="+I+(x>0?"&start="+x:"")+(S>0?"&end="+b:"")).attr("width","560").attr("height","315")}else if(d&&d[1].length||h&&h[2].length){var $=d&&d[1].length?d[1]:h[2];n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","310").attr("width","500").attr("src","https://v.qq.com/txp/iframe/player.html?vid="+$+"&amp;auto=0")}else if(f||p||m)n=e()("<video controls>").attr("src",t).attr("width","640").attr("height","360");else{if(!v||!v[0].length)return!1;n=e()("<iframe>").attr("frameborder",0).attr("src","https://www.facebook.com/plugins/video.php?href="+encodeURIComponent(v[0])+"&show_text=0&width=560").attr("width","560").attr("height","301").attr("scrolling","no").attr("allowtransparency","true")}return n.addClass("note-video-clip"),n[0]}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getSelectedText");this.context.invoke("editor.saveRange"),this.showVideoDialog(e).then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange");var n=t.createVideoNode(e);n&&t.context.invoke("editor.insertNode",n)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showVideoDialog",value:function(){var t=this;return e().Deferred((function(e){var n=t.$dialog.find(".note-video-url"),o=t.$dialog.find(".note-video-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),n.on("input paste propertychange",(function(){t.ui.toggleBtn(o,n.val())})),f.isSupportTouch||n.trigger("focus"),o.click((function(t){t.preventDefault(),e.resolve(n.val())})),t.bindEnterKey(n,o)})),t.ui.onDialogHidden(t.$dialog,(function(){n.off(),o.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&be(n.prototype,o),i&&be(n,i),t}();function ke(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var we=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<p class="text-center">','<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ','<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ','<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>',"</p>"].join("");this.$dialog=this.ui.dialog({title:this.lang.options.help,fade:this.options.dialogsFade,body:this.createShortcutList(),footer:e,callback:function(t){t.find(".modal-body,.note-modal-body").css({"max-height":300,overflow:"scroll"})}}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"createShortcutList",value:function(){var t=this,n=this.options.keyMap[f.isMac?"mac":"pc"];return Object.keys(n).map((function(o){var i=n[o],r=e()('<div><div class="help-list-item"></div></div>');return r.append(e()("<label><kbd>"+o+"</kdb></label>").css({width:180,"margin-right":10})).append(e()("<span></span>").html(t.context.memo("help."+i)||i)),r.html()})).join("")}},{key:"showHelpDialog",value:function(){var t=this;return e().Deferred((function(e){t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),e.resolve()})),t.ui.showDialog(t.$dialog)})).promise()}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showHelpDialog().then((function(){t.context.invoke("editor.restoreRange")}))}}],o&&ke(n.prototype,o),i&&ke(n,i),t}();function Ce(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var xe=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.hidable=!0,this.onContextmenu=!1,this.pageX=null,this.pageY=null,this.events={"summernote.contextmenu":function(t){o.options.editing&&(t.preventDefault(),t.stopPropagation(),o.onContextmenu=!0,o.update(!0))},"summernote.mousedown":function(t,e){o.pageX=e.pageX,o.pageY=e.pageY},"summernote.keyup summernote.mouseup summernote.scroll":function(t,e){o.options.editing&&!o.onContextmenu&&(o.pageX=e.pageX,o.pageY=e.pageY,o.update()),o.onContextmenu=!1},"summernote.disable summernote.change summernote.dialog.shown summernote.blur":function(){o.hide()},"summernote.focusout":function(){o.$popover.is(":active,:focus")||o.hide()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return this.options.airMode&&!k.isEmpty(this.options.popover.air)}},{key:"initialize",value:function(){var t=this;this.$popover=this.ui.popover({className:"note-air-popover"}).render().appendTo(this.options.container);var e=this.$popover.find(".popover-content");this.context.invoke("buttons.build",e,this.options.popover.air),this.$popover.on("mousedown",(function(){t.hidable=!1})),this.$popover.on("mouseup",(function(){t.hidable=!0}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){var n=this.context.invoke("editor.currentStyle");if(!n.range||n.range.isCollapsed()&&!t)this.hide();else{var o={left:this.pageX,top:this.pageY},i=e()(this.options.container).offset();o.top-=i.top,o.left-=i.left,this.$popover.css({display:"block",left:Math.max(o.left,0)+-5,top:o.top+5}),this.context.invoke("buttons.updateCurrentStyle",this.$popover)}}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$popover.find(".btn-codeview"),t),t&&this.hide()}},{key:"hide",value:function(){this.hidable&&this.$popover.hide()}}])&&Ce(n.prototype,o),i&&Ce(n,i),t}();function Se(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Te=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$editable=n.layoutInfo.editable,this.options=n.options,this.hint=this.options.hint||[],this.direction=this.options.hintDirection||"bottom",this.hints=Array.isArray(this.hint)?this.hint:[this.hint],this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||o.handleKeyup(e)},"summernote.keydown":function(t,e){o.handleKeydown(e)},"summernote.disable summernote.dialog.shown summernote.blur":function(){o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return this.hints.length>0}},{key:"initialize",value:function(){var t=this;this.lastWordRange=null,this.matchingWord=null,this.$popover=this.ui.popover({className:"note-hint-popover",hideArrow:!0,direction:""}).render().appendTo(this.options.container),this.$popover.hide(),this.$content=this.$popover.find(".popover-content,.note-popover-content"),this.$content.on("click",".note-hint-item",(function(n){t.$content.find(".active").removeClass("active"),e()(n.currentTarget).addClass("active"),t.replace()})),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"selectItem",value:function(t){this.$content.find(".active").removeClass("active"),t.addClass("active"),this.$content[0].scrollTop=t[0].offsetTop-this.$content.innerHeight()/2}},{key:"moveDown",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.next();if(e.length)this.selectItem(e);else{var n=t.parent().next();n.length||(n=this.$content.find(".note-hint-group").first()),this.selectItem(n.find(".note-hint-item").first())}}},{key:"moveUp",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.prev();if(e.length)this.selectItem(e);else{var n=t.parent().prev();n.length||(n=this.$content.find(".note-hint-group").last()),this.selectItem(n.find(".note-hint-item").last())}}},{key:"replace",value:function(){var t=this.$content.find(".note-hint-item.active");if(t.length){var n=this.nodeFromItem(t);if(null!==this.matchingWord&&0===this.matchingWord.length)this.lastWordRange.so=this.lastWordRange.eo;else if(null!==this.matchingWord&&this.matchingWord.length>0&&!this.lastWordRange.isCollapsed()){var o=this.lastWordRange.eo-this.lastWordRange.so-this.matchingWord.length;o>0&&(this.lastWordRange.so+=o)}if(this.lastWordRange.insertNode(n),"next"===this.options.hintSelect){var i=document.createTextNode("");e()(n).after(i),yt.createFromNodeBefore(i).select()}else yt.createFromNodeAfter(n).select();this.lastWordRange=null,this.hide(),this.context.invoke("editor.focus"),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}}},{key:"nodeFromItem",value:function(t){var e=this.hints[t.data("index")],n=t.data("item"),o=e.content?e.content(n):n;return"string"==typeof o&&(o=ht.createText(o)),o}},{key:"createItemTemplates",value:function(t,n){var o=this.hints[t];return n.map((function(n){var i=e()('<div class="note-hint-item"></div>');return i.append(o.template?o.template(n):n+""),i.data({index:t,item:n}),i}))}},{key:"handleKeydown",value:function(t){this.$popover.is(":visible")&&(t.keyCode===wt.code.ENTER?(t.preventDefault(),this.replace()):t.keyCode===wt.code.UP?(t.preventDefault(),this.moveUp()):t.keyCode===wt.code.DOWN&&(t.preventDefault(),this.moveDown()))}},{key:"searchKeyword",value:function(t,e,n){var o=this.hints[t];if(o&&o.match.test(e)&&o.search){var i=o.match.exec(e);this.matchingWord=i[0],o.search(i[1],n)}else n()}},{key:"createGroup",value:function(t,n){var o=this,i=e()('<div class="note-hint-group note-hint-group-'+t+'"></div>');return this.searchKeyword(t,n,(function(e){(e=e||[]).length&&(i.html(o.createItemTemplates(t,e)),o.show())})),i}},{key:"handleKeyup",value:function(t){var n=this;if(!k.contains([wt.code.ENTER,wt.code.UP,wt.code.DOWN],t.keyCode)){var o,i,r=this.context.invoke("editor.getLastRange");if("words"===this.options.hintMode){if(o=r.getWordsRange(r),i=o.toString(),this.hints.forEach((function(t){if(t.match.test(i))return o=r.getWordsMatchRange(t.match),!1})),!o)return void this.hide();i=o.toString()}else o=r.getWordRange(),i=o.toString();if(this.hints.length&&i){this.$content.empty();var a=m.rect2bnd(k.last(o.getClientRects())),s=e()(this.options.container).offset();a&&(a.top-=s.top,a.left-=s.left,this.$popover.hide(),this.lastWordRange=o,this.hints.forEach((function(t,e){t.match.test(i)&&n.createGroup(e,i).appendTo(n.$content)})),this.$content.find(".note-hint-item:first").addClass("active"),"top"===this.direction?this.$popover.css({left:a.left,top:a.top-this.$popover.outerHeight()-5}):this.$popover.css({left:a.left,top:a.top+a.height+5}))}else this.hide()}}},{key:"show",value:function(){this.$popover.show()}},{key:"hide",value:function(){this.$popover.hide()}}],o&&Se(n.prototype,o),i&&Se(n,i),t}();function Ee(t){return Ee="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ee(t)}function Ie(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}e().summernote=e().extend(e().summernote,{version:"0.8.20",plugins:{},dom:ht,range:yt,lists:k,options:{langInfo:e().summernote.lang["en-US"],editing:!0,modules:{editor:Ft,clipboard:Ht,dropzone:Bt,codeview:jt,statusbar:Kt,fullscreen:qt,handle:Gt,hintPopover:Te,autoLink:Qt,autoSync:Jt,autoReplace:ee,placeholder:oe,buttons:re,toolbar:se,linkDialog:ce,linkPopover:de,imageDialog:fe,imagePopover:me,tablePopover:ge,videoDialog:ye,helpDialog:we,airPopover:xe},buttons:{},lang:"en-US",followingToolbar:!1,toolbarPosition:"top",otherStaticBar:"",codeviewKeepButton:!1,toolbar:[["style",["style"]],["font",["bold","underline","clear"]],["fontname",["fontname"]],["color",["color"]],["para",["ul","ol","paragraph"]],["table",["table"]],["insert",["link","picture","video"]],["view",["fullscreen","codeview","help"]]],popatmouse:!0,popover:{image:[["resize",["resizeFull","resizeHalf","resizeQuarter","resizeNone"]],["float",["floatLeft","floatRight","floatNone"]],["remove",["removeMedia"]]],link:[["link",["linkDialogShow","unlink"]]],table:[["add",["addRowDown","addRowUp","addColLeft","addColRight"]],["delete",["deleteRow","deleteCol","deleteTable"]]],air:[["color",["color"]],["font",["bold","underline","clear"]],["para",["ul","paragraph"]],["table",["table"]],["insert",["link","picture"]],["view",["fullscreen","codeview"]]]},airMode:!1,overrideContextMenu:!1,width:null,height:null,linkTargetBlank:!0,useProtocol:!0,defaultProtocol:"http://",focus:!1,tabDisabled:!1,tabSize:4,styleWithCSS:!1,shortcuts:!0,textareaAutoSync:!0,tooltip:"auto",container:null,maxTextLength:0,blockquoteBreakingLevel:2,spellCheck:!0,disableGrammar:!1,placeholder:null,inheritPlaceholder:!1,recordEveryKeystroke:!1,historyLimit:200,showDomainOnlyForAutolink:!1,hintMode:"word",hintSelect:"after",hintDirection:"bottom",styleTags:["p","blockquote","pre","h1","h2","h3","h4","h5","h6"],fontNames:["Arial","Arial Black","Comic Sans MS","Courier New","Helvetica Neue","Helvetica","Impact","Lucida Grande","Tahoma","Times New Roman","Verdana"],fontNamesIgnoreCheck:[],addDefaultFonts:!0,fontSizes:["8","9","10","11","12","14","18","24","36"],fontSizeUnits:["px","pt"],colors:[["#000000","#424242","#636363","#9C9C94","#CEC6CE","#EFEFEF","#F7F7F7","#FFFFFF"],["#FF0000","#FF9C00","#FFFF00","#00FF00","#00FFFF","#0000FF","#9C00FF","#FF00FF"],["#F7C6CE","#FFE7CE","#FFEFC6","#D6EFD6","#CEDEE7","#CEE7F7","#D6D6E7","#E7D6DE"],["#E79C9C","#FFC69C","#FFE79C","#B5D6A5","#A5C6CE","#9CC6EF","#B5A5D6","#D6A5BD"],["#E76363","#F7AD6B","#FFD663","#94BD7B","#73A5AD","#6BADDE","#8C7BC6","#C67BA5"],["#CE0000","#E79439","#EFC631","#6BA54A","#4A7B8C","#3984C6","#634AA5","#A54A7B"],["#9C0000","#B56308","#BD9400","#397B21","#104A5A","#085294","#311873","#731842"],["#630000","#7B3900","#846300","#295218","#083139","#003163","#21104A","#4A1031"]],colorsName:[["Black","Tundora","Dove Gray","Star Dust","Pale Slate","Gallery","Alabaster","White"],["Red","Orange Peel","Yellow","Green","Cyan","Blue","Electric Violet","Magenta"],["Azalea","Karry","Egg White","Zanah","Botticelli","Tropical Blue","Mischka","Twilight"],["Tonys Pink","Peach Orange","Cream Brulee","Sprout","Casper","Perano","Cold Purple","Careys Pink"],["Mandy","Rajah","Dandelion","Olivine","Gulf Stream","Viking","Blue Marguerite","Puce"],["Guardsman Red","Fire Bush","Golden Dream","Chelsea Cucumber","Smalt Blue","Boston Blue","Butterfly Bush","Cadillac"],["Sangria","Mai Tai","Buddha Gold","Forest Green","Eden","Venice Blue","Meteorite","Claret"],["Rosewood","Cinnamon","Olive","Parsley","Tiber","Midnight Blue","Valentino","Loulou"]],colorButton:{foreColor:"#000000",backColor:"#FFFF00"},lineHeights:["1.0","1.2","1.4","1.5","1.6","1.8","2.0","3.0"],tableClassName:"table table-bordered",insertTableMaxSize:{col:10,row:10},dialogsInBody:!1,dialogsFade:!1,maximumImageFileSize:null,acceptImageFileTypes:"image/*",callbacks:{onBeforeCommand:null,onBlur:null,onBlurCodeview:null,onChange:null,onChangeCodeview:null,onDialogShown:null,onEnter:null,onFocus:null,onImageLinkInsert:null,onImageUpload:null,onImageUploadError:null,onInit:null,onKeydown:null,onKeyup:null,onMousedown:null,onMouseup:null,onPaste:null,onScroll:null},codemirror:{mode:"text/html",htmlMode:!0,lineNumbers:!0},codeviewFilter:!0,codeviewFilterRegex:/<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,codeviewIframeFilter:!0,codeviewIframeWhitelistSrc:[],codeviewIframeWhitelistSrcBase:["www.youtube.com","www.youtube-nocookie.com","www.facebook.com","vine.co","instagram.com","player.vimeo.com","www.dailymotion.com","player.youku.com","jumpingbean.tv","v.qq.com"],keyMap:{pc:{ESC:"escape",ENTER:"insertParagraph","CTRL+Z":"undo","CTRL+Y":"redo",TAB:"tab","SHIFT+TAB":"untab","CTRL+B":"bold","CTRL+I":"italic","CTRL+U":"underline","CTRL+SHIFT+S":"strikethrough","CTRL+BACKSLASH":"removeFormat","CTRL+SHIFT+L":"justifyLeft","CTRL+SHIFT+E":"justifyCenter","CTRL+SHIFT+R":"justifyRight","CTRL+SHIFT+J":"justifyFull","CTRL+SHIFT+NUM7":"insertUnorderedList","CTRL+SHIFT+NUM8":"insertOrderedList","CTRL+LEFTBRACKET":"outdent","CTRL+RIGHTBRACKET":"indent","CTRL+NUM0":"formatPara","CTRL+NUM1":"formatH1","CTRL+NUM2":"formatH2","CTRL+NUM3":"formatH3","CTRL+NUM4":"formatH4","CTRL+NUM5":"formatH5","CTRL+NUM6":"formatH6","CTRL+ENTER":"insertHorizontalRule","CTRL+K":"linkDialog.show"},mac:{ESC:"escape",ENTER:"insertParagraph","CMD+Z":"undo","CMD+SHIFT+Z":"redo",TAB:"tab","SHIFT+TAB":"untab","CMD+B":"bold","CMD+I":"italic","CMD+U":"underline","CMD+SHIFT+S":"strikethrough","CMD+BACKSLASH":"removeFormat","CMD+SHIFT+L":"justifyLeft","CMD+SHIFT+E":"justifyCenter","CMD+SHIFT+R":"justifyRight","CMD+SHIFT+J":"justifyFull","CMD+SHIFT+NUM7":"insertUnorderedList","CMD+SHIFT+NUM8":"insertOrderedList","CMD+LEFTBRACKET":"outdent","CMD+RIGHTBRACKET":"indent","CMD+NUM0":"formatPara","CMD+NUM1":"formatH1","CMD+NUM2":"formatH2","CMD+NUM3":"formatH3","CMD+NUM4":"formatH4","CMD+NUM5":"formatH5","CMD+NUM6":"formatH6","CMD+ENTER":"insertHorizontalRule","CMD+K":"linkDialog.show"}},icons:{align:"note-icon-align",alignCenter:"note-icon-align-center",alignJustify:"note-icon-align-justify",alignLeft:"note-icon-align-left",alignRight:"note-icon-align-right",rowBelow:"note-icon-row-below",colBefore:"note-icon-col-before",colAfter:"note-icon-col-after",rowAbove:"note-icon-row-above",rowRemove:"note-icon-row-remove",colRemove:"note-icon-col-remove",indent:"note-icon-align-indent",outdent:"note-icon-align-outdent",arrowsAlt:"note-icon-arrows-alt",bold:"note-icon-bold",caret:"note-icon-caret",circle:"note-icon-circle",close:"note-icon-close",code:"note-icon-code",eraser:"note-icon-eraser",floatLeft:"note-icon-float-left",floatRight:"note-icon-float-right",font:"note-icon-font",frame:"note-icon-frame",italic:"note-icon-italic",link:"note-icon-link",unlink:"note-icon-chain-broken",magic:"note-icon-magic",menuCheck:"note-icon-menu-check",minus:"note-icon-minus",orderedlist:"note-icon-orderedlist",pencil:"note-icon-pencil",picture:"note-icon-picture",question:"note-icon-question",redo:"note-icon-redo",rollback:"note-icon-rollback",square:"note-icon-square",strikethrough:"note-icon-strikethrough",subscript:"note-icon-subscript",superscript:"note-icon-superscript",table:"note-icon-table",textHeight:"note-icon-text-height",trash:"note-icon-trash",underline:"note-icon-underline",undo:"note-icon-undo",unorderedlist:"note-icon-unorderedlist",video:"note-icon-video"}}});var $e=function(){function t(e,n,o,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.markup=e,this.children=n,this.options=o,this.callback=i}var n,o,i;return n=t,(o=[{key:"render",value:function(t){var n=e()(this.markup);if(this.options&&this.options.contents&&n.html(this.options.contents),this.options&&this.options.className&&n.addClass(this.options.className),this.options&&this.options.data&&e().each(this.options.data,(function(t,e){n.attr("data-"+t,e)})),this.options&&this.options.click&&n.on("click",this.options.click),this.children){var o=n.find(".note-children-container");this.children.forEach((function(t){t.render(o.length?o:n)}))}return this.callback&&this.callback(n,this.options),this.options&&this.options.callback&&this.options.callback(n),t&&t.append(n),n}}])&&Ie(n.prototype,o),i&&Ie(n,i),t}();const Ne=function(t,e){return function(){var n="object"===Ee(arguments[1])?arguments[1]:arguments[0],o=Array.isArray(arguments[0])?arguments[0]:[];return n&&n.children&&(o=n.children),new $e(t,o,n,e)}};function Pe(t){return Pe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Pe(t)}var Re=Ne('<div class="note-editor note-frame card"/>'),Le=Ne('<div class="note-toolbar card-header" role="toolbar"/>'),Ae=Ne('<div class="note-editing-area"/>'),Fe=Ne('<textarea class="note-codable" aria-multiline="true"/>'),De=Ne('<div class="note-editable card-block" contentEditable="true" role="textbox" aria-multiline="true"/>'),He=Ne(['<output class="note-status-output" role="status" aria-live="polite"></output>','<div class="note-statusbar" role="status">','<div class="note-resizebar" aria-label="Resize">','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>',"</div>","</div>"].join("")),ze=Ne('<div class="note-editor note-airframe"/>'),Be=Ne(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>','<output class="note-status-output" role="status" aria-live="polite"></output>'].join("")),Me=Ne('<div class="note-btn-group btn-group">'),Oe=Ne('<div class="note-dropdown-menu dropdown-menu" role="list">',(function(t,e){var n=Array.isArray(e.items)?e.items.map((function(t){var n="string"==typeof t?t:t.value||"",o=e.template?e.template(t):t,i="object"===Pe(t)?t.option:void 0;return'<a class="dropdown-item" href="#" '+('data-value="'+n+'"'+(void 0!==i?' data-option="'+i+'"':""))+' role="listitem" aria-label="'+n+'">'+o+"</a>"})).join(""):e.items;t.html(n).attr({"aria-label":e.title}),e&&e.codeviewKeepButton&&t.addClass("note-codeview-keep")})),Ue=function(t){return t},je=Ne('<div class="note-dropdown-menu dropdown-menu note-check" role="list">',(function(t,e){var n=Array.isArray(e.items)?e.items.map((function(t){var n="string"==typeof t?t:t.value||"",o=e.template?e.template(t):t;return'<a class="dropdown-item" href="#" data-value="'+n+'" role="listitem" aria-label="'+t+'">'+qe(e.checkClassName)+" "+o+"</a>"})).join(""):e.items;t.html(n).attr({"aria-label":e.title}),e&&e.codeviewKeepButton&&t.addClass("note-codeview-keep")})),We=Ne('<div class="modal note-modal" aria-hidden="false" tabindex="-1" role="dialog"/>',(function(t,e){e.fade&&t.addClass("fade"),t.attr({"aria-label":e.title}),t.html(['<div class="modal-dialog">','<div class="modal-content">',e.title?'<div class="modal-header"><h4 class="modal-title">'+e.title+'</h4><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close" aria-hidden="true"></button></div>':"",'<div class="modal-body">'+e.body+"</div>",e.footer?'<div class="modal-footer">'+e.footer+"</div>":"","</div>","</div>"].join(""))})),Ke=Ne(['<div class="note-popover popover show">','<div class="popover-arrow"></div>','<div class="popover-body note-children-container"></div>',"</div>"].join(""),(function(t,e){var n=void 0!==e.direction?e.direction:"bottom";t.attr("data-bs-placement",n),e.hideArrow&&t.find(".popover-arrow").hide()})),Ve=Ne('<div class="form-check"></div>',(function(t,e){t.html(['<label class="form-check-label"'+(e.id?' for="note-'+e.id+'"':"")+">",'<input type="checkbox" class="form-check-input"'+(e.id?' id="note-'+e.id+'"':""),e.checked?" checked":"",' aria-label="'+(e.text?e.text:"")+'"',' aria-checked="'+(e.checked?"true":"false")+'"/>'," "+(e.text?e.text:"")+"</label>"].join(""))})),qe=function(t,e){return t.match(/^</)?t:"<"+(e=e||"i")+' class="'+t+'"></'+e+">"};e().summernote=e().extend(e().summernote,{ui_template:function(t){return{editor:Re,toolbar:Le,editingArea:Ae,codable:Fe,editable:De,statusbar:He,airEditor:ze,airEditable:Be,buttonGroup:Me,dropdown:Oe,dropdownButtonContents:Ue,dropdownCheck:je,dialog:We,popover:Ke,icon:qe,checkbox:Ve,options:t,palette:function(e,n){return Ne('<div class="note-color-palette"/>',(function(e,n){for(var o=[],i=0,r=n.colors.length;i<r;i++){for(var a=n.eventName,s=n.colors[i],l=n.colorsName[i],c=[],u=0,d=s.length;u<d;u++){var h=s[u],f=l[u];c.push(['<button type="button" class="note-color-btn"','style="background-color:',h,'" ','data-event="',a,'" ','data-value="',h,'" ','title="',f,'" ','aria-label="',f,'" ','data-toggle="button" tabindex="-1"></button>'].join(""))}o.push('<div class="note-color-row">'+c.join("")+"</div>")}e.html(o.join("")),n.tooltip&&e.find(".note-color-btn").tooltip({container:n.container||t.container,trigger:"hover",placement:"bottom"})}))(e,n)},button:function(n,o){return Ne('<button type="button" class="note-btn btn btn-light btn-sm" tabindex="-1">',(function(n,o){o&&o.tooltip&&n.attr({title:o.tooltip,"aria-label":o.tooltip}).tooltip({container:o.container||t.container,trigger:"hover",placement:"bottom"}).on("click",(function(t){e()(t.currentTarget).tooltip("hide")})),o&&o.codeviewButton&&n.addClass("note-codeview-keep")}))(n,o)},toggleBtn:function(t,e){t.toggleClass("disabled",!e),t.attr("disabled",!e)},toggleBtnActive:function(t,e){t.toggleClass("active",e)},onDialogShown:function(t,e){t.one("shown.bs.modal",e)},onDialogHidden:function(t,e){t.one("hidden.bs.modal",e)},showDialog:function(t){t.modal("show")},hideDialog:function(t){t.modal("hide")},createLayout:function(e){var n=(t.airMode?ze([Ae([Fe(),Be()])]):"bottom"===t.toolbarPosition?Re([Ae([Fe(),De()]),Le(),He()]):Re([Le(),Ae([Fe(),De()]),He()])).render();return n.insertAfter(e),{note:e,editor:n,toolbar:n.find(".note-toolbar"),editingArea:n.find(".note-editing-area"),editable:n.find(".note-editable"),codable:n.find(".note-codable"),statusbar:n.find(".note-statusbar")}},removeLayout:function(t,e){t.html(e.editable.html()),e.editor.remove(),t.show()}}},interface:"bs5"}),e().summernote.options.styleTags=["p",{title:"Blockquote",tag:"blockquote",className:"blockquote",value:"blockquote"},"pre","h1","h2","h3","h4","h5","h6"]})(),i})()}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css
new file mode 100644
index 0000000..d496fe4
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css
@@ -0,0 +1,1505 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+@font-face {
+    font-family: "summernote";
+    font-style: normal;
+    font-weight: 400;
+    font-display: auto;
+    src: url("./font/summernote.eot?#iefix") format("embedded-opentype"), url("./font/summernote.woff2") format("woff2"), url("./font/summernote.woff") format("woff"), url("./font/summernote.ttf") format("truetype");
+}
+[class^=note-icon]:before,
+[class*=" note-icon"]:before {
+    display: inline-block;
+    font-family: "summernote";
+    font-style: normal;
+    font-size: inherit;
+    text-decoration: inherit;
+    text-rendering: auto;
+    text-transform: none;
+    vertical-align: middle;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    speak: none;
+}
+
+.note-icon-fw {
+    text-align: center;
+    width: 1.25em;
+}
+
+.note-icon-border {
+    border: solid 0.08em #eee;
+    border-radius: 0.1em;
+    padding: 0.2em 0.25em 0.15em;
+}
+
+.note-icon-pull-left {
+    float: left;
+}
+
+.note-icon-pull-right {
+    float: right;
+}
+
+.note-icon.note-icon-pull-left {
+    margin-right: 0.3em;
+}
+.note-icon.note-icon-pull-right {
+    margin-left: 0.3em;
+}
+
+.note-icon-align::before {
+    content: "\ea01";
+}
+
+.note-icon-align-center::before {
+    content: "\ea02";
+}
+
+.note-icon-align-indent::before {
+    content: "\ea03";
+}
+
+.note-icon-align-justify::before {
+    content: "\ea04";
+}
+
+.note-icon-align-left::before {
+    content: "\ea05";
+}
+
+.note-icon-align-outdent::before {
+    content: "\ea06";
+}
+
+.note-icon-align-right::before {
+    content: "\ea07";
+}
+
+.note-icon-arrow-circle-down::before {
+    content: "\ea08";
+}
+
+.note-icon-arrow-circle-left::before {
+    content: "\ea09";
+}
+
+.note-icon-arrow-circle-right::before {
+    content: "\ea0a";
+}
+
+.note-icon-arrow-circle-up::before {
+    content: "\ea0b";
+}
+
+.note-icon-arrows-alt::before {
+    content: "\ea0c";
+}
+
+.note-icon-arrows-h::before {
+    content: "\ea0d";
+}
+
+.note-icon-arrows-v::before {
+    content: "\ea0e";
+}
+
+.note-icon-bold::before {
+    content: "\ea0f";
+}
+
+.note-icon-caret::before {
+    content: "\ea10";
+}
+
+.note-icon-chain-broken::before {
+    content: "\ea11";
+}
+
+.note-icon-circle::before {
+    content: "\ea12";
+}
+
+.note-icon-close::before {
+    content: "\ea13";
+}
+
+.note-icon-code::before {
+    content: "\ea14";
+}
+
+.note-icon-col-after::before {
+    content: "\ea15";
+}
+
+.note-icon-col-before::before {
+    content: "\ea16";
+}
+
+.note-icon-col-remove::before {
+    content: "\ea17";
+}
+
+.note-icon-eraser::before {
+    content: "\ea18";
+}
+
+.note-icon-float-left::before {
+    content: "\ea19";
+}
+
+.note-icon-float-none::before {
+    content: "\ea1a";
+}
+
+.note-icon-float-right::before {
+    content: "\ea1b";
+}
+
+.note-icon-font::before {
+    content: "\ea1c";
+}
+
+.note-icon-frame::before {
+    content: "\ea1d";
+}
+
+.note-icon-italic::before {
+    content: "\ea1e";
+}
+
+.note-icon-link::before {
+    content: "\ea1f";
+}
+
+.note-icon-magic::before {
+    content: "\ea20";
+}
+
+.note-icon-menu-check::before {
+    content: "\ea21";
+}
+
+.note-icon-minus::before {
+    content: "\ea22";
+}
+
+.note-icon-orderedlist::before {
+    content: "\ea23";
+}
+
+.note-icon-pencil::before {
+    content: "\ea24";
+}
+
+.note-icon-picture::before {
+    content: "\ea25";
+}
+
+.note-icon-question::before {
+    content: "\ea26";
+}
+
+.note-icon-redo::before {
+    content: "\ea27";
+}
+
+.note-icon-rollback::before {
+    content: "\ea28";
+}
+
+.note-icon-row-above::before {
+    content: "\ea29";
+}
+
+.note-icon-row-below::before {
+    content: "\ea2a";
+}
+
+.note-icon-row-remove::before {
+    content: "\ea2b";
+}
+
+.note-icon-special-character::before {
+    content: "\ea2c";
+}
+
+.note-icon-square::before {
+    content: "\ea2d";
+}
+
+.note-icon-strikethrough::before {
+    content: "\ea2e";
+}
+
+.note-icon-subscript::before {
+    content: "\ea2f";
+}
+
+.note-icon-summernote::before {
+    content: "\ea30";
+}
+
+.note-icon-superscript::before {
+    content: "\ea31";
+}
+
+.note-icon-table::before {
+    content: "\ea32";
+}
+
+.note-icon-text-height::before {
+    content: "\ea33";
+}
+
+.note-icon-trash::before {
+    content: "\ea34";
+}
+
+.note-icon-underline::before {
+    content: "\ea35";
+}
+
+.note-icon-undo::before {
+    content: "\ea36";
+}
+
+.note-icon-unorderedlist::before {
+    content: "\ea37";
+}
+
+.note-icon-video::before {
+    content: "\ea38";
+}
+
+.note-frame {
+    -ms-box-sizing: border-box;
+    box-sizing: border-box;
+    color: #000;
+    font-family: sans-serif;
+    border-radius: 4px;
+}
+
+.note-toolbar {
+    padding: 10px 5px;
+    border-bottom: 1px solid #e2e2e2;
+    color: #333;
+    background-color: #f5f5f5;
+    border-color: #ddd;
+    border-top-left-radius: 3px;
+    border-top-right-radius: 3px;
+}
+
+.note-btn-group {
+    position: relative;
+    display: inline-block;
+    margin-right: 8px;
+}
+.note-btn-group > .note-btn-group {
+    margin-right: 0;
+}
+.note-btn-group > .note-btn:first-child {
+    margin-left: 0;
+}
+.note-btn-group .note-btn + .note-btn,
+.note-btn-group .note-btn + .note-btn-group,
+.note-btn-group .note-btn-group + .note-btn,
+.note-btn-group .note-btn-group + .note-btn-group {
+    margin-left: -1px;
+}
+.note-btn-group > .note-btn:not(:first-child),
+.note-btn-group > .note-btn-group:not(:first-child) > .note-btn {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+}
+.note-btn-group > .note-btn:not(:last-child):not(.dropdown-toggle),
+.note-btn-group > .note-btn-group:not(:last-child) > .note-btn {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0;
+}
+.note-btn-group.open > .note-dropdown {
+    display: block;
+}
+
+.note-btn {
+    display: inline-block;
+    font-weight: 400;
+    margin-bottom: 0;
+    text-align: center;
+    vertical-align: middle;
+    touch-action: manipulation;
+    cursor: pointer;
+    background-image: none;
+    border: 1px solid #dae0e5;
+    white-space: nowrap;
+    outline: 0;
+    color: #333;
+    background-color: #fff;
+    border-color: #dae0e5;
+    padding: 5px 10px;
+    font-size: 14px;
+    line-height: 1.4;
+    border-radius: 3px;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+.note-btn:focus, .note-btn.focus {
+    color: #333;
+    background-color: #ebebeb;
+    border-color: #dae0e5;
+}
+.note-btn:hover {
+    color: #333;
+    background-color: #ebebeb;
+    border-color: #dae0e5;
+}
+.note-btn.disabled:focus, .note-btn.disabled.focus, .note-btn[disabled]:focus, .note-btn[disabled].focus, fieldset[disabled] .note-btn:focus, fieldset[disabled] .note-btn.focus {
+    background-color: #fff;
+    border-color: #dae0e5;
+}
+.note-btn:hover, .note-btn:focus, .note-btn.focus {
+    color: #333;
+    text-decoration: none;
+    border: 1px solid #dae0e5;
+    background-color: #ebebeb;
+    outline: 0;
+    border-radius: 1px;
+}
+.note-btn:active, .note-btn.active {
+    outline: 0;
+    background-image: none;
+    color: #333;
+    text-decoration: none;
+    border: 1px solid #dae0e5;
+    background-color: #ebebeb;
+    outline: 0;
+    border-radius: 1px;
+    box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.note-btn.disabled, .note-btn[disabled], fieldset[disabled] .note-btn {
+    cursor: not-allowed;
+    -webkit-opacity: 0.65;
+    -khtml-opacity: 0.65;
+    -moz-opacity: 0.65;
+    opacity: 0.65;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=65);
+    filter: alpha(opacity=65);
+    box-shadow: none;
+}
+.note-btn > span.note-icon-caret:first-child {
+    margin-left: -1px;
+}
+.note-btn > span.note-icon-caret:nth-child(2) {
+    padding-left: 3px;
+    margin-right: -5px;
+}
+
+.note-btn-primary {
+    background: #fa6362;
+    color: #fff;
+}
+.note-btn-primary:hover, .note-btn-primary:focus, .note-btn-primary.focus {
+    color: #fff;
+    text-decoration: none;
+    border: 1px solid #dae0e5;
+    background-color: #fa6362;
+    border-radius: 1px;
+}
+
+.note-btn-block {
+    display: block;
+    width: 100%;
+}
+
+.note-btn-block + .note-btn-block {
+    margin-top: 5px;
+}
+
+input[type=submit].note-btn-block,
+input[type=reset].note-btn-block,
+input[type=button].note-btn-block {
+    width: 100%;
+}
+
+button.close {
+    padding: 0;
+    cursor: pointer;
+    background: transparent;
+    border: 0;
+    -webkit-appearance: none;
+}
+
+.close {
+    float: right;
+    font-size: 21px;
+    line-height: 1;
+    color: #000;
+    opacity: 0.2;
+}
+
+.close:hover {
+    -webkit-opacity: 1;
+    -khtml-opacity: 1;
+    -moz-opacity: 1;
+    -ms-filter: alpha(opacity=100);
+    filter: alpha(opacity=100);
+    opacity: 1;
+}
+
+.note-dropdown {
+    position: relative;
+}
+
+.note-color .dropdown-toggle {
+    width: 30px;
+    padding-left: 5px;
+}
+
+.note-dropdown-menu {
+    display: none;
+    min-width: 100px;
+    position: absolute;
+    top: 100%;
+    left: 0;
+    z-index: 1000;
+    float: left;
+    text-align: left;
+    background: #fff;
+    border: 1px solid #e2e2e2;
+    padding: 5px;
+    background-clip: padding-box;
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.06);
+}
+.note-dropdown-menu > *:last-child {
+    margin-right: 0;
+}
+
+.note-btn-group.open .note-dropdown-menu {
+    display: block;
+}
+
+.note-dropdown-item {
+    display: block;
+}
+.note-dropdown-item:hover {
+    background-color: #ebebeb;
+}
+
+a.note-dropdown-item,
+a.note-dropdown-item:hover {
+    margin: 5px 0;
+    color: #000;
+    text-decoration: none;
+}
+
+.note-modal {
+    position: fixed;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+    z-index: 1050;
+    -webkit-opacity: 1;
+    -khtml-opacity: 1;
+    -moz-opacity: 1;
+    opacity: 1;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100);
+    filter: alpha(opacity=100);
+    display: none;
+}
+.note-modal.open {
+    display: block;
+}
+
+.note-modal-content {
+    position: relative;
+    width: auto;
+    margin: 30px 20px;
+    border: 1px solid rgba(0, 0, 0, 0.2);
+    background: #fff;
+    background-clip: border-box;
+    outline: 0;
+    border-radius: 5px;
+    box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+}
+
+.note-modal-header {
+    padding: 10px 20px;
+    border: 1px solid #ededef;
+}
+
+.note-modal-body {
+    position: relative;
+    padding: 20px 30px;
+}
+.note-modal-body kbd {
+    border-radius: 2px;
+    background-color: #000;
+    color: #fff;
+    padding: 3px 5px;
+    font-weight: 700;
+    -ms-box-sizing: border-box;
+    box-sizing: border-box;
+}
+
+.note-modal-footer {
+    height: 40px;
+    padding: 10px;
+    text-align: center;
+}
+
+.note-modal-footer a {
+    color: #337ab7;
+    text-decoration: none;
+}
+
+.note-modal-footer a:hover,
+.note-modal-footer a:focus {
+    color: #23527c;
+    text-decoration: underline;
+}
+
+.note-modal-footer .note-btn {
+    float: right;
+}
+
+.note-modal-title {
+    font-size: 20px;
+    color: #42515f;
+    margin: 0;
+    line-height: 1.4;
+}
+
+.note-modal-backdrop {
+    position: fixed;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    top: 0;
+    z-index: 1040;
+    background: #000;
+    -webkit-opacity: 0.5;
+    -khtml-opacity: 0.5;
+    -moz-opacity: 0.5;
+    opacity: 0.5;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=50);
+    filter: alpha(opacity=50);
+    display: none;
+}
+.note-modal-backdrop.open {
+    display: block;
+}
+
+@media (min-width: 768px) {
+    .note-modal-content {
+        width: 600px;
+        margin: 30px auto;
+    }
+}
+@media (min-width: 992px) {
+    .note-modal-content-large {
+        width: 900px;
+    }
+}
+.note-modal .note-help-block {
+    display: block;
+    margin-top: 5px;
+    margin-bottom: 10px;
+    color: #737373;
+}
+.note-modal .note-nav {
+    display: flex;
+    flex-wrap: wrap;
+    padding-left: 0;
+    margin-bottom: 0;
+    list-style: none;
+}
+.note-modal .note-nav-link {
+    display: block;
+    padding: 0.5rem 1rem;
+    color: #007bff;
+    text-decoration: none;
+    background-color: transparent;
+    -webkit-text-decoration-skip: objects;
+}
+.note-modal .note-nav-link:focus,
+.note-modal .note-nav-link:hover {
+    color: #0056b3;
+    text-decoration: none;
+}
+.note-modal .note-nav-link.disabled {
+    color: #868e96;
+}
+.note-modal .note-nav-tabs {
+    border-bottom: 1px solid #ddd;
+}
+.note-modal .note-nav-tabs .note-nav-item {
+    margin-bottom: -1px;
+}
+.note-modal .note-nav-tabs .note-nav-link {
+    border: 1px solid transparent;
+    border-top-left-radius: 0.25rem;
+    border-top-right-radius: 0.25rem;
+}
+.note-modal .note-nav-tabs .note-nav-link:focus,
+.note-modal .note-nav-tabs .note-nav-link:hover {
+    border-color: #e9ecef #e9ecef #ddd;
+}
+.note-modal .note-nav-tabs .note-nav-link.disabled {
+    color: #868e96;
+    background-color: transparent;
+    border-color: transparent;
+}
+.note-modal .note-nav-tabs .note-nav-item.show .note-nav-link {
+    color: #495057;
+    background-color: #fff;
+    border-color: #ddd #ddd #fff;
+}
+.note-modal .note-tab-content {
+    margin: 15px auto;
+}
+.note-modal .note-tab-content > .note-tab-pane:target ~ .note-tab-pane:last-child,
+.note-modal .note-tab-content > .note-tab-pane {
+    display: none;
+}
+.note-modal .note-tab-content > :last-child,
+.note-modal .note-tab-content > .note-tab-pane:target {
+    display: block;
+}
+
+.note-form-group {
+    padding-bottom: 20px;
+}
+
+.note-form-group:last-child {
+    padding-bottom: 0;
+}
+
+.note-form-label {
+    display: block;
+    width: 100%;
+    font-size: 16px;
+    color: #42515f;
+    margin-bottom: 10px;
+    font-weight: 700;
+}
+
+.note-input {
+    width: 100%;
+    display: block;
+    border: 1px solid #ededef;
+    background: #fff;
+    outline: 0;
+    padding: 6px 4px;
+    font-size: 14px;
+    -ms-box-sizing: border-box;
+    box-sizing: border-box;
+}
+
+.note-input::-webkit-input-placeholder {
+    color: #eeeeee;
+}
+
+.note-input:-moz-placeholder {
+    /* Firefox 18- */
+    color: #eeeeee;
+}
+
+.note-input::-moz-placeholder {
+    /* Firefox 19+ */
+    color: #eeeeee;
+}
+
+.note-input:-ms-input-placeholder {
+    color: #eeeeee;
+}
+
+.note-tooltip {
+    position: absolute;
+    z-index: 1070;
+    display: block;
+    font-size: 13px;
+    transition: opacity 0.15s;
+    -webkit-opacity: 0;
+    -khtml-opacity: 0;
+    -moz-opacity: 0;
+    opacity: 0;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
+    filter: alpha(opacity=0);
+}
+.note-tooltip.in {
+    -webkit-opacity: 0.9;
+    -khtml-opacity: 0.9;
+    -moz-opacity: 0.9;
+    opacity: 0.9;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=90);
+    filter: alpha(opacity=90);
+}
+.note-tooltip.top {
+    margin-top: -3px;
+    padding: 5px 0;
+}
+.note-tooltip.right {
+    margin-left: 3px;
+    padding: 0 5px;
+}
+.note-tooltip.bottom {
+    margin-top: 3px;
+    padding: 5px 0;
+}
+.note-tooltip.left {
+    margin-left: -3px;
+    padding: 0 5px;
+}
+
+.note-tooltip.bottom .note-tooltip-arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-width: 0 5px 5px;
+    border-bottom-color: #000;
+}
+.note-tooltip.top .note-tooltip-arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -5px;
+    border-width: 5px 5px 0;
+    border-top-color: #000;
+}
+.note-tooltip.right .note-tooltip-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -5px;
+    border-width: 5px 5px 5px 0;
+    border-right-color: #000;
+}
+.note-tooltip.left .note-tooltip-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -5px;
+    border-width: 5px 0 5px 5px;
+    border-left-color: #000;
+}
+
+.note-tooltip-arrow {
+    position: absolute;
+    width: 0;
+    height: 0;
+    border-color: transparent;
+    border-style: solid;
+}
+
+.note-tooltip-content {
+    max-width: 200px;
+    font-family: sans-serif;
+    padding: 3px 8px;
+    color: #fff;
+    text-align: center;
+    background-color: #000;
+}
+
+.note-popover {
+    position: absolute;
+    z-index: 1060;
+    display: block;
+    font-size: 13px;
+    font-family: sans-serif;
+    display: none;
+    background: #ffffff;
+    border: 1px solid rgba(0, 0, 0, 0.2);
+    border: 1px solid #ccc;
+}
+.note-popover.in {
+    display: block;
+}
+.note-popover.top {
+    margin-top: -10px;
+    padding: 5px 0;
+}
+.note-popover.right {
+    margin-left: 10px;
+    padding: 0 5px;
+}
+.note-popover.bottom {
+    margin-top: 10px;
+    padding: 5px 0;
+}
+.note-popover.left {
+    margin-left: -10px;
+    padding: 0 5px;
+}
+
+.note-popover.bottom .note-popover-arrow {
+    top: -11px;
+    left: 20px;
+    margin-left: -10px;
+    border-top-width: 0;
+    border-bottom-color: #999999;
+    border-bottom-color: rgba(0, 0, 0, 0.25);
+}
+.note-popover.bottom .note-popover-arrow::after {
+    top: 1px;
+    margin-left: -10px;
+    content: "\0020";
+    border-top-width: 0;
+    border-bottom-color: #fff;
+}
+.note-popover.top .note-popover-arrow {
+    bottom: -11px;
+    left: 20px;
+    margin-left: -10px;
+    border-bottom-width: 0;
+    border-top-color: #999999;
+    border-top-color: rgba(0, 0, 0, 0.25);
+}
+.note-popover.top .note-popover-arrow::after {
+    bottom: 1px;
+    margin-left: -10px;
+    content: "\0020";
+    border-bottom-width: 0;
+    border-top-color: #fff;
+}
+.note-popover.right .note-popover-arrow {
+    top: 50%;
+    left: -11px;
+    margin-top: -10px;
+    border-left-width: 0;
+    border-right-color: #999999;
+    border-right-color: rgba(0, 0, 0, 0.25);
+}
+.note-popover.right .note-popover-arrow::after {
+    left: 1px;
+    margin-top: -10px;
+    content: "\0020";
+    border-left-width: 0;
+    border-right-color: #fff;
+}
+.note-popover.left .note-popover-arrow {
+    top: 50%;
+    right: -11px;
+    margin-top: -10px;
+    border-right-width: 0;
+    border-left-color: #999999;
+    border-left-color: rgba(0, 0, 0, 0.25);
+}
+.note-popover.left .note-popover-arrow::after {
+    right: 1px;
+    margin-top: -10px;
+    content: "\0020";
+    border-right-width: 0;
+    border-left-color: #fff;
+}
+
+.note-popover-arrow {
+    position: absolute;
+    width: 0;
+    height: 0;
+    border: 11px solid transparent;
+}
+.note-popover-arrow::after {
+    position: absolute;
+    display: block;
+    width: 0;
+    height: 0;
+    border-color: transparent;
+    border-style: solid;
+    content: "\0020";
+    border-width: 10px;
+}
+
+.note-popover-content {
+    /*max-width: $popover-max-width;*/
+    padding: 3px 8px;
+    color: #000;
+    text-align: center;
+    background-color: #ffffff;
+    min-width: 100px;
+    min-height: 30px;
+}
+
+/* Theme Variables
+ ------------------------------------------ */
+/* Layout
+ ------------------------------------------ */
+.note-editor {
+    position: relative;
+}
+.note-editor .note-dropzone {
+    position: absolute;
+    display: none;
+    z-index: 100;
+    color: lightskyblue;
+    background-color: #fff;
+    opacity: 0.95;
+}
+.note-editor .note-dropzone .note-dropzone-message {
+    display: table-cell;
+    vertical-align: middle;
+    text-align: center;
+    font-size: 28px;
+    font-weight: 700;
+}
+.note-editor .note-dropzone.hover {
+    color: #098ddf;
+}
+.note-editor.dragover .note-dropzone {
+    display: table;
+}
+.note-editor .note-editing-area {
+    position: relative;
+}
+.note-editor .note-editing-area .note-editable {
+    outline: none;
+}
+.note-editor .note-editing-area .note-editable sup {
+    vertical-align: super;
+}
+.note-editor .note-editing-area .note-editable sub {
+    vertical-align: sub;
+}
+.note-editor .note-editing-area .note-editable img.note-float-left {
+    margin-right: 10px;
+}
+.note-editor .note-editing-area .note-editable img.note-float-right {
+    margin-left: 10px;
+}
+
+/* Frame mode layout
+ ------------------------------------------ */
+.note-editor.note-frame,
+.note-editor.note-airframe {
+    border: 1px solid #00000032;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-editable,
+.note-editor.note-airframe.codeview .note-editing-area .note-editable {
+    display: none;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-codable,
+.note-editor.note-airframe.codeview .note-editing-area .note-codable {
+    display: block;
+}
+.note-editor.note-frame .note-editing-area,
+.note-editor.note-airframe .note-editing-area {
+    overflow: hidden;
+}
+.note-editor.note-frame .note-editing-area .note-editable,
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 10px;
+    overflow: auto;
+    word-wrap: break-word;
+}
+.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],
+.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false] {
+    background-color: #8080801d;
+}
+.note-editor.note-frame .note-editing-area .note-codable,
+.note-editor.note-airframe .note-editing-area .note-codable {
+    display: none;
+    width: 100%;
+    padding: 10px;
+    border: none;
+    box-shadow: none;
+    font-family: Menlo, Monaco, monospace, sans-serif;
+    font-size: 14px;
+    color: #ccc;
+    background-color: #222;
+    resize: none;
+    outline: none;
+    -ms-box-sizing: border-box;
+    box-sizing: border-box;
+    border-radius: 0;
+    margin-bottom: 0;
+}
+.note-editor.note-frame.fullscreen,
+.note-editor.note-airframe.fullscreen {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100% !important;
+    z-index: 1050;
+}
+.note-editor.note-frame.fullscreen .note-resizebar,
+.note-editor.note-airframe.fullscreen .note-resizebar {
+    display: none;
+}
+.note-editor.note-frame .note-status-output,
+.note-editor.note-airframe .note-status-output {
+    display: block;
+    width: 100%;
+    font-size: 14px;
+    line-height: 1.42857143;
+    height: 20px;
+    margin-bottom: 0;
+    color: #000;
+    border: 0;
+    border-top: 1px solid #e2e2e2;
+}
+.note-editor.note-frame .note-status-output:empty,
+.note-editor.note-airframe .note-status-output:empty {
+    height: 0;
+    border-top: 0 solid transparent;
+}
+.note-editor.note-frame .note-status-output .pull-right,
+.note-editor.note-airframe .note-status-output .pull-right {
+    float: right !important;
+}
+.note-editor.note-frame .note-status-output .text-muted,
+.note-editor.note-airframe .note-status-output .text-muted {
+    color: #777;
+}
+.note-editor.note-frame .note-status-output .text-primary,
+.note-editor.note-airframe .note-status-output .text-primary {
+    color: #286090;
+}
+.note-editor.note-frame .note-status-output .text-success,
+.note-editor.note-airframe .note-status-output .text-success {
+    color: #3c763d;
+}
+.note-editor.note-frame .note-status-output .text-info,
+.note-editor.note-airframe .note-status-output .text-info {
+    color: #31708f;
+}
+.note-editor.note-frame .note-status-output .text-warning,
+.note-editor.note-airframe .note-status-output .text-warning {
+    color: #8a6d3b;
+}
+.note-editor.note-frame .note-status-output .text-danger,
+.note-editor.note-airframe .note-status-output .text-danger {
+    color: #a94442;
+}
+.note-editor.note-frame .note-status-output .alert,
+.note-editor.note-airframe .note-status-output .alert {
+    margin: -7px 0 0 0;
+    padding: 7px 10px 2px 10px;
+    border-radius: 0;
+    color: #000;
+    background-color: #f5f5f5;
+}
+.note-editor.note-frame .note-status-output .alert .note-icon,
+.note-editor.note-airframe .note-status-output .alert .note-icon {
+    margin-right: 5px;
+}
+.note-editor.note-frame .note-status-output .alert-success,
+.note-editor.note-airframe .note-status-output .alert-success {
+    color: #3c763d !important;
+    background-color: #dff0d8 !important;
+}
+.note-editor.note-frame .note-status-output .alert-info,
+.note-editor.note-airframe .note-status-output .alert-info {
+    color: #31708f !important;
+    background-color: #d9edf7 !important;
+}
+.note-editor.note-frame .note-status-output .alert-warning,
+.note-editor.note-airframe .note-status-output .alert-warning {
+    color: #8a6d3b !important;
+    background-color: #fcf8e3 !important;
+}
+.note-editor.note-frame .note-status-output .alert-danger,
+.note-editor.note-airframe .note-status-output .alert-danger {
+    color: #a94442 !important;
+    background-color: #f2dede !important;
+}
+.note-editor.note-frame .note-statusbar,
+.note-editor.note-airframe .note-statusbar {
+    background-color: #8080801d;
+    border-bottom-left-radius: 4px;
+    border-bottom-right-radius: 4px;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar,
+.note-editor.note-airframe .note-statusbar .note-resizebar {
+    padding-top: 1px;
+    height: 9px;
+    width: 100%;
+    cursor: ns-resize;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar {
+    width: 20px;
+    margin: 1px auto;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar {
+    cursor: default;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar {
+    display: none;
+}
+.note-editor.note-frame .note-placeholder,
+.note-editor.note-airframe .note-placeholder {
+    padding: 10px;
+}
+
+.note-editor.note-airframe {
+    border: 0;
+}
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 0;
+}
+
+/* Popover
+ ------------------------------------------ */
+.note-popover.popover {
+    display: none;
+    max-width: none;
+}
+.note-popover.popover .popover-content a {
+    display: inline-block;
+    max-width: 200px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    vertical-align: middle;
+}
+.note-popover.popover .arrow {
+    left: 20px !important;
+}
+
+/* Popover and Toolbar (Button container)
+ ------------------------------------------ */
+.note-toolbar {
+    position: relative;
+}
+
+.note-popover .popover-content, .note-editor .note-toolbar {
+    margin: 0;
+    padding: 0 0 5px 5px;
+}
+.note-popover .popover-content > .note-btn-group, .note-editor .note-toolbar > .note-btn-group {
+    margin-top: 5px;
+    margin-left: 0;
+    margin-right: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table, .note-editor .note-toolbar .note-btn-group .note-table {
+    min-width: 0;
+    padding: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker {
+    font-size: 18px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher {
+    position: absolute !important;
+    z-index: 3;
+    width: 10em;
+    height: 10em;
+    cursor: pointer;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted {
+    position: relative !important;
+    z-index: 1;
+    width: 5em;
+    height: 5em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted {
+    position: absolute !important;
+    z-index: 2;
+    width: 1em;
+    height: 1em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-style .dropdown-style blockquote, .note-popover .popover-content .note-style .dropdown-style pre, .note-editor .note-toolbar .note-style .dropdown-style blockquote, .note-editor .note-toolbar .note-style .dropdown-style pre {
+    margin: 0;
+    padding: 5px 10px;
+}
+.note-popover .popover-content .note-style .dropdown-style h1, .note-popover .popover-content .note-style .dropdown-style h2, .note-popover .popover-content .note-style .dropdown-style h3, .note-popover .popover-content .note-style .dropdown-style h4, .note-popover .popover-content .note-style .dropdown-style h5, .note-popover .popover-content .note-style .dropdown-style h6, .note-popover .popover-content .note-style .dropdown-style p, .note-editor .note-toolbar .note-style .dropdown-style h1, .note-editor .note-toolbar .note-style .dropdown-style h2, .note-editor .note-toolbar .note-style .dropdown-style h3, .note-editor .note-toolbar .note-style .dropdown-style h4, .note-editor .note-toolbar .note-style .dropdown-style h5, .note-editor .note-toolbar .note-style .dropdown-style h6, .note-editor .note-toolbar .note-style .dropdown-style p {
+    margin: 0;
+    padding: 0;
+}
+.note-popover .popover-content .note-color-all .note-dropdown-menu, .note-editor .note-toolbar .note-color-all .note-dropdown-menu {
+    min-width: 337px;
+}
+.note-popover .popover-content .note-color .dropdown-toggle, .note-editor .note-toolbar .note-color .dropdown-toggle {
+    width: 20px;
+    padding-left: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette {
+    display: inline-block;
+    margin: 0;
+    width: 160px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child {
+    margin: 0 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title {
+    font-size: 12px;
+    margin: 2px 7px;
+    text-align: center;
+    border-bottom: 1px solid #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select {
+    font-size: 11px;
+    margin: 3px;
+    padding: 0 3px;
+    cursor: pointer;
+    width: 100%;
+    border-radius: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover {
+    background: #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row {
+    height: 20px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn {
+    display: none;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn {
+    border: 1px solid #eee;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu, .note-editor .note-toolbar .note-para .note-dropdown-menu {
+    min-width: 228px;
+    padding: 5px;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu > div + div, .note-editor .note-toolbar .note-para .note-dropdown-menu > div + div {
+    margin-left: 5px;
+}
+.note-popover .popover-content .note-dropdown-menu, .note-editor .note-toolbar .note-dropdown-menu {
+    min-width: 160px;
+}
+.note-popover .popover-content .note-dropdown-menu.right, .note-editor .note-toolbar .note-dropdown-menu.right {
+    right: 0;
+    left: auto;
+}
+.note-popover .popover-content .note-dropdown-menu.right::before, .note-editor .note-toolbar .note-dropdown-menu.right::before {
+    right: 9px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.right::after, .note-editor .note-toolbar .note-dropdown-menu.right::after {
+    right: 10px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a i, .note-editor .note-toolbar .note-dropdown-menu.note-check a i {
+    color: deepskyblue;
+    visibility: hidden;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a.checked i, .note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i {
+    visibility: visible;
+}
+.note-popover .popover-content .note-fontsize-10, .note-editor .note-toolbar .note-fontsize-10 {
+    font-size: 10px;
+}
+.note-popover .popover-content .note-color-palette, .note-editor .note-toolbar .note-color-palette {
+    line-height: 1;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn, .note-editor .note-toolbar .note-color-palette div .note-color-btn {
+    width: 20px;
+    height: 20px;
+    padding: 0;
+    margin: 0;
+    border: 0;
+    border-radius: 0;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn:hover, .note-editor .note-toolbar .note-color-palette div .note-color-btn:hover {
+    transform: scale(1.2);
+    transition: all 0.2s;
+}
+
+/* Dialog
+ ------------------------------------------ */
+.note-modal .modal-dialog {
+    outline: 0;
+    border-radius: 5px;
+    box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+}
+.note-modal .form-group {
+    margin-left: 0;
+    margin-right: 0;
+}
+.note-modal .note-modal-form {
+    margin: 0;
+}
+.note-modal .note-image-dialog .note-dropzone {
+    min-height: 100px;
+    font-size: 30px;
+    line-height: 4;
+    color: lightgray;
+    text-align: center;
+    border: 4px dashed lightgray;
+    margin-bottom: 10px;
+}
+@-moz-document url-prefix() {
+    .note-modal .note-image-input {
+        height: auto;
+    }
+}
+
+/* Placeholder
+ ------------------------------------------ */
+.note-placeholder {
+    position: absolute;
+    display: none;
+    color: gray;
+}
+
+/* Handle
+ ------------------------------------------ */
+.note-handle .note-control-selection {
+    position: absolute;
+    display: none;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection > div {
+    position: absolute;
+}
+.note-handle .note-control-selection .note-control-selection-bg {
+    width: 100%;
+    height: 100%;
+    background-color: #000;
+    -webkit-opacity: 0.3;
+    -khtml-opacity: 0.3;
+    -moz-opacity: 0.3;
+    opacity: 0.3;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+    filter: alpha(opacity=30);
+}
+.note-handle .note-control-selection .note-control-handle, .note-handle .note-control-selection .note-control-sizing, .note-handle .note-control-selection .note-control-holder {
+    width: 7px;
+    height: 7px;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection .note-control-sizing {
+    background-color: #000;
+}
+.note-handle .note-control-selection .note-control-nw {
+    top: -5px;
+    left: -5px;
+    border-right: none;
+    border-bottom: none;
+}
+.note-handle .note-control-selection .note-control-ne {
+    top: -5px;
+    right: -5px;
+    border-bottom: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-sw {
+    bottom: -5px;
+    left: -5px;
+    border-top: none;
+    border-right: none;
+}
+.note-handle .note-control-selection .note-control-se {
+    right: -5px;
+    bottom: -5px;
+    cursor: se-resize;
+}
+.note-handle .note-control-selection .note-control-se.note-control-holder {
+    cursor: default;
+    border-top: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-selection-info {
+    right: 0;
+    bottom: 0;
+    padding: 5px;
+    margin: 5px;
+    color: #fff;
+    background-color: #000;
+    font-size: 12px;
+    border-radius: 5px;
+    -webkit-opacity: 0.7;
+    -khtml-opacity: 0.7;
+    -moz-opacity: 0.7;
+    opacity: 0.7;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=70);
+    filter: alpha(opacity=70);
+}
+
+.note-hint-popover {
+    min-width: 100px;
+    padding: 2px;
+}
+.note-hint-popover .popover-content {
+    padding: 3px;
+    max-height: 150px;
+    overflow: auto;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item {
+    display: block !important;
+    padding: 3px;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item.active, .note-hint-popover .popover-content .note-hint-group .note-hint-item:hover {
+    display: block;
+    clear: both;
+    font-weight: 400;
+    line-height: 1.4;
+    color: white;
+    white-space: nowrap;
+    text-decoration: none;
+    background-color: #428bca;
+    outline: 0;
+    cursor: pointer;
+}
+
+/* Handle
+ ------------------------------------------ */
+html .note-fullscreen-body, body .note-fullscreen-body {
+    overflow: hidden !important;
+}
+
+.note-editor .note-editing-area .note-editable table {
+    width: 100%;
+    border-collapse: collapse;
+}
+.note-editor .note-editing-area .note-editable table td, .note-editor .note-editing-area .note-editable table th {
+    border: 1px solid #ececec;
+    padding: 5px 3px;
+}
+.note-editor .note-editing-area .note-editable a {
+    background-color: inherit;
+    text-decoration: inherit;
+    font-family: inherit;
+    font-weight: inherit;
+    color: #337ab7;
+}
+.note-editor .note-editing-area .note-editable a:hover,
+.note-editor .note-editing-area .note-editable a:focus {
+    color: #23527c;
+    text-decoration: underline;
+    outline: 0;
+}
+.note-editor .note-editing-area .note-editable figure {
+    margin: 0;
+}
+
+/* Dialog
+ ------------------------------------------*/
+.note-modal .note-modal-body label {
+    margin-bottom: 2px;
+    padding: 2px 5px;
+    display: inline-block;
+}
+.note-modal .note-modal-body .help-list-item:hover {
+    background-color: #e0e0e0;
+}
+@-moz-document url-prefix() {
+    .note-modal .note-image-input {
+        height: auto;
+    }
+}
+
+.help-list-item label {
+    margin-bottom: 5px;
+    display: inline-block;
+}
+
+/*# sourceMappingURL=summernote-lite.css.map*/
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css.map
new file mode 100644
index 0000000..2b6b158
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote-lite.css","mappings":";;;;;;;;;;;;AAMA;IACE;IACA;IACA;IACA;IACA;ACLF;ADSA;;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ACPF;;ADYA;IACE;IACA;ACTF;;ADYA;IACE;IACA;IACA;ACTF;;ADYA;IACE;ACTF;;ADYA;IACE;ACTF;;ADaE;IACE;ACVJ;ADYE;IACE;ACVJ;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;AC9QA;IC8GE,0BD7GoB;ICgHpB,sBDhHoB;IACpB;IACA,uBEKY;IFJZ;ADoRF;;AIxRA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;AJ2RF;;AKlSA;IACE;IACA;IACA;ALqSF;AKnSE;IACE;ALqSJ;AKlSE;IACE;ALoSJ;AKjSE;;;;IAIE;ALmSJ;AKhSE;;IAEI;IACA;ALkSN;AK/RE;;IAEE;IACA;ALiSJ;AK7RI;IACE;AL+RN;;AMjUA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ICLA,WJqBmB;IIpBnB,sBJqBe;IIpBf,qBJqBmB;IIMnB;IACA,eJ3BU;II4BV,gBJxBY;IIyBZ,kBJnBmB;IDiGnB,yBItGqB;IJuGrB,sBIvGqB;IJwGrB,qBIxGqB;IJyGrB,iBIzGqB;AN4UvB;AOhVE;IAEE,WJeiB;IIdjB,yBJiBmB;IIhBnB,qBJeiB;AHkUrB;AO/UE;IACE,WJUiB;IITjB,yBJYmB;IIXnB,qBJUiB;AHuUrB;AO3UI;IAEE,sBJCW;IIAX,qBJCe;AH2UrB;AMxVE;IAGE,WHQiB;IGPjB;IACA;IACA,yBHQmB;IGPnB;IJyBF,kBIxBmB;AN0VrB;AMvVE;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;ANwVJ;AMrVE;IAGE,mBHHc;IDyBhB,qBIrBmB;IJsBnB,oBItBmB;IJuBnB,kBIvBmB;IJwBnB,aIxBmB;IJ0BnB;IACA;IAmCA,gBI7DsB;AN4VxB;AMzVE;IACE;AN2VJ;AMxVE;IACE;IACA;AN0VJ;;AMtVA;IACE;IACA;ANyVF;AMvVE;IAGE;IACA;IACA;IACA;IJrBF,kBIsBmB;ANyVrB;;AMpVA;IACE;IACA;ANuVF;;AMpVA;IACE;ANuVF;;AMhVE;;;IACE;ANqVJ;;AMjVA;IACE;IACA;IACA;IACA;IACA;ANoVF;;AMjVA;IACE;IACA;IACA;IACA;IACA;ANoVF;;AMjVA;IACE;IACC;IACE;IACE;IACI;IACD;ANoVV;;AQvcA;IACE;AR0cF;;AQtcE;IACE;IACA;ARycJ;;AQtcA;IACE;IACA;IACA;IACA;IACA;IACA,aL2ByB;IK1BzB;IACA;IACA,gBL8BkB;IK7BlB;IACA;IACA;INqFA,yCMpFoB;AR2ctB;AQzcE;IACE;AR2cJ;;AQvcA;IACE;AR0cF;;AQvcA;IACE;AR0cF;AQxcE;IACE,yBLRmB;AHkdvB;;AQtcA;;IAEE;IACA;IACA;ARycF;;ASvfA;IACE;IACA;IACA;IACA;IACA;IACA,aNyCc;IDmBd,kBO3DiB;IP4DjB,iBO5DiB;IP6DjB,eO7DiB;IP8DjB,UO9DiB;IPgEjB;IACA;IOhEA;AT+fF;AS7fE;IACE;AT+fJ;;AS3fA;IACE;IACA;IACA;IACA;IACA,gBNuDiB;IMtDjB;IACA;IACA;IPoFA,wCOnFoB;ATggBtB;;AS7fA;IACE;IACA;ATggBF;;AS7fA;IACE;IACA;ATggBF;AS7fE;IACE;IACA;IACA;IACA;IACA;IPoEF,0BADyB;IAIzB,sBAJyB;AFgc3B;;AS9fA;IACE;IACA;IACA;ATigBF;;AS7fA;IACE;IACA;ATggBF;;AS7fA;;IAEE;IACA;ATggBF;;AS7fA;IACE;ATggBF;;AS7fA;IACE;IACA;IACA;IACA;ATggBF;;AS7fA;IACE;IACA;IACA;IACA;IACA;IACA,aNpCyB;IMqCzB,gBNLkB;IDZlB,oBOkBiB;IPjBjB,mBOiBiB;IPhBjB,iBOgBiB;IPfjB,YOeiB;IPbjB;IACA;IOaA;ATqgBF;ASngBE;IACE;ATqgBJ;;AS/fA;IAEE;QACE;QACA;ITigBA;AACJ;AS9fA;IACE;QACE;ITggBA;AACJ;AS3fE;IACE;IACA;IACA;IACA;AT6fJ;AS1fE;IAEE;IAEI;IACJ;IACA;IACA;AT4fJ;ASzfE;IACE;IACA;IACA;IACA;IACA;IACA;AT2fJ;ASxfE;;IAEE;IACA;AT0fJ;ASvfE;IACE;ATyfJ;AStfE;IACE;ATwfJ;ASrfE;IACE;ATufJ;ASpfE;IACE;IACA;IACA;ATsfJ;ASnfE;;IAEE;ATqfJ;ASlfE;IACE;IACA;IACA;ATofJ;ASjfE;IACE;IACA;IACA;ATmfJ;AShfE;IACE;ATkfJ;AS/eE;;IAEE;ATifJ;AS/eE;;IAEE;ATifJ;;AU5qBA;IACE;AV+qBF;;AU5qBA;IACE;AV+qBF;;AU5qBA;IACE;IACA;IACA;IACA;IACA;IACA;AV+qBF;;AU5qBA;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IRsFA,0BADyB;IAIzB,sBAJyB;AF8lB3B;;AU9qBA;IACE,cPxBY;AHysBd;;AU9qBA;IAA+B;IAC7B,cP5BY;AH8sBd;;AU/qBA;IAAiC;IAC/B,cPhCY;AHmtBd;;AUhrBA;IACE,cPpCY;AHutBd;;AW7tBA;IACE;IACA,aR2Cc;IQ1Cd;IAGA;IAEA;IT0DA,kBSzDiB;IT0DjB,iBS1DiB;IT2DjB,eS3DiB;IT4DjB,US5DiB;IT8DjB;IACA;AFmqBF;AWhuBE;ITuDA,oBCXiB;IDYjB,mBCZiB;IDajB,iBCbiB;IDcjB,YCdiB;IDgBjB;IACA;AF2qBF;AWvuBE;IAAW;IAAmB;AX2uBhC;AW1uBE;IAAW;IAAmB;AX8uBhC;AW7uBE;IAAW;IAAmB;AXivBhC;AWhvBE;IAAW;IAAmB;AXovBhC;;AWhvBE;IACE;IACA;IACA;IACA;IACA,yBR8Be;AHqtBnB;AWhvBE;IACE;IACA;IACA;IACA;IACA,sBRsBe;AH4tBnB;AW/uBE;IACE;IACA;IACA;IACA;IACA,wBRce;AHmuBnB;AW/uBE;IACE;IACA;IACA;IACA;IACA,uBROe;AH0uBnB;;AW5uBA;IACE;IACA;IACA;IACA;IACA;AX+uBF;;AW5uBA;IACE,gBRTiB;IQUjB,uBRtDY;IQuDZ;IACA,WRXiB;IQYjB;IACA,sBRZiB;AH2vBnB;;AYjzBA;IACE;IACA,aT0Cc;ISzCd;IAGA;IACA,uBTCY;ISCZ;IACA,mBTiDc;IShDd;IACA;AZizBF;AY/yBE;IAAW;AZkzBb;AYjzBE;IAAW;IAAoB;AZqzBjC;AYpzBE;IAAW;IAAoB;AZwzBjC;AYvzBE;IAAW;IAAoB;AZ2zBjC;AY1zBE;IAAW;IAAoB;AZ8zBjC;;AY1zBE;IACE;IACA;IACA;IACA;IACA,4BT0CkC;ISzClC,wCTwCuB;AHqxB3B;AY3zBI;IACE;IACA;IACA;IACA;IACA;AZ6zBN;AYzzBE;IACE;IACA;IACA;IACA;IACA,yBTyBkC;ISxBlC,qCTuBuB;AHoyB3B;AYzzBI;IACE;IACA;IACA;IACA;IACA;AZ2zBN;AYvzBE;IACE;IACA;IACA;IACA;IACA,2BTQkC;ISPlC,uCTMuB;AHmzB3B;AYvzBI;IACE;IACA;IACA;IACA;IACA;AZyzBN;AYrzBE;IACE;IACA;IACA;IACA;IACA,0BTTkC;ISUlC,sCTXuB;AHk0B3B;AYrzBI;IACE;IACA;IACA;IACA;IACA;AZuzBN;;AYjzBA;IACE;IACA;IACA;IACA;AZozBF;AYlzBE;IACE;IACA;IACA;IACA;IACA;IACA;IAGA;IACA;AZkzBJ;;AY7yBA;IACE;IACA;IACA,WTxDc;ISyDd;IACA,yBT3Dc;IS4Dd;IACA;AZgzBF;;Aat6BA;6CAAA;AAQA;6CAAA;AAEA;IACE;Abm6BF;Aa95BE;IACE;IACA;IACA;IACA,mBANe;IAOf;IACA;Abg6BJ;Aa95BI;IACE;IACA;IACA;IACA;IACA;Abg6BN;Aa75BI;IACE,cAlBoB;Abi7B1B;Aa35BE;IACE;Ab65BJ;Aa15BE;IACE;Ab45BJ;Aa15BI;IACE;Ab45BN;Aa15BM;IACE;Ab45BR;Aaz5BM;IACE;Ab25BR;Aax5BM;IACE,kBAlDW;Ab48BnB;Aav5BM;IACE,iBAvDU;Abg9BlB;;Aan5BA;6CAAA;AAEA;;IAEE;Abs5BF;Aaj5BM;;IACE;Abo5BR;Aal5BM;;IACE;Abq5BR;Aah5BE;;IACE;Abm5BJ;Aah5BI;;IACE;IACA;IACA;Abm5BN;Aaj5BM;;IACE,2BA3FW;Ab++BnB;Aa/4BI;;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IXFJ,0BWKwB;IXFxB,sBWEwB;IXnExB,gBWoEqB;IACjB;Abq5BN;Aah5BE;;IACE;IACA;IACA;IACA;IACA;Abm5BJ;Aal5BI;;IACE;Abq5BN;Aah5BE;;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;Abm5BJ;Aah5BE;;IACE;IACA;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;IACA;IACA;IACA;IACA;Abm5BJ;Aah5BE;;IACE;Abm5BJ;Aah5BE;;IACE;IACA;Abm5BJ;Aah5BE;;IACE;IACA;Abm5BJ;Aah5BE;;IACE;IACA;Abm5BJ;Aah5BE;;IACE;IACA;Abm5BJ;Aa/4BE;;IACE,2BAhNe;IAiNf;IACA;IACA;Abk5BJ;Aaj5BI;;IACE;IACA;IACA;IACA;Abo5BN;Aan5BM;;IACE;IACA;IACA;Abs5BR;Aaj5BM;;IACE;Abo5BR;Aan5BQ;;IACE;Abs5BV;Aaj5BE;;IACE;Abo5BJ;;Aah5BA;IACE;Abm5BF;Aah5BI;IACE;Abk5BN;;Aa54BA;6CAAA;AAEA;IACE;IACA;Ab+4BF;Aa54BI;IACE;IACA;IACA;IACA;IACA;IACA;Ab84BN;Aa34BE;IACE;Ab64BJ;;Aaz4BA;6CAAA;AAEA;IACE;Ab44BF;;Aaz4BA;IACE;IACA;Ab44BF;Aa14BE;IACE;IACA;IACA;Ab44BJ;Aax4BI;IACE;IACA;Ab04BN;Aaz4BM;IACE;Ab24BR;Aa14BQ;IACE;IACA;IACA;IACA;IACA;Ab44BV;Aa14BQ;IACE;IACA;IACA;IACA;IACA;Ab44BV;Aa14BQ;IACE;IACA;IACA;IACA;IACA;Ab44BV;Aap4BM;IACE;IACA;Abs4BR;Aap4BM;IACE;IACA;Abs4BR;Aah4BI;IACE;Abk4BN;Aa73BI;IACE;IACA;Ab+3BN;Aa53BM;IACE;IACA;IACA;Ab83BR;Aa73BQ;IACE;Ab+3BV;Aa53BQ;IACE;IACA;IACA;IACA;Ab83BV;Aa33BQ;;;IAEE;IACA;IACA;IACA;IACA;IXhUR,kBWiUyB;Abg4B3B;Aa93BU;;;IACE;Abk4BZ;Aa93BQ;IACE;Abg4BV;Aa73BQ;IACE;Ab+3BV;Aa33BU;IACE;Ab63BZ;Aar3BI;IACE;IACA;Abu3BN;Aat3BM;IACE;Abw3BR;Aal3BE;IACE;Abo3BJ;Aah3BI;IACE;IACA;Abk3BN;Aaj3BM;IACE;IACA;Abm3BR;Aaj3BM;IACE;IACA;Abm3BR;Aa92BM;IACE;IACA;Abg3BR;Aa92BM;IACE;Abg3BR;Aa32BE;IACE;Ab62BJ;Aaz2BE;IACE;Ab22BJ;Aaz2BM;IACE;IACA;IACA;IACA;IACA;IACA;Ab22BR;Aaz2BM;IACE;IACA;Ab22BR;;Aar2BA;6CAAA;AAGE;IACE;IACA;IXnWF,wCWoWsB;Aby2BxB;Aav2BE;IACE;IACA;Aby2BJ;Aav2BE;IACE;Aby2BJ;Aat2BI;IACE;IACA;IACA;IACA;IACA;IACA;IACA;Abw2BN;Aan2BE;IACE;QACE;Ibq2BF;AACJ;;Aaj2BA;6CAAA;AAEA;IACE;IACA;IACA;Abo2BF;;Aaj2BA;6CAAA;AAIE;IACE;IACA;IACA;Abk2BJ;Aaj2BI;IACE;Abm2BN;Aah2BI;IACE;IACA;IACA;IXjcJ,oBWkcqB;IXjcrB,mBWicqB;IXhcrB,iBWgcqB;IX/brB,YW+bqB;IX7brB;IACA;AFmyCF;Aap2BI;IACE;IACA;IACA;Abs2BN;Aa/1BI;IAEE;Abg2BN;Aa71BI;IACE;IACA;IACA;IACA;Ab+1BN;Aa51BI;IACE;IACA;IACA;IACA;Ab81BN;Aa31BI;IACE;IACA;IACA;IACA;Ab61BN;Aa11BI;IACE;IACA;IACA;Ab41BN;Aaz1BI;IACE;IACA;IACA;Ab21BN;Aax1BI;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IX9gBJ,kBW+gBqB;IX7frB,oBW8fqB;IX7frB,mBW6fqB;IX5frB,iBW4fqB;IX3frB,YW2fqB;IXzfrB;IACA;AFy1CF;;Aa51BA;IACE;IACA;Ab+1BF;Aa71BE;IACE;IACA;IACA;Ab+1BJ;Aa51BM;IACE;IACA;Ab81BR;Aa51BQ;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;Ab81BV;;Aav1BA;6CAAA;AAGE;IACE;Aby1BJ;;AA56CM;IACE;IACA;AA+6CR;AA76CS;IACC;IACA;AA+6CV;AA36CM;IACE;IACA;IACA;IACA;IACA;AA66CR;AA16CM;;IAEE;IACA;IACA;AA46CR;AAz6CM;IACE;AA26CR;;AAr6CA;4CAAA;AAII;IACE;IACA;IACA;AAs6CN;AAn6CK;IACC;AAq6CN;AAh6CE;IACE;QACE;IAk6CF;AACJ;;AA55CE;IACE;IACA;AA+5CJ","sources":["webpack:///./src/styles/summernote/font.scss","webpack:///./src/styles/lite/summernote-lite.scss","webpack:///./src/styles/lite/scss/common.scss","webpack:///./src/styles/summernote/elements.scss","webpack:///./src/styles/lite/scss/variables.scss","webpack:///./src/styles/lite/scss/toolbar.scss","webpack:///./src/styles/lite/scss/btn-group.scss","webpack:///./src/styles/lite/scss/buttons.scss","webpack:///./src/styles/lite/scss/mixins/buttons.scss","webpack:///./src/styles/lite/scss/dropdown.scss","webpack:///./src/styles/lite/scss/modal.scss","webpack:///./src/styles/lite/scss/form.scss","webpack:///./src/styles/lite/scss/tooltip.scss","webpack:///./src/styles/lite/scss/popover.scss","webpack:///./src/styles/summernote/common.scss"],"sourcesContent":["// Variables\n\n$sni-css-prefix: note-icon !default;\n\n// Path\n\n@font-face {\n  font-family: \"summernote\";\n  font-style: normal;\n  font-weight: 400;\n  font-display: auto;\n  src: url(\"./font/summernote.eot?#iefix\") format(\"embedded-opentype\"), url(\"./font/summernote.woff2\") format(\"woff2\"), url(\"./font/summernote.woff\") format(\"woff\"), url(\"./font/summernote.ttf\") format(\"truetype\");}\n\n// Core\n\n[class^=\"#{$sni-css-prefix}\"]:before,\n[class*=\" #{$sni-css-prefix}\"]:before {\n  display: inline-block;\n  font-family: \"summernote\";\n  font-style: normal;\n  font-size: inherit;\n  text-decoration: inherit;\n  text-rendering: auto;\n  text-transform: none;\n  vertical-align: middle;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  speak: none;\n}\n\n// Extras\n\n.#{$sni-css-prefix}-fw {\n  text-align: center;\n  width: 1.25em;\n}\n\n.#{$sni-css-prefix}-border {\n  border: solid 0.08em #eee;\n  border-radius: 0.1em;\n  padding: 0.2em 0.25em 0.15em;\n}\n\n.#{$sni-css-prefix}-pull-left {\n  float: left;\n}\n\n.#{$sni-css-prefix}-pull-right {\n  float: right;\n}\n\n.#{$sni-css-prefix} {\n  &.#{$sni-css-prefix}-pull-left {\n    margin-right: 0.3em;\n  }\n  &.#{$sni-css-prefix}-pull-right {\n    margin-left: 0.3em;\n  }\n}\n\n// Functions\n\n@function char($character-code) {\n  @if function-exists(\"selector-append\") {\n    @return unquote(\"\\\"\\\\#{$character-code}\\\"\");\n  }\n\n  @if \"\\\\#{'x'}\" == \"\\\\x\" {\n    @return str-slice(\"\\x\", 1, 1) + $character-code;\n  }\n  @else {\n    @return #{\"\\\"\\\\\"}#{$character-code + \"\\\"\"};\n  }\n}\n\n// Icons\n\n\n.note-icon-align::before {\n  content: \"\\ea01\";\n}\n\n.note-icon-align-center::before {\n  content: \"\\ea02\";\n}\n\n.note-icon-align-indent::before {\n  content: \"\\ea03\";\n}\n\n.note-icon-align-justify::before {\n  content: \"\\ea04\";\n}\n\n.note-icon-align-left::before {\n  content: \"\\ea05\";\n}\n\n.note-icon-align-outdent::before {\n  content: \"\\ea06\";\n}\n\n.note-icon-align-right::before {\n  content: \"\\ea07\";\n}\n\n.note-icon-arrow-circle-down::before {\n  content: \"\\ea08\";\n}\n\n.note-icon-arrow-circle-left::before {\n  content: \"\\ea09\";\n}\n\n.note-icon-arrow-circle-right::before {\n  content: \"\\ea0a\";\n}\n\n.note-icon-arrow-circle-up::before {\n  content: \"\\ea0b\";\n}\n\n.note-icon-arrows-alt::before {\n  content: \"\\ea0c\";\n}\n\n.note-icon-arrows-h::before {\n  content: \"\\ea0d\";\n}\n\n.note-icon-arrows-v::before {\n  content: \"\\ea0e\";\n}\n\n.note-icon-bold::before {\n  content: \"\\ea0f\";\n}\n\n.note-icon-caret::before {\n  content: \"\\ea10\";\n}\n\n.note-icon-chain-broken::before {\n  content: \"\\ea11\";\n}\n\n.note-icon-circle::before {\n  content: \"\\ea12\";\n}\n\n.note-icon-close::before {\n  content: \"\\ea13\";\n}\n\n.note-icon-code::before {\n  content: \"\\ea14\";\n}\n\n.note-icon-col-after::before {\n  content: \"\\ea15\";\n}\n\n.note-icon-col-before::before {\n  content: \"\\ea16\";\n}\n\n.note-icon-col-remove::before {\n  content: \"\\ea17\";\n}\n\n.note-icon-eraser::before {\n  content: \"\\ea18\";\n}\n\n.note-icon-float-left::before {\n  content: \"\\ea19\";\n}\n\n.note-icon-float-none::before {\n  content: \"\\ea1a\";\n}\n\n.note-icon-float-right::before {\n  content: \"\\ea1b\";\n}\n\n.note-icon-font::before {\n  content: \"\\ea1c\";\n}\n\n.note-icon-frame::before {\n  content: \"\\ea1d\";\n}\n\n.note-icon-italic::before {\n  content: \"\\ea1e\";\n}\n\n.note-icon-link::before {\n  content: \"\\ea1f\";\n}\n\n.note-icon-magic::before {\n  content: \"\\ea20\";\n}\n\n.note-icon-menu-check::before {\n  content: \"\\ea21\";\n}\n\n.note-icon-minus::before {\n  content: \"\\ea22\";\n}\n\n.note-icon-orderedlist::before {\n  content: \"\\ea23\";\n}\n\n.note-icon-pencil::before {\n  content: \"\\ea24\";\n}\n\n.note-icon-picture::before {\n  content: \"\\ea25\";\n}\n\n.note-icon-question::before {\n  content: \"\\ea26\";\n}\n\n.note-icon-redo::before {\n  content: \"\\ea27\";\n}\n\n.note-icon-rollback::before {\n  content: \"\\ea28\";\n}\n\n.note-icon-row-above::before {\n  content: \"\\ea29\";\n}\n\n.note-icon-row-below::before {\n  content: \"\\ea2a\";\n}\n\n.note-icon-row-remove::before {\n  content: \"\\ea2b\";\n}\n\n.note-icon-special-character::before {\n  content: \"\\ea2c\";\n}\n\n.note-icon-square::before {\n  content: \"\\ea2d\";\n}\n\n.note-icon-strikethrough::before {\n  content: \"\\ea2e\";\n}\n\n.note-icon-subscript::before {\n  content: \"\\ea2f\";\n}\n\n.note-icon-summernote::before {\n  content: \"\\ea30\";\n}\n\n.note-icon-superscript::before {\n  content: \"\\ea31\";\n}\n\n.note-icon-table::before {\n  content: \"\\ea32\";\n}\n\n.note-icon-text-height::before {\n  content: \"\\ea33\";\n}\n\n.note-icon-trash::before {\n  content: \"\\ea34\";\n}\n\n.note-icon-underline::before {\n  content: \"\\ea35\";\n}\n\n.note-icon-undo::before {\n  content: \"\\ea36\";\n}\n\n.note-icon-unorderedlist::before {\n  content: \"\\ea37\";\n}\n\n.note-icon-video::before {\n  content: \"\\ea38\";\n}\n\n","// Core variables and mixins\n@import '../summernote/font.scss';\n@import '../summernote/elements.scss';\n@import \"scss/variables.scss\";\n@import \"scss/mixins.scss\";\n\n@import \"scss/common.scss\";\n@import \"scss/toolbar.scss\";\n@import \"scss/btn-group.scss\";\n@import \"scss/buttons.scss\";\n@import \"scss/dropdown.scss\";\n@import \"scss/modal.scss\";\n@import \"scss/form.scss\";\n@import \"scss/tooltip.scss\";\n@import \"scss/popover.scss\";\n\n@import '../summernote/common.scss';\n\n.note-editor {\n  .note-editing-area {\n    .note-editable {\n      table {\n        width: 100%;\n        border-collapse: collapse;\n\n         td, th {\n          border: 1px solid #ececec;\n          padding: 5px 3px;\n        }\n      }\n\n      a {\n        background-color: inherit;\n        text-decoration: inherit;\n        font-family: inherit;\n        font-weight: inherit;\n        color: #337ab7;\n      }\n\n      a:hover,\n      a:focus {\n        color: #23527c;\n        text-decoration: underline;\n        outline: 0;\n      }\n\n      figure {\n        margin: 0;\n      }\n    }\n  }\n}\n\n/* Dialog\n ------------------------------------------*/\n.note-modal {\n  .note-modal-body {\n    label {\n      margin-bottom: 2px;\n      padding: 2px 5px;\n      display: inline-block;\n    }\n\n     .help-list-item:hover {\n      background-color: #e0e0e0;\n    }\n  }\n\n   // [workaround] firefox fileinput\n  @-moz-document url-prefix() {\n    .note-image-input {\n      height: auto;\n    }\n  }\n}\n\n\n.help-list-item {\n  label {\n    margin-bottom:5px;\n    display:inline-block;\n  }\n}\n",".note-frame {\n  @include box-sizing(border-box);\n  color: #000;\n  font-family: $font-family;\n  border-radius: 4px;\n}\n","@mixin gradient($color: #F5F5F5, $start: #EEE, $stop: #FFF) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, $start),\n                               color-stop(1, $stop));\n  background: -ms-linear-gradient(bottom,\n                                  $start,\n                                  $stop);\n  background: -moz-linear-gradient(center bottom,\n                                   $start 0%,\n                                   $stop 100%);\n  background: -o-linear-gradient($stop,\n                                 $start);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($stop)}', endColorstr='#{ie-hex-str($start)}', GradientType=0);\n}\n@mixin bw-gradient($color: #F5F5F5, $start: 0, $stop: 255) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, rgb($start,$start,$start)),\n                               color-stop(1, rgb($stop,$stop,$stop)));\n  background: -ms-linear-gradient(bottom,\n                                  rgb($start,$start,$start) 0%,\n                                  rgb($stop,$stop,$stop) 100%);\n  background: -moz-linear-gradient(center bottom,\n                                   rgb($start,$start,$start) 0%,\n                                   rgb($stop,$stop,$stop) 100%);\n  background: -o-linear-gradient(rgb($stop,$stop,$stop),\n                                 rgb($start,$start,$start));\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str(rgb($stop,$stop,$stop))}', endColorstr='#{ie-hex-str(rgb($start,$start,$start))}', GradientType=0);\n}\n@mixin bordered($top-color: #EEE, $right-color: #EEE, $bottom-color: #EEE, $left-color: #EEE) {\n  border-top: solid 1px $top-color;\n  border-left: solid 1px $left-color;\n  border-right: solid 1px $right-color;\n  border-bottom: solid 1px $bottom-color;\n}\n@mixin drop-shadow($x-axis: 0, $y-axis: 1px, $blur: 2px, $alpha: 0.1) {\n  -webkit-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n}\n@mixin rounded($radius: 2px) {\n  -webkit-border-radius: $radius;\n  -moz-border-radius: $radius;\n  border-radius: $radius;\n}\n@mixin border-radius($topright: 0, $bottomright: 0, $bottomleft: 0, $topleft: 0) {\n  -webkit-border-top-right-radius: $topright;\n  -webkit-border-bottom-right-radius: $bottomright;\n  -webkit-border-bottom-left-radius: $bottomleft;\n  -webkit-border-top-left-radius: $topleft;\n  -moz-border-radius-topright: $topright;\n  -moz-border-radius-bottomright: $bottomright;\n  -moz-border-radius-bottomleft: $bottomleft;\n  -moz-border-radius-topleft: $topleft;\n  border-top-right-radius: $topright;\n  border-bottom-right-radius: $bottomright;\n  border-bottom-left-radius: $bottomleft;\n  border-top-left-radius: $topleft;\n  @include background-clip(padding-box);\n}\n@mixin opacity($opacity: 0.5) {\n  -webkit-opacity: $opacity;\n  -khtml-opacity: $opacity;\n  -moz-opacity: $opacity;\n  opacity: $opacity;\n  $opperc: $opacity * 100;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=#{$opperc});\n  filter: alpha(opacity=$opperc);\n}\n@mixin transition-duration($duration: 0.2s) {\n  -moz-transition-duration: $duration;\n  -webkit-transition-duration: $duration;\n  -o-transition-duration: $duration;\n  transition-duration: $duration;\n}\n@mixin transform($arguments...) {\n  -webkit-transform: $arguments;\n  -moz-transform: $arguments;\n  -o-transform: $arguments;\n  -ms-transform: $arguments;\n  transform: $arguments;\n}\n@mixin rotation($deg:5deg) {\n  @include transform(rotate($deg));\n}\n@mixin scale($ratio:1.5) {\n  @include transform(scale($ratio));\n}\n@mixin transition($duration:0.2s, $ease:ease-out) {\n  -webkit-transition: all $duration $ease;\n  -moz-transition: all $duration $ease;\n  -o-transition: all $duration $ease;\n  transition: all $duration $ease;\n}\n@mixin inner-shadow($horizontal:0, $vertical:1px, $blur:2px, $alpha: 0.4) {\n  -webkit-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n}\n@mixin box-shadow($arguments) {\n  -webkit-box-shadow: $arguments;\n  -moz-box-shadow: $arguments;\n  box-shadow: $arguments;\n}\n@mixin box-sizing($sizing: border-box) {\n  -ms-box-sizing: $sizing;\n  -moz-box-sizing: $sizing;\n  -webkit-box-sizing: $sizing;\n  box-sizing: $sizing;\n}\n@mixin user-select($argument: none) {\n  -webkit-user-select: $argument;\n  -moz-user-select: $argument;\n  -ms-user-select: $argument;\n  user-select: $argument;\n}\n@mixin columns($colwidth: 250px, $colcount: 0, $colgap: 50px, $columnRuleColor: #EEE, $columnRuleStyle: solid, $columnRuleWidth: 1px) {\n  -moz-column-width: $colwidth;\n  -moz-column-count: $colcount;\n  -moz-column-gap: $colgap;\n  -moz-column-rule-color: $columnRuleColor;\n  -moz-column-rule-style: $columnRuleStyle;\n  -moz-column-rule-width: $columnRuleWidth;\n  -webkit-column-width: $colwidth;\n  -webkit-column-count: $colcount;\n  -webkit-column-gap: $colgap;\n  -webkit-column-rule-color: $columnRuleColor;\n  -webkit-column-rule-style: $columnRuleStyle;\n  -webkit-column-rule-width: $columnRuleWidth;\n  column-width: $colwidth;\n  column-count: $colcount;\n  column-gap: $colgap;\n  column-rule-color: $columnRuleColor;\n  column-rule-style: $columnRuleStyle;\n  column-rule-width: $columnRuleWidth;\n}\n@mixin translate($x:0, $y:0) {\n  @include transform(translate($x, $y));\n}\n@mixin background-clip($argument: padding-box) {\n  -moz-background-clip: $argument;\n  -webkit-background-clip: $argument;\n  background-clip: $argument;\n}\n","\n$gray-base:   #000;\n$gray-darker: lighten($gray-base, 13.5%); // #222\n$gray-dark:   lighten($gray-base, 20%);   // #333\n$gray:        lighten($gray-base, 33.5%); // #555\n$gray-light:  lighten($gray-base, 46.7%); // #777\n$gray-lighter:lighten($gray-base, 93.5%); // #eee\n\n$font-family: sans-serif;\n$font-size: 14px;\n$font-size-large: ceil(($font-size * 1.25));\n$font-size-small: ceil(($font-size * 0.85));\n\n$line-height: 1.4;\n$line-height-computed: floor(($line-height * $font-size));\n\n$padding-base-vertical: 5px;\n$padding-base-horizontal: 10px;\n\n$border-radius-base: 3px;\n$btn-border-radius-base: $border-radius-base;\n\n$icon-font-path: \"../fonts/\";\n$icon-font-name: \"summernote\";\n$icon-font-svg-id: \"summernote\";\n\n$btn-font-weight: normal;\n$btn-default-color : #333;\n$btn-default-bg: #fff;\n$btn-default-border: #dae0e5;\n$btn-default-hover-bg: #ebebeb;\n$btn-default-active-bg: #f0f0f0;\n\n$input-bg: #fff;\n$input-bg-disabled: $gray-lighter;\n$input-color: $gray;\n$input-border: #ccc;\n\n$input-border-focus: #66afe9;\n$input-color-placeholder: #999;\n\n$cursor-disabled: not-allowed;\n\n$zindex-dropdown:          1000;\n$zindex-popover:1060;\n$zindex-tooltip:1070;\n$zindex-modal-background:  1040;\n$zindex-modal:  1050;\n\n$dropdown-color-bg: #fff;\n$dropdown-color-border: #e2e2e2;\n\n$tooltip-max-width:200px;\n$tooltip-color:    #fff;\n$tooltip-bg:       #000;\n$tooltip-opacity:  .9;\n$tooltip-arrow-width:         5px;\n$tooltip-arrow-color:         $tooltip-bg;\n\n$popover-bg:    #ffffff;\n$popover-color: #000;\n$popover-max-width:        276px;\n$popover-border-color:     rgba(0,0,0,.2);\n$popover-fallback-border-color:       #ccc;\n$popover-title-bg:         darken($popover-bg, 3%);\n$popover-arrow-width:      10px;\n$popover-arrow-color:      $popover-bg;\n$popover-arrow-outer-width:($popover-arrow-width + 1);\n$popover-arrow-outer-color:fade-in($popover-border-color, .05);\n$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%);\n\n\n$modal-inner-padding: 15px;\n$modal-title-padding: 15px;\n$modal-title-line-height: $line-height;\n$modal-content-bg: #fff;\n$modal-content-border-color: rgba(0,0,0,.2);\n$modal-content-fallback-border-color: #999;\n$modal-backdrop-bg: #000;\n$modal-backdrop-opacity: .5;\n$modal-header-border-color: #e5e5e5;\n$modal-footer-border-color: $modal-header-border-color;\n",".note-toolbar {\n  padding: 10px 5px;\n  border-bottom: 1px solid #e2e2e2;\n  color: #333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n",".note-btn-group {\n  position: relative;\n  display: inline-block;\n  margin-right: 8px;\n\n  > .note-btn-group {\n    margin-right: 0;\n  }\n\n  > .note-btn:first-child {\n    margin-left: 0;\n  }\n\n  .note-btn + .note-btn,\n  .note-btn + .note-btn-group,\n  .note-btn-group + .note-btn,\n  .note-btn-group + .note-btn-group {\n    margin-left: -1px;\n  }\n\n  > .note-btn:not(:first-child),\n  > .note-btn-group:not(:first-child) > .note-btn {\n      border-top-left-radius: 0;\n      border-bottom-left-radius: 0;\n  }\n\n  > .note-btn:not(:last-child):not(.dropdown-toggle),\n  > .note-btn-group:not(:last-child) > .note-btn {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n\n  &.open {\n    > .note-dropdown {\n      display: block;\n    }\n  }\n}\n",".note-btn {\n  display: inline-block;\n  font-weight: 400;\n  margin-bottom: 0;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid $btn-default-border;\n  white-space: nowrap;\n  outline: 0;\n  @include button-maker($btn-default-color, $btn-default-bg, $btn-default-hover-bg,  $btn-default-active-bg, $btn-default-border);\n  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size, $line-height, $btn-border-radius-base);\n  @include user-select(none);\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: $btn-default-color;\n    text-decoration: none;\n    border: 1px solid $btn-default-border;\n    background-color: $btn-default-hover-bg;\n    outline: 0;\n    @include rounded(1px);\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    color: #333;\n    text-decoration: none;\n    border: 1px solid #dae0e5;\n    background-color: #ebebeb;\n    outline: 0;\n    border-radius: 1px;\n    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n    box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: $cursor-disabled;\n    @include opacity(.65);\n    @include box-shadow(none);\n  }\n\n  & > span.note-icon-caret:first-child {\n    margin-left: -1px;\n  }\n\n  & > span.note-icon-caret:nth-child(2) {\n    padding-left: 3px;\n    margin-right: -5px;\n  }\n}\n\n.note-btn-primary {\n  background: #fa6362;\n  color: #fff;\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: #fff;\n    text-decoration: none;\n    border: 1px solid $btn-default-border;\n    background-color: #fa6362;\n    @include rounded(1px);\n  }\n\n}\n\n.note-btn-block {\n  display: block;\n  width: 100%;\n}\n\n.note-btn-block + .note-btn-block {\n  margin-top:5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.note-btn-block {\n    width: 100%;\n  }\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  line-height: 1;\n  color: #000;\n  opacity: .2;\n}\n\n.close:hover {\n  -webkit-opacity: 1;\n   -khtml-opacity: 1;\n     -moz-opacity: 1;\n       -ms-filter: alpha(opacity=100);\n           filter: alpha(opacity=100);\n          opacity: 1\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-maker($color, $background, $focusBackground, $activeBackground, $border) {\n  color: $color;\n  background-color: $background;\n  border-color: $border;\n\n  &:focus,\n  &.focus {\n    color: $color;\n    background-color: $focusBackground;\n    border-color: $border;\n  }\n  &:hover {\n    color: $color;\n    background-color: $focusBackground;\n    border-color: $border;\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:focus,\n    &.focus {\n      background-color: $background;\n      border-color: $border;\n    }\n  }\n}\n\n// Button sizes\n@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {\n  padding: $padding-vertical $padding-horizontal;\n  font-size: $font-size;\n  line-height: $line-height;\n  border-radius: $border-radius;\n}\n",".note-dropdown {\n  position: relative;\n\n}\n.note-color {\n  .dropdown-toggle {\n    width: 30px;\n    padding-left: 5px;\n  }\n}\n.note-dropdown-menu {\n  display: none;\n  min-width: 100px;\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index : $zindex-dropdown;\n  float: left;\n  text-align:left;\n  background: $dropdown-color-bg;\n  border: 1px solid $dropdown-color-border;\n  padding: 5px;\n  background-clip: padding-box;\n  @include box-shadow(0 1px 1px rgba(0,0,0,.06));\n\n  > *:last-child {\n    margin-right: 0;\n  }\n}\n\n.note-btn-group.open .note-dropdown-menu {\n  display: block;\n}\n\n.note-dropdown-item {\n  display: block;\n\n  &:hover {\n    background-color: $btn-default-hover-bg;\n  }\n}\n\na.note-dropdown-item,\na.note-dropdown-item:hover {\n  margin: 5px 0;\n  color: #000;\n  text-decoration: none;\n}\n",".note-modal {\n  position: fixed;\n  left: 0;\n  right: 0;\n  top: 0;\n  bottom: 0;\n  z-index: $zindex-modal;\n  @include opacity(1);\n  display: none;\n\n  &.open {\n    display:block;\n  }\n}\n\n.note-modal-content {\n  position: relative;\n  width: auto;\n  margin: 30px 20px;\n  border: 1px solid $modal-content-border-color;\n  background: $modal-content-bg;\n  background-clip: border-box;\n  outline: 0;\n  border-radius: 5px;\n  @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n}\n\n.note-modal-header {\n  padding: 10px 20px;\n  border: 1px solid #ededef;\n}\n\n.note-modal-body {\n  position: relative;\n  padding: 20px 30px;\n\n  // shortcut text style\n  kbd {\n    border-radius: 2px;\n    background-color: #000;\n    color: #fff;\n    padding: 3px 5px;\n    font-weight: 700;\n    @include box-sizing();\n  }\n}\n\n.note-modal-footer {\n  height: 40px;\n  padding: 10px;\n  text-align: center;\n\n}\n\n.note-modal-footer a {\n  color: #337ab7;\n  text-decoration: none\n}\n\n.note-modal-footer a:hover,\n.note-modal-footer a:focus {\n  color: #23527c;\n  text-decoration: underline\n}\n\n.note-modal-footer .note-btn {\n  float: right\n}\n\n.note-modal-title {\n  font-size: 20px;\n  color: #42515f;\n  margin: 0;\n  line-height: 1.4;\n}\n\n.note-modal-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: $zindex-modal-background;\n  background: $modal-backdrop-bg;\n  @include opacity(0.5);\n  display: none;\n\n  &.open {\n    display: block;\n  }\n}\n\n\n// Scale up the modal\n@media (min-width: 768px) {\n  // Automatically set modal's width for larger viewports\n  .note-modal-content {\n    width: 600px;\n    margin: 30px auto;\n  }\n}\n\n@media (min-width: 992px) {\n  .note-modal-content-large {\n    width: 900px;\n  }\n}\n\n.note-modal {\n\n  .note-help-block {\n    display: block;\n    margin-top: 5px;\n    margin-bottom: 10px;\n    color: #737373;\n  }\n\n  .note-nav {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-wrap: wrap;\n        flex-wrap: wrap;\n    padding-left: 0;\n    margin-bottom: 0;\n    list-style: none;\n  }\n\n  .note-nav-link {\n    display: block;\n    padding: 0.5rem 1rem;\n    color: #007bff;\n    text-decoration: none;\n    background-color: transparent;\n    -webkit-text-decoration-skip: objects;\n  }\n\n  .note-nav-link:focus,\n  .note-nav-link:hover {\n    color: #0056b3;\n    text-decoration: none;\n  }\n\n  .note-nav-link.disabled {\n    color: #868e96;\n  }\n\n  .note-nav-tabs {\n    border-bottom: 1px solid #ddd;\n  }\n\n  .note-nav-tabs .note-nav-item {\n    margin-bottom: -1px;\n  }\n\n  .note-nav-tabs .note-nav-link {\n    border: 1px solid transparent;\n    border-top-left-radius: 0.25rem;\n    border-top-right-radius: 0.25rem;\n  }\n\n  .note-nav-tabs .note-nav-link:focus,\n  .note-nav-tabs .note-nav-link:hover {\n    border-color: #e9ecef #e9ecef #ddd;\n  }\n\n  .note-nav-tabs .note-nav-link.disabled {\n    color: #868e96;\n    background-color: transparent;\n    border-color: transparent;\n  }\n\n  .note-nav-tabs .note-nav-item.show .note-nav-link {\n    color: #495057;\n    background-color: #fff;\n    border-color: #ddd #ddd #fff;\n  }\n\n  .note-tab-content {\n    margin: 15px auto;\n  }\n\n  .note-tab-content > .note-tab-pane:target ~ .note-tab-pane:last-child,\n  .note-tab-content > .note-tab-pane {\n    display: none;\n  }\n  .note-tab-content > :last-child,\n  .note-tab-content > .note-tab-pane:target {\n    display: block;\n  }\n}\n",".note-form-group {\n  padding-bottom: 20px;\n}\n\n.note-form-group:last-child {\n  padding-bottom: 0;\n}\n\n.note-form-label {\n  display: block;\n  width: 100%;\n  font-size: 16px;\n  color: #42515f;\n  margin-bottom: 10px;\n  font-weight: 700;\n}\n\n.note-input {\n  width: 100%;\n  display: block;\n  border: 1px solid #ededef;\n  background: #fff;\n  outline: 0;\n  padding: 6px 4px;\n  font-size: 14px;\n  @include box-sizing();\n}\n\n\n.note-input::-webkit-input-placeholder {\n  color: $gray-lighter;\n}\n\n.note-input:-moz-placeholder { /* Firefox 18- */\n  color: $gray-lighter;\n}\n\n.note-input::-moz-placeholder {  /* Firefox 19+ */\n  color: $gray-lighter;\n}\n\n.note-input:-ms-input-placeholder {\n  color: $gray-lighter;\n}\n",".note-tooltip {\n  position: absolute;\n  z-index: $zindex-tooltip;\n  display: block;\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  font-size: 13px;\n\n  transition: opacity .15s;\n  @include opacity(0);\n\n  &.in     { @include opacity($tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: $tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 $tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: $tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 $tooltip-arrow-width; }\n}\n\n.note-tooltip {\n  &.bottom .note-tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-bottom-color: $tooltip-arrow-color;\n  }\n\n  &.top .note-tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-top-color: $tooltip-arrow-color;\n  }\n\n  &.right .note-tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n    border-right-color: $tooltip-arrow-color;\n  }\n  &.left .note-tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -$tooltip-arrow-width;\n    border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n    border-left-color: $tooltip-arrow-color;\n  }\n}\n\n\n.note-tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.note-tooltip-content {\n  max-width: $tooltip-max-width;\n  font-family: $font-family;\n  padding: 3px 8px;\n  color: $tooltip-color;\n  text-align: center;\n  background-color: $tooltip-bg;\n}\n",".note-popover {\n  position: absolute;\n  z-index: $zindex-popover;\n  display: block;\n  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  font-size: 13px;\n  font-family: $font-family;\n\n  display: none;\n  background: $popover-bg;\n  border: 1px solid $popover-border-color;\n  border: 1px solid $popover-fallback-border-color;\n\n  &.in     { display: block; }\n  &.top    { margin-top:  -10px; padding: $tooltip-arrow-width 0; }\n  &.right  { margin-left:  10px; padding: 0 $tooltip-arrow-width; }\n  &.bottom { margin-top:   10px; padding: $tooltip-arrow-width 0; }\n  &.left   { margin-left: -10px; padding: 0 $tooltip-arrow-width; }\n}\n\n.note-popover {\n  &.bottom .note-popover-arrow {\n    top: -11px;\n    left: 20px;\n    margin-left: -$popover-arrow-width;\n    border-top-width: 0;\n    border-bottom-color: $popover-arrow-outer-fallback-color;\n    border-bottom-color: $popover-arrow-outer-color;\n\n    &::after {\n      top: 1px;\n      margin-left: -10px;\n      content: \" \";\n      border-top-width: 0;\n      border-bottom-color: #fff;\n    }\n  }\n\n  &.top .note-popover-arrow {\n    bottom: -11px;\n    left: 20px;\n    margin-left: -$popover-arrow-width;\n    border-bottom-width: 0;\n    border-top-color: $popover-arrow-outer-fallback-color;\n    border-top-color: $popover-arrow-outer-color;\n\n    &::after {\n      bottom: 1px;\n      margin-left: -10px;\n      content: \" \";\n      border-bottom-width: 0;\n      border-top-color: #fff;\n    }\n  }\n\n  &.right .note-popover-arrow {\n    top: 50%;\n    left: -11px;\n    margin-top: -$popover-arrow-width;\n    border-left-width: 0;\n    border-right-color: $popover-arrow-outer-fallback-color;\n    border-right-color: $popover-arrow-outer-color;\n\n    &::after {\n      left: 1px;\n      margin-top: -10px;\n      content: \" \";\n      border-left-width: 0;\n      border-right-color: #fff;\n    }\n\n  }\n  &.left .note-popover-arrow {\n    top: 50%;\n    right: -11px;\n    margin-top: -$popover-arrow-width;\n    border-right-width: 0;\n    border-left-color: $popover-arrow-outer-fallback-color;\n    border-left-color: $popover-arrow-outer-color;\n\n    &::after {\n      right: 1px;\n      margin-top: -10px;\n      content: \" \";\n      border-right-width: 0;\n      border-left-color: #fff;\n    }\n  }\n}\n\n\n.note-popover-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border: 11px solid transparent;\n\n  &::after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n\n\n    content :  \" \";\n    border-width: 10px;\n  }\n\n}\n\n.note-popover-content {\n  /*max-width: $popover-max-width;*/\n  padding: 3px 8px;\n  color: $popover-color;\n  text-align: center;\n  background-color: $popover-bg;\n  min-width: 100px;\n  min-height: 30px;\n}\n","@import \"elements.scss\";\n\n/* Theme Variables\n ------------------------------------------ */\n$border-color: #00000032;\n$background-color: #8080801d;\n\n$img-margin-left: 10px;\n$img-margin-right: 10px;\n\n/* Layout\n ------------------------------------------ */\n.note-editor {\n  position: relative;\n\n  // dropzone\n  $dropzone-color: lightskyblue;\n  $dropzone-active-color: darken($dropzone-color, 30);\n  .note-dropzone {\n    position: absolute;\n    display: none;\n    z-index: 100;\n    color: $dropzone-color;\n    background-color: #fff;\n    opacity: 0.95;\n\n    .note-dropzone-message {\n      display: table-cell;\n      vertical-align: middle;\n      text-align: center;\n      font-size: 28px;\n      font-weight: 700;\n    }\n\n    &.hover {\n      color: $dropzone-active-color;\n    }\n  }\n\n  &.dragover .note-dropzone {\n    display: table;\n  }\n\n  .note-editing-area {\n    position: relative;\n\n    .note-editable {\n      outline: none;\n\n      sup {\n        vertical-align: super;\n      }\n\n      sub {\n        vertical-align: sub;\n      }\n\n      img.note-float-left {\n        margin-right: $img-margin-right;\n      }\n\n      img.note-float-right {\n        margin-left: $img-margin-left;\n      }\n    }\n  }\n}\n\n/* Frame mode layout\n ------------------------------------------ */\n.note-editor.note-frame,\n.note-editor.note-airframe {\n  border: 1px solid $border-color;\n\n  // codeview mode\n  &.codeview {\n    .note-editing-area {\n      .note-editable {\n        display: none;\n      }\n      .note-codable {\n        display: block;\n      }\n    }\n  }\n\n  .note-editing-area {\n    overflow: hidden;\n\n    // editable\n    .note-editable {\n      padding: 10px;\n      overflow: auto;\n      word-wrap: break-word;\n\n      &[contenteditable=\"false\"] {\n        background-color: $background-color;\n      }\n    }\n\n    // codeable\n    .note-codable {\n      display: none;\n      width: 100%;\n      padding: 10px;\n      border: none;\n      box-shadow: none;\n      font-family: Menlo, Monaco, monospace, sans-serif;\n      font-size: 14px;\n      color: #ccc;\n      background-color: #222;\n      resize: none;\n      outline: none;\n\n      // override BS2 default style\n      @include box-sizing(border-box);\n      @include rounded(0);\n      margin-bottom: 0;\n    }\n  }\n\n  // fullscreen mode\n  &.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100% !important;\n    z-index: 1050; // bs3 modal-backdrop: 1030, bs2: 1040\n    .note-resizebar {\n      display: none;\n    }\n  }\n\n  // Notifications\n  .note-status-output {\n    display: block;\n    width: 100%;\n    font-size: 14px;\n    line-height: 1.42857143;\n    height: 20px;\n    margin-bottom: 0;\n    color: #000;\n    border: 0;\n    border-top: 1px solid #e2e2e2;\n  }\n\n  .note-status-output:empty {\n    height: 0;\n    border-top: 0 solid transparent;\n  }\n\n  .note-status-output .pull-right {\n    float: right !important;\n  }\n\n  .note-status-output .text-muted {\n    color: #777;\n  }\n\n  .note-status-output .text-primary {\n    color: #286090;\n  }\n\n  .note-status-output .text-success {\n    color: #3c763d;\n  }\n\n  .note-status-output .text-info {\n    color: #31708f;\n  }\n\n  .note-status-output .text-warning {\n    color: #8a6d3b;\n  }\n\n  .note-status-output .text-danger {\n    color: #a94442;\n  }\n\n  .note-status-output .alert {\n    margin: -7px 0 0 0;\n    padding: 7px 10px 2px 10px;\n    border-radius: 0;\n    color: #000;\n    background-color: #f5f5f5;\n  }\n\n  .note-status-output .alert .note-icon {\n    margin-right: 5px;\n  }\n\n  .note-status-output .alert-success {\n    color: #3c763d !important;\n    background-color: #dff0d8 !important;\n  }\n\n  .note-status-output .alert-info {\n    color: #31708f !important;\n    background-color: #d9edf7 !important;\n  }\n\n  .note-status-output .alert-warning {\n    color: #8a6d3b !important;\n    background-color: #fcf8e3 !important;\n  }\n\n  .note-status-output .alert-danger {\n    color: #a94442 !important;\n    background-color: #f2dede !important;\n  }\n\n  // statusbar\n  .note-statusbar {\n    background-color: $background-color;\n    border-bottom-left-radius: 4px;\n    border-bottom-right-radius: 4px;\n    border-top: 1px solid $border-color;\n    .note-resizebar {\n      padding-top: 1px;\n      height: 9px;\n      width: 100%;\n      cursor: ns-resize;\n      .note-icon-bar {\n        width: 20px;\n        margin: 1px auto;\n        border-top: 1px solid $border-color;\n      }\n    }\n\n    &.locked {\n      .note-resizebar {\n        cursor: default;\n        .note-icon-bar {\n          display: none;\n        }\n      }\n    }\n  }\n  .note-placeholder {\n    padding: 10px;\n  }\n}\n\n.note-editor.note-airframe {\n  border: 0;\n\n  .note-editing-area {\n    .note-editable {\n      padding: 0;\n    }\n  }\n}\n\n\n/* Popover\n ------------------------------------------ */\n.note-popover.popover {\n  display: none;\n  max-width: none;\n\n  .popover-content {\n    a {\n      display: inline-block;\n      max-width: 200px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap; // for FF\n      vertical-align: middle; // for FF\n    }\n  }\n  .arrow {\n    left: 20px !important;\n  }\n}\n\n/* Popover and Toolbar (Button container)\n ------------------------------------------ */\n.note-toolbar {\n  position: relative;\n}\n\n.note-popover .popover-content, .note-editor .note-toolbar {\n  margin: 0;\n  padding: 0 0 5px 5px;\n\n  & > .note-btn-group {\n    margin-top: 5px;\n    margin-left: 0;\n    margin-right: 5px;\n  }\n\n  .note-btn-group {\n    .note-table {\n      min-width: 0;\n      padding: 5px;\n      .note-dimension-picker {\n        font-size: 18px;\n        .note-dimension-picker-mousecatcher {\n          position: absolute !important;\n          z-index: 3;\n          width: 10em;\n          height: 10em;\n          cursor: pointer;\n        }\n        .note-dimension-picker-unhighlighted {\n          position: relative !important;\n          z-index: 1;\n          width: 5em;\n          height: 5em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n        .note-dimension-picker-highlighted {\n          position: absolute !important;\n          z-index: 2;\n          width: 1em;\n          height: 1em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n      }\n    }\n  }\n\n  .note-style {\n    .dropdown-style {\n      blockquote, pre {\n        margin: 0;\n        padding: 5px 10px;\n      }\n      h1, h2, h3, h4, h5, h6, p {\n        margin: 0;\n        padding: 0;\n      }\n    }\n  }\n\n  .note-color-all {\n    .note-dropdown-menu {\n      min-width: 337px;\n    }\n  }\n\n  .note-color {\n    .dropdown-toggle {\n      width: 20px;\n      padding-left: 5px;\n    }\n    .note-dropdown-menu {\n      .note-palette {\n        display: inline-block;\n        margin: 0;\n        width: 160px;\n        &:first-child {\n          margin: 0 5px;\n        }\n\n        .note-palette-title {\n          font-size: 12px;\n          margin: 2px 7px;\n          text-align: center;\n          border-bottom: 1px solid #eee;\n        }\n\n        .note-color-reset,\n        .note-color-select {\n          font-size: 11px;\n          margin: 3px;\n          padding: 0 3px;\n          cursor: pointer;\n          width: 100%;\n          @include rounded(5px);\n\n          &:hover {\n            background: #eee;\n          }\n        }\n\n        .note-color-row {\n          height: 20px;\n        }\n\n        .note-color-select-btn {\n          display: none;\n        }\n\n        .note-holder-custom {\n          .note-color-btn {\n            border: 1px solid #eee;\n          }\n        }\n      }\n    }\n  }\n\n  .note-para {\n    .note-dropdown-menu {\n      min-width: 228px;\n      padding: 5px;\n      & > div + div {\n        margin-left: 5px;\n      }\n    }\n  }\n\n  // dropdown-menu for toolbar and popover\n  .note-dropdown-menu {\n    min-width: 160px;\n\n    // dropdown-menu right position\n    // http://forrst.com/posts/Bootstrap_right_positioned_dropdown-2KB\n    &.right {\n      right: 0;\n      left: auto;\n      &::before {\n        right: 9px;\n        left: auto !important;\n      }\n      &::after {\n        right: 10px;\n        left: auto !important;\n      }\n    }\n    // dropdown-menu for selectbox\n    &.note-check {\n      a i {\n        color: deepskyblue;\n        visibility: hidden;\n      }\n      a.checked i {\n        visibility: visible;\n      }\n    }\n  }\n\n  .note-fontsize-10 {\n    font-size: 10px;\n  }\n\n  // color palette for toolbar and popover\n  .note-color-palette {\n    line-height: 1;\n    div {\n      .note-color-btn {\n        width: 20px;\n        height: 20px;\n        padding: 0;\n        margin: 0;\n        border: 0;\n        border-radius: 0;\n      }\n      .note-color-btn:hover {\n        transform: scale(1.2);\n        transition: all 0.2s;\n      }\n    }\n  }\n}\n\n/* Dialog\n ------------------------------------------ */\n.note-modal {\n  .modal-dialog {\n    outline: 0;\n    border-radius: 5px;\n    @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n  }\n  .form-group { // overwrite BS's form-horizontal minus margins\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .note-modal-form {\n    margin: 0; // overwrite BS2's form margin bottom\n  }\n  .note-image-dialog {\n    .note-dropzone {\n      min-height: 100px;\n      font-size: 30px;\n      line-height: 4; // vertical-align\n      color: lightgray;\n      text-align: center;\n      border: 4px dashed lightgray;\n      margin-bottom: 10px;\n    }\n  }\n\n  // [workaround] firefox fileinput\n  @-moz-document url-prefix() {\n    .note-image-input {\n      height: auto;\n    }\n  }\n}\n\n/* Placeholder\n ------------------------------------------ */\n.note-placeholder {\n  position: absolute;\n  display: none;\n  color: gray;\n}\n\n/* Handle\n ------------------------------------------ */\n.note-handle {\n  // control selection\n  .note-control-selection {\n    position: absolute;\n    display: none;\n    border: 1px solid #000;\n    & > div {\n      position: absolute;\n    }\n\n    .note-control-selection-bg {\n      width: 100%;\n      height: 100%;\n      background-color: #000;\n      @include opacity(0.3);\n    }\n\n    .note-control-handle {\n      width: 7px;\n      height: 7px;\n      border: 1px solid #000;\n    }\n\n    .note-control-holder {\n      @extend .note-control-handle;\n    }\n\n    .note-control-sizing {\n      @extend .note-control-handle;\n      background-color: #000;\n    }\n\n    .note-control-nw {\n      top: -5px;\n      left: -5px;\n      border-right: none;\n      border-bottom: none;\n    }\n\n    .note-control-ne {\n      top: -5px;\n      right: -5px;\n      border-bottom: none;\n      border-left: none;\n    }\n\n    .note-control-sw {\n      bottom: -5px;\n      left: -5px;\n      border-top: none;\n      border-right: none;\n    }\n\n    .note-control-se {\n      right: -5px;\n      bottom: -5px;\n      cursor: se-resize;\n    }\n\n    .note-control-se.note-control-holder {\n      cursor: default;\n      border-top: none;\n      border-left: none;\n    }\n\n    .note-control-selection-info {\n      right: 0;\n      bottom: 0;\n      padding: 5px;\n      margin: 5px;\n      color: #fff;\n      background-color: #000;\n      font-size: 12px;\n      @include rounded(5px);\n      @include opacity(0.7);\n    }\n  }\n}\n\n.note-hint-popover {\n  min-width: 100px;\n  padding: 2px;\n\n  .popover-content {\n    padding: 3px;\n    max-height: 150px;\n    overflow: auto;\n\n    .note-hint-group {\n      .note-hint-item {\n        display: block !important;\n        padding: 3px;\n\n        &.active, &:hover {\n          display: block;\n          clear: both;\n          font-weight: 400;\n          line-height: 1.4;\n          color: white;\n          white-space: nowrap;\n          text-decoration: none;\n          background-color: #428bca;\n          outline: 0;\n          cursor: pointer;\n        }\n      }\n    }\n  }\n}\n\n/* Handle\n ------------------------------------------ */\nhtml, body {\n  .note-fullscreen-body {\n    overflow: hidden !important;\n  }\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js
new file mode 100644
index 0000000..022e7b7
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js
@@ -0,0 +1,10783 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("jQuery"));
+	else if(typeof define === 'function' && define.amd)
+		define(["jQuery"], factory);
+	else {
+		var a = typeof exports === 'object' ? factory(require("jQuery")) : factory(root["jQuery"]);
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {
+return /******/ (() => { // webpackBootstrap
+/******/ 	"use strict";
+/******/ 	var __webpack_modules__ = ({
+
+/***/ 9770:
+/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => {
+
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1145);
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
+
+(jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) = (jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) || {
+  lang: {}
+};
+jquery__WEBPACK_IMPORTED_MODULE_0___default().extend((jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote.lang), {
+  'en-US': {
+    font: {
+      bold: 'Bold',
+      italic: 'Italic',
+      underline: 'Underline',
+      clear: 'Remove Font Style',
+      height: 'Line Height',
+      name: 'Font Family',
+      strikethrough: 'Strikethrough',
+      subscript: 'Subscript',
+      superscript: 'Superscript',
+      size: 'Font Size',
+      sizeunit: 'Font Size Unit'
+    },
+    image: {
+      image: 'Picture',
+      insert: 'Insert Image',
+      resizeFull: 'Resize full',
+      resizeHalf: 'Resize half',
+      resizeQuarter: 'Resize quarter',
+      resizeNone: 'Original size',
+      floatLeft: 'Float Left',
+      floatRight: 'Float Right',
+      floatNone: 'Remove float',
+      shapeRounded: 'Shape: Rounded',
+      shapeCircle: 'Shape: Circle',
+      shapeThumbnail: 'Shape: Thumbnail',
+      shapeNone: 'Shape: None',
+      dragImageHere: 'Drag image or text here',
+      dropImage: 'Drop image or Text',
+      selectFromFiles: 'Select from files',
+      maximumFileSize: 'Maximum file size',
+      maximumFileSizeError: 'Maximum file size exceeded.',
+      url: 'Image URL',
+      remove: 'Remove Image',
+      original: 'Original'
+    },
+    video: {
+      video: 'Video',
+      videoLink: 'Video Link',
+      insert: 'Insert Video',
+      url: 'Video URL',
+      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)'
+    },
+    link: {
+      link: 'Link',
+      insert: 'Insert Link',
+      unlink: 'Unlink',
+      edit: 'Edit',
+      textToDisplay: 'Text to display',
+      url: 'To what URL should this link go?',
+      openInNewWindow: 'Open in new window',
+      useProtocol: 'Use default protocol'
+    },
+    table: {
+      table: 'Table',
+      addRowAbove: 'Add row above',
+      addRowBelow: 'Add row below',
+      addColLeft: 'Add column left',
+      addColRight: 'Add column right',
+      delRow: 'Delete row',
+      delCol: 'Delete column',
+      delTable: 'Delete table'
+    },
+    hr: {
+      insert: 'Insert Horizontal Rule'
+    },
+    style: {
+      style: 'Style',
+      p: 'Normal',
+      blockquote: 'Quote',
+      pre: 'Code',
+      h1: 'Header 1',
+      h2: 'Header 2',
+      h3: 'Header 3',
+      h4: 'Header 4',
+      h5: 'Header 5',
+      h6: 'Header 6'
+    },
+    lists: {
+      unordered: 'Unordered list',
+      ordered: 'Ordered list'
+    },
+    options: {
+      help: 'Help',
+      fullscreen: 'Full Screen',
+      codeview: 'Code View'
+    },
+    paragraph: {
+      paragraph: 'Paragraph',
+      outdent: 'Outdent',
+      indent: 'Indent',
+      left: 'Align left',
+      center: 'Align center',
+      right: 'Align right',
+      justify: 'Justify full'
+    },
+    color: {
+      recent: 'Recent Color',
+      more: 'More Color',
+      background: 'Background Color',
+      foreground: 'Text Color',
+      transparent: 'Transparent',
+      setTransparent: 'Set transparent',
+      reset: 'Reset',
+      resetToDefault: 'Reset to default',
+      cpSelect: 'Select'
+    },
+    shortcut: {
+      shortcuts: 'Keyboard shortcuts',
+      close: 'Close',
+      textFormatting: 'Text formatting',
+      action: 'Action',
+      paragraphFormatting: 'Paragraph formatting',
+      documentStyle: 'Document Style',
+      extraKeys: 'Extra keys'
+    },
+    help: {
+      'escape': 'Escape',
+      'insertParagraph': 'Insert Paragraph',
+      'undo': 'Undo the last command',
+      'redo': 'Redo the last command',
+      'tab': 'Tab',
+      'untab': 'Untab',
+      'bold': 'Set a bold style',
+      'italic': 'Set a italic style',
+      'underline': 'Set a underline style',
+      'strikethrough': 'Set a strikethrough style',
+      'removeFormat': 'Clean a style',
+      'justifyLeft': 'Set left align',
+      'justifyCenter': 'Set center align',
+      'justifyRight': 'Set right align',
+      'justifyFull': 'Set full align',
+      'insertUnorderedList': 'Toggle unordered list',
+      'insertOrderedList': 'Toggle ordered list',
+      'outdent': 'Outdent on current paragraph',
+      'indent': 'Indent on current paragraph',
+      'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+      'formatH1': 'Change current block\'s format as H1',
+      'formatH2': 'Change current block\'s format as H2',
+      'formatH3': 'Change current block\'s format as H3',
+      'formatH4': 'Change current block\'s format as H4',
+      'formatH5': 'Change current block\'s format as H5',
+      'formatH6': 'Change current block\'s format as H6',
+      'insertHorizontalRule': 'Insert horizontal rule',
+      'linkDialog.show': 'Show Link Dialog'
+    },
+    history: {
+      undo: 'Undo',
+      redo: 'Redo'
+    },
+    specialChar: {
+      specialChar: 'SPECIAL CHARACTERS',
+      select: 'Select Special characters'
+    },
+    output: {
+      noSelection: 'No Selection Made!'
+    }
+  }
+});
+
+/***/ }),
+
+/***/ 1145:
+/***/ ((module) => {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;
+
+/***/ })
+
+/******/ 	});
+/************************************************************************/
+/******/ 	// The module cache
+/******/ 	var __webpack_module_cache__ = {};
+/******/ 	
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// Check if module is in cache
+/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
+/******/ 		if (cachedModule !== undefined) {
+/******/ 			return cachedModule.exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = __webpack_module_cache__[moduleId] = {
+/******/ 			// no module.id needed
+/******/ 			// no module.loaded needed
+/******/ 			exports: {}
+/******/ 		};
+/******/ 	
+/******/ 		// Execute the module function
+/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/ 	
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/compat get default export */
+/******/ 	(() => {
+/******/ 		// getDefaultExport function for compatibility with non-harmony modules
+/******/ 		__webpack_require__.n = (module) => {
+/******/ 			var getter = module && module.__esModule ?
+/******/ 				() => (module['default']) :
+/******/ 				() => (module);
+/******/ 			__webpack_require__.d(getter, { a: getter });
+/******/ 			return getter;
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	(() => {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = (exports, definition) => {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	(() => {
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/make namespace object */
+/******/ 	(() => {
+/******/ 		// define __esModule on exports
+/******/ 		__webpack_require__.r = (exports) => {
+/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 			}
+/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+// ESM COMPAT FLAG
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: external "jQuery"
+var external_jQuery_ = __webpack_require__(1145);
+var external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_);
+// EXTERNAL MODULE: ./src/lang/summernote-en-US.js
+var summernote_en_US = __webpack_require__(9770);
+;// CONCATENATED MODULE: ./src/js/core/env.js
+
+/**
+ * returns whether font is installed or not.
+ *
+ * @param {String} fontName
+ * @return {Boolean}
+ */
+
+var genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];
+
+function validFontName(fontName) {
+  return external_jQuery_default().inArray(fontName.toLowerCase(), genericFontFamilies) === -1 ? "'".concat(fontName, "'") : fontName;
+}
+
+function isFontInstalled(fontName) {
+  var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';
+  var testText = 'mmmmmmmmmmwwwww';
+  var testSize = '200px';
+  var canvas = document.createElement('canvas');
+  var context = canvas.getContext('2d');
+  context.font = testSize + " '" + testFontName + "'";
+  var originalWidth = context.measureText(testText).width;
+  context.font = testSize + ' ' + validFontName(fontName) + ', "' + testFontName + '"';
+  var width = context.measureText(testText).width;
+  return originalWidth !== width;
+}
+
+var userAgent = navigator.userAgent;
+var isMSIE = /MSIE|Trident/i.test(userAgent);
+var browserVersion;
+
+if (isMSIE) {
+  var matches = /MSIE (\d+[.]\d+)/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+
+  matches = /Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+}
+
+var isEdge = /Edge\/\d+/.test(userAgent);
+var isSupportTouch = 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; // [workaround] IE doesn't have input events for contentEditable
+// - see: https://goo.gl/4bfIvA
+
+var inputEventName = isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';
+/**
+ * @class core.env
+ *
+ * Object which check platform and agent
+ *
+ * @singleton
+ * @alternateClassName env
+ */
+
+/* harmony default export */ const env = ({
+  isMac: navigator.appVersion.indexOf('Mac') > -1,
+  isMSIE: isMSIE,
+  isEdge: isEdge,
+  isFF: !isEdge && /firefox/i.test(userAgent),
+  isPhantom: /PhantomJS/i.test(userAgent),
+  isWebkit: !isEdge && /webkit/i.test(userAgent),
+  isChrome: !isEdge && /chrome/i.test(userAgent),
+  isSafari: !isEdge && /safari/i.test(userAgent) && !/chrome/i.test(userAgent),
+  browserVersion: browserVersion,
+  isSupportTouch: isSupportTouch,
+  isFontInstalled: isFontInstalled,
+  isW3CRangeSupport: !!document.createRange,
+  inputEventName: inputEventName,
+  genericFontFamilies: genericFontFamilies,
+  validFontName: validFontName
+});
+;// CONCATENATED MODULE: ./src/js/core/func.js
+
+/**
+ * @class core.func
+ *
+ * func utils (for high-order func's arg)
+ *
+ * @singleton
+ * @alternateClassName func
+ */
+
+function eq(itemA) {
+  return function (itemB) {
+    return itemA === itemB;
+  };
+}
+
+function eq2(itemA, itemB) {
+  return itemA === itemB;
+}
+
+function peq2(propName) {
+  return function (itemA, itemB) {
+    return itemA[propName] === itemB[propName];
+  };
+}
+
+function ok() {
+  return true;
+}
+
+function fail() {
+  return false;
+}
+
+function not(f) {
+  return function () {
+    return !f.apply(f, arguments);
+  };
+}
+
+function and(fA, fB) {
+  return function (item) {
+    return fA(item) && fB(item);
+  };
+}
+
+function func_self(a) {
+  return a;
+}
+
+function invoke(obj, method) {
+  return function () {
+    return obj[method].apply(obj, arguments);
+  };
+}
+
+var idCounter = 0;
+/**
+ * reset globally-unique id
+ *
+ */
+
+function resetUniqueId() {
+  idCounter = 0;
+}
+/**
+ * generate a globally-unique id
+ *
+ * @param {String} [prefix]
+ */
+
+
+function uniqueId(prefix) {
+  var id = ++idCounter + '';
+  return prefix ? prefix + id : id;
+}
+/**
+ * returns bnd (bounds) from rect
+ *
+ * - IE Compatibility Issue: http://goo.gl/sRLOAo
+ * - Scroll Issue: http://goo.gl/sNjUc
+ *
+ * @param {Rect} rect
+ * @return {Object} bounds
+ * @return {Number} bounds.top
+ * @return {Number} bounds.left
+ * @return {Number} bounds.width
+ * @return {Number} bounds.height
+ */
+
+
+function rect2bnd(rect) {
+  var $document = external_jQuery_default()(document);
+  return {
+    top: rect.top + $document.scrollTop(),
+    left: rect.left + $document.scrollLeft(),
+    width: rect.right - rect.left,
+    height: rect.bottom - rect.top
+  };
+}
+/**
+ * returns a copy of the object where the keys have become the values and the values the keys.
+ * @param {Object} obj
+ * @return {Object}
+ */
+
+
+function invertObject(obj) {
+  var inverted = {};
+
+  for (var key in obj) {
+    if (Object.prototype.hasOwnProperty.call(obj, key)) {
+      inverted[obj[key]] = key;
+    }
+  }
+
+  return inverted;
+}
+/**
+ * @param {String} namespace
+ * @param {String} [prefix]
+ * @return {String}
+ */
+
+
+function namespaceToCamel(namespace, prefix) {
+  prefix = prefix || '';
+  return prefix + namespace.split('.').map(function (name) {
+    return name.substring(0, 1).toUpperCase() + name.substring(1);
+  }).join('');
+}
+/**
+ * Returns a function, that, as long as it continues to be invoked, will not
+ * be triggered. The function will be called after it stops being called for
+ * N milliseconds. If `immediate` is passed, trigger the function on the
+ * leading edge, instead of the trailing.
+ * @param {Function} func
+ * @param {Number} wait
+ * @param {Boolean} immediate
+ * @return {Function}
+ */
+
+
+function debounce(func, wait, immediate) {
+  var timeout;
+  return function () {
+    var context = this;
+    var args = arguments;
+
+    var later = function later() {
+      timeout = null;
+
+      if (!immediate) {
+        func.apply(context, args);
+      }
+    };
+
+    var callNow = immediate && !timeout;
+    clearTimeout(timeout);
+    timeout = setTimeout(later, wait);
+
+    if (callNow) {
+      func.apply(context, args);
+    }
+  };
+}
+/**
+ *
+ * @param {String} url
+ * @return {Boolean}
+ */
+
+
+function isValidUrl(url) {
+  var expression = /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
+  return expression.test(url);
+}
+
+/* harmony default export */ const func = ({
+  eq: eq,
+  eq2: eq2,
+  peq2: peq2,
+  ok: ok,
+  fail: fail,
+  self: func_self,
+  not: not,
+  and: and,
+  invoke: invoke,
+  resetUniqueId: resetUniqueId,
+  uniqueId: uniqueId,
+  rect2bnd: rect2bnd,
+  invertObject: invertObject,
+  namespaceToCamel: namespaceToCamel,
+  debounce: debounce,
+  isValidUrl: isValidUrl
+});
+;// CONCATENATED MODULE: ./src/js/core/lists.js
+
+/**
+ * returns the first item of an array.
+ *
+ * @param {Array} array
+ */
+
+function head(array) {
+  return array[0];
+}
+/**
+ * returns the last item of an array.
+ *
+ * @param {Array} array
+ */
+
+
+function last(array) {
+  return array[array.length - 1];
+}
+/**
+ * returns everything but the last entry of the array.
+ *
+ * @param {Array} array
+ */
+
+
+function initial(array) {
+  return array.slice(0, array.length - 1);
+}
+/**
+ * returns the rest of the items in an array.
+ *
+ * @param {Array} array
+ */
+
+
+function tail(array) {
+  return array.slice(1);
+}
+/**
+ * returns item of array
+ */
+
+
+function find(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    var item = array[idx];
+
+    if (pred(item)) {
+      return item;
+    }
+  }
+}
+/**
+ * returns true if all of the values in the array pass the predicate truth test.
+ */
+
+
+function lists_all(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!pred(array[idx])) {
+      return false;
+    }
+  }
+
+  return true;
+}
+/**
+ * returns true if the value is present in the list.
+ */
+
+
+function contains(array, item) {
+  if (array && array.length && item) {
+    if (array.indexOf) {
+      return array.indexOf(item) !== -1;
+    } else if (array.contains) {
+      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`
+      return array.contains(item);
+    }
+  }
+
+  return false;
+}
+/**
+ * get sum from a list
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - iterator
+ */
+
+
+function sum(array, fn) {
+  fn = fn || func.self;
+  return array.reduce(function (memo, v) {
+    return memo + fn(v);
+  }, 0);
+}
+/**
+ * returns a copy of the collection with array type.
+ * @param {Collection} collection - collection eg) node.childNodes, ...
+ */
+
+
+function from(collection) {
+  var result = [];
+  var length = collection.length;
+  var idx = -1;
+
+  while (++idx < length) {
+    result[idx] = collection[idx];
+  }
+
+  return result;
+}
+/**
+ * returns whether list is empty or not
+ */
+
+
+function isEmpty(array) {
+  return !array || !array.length;
+}
+/**
+ * cluster elements by predicate function.
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ * @param {Array[]}
+ */
+
+
+function clusterBy(array, fn) {
+  if (!array.length) {
+    return [];
+  }
+
+  var aTail = tail(array);
+  return aTail.reduce(function (memo, v) {
+    var aLast = last(memo);
+
+    if (fn(last(aLast), v)) {
+      aLast[aLast.length] = v;
+    } else {
+      memo[memo.length] = [v];
+    }
+
+    return memo;
+  }, [[head(array)]]);
+}
+/**
+ * returns a copy of the array with all false values removed
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ */
+
+
+function compact(array) {
+  var aResult = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (array[idx]) {
+      aResult.push(array[idx]);
+    }
+  }
+
+  return aResult;
+}
+/**
+ * produces a duplicate-free version of the array
+ *
+ * @param {Array} array
+ */
+
+
+function unique(array) {
+  var results = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!contains(results, array[idx])) {
+      results.push(array[idx]);
+    }
+  }
+
+  return results;
+}
+/**
+ * returns next item.
+ * @param {Array} array
+ */
+
+
+function next(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx + 1];
+  }
+
+  return null;
+}
+/**
+ * returns prev item.
+ * @param {Array} array
+ */
+
+
+function prev(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx - 1];
+  }
+
+  return null;
+}
+/**
+ * @class core.list
+ *
+ * list utils
+ *
+ * @singleton
+ * @alternateClassName list
+ */
+
+
+/* harmony default export */ const lists = ({
+  head: head,
+  last: last,
+  initial: initial,
+  tail: tail,
+  prev: prev,
+  next: next,
+  find: find,
+  contains: contains,
+  all: lists_all,
+  sum: sum,
+  from: from,
+  isEmpty: isEmpty,
+  clusterBy: clusterBy,
+  compact: compact,
+  unique: unique
+});
+;// CONCATENATED MODULE: ./src/js/core/dom.js
+
+
+
+
+var NBSP_CHAR = String.fromCharCode(160);
+var ZERO_WIDTH_NBSP_CHAR = "\uFEFF";
+/**
+ * @method isEditable
+ *
+ * returns whether node is `note-editable` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+function isEditable(node) {
+  return node && external_jQuery_default()(node).hasClass('note-editable');
+}
+/**
+ * @method isControlSizing
+ *
+ * returns whether node is `note-control-sizing` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function isControlSizing(node) {
+  return node && external_jQuery_default()(node).hasClass('note-control-sizing');
+}
+/**
+ * @method makePredByNodeName
+ *
+ * returns predicate which judge whether nodeName is same
+ *
+ * @param {String} nodeName
+ * @return {Function}
+ */
+
+
+function makePredByNodeName(nodeName) {
+  nodeName = nodeName.toUpperCase();
+  return function (node) {
+    return node && node.nodeName.toUpperCase() === nodeName;
+  };
+}
+/**
+ * @method isText
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is text(3)
+ */
+
+
+function isText(node) {
+  return node && node.nodeType === 3;
+}
+/**
+ * @method isElement
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is element(1)
+ */
+
+
+function isElement(node) {
+  return node && node.nodeType === 1;
+}
+/**
+ * ex) br, col, embed, hr, img, input, ...
+ * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
+ */
+
+
+function isVoid(node) {
+  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());
+}
+
+function isPara(node) {
+  if (isEditable(node)) {
+    return false;
+  } // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
+
+
+  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+function isHeading(node) {
+  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+var isPre = makePredByNodeName('PRE');
+var isLi = makePredByNodeName('LI');
+
+function isPurePara(node) {
+  return isPara(node) && !isLi(node);
+}
+
+var isTable = makePredByNodeName('TABLE');
+var isData = makePredByNodeName('DATA');
+
+function isInline(node) {
+  return !isBodyContainer(node) && !isList(node) && !isHr(node) && !isPara(node) && !isTable(node) && !isBlockquote(node) && !isData(node);
+}
+
+function isList(node) {
+  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
+}
+
+var isHr = makePredByNodeName('HR');
+
+function isCell(node) {
+  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
+}
+
+var isBlockquote = makePredByNodeName('BLOCKQUOTE');
+
+function isBodyContainer(node) {
+  return isCell(node) || isBlockquote(node) || isEditable(node);
+}
+
+var isAnchor = makePredByNodeName('A');
+
+function isParaInline(node) {
+  return isInline(node) && !!ancestor(node, isPara);
+}
+
+function isBodyInline(node) {
+  return isInline(node) && !ancestor(node, isPara);
+}
+
+var isBody = makePredByNodeName('BODY');
+/**
+ * returns whether nodeB is closest sibling of nodeA
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ * @return {Boolean}
+ */
+
+function isClosestSibling(nodeA, nodeB) {
+  return nodeA.nextSibling === nodeB || nodeA.previousSibling === nodeB;
+}
+/**
+ * returns array of closest siblings with node
+ *
+ * @param {Node} node
+ * @param {function} [pred] - predicate function
+ * @return {Node[]}
+ */
+
+
+function withClosestSiblings(node, pred) {
+  pred = pred || func.ok;
+  var siblings = [];
+
+  if (node.previousSibling && pred(node.previousSibling)) {
+    siblings.push(node.previousSibling);
+  }
+
+  siblings.push(node);
+
+  if (node.nextSibling && pred(node.nextSibling)) {
+    siblings.push(node.nextSibling);
+  }
+
+  return siblings;
+}
+/**
+ * blank HTML for cursor position
+ * - [workaround] old IE only works with &nbsp;
+ * - [workaround] IE11 and other browser works with bogus br
+ */
+
+
+var blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';
+/**
+ * @method nodeLength
+ *
+ * returns #text's text size or element's childNodes size
+ *
+ * @param {Node} node
+ */
+
+function nodeLength(node) {
+  if (isText(node)) {
+    return node.nodeValue.length;
+  }
+
+  if (node) {
+    return node.childNodes.length;
+  }
+
+  return 0;
+}
+/**
+ * returns whether deepest child node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function deepestChildIsEmpty(node) {
+  do {
+    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;
+  } while (node = node.firstElementChild);
+
+  return dom_isEmpty(node);
+}
+/**
+ * returns whether node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function dom_isEmpty(node) {
+  var len = nodeLength(node);
+
+  if (len === 0) {
+    return true;
+  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {
+    // ex) <p><br></p>, <span><br></span>
+    return true;
+  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {
+    // ex) <p></p>, <span></span>
+    return true;
+  }
+
+  return false;
+}
+/**
+ * padding blankHTML if node is empty (for cursor position)
+ */
+
+
+function paddingBlankHTML(node) {
+  if (!isVoid(node) && !nodeLength(node)) {
+    node.innerHTML = blankHTML;
+  }
+}
+/**
+ * find nearest ancestor predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function ancestor(node, pred) {
+  while (node) {
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * find nearest ancestor only single child blood line and predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function singleChildAncestor(node, pred) {
+  node = node.parentNode;
+
+  while (node) {
+    if (nodeLength(node) !== 1) {
+      break;
+    }
+
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * returns new array of ancestor nodes (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listAncestor(node, pred) {
+  pred = pred || func.fail;
+  var ancestors = [];
+  ancestor(node, function (el) {
+    if (!isEditable(el)) {
+      ancestors.push(el);
+    }
+
+    return pred(el);
+  });
+  return ancestors;
+}
+/**
+ * find farthest ancestor predicate hit
+ */
+
+
+function lastAncestor(node, pred) {
+  var ancestors = listAncestor(node);
+  return lists.last(ancestors.filter(pred));
+}
+/**
+ * returns common ancestor node between two nodes.
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ */
+
+
+function commonAncestor(nodeA, nodeB) {
+  var ancestors = listAncestor(nodeA);
+
+  for (var n = nodeB; n; n = n.parentNode) {
+    if (ancestors.indexOf(n) > -1) return n;
+  }
+
+  return null; // difference document area
+}
+/**
+ * listing all previous siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listPrev(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.previousSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing next siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listNext(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.nextSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing descendant nodes
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listDescendant(node, pred) {
+  var descendants = [];
+  pred = pred || func.ok; // start DFS(depth first search) with node
+
+  (function fnWalk(current) {
+    if (node !== current && pred(current)) {
+      descendants.push(current);
+    }
+
+    for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
+      fnWalk(current.childNodes[idx]);
+    }
+  })(node);
+
+  return descendants;
+}
+/**
+ * wrap node with new tag.
+ *
+ * @param {Node} node
+ * @param {Node} tagName of wrapper
+ * @return {Node} - wrapper
+ */
+
+
+function wrap(node, wrapperName) {
+  var parent = node.parentNode;
+  var wrapper = external_jQuery_default()('<' + wrapperName + '>')[0];
+  parent.insertBefore(wrapper, node);
+  wrapper.appendChild(node);
+  return wrapper;
+}
+/**
+ * insert node after preceding
+ *
+ * @param {Node} node
+ * @param {Node} preceding - predicate function
+ */
+
+
+function insertAfter(node, preceding) {
+  var next = preceding.nextSibling;
+  var parent = preceding.parentNode;
+
+  if (next) {
+    parent.insertBefore(node, next);
+  } else {
+    parent.appendChild(node);
+  }
+
+  return node;
+}
+/**
+ * append elements.
+ *
+ * @param {Node} node
+ * @param {Collection} aChild
+ */
+
+
+function appendChildNodes(node, aChild) {
+  external_jQuery_default().each(aChild, function (idx, child) {
+    node.appendChild(child);
+  });
+  return node;
+}
+/**
+ * returns whether boundaryPoint is left edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePoint(point) {
+  return point.offset === 0;
+}
+/**
+ * returns whether boundaryPoint is right edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePoint(point) {
+  return point.offset === nodeLength(point.node);
+}
+/**
+ * returns whether boundaryPoint is edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isEdgePoint(point) {
+  return isLeftEdgePoint(point) || isRightEdgePoint(point);
+}
+/**
+ * returns whether node is left edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgeOf(node, ancestor) {
+  while (node && node !== ancestor) {
+    if (position(node) !== 0) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether node is right edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgeOf(node, ancestor) {
+  if (!ancestor) {
+    return false;
+  }
+
+  while (node && node !== ancestor) {
+    if (position(node) !== nodeLength(node.parentNode) - 1) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether point is left edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePointOf(point, ancestor) {
+  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);
+}
+/**
+ * returns whether point is right edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePointOf(point, ancestor) {
+  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);
+}
+/**
+ * returns offset from parent.
+ *
+ * @param {Node} node
+ */
+
+
+function position(node) {
+  var offset = 0;
+
+  while (node = node.previousSibling) {
+    offset += 1;
+  }
+
+  return offset;
+}
+
+function hasChildren(node) {
+  return !!(node && node.childNodes && node.childNodes.length);
+}
+/**
+ * returns previous boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPoint(point, isSkipInnerOffset) {
+  var node;
+  var offset;
+
+  if (point.offset === 0) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node);
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset - 1];
+    offset = nodeLength(node);
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? 0 : point.offset - 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPoint(point, isSkipInnerOffset) {
+  var node, offset;
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    var nextTextNode = getNextTextNode(point.node);
+
+    if (nextTextNode) {
+      node = nextTextNode;
+      offset = 0;
+    } else {
+      node = point.node.parentNode;
+      offset = position(point.node) + 1;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint with empty node
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointWithEmptyNode(point, isSkipInnerOffset) {
+  var node,
+      offset = 0; // if node is empty string node, return current node's sibling.
+
+  if (dom_isEmpty(point.node)) {
+    if (point.node === null) {
+      return null;
+    }
+
+    node = point.node.nextSibling;
+    offset = 0;
+    return {
+      node: node,
+      offset: offset
+    };
+  }
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node) + 1; // if next node is editable ,  return current node's sibling node.
+
+    if (isEditable(node)) {
+      node = point.node.nextSibling;
+      offset = 0;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+
+    if (dom_isEmpty(node)) {
+      if (!dom_isEmpty(point.node.nextSibling)) {
+        return {
+          node: point.node.nextSibling,
+          offset: offset
+        };
+      }
+
+      return null;
+    }
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+
+    if (dom_isEmpty(node)) {
+      return null;
+    }
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/*
+* returns the next Text node index or 0 if not found.
+*/
+
+
+function getNextTextNode(actual) {
+  if (!actual.nextSibling) return undefined;
+  if (actual.parent !== actual.nextSibling.parent) return undefined;
+  if (isText(actual.nextSibling)) return actual.nextSibling;else return getNextTextNode(actual.nextSibling);
+}
+/**
+ * returns whether pointA and pointB is same or not.
+ *
+ * @param {BoundaryPoint} pointA
+ * @param {BoundaryPoint} pointB
+ * @return {Boolean}
+ */
+
+
+function isSamePoint(pointA, pointB) {
+  return pointA.node === pointB.node && pointA.offset === pointB.offset;
+}
+/**
+ * returns whether point is visible (can set cursor) or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isVisiblePoint(point) {
+  if (isText(point.node) || !hasChildren(point.node) || dom_isEmpty(point.node)) {
+    return true;
+  }
+
+  var leftNode = point.node.childNodes[point.offset - 1];
+  var rightNode = point.node.childNodes[point.offset];
+
+  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {
+    return true;
+  }
+
+  return false;
+}
+/**
+ * @method prevPointUtil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = prevPoint(point);
+  }
+
+  return null;
+}
+/**
+ * @method nextPointUntil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = nextPoint(point);
+  }
+
+  return null;
+}
+/**
+ * returns whether point has character or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isCharPoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch && ch !== ' ' && ch !== NBSP_CHAR;
+}
+/**
+ * returns whether point has space or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isSpacePoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch === ' ' || ch === NBSP_CHAR;
+}
+/**
+ * @method walkPoint
+ *
+ * @param {BoundaryPoint} startPoint
+ * @param {BoundaryPoint} endPoint
+ * @param {Function} handler
+ * @param {Boolean} isSkipInnerOffset
+ */
+
+
+function walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {
+  var point = startPoint;
+
+  while (point) {
+    handler(point);
+
+    if (isSamePoint(point, endPoint)) {
+      break;
+    }
+
+    var isSkipOffset = isSkipInnerOffset && startPoint.node !== point.node && endPoint.node !== point.node;
+    point = nextPointWithEmptyNode(point, isSkipOffset);
+  }
+}
+/**
+ * @method makeOffsetPath
+ *
+ * return offsetPath(array of offset) from ancestor
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {Node} node
+ */
+
+
+function makeOffsetPath(ancestor, node) {
+  var ancestors = listAncestor(node, func.eq(ancestor));
+  return ancestors.map(position).reverse();
+}
+/**
+ * @method fromOffsetPath
+ *
+ * return element from offsetPath(array of offset)
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {array} offsets - offsetPath
+ */
+
+
+function fromOffsetPath(ancestor, offsets) {
+  var current = ancestor;
+
+  for (var i = 0, len = offsets.length; i < len; i++) {
+    if (current.childNodes.length <= offsets[i]) {
+      current = current.childNodes[current.childNodes.length - 1];
+    } else {
+      current = current.childNodes[offsets[i]];
+    }
+  }
+
+  return current;
+}
+/**
+ * @method splitNode
+ *
+ * split element or #text
+ *
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @param {Boolean} [options.isDiscardEmptySplits] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitNode(point, options) {
+  var isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;
+  var isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;
+  var isDiscardEmptySplits = options && options.isDiscardEmptySplits;
+
+  if (isDiscardEmptySplits) {
+    isSkipPaddingBlankHTML = true;
+  } // edge case
+
+
+  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {
+    if (isLeftEdgePoint(point)) {
+      return point.node;
+    } else if (isRightEdgePoint(point)) {
+      return point.node.nextSibling;
+    }
+  } // split #text
+
+
+  if (isText(point.node)) {
+    return point.node.splitText(point.offset);
+  } else {
+    var childNode = point.node.childNodes[point.offset];
+    var clone = insertAfter(point.node.cloneNode(false), point.node);
+    appendChildNodes(clone, listNext(childNode));
+
+    if (!isSkipPaddingBlankHTML) {
+      paddingBlankHTML(point.node);
+      paddingBlankHTML(clone);
+    }
+
+    if (isDiscardEmptySplits) {
+      if (dom_isEmpty(point.node)) {
+        remove(point.node);
+      }
+
+      if (dom_isEmpty(clone)) {
+        remove(clone);
+        return point.node.nextSibling;
+      }
+    }
+
+    return clone;
+  }
+}
+/**
+ * @method splitTree
+ *
+ * split tree by point
+ *
+ * @param {Node} root - split root
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitTree(root, point, options) {
+  // ex) [#text, <span>, <p>]
+  var ancestors = listAncestor(point.node, func.eq(root));
+
+  if (!ancestors.length) {
+    return null;
+  } else if (ancestors.length === 1) {
+    return splitNode(point, options);
+  }
+
+  return ancestors.reduce(function (node, parent) {
+    if (node === point.node) {
+      node = splitNode(point, options);
+    }
+
+    return splitNode({
+      node: parent,
+      offset: node ? position(node) : nodeLength(parent)
+    }, options);
+  });
+}
+/**
+ * split point
+ *
+ * @param {Point} point
+ * @param {Boolean} isInline
+ * @return {Object}
+ */
+
+
+function splitPoint(point, isInline) {
+  // find splitRoot, container
+  //  - inline: splitRoot is a child of paragraph
+  //  - block: splitRoot is a child of bodyContainer
+  var pred = isInline ? isPara : isBodyContainer;
+  var ancestors = listAncestor(point.node, pred);
+  var topAncestor = lists.last(ancestors) || point.node;
+  var splitRoot, container;
+
+  if (pred(topAncestor)) {
+    splitRoot = ancestors[ancestors.length - 2];
+    container = topAncestor;
+  } else {
+    splitRoot = topAncestor;
+    container = splitRoot.parentNode;
+  } // if splitRoot is exists, split with splitTree
+
+
+  var pivot = splitRoot && splitTree(splitRoot, point, {
+    isSkipPaddingBlankHTML: isInline,
+    isNotSplitEdgePoint: isInline
+  }); // if container is point.node, find pivot with point.offset
+
+  if (!pivot && container === point.node) {
+    pivot = point.node.childNodes[point.offset];
+  }
+
+  return {
+    rightNode: pivot,
+    container: container
+  };
+}
+
+function create(nodeName) {
+  return document.createElement(nodeName);
+}
+
+function createText(text) {
+  return document.createTextNode(text);
+}
+/**
+ * @method remove
+ *
+ * remove node, (isRemoveChild: remove child or not)
+ *
+ * @param {Node} node
+ * @param {Boolean} isRemoveChild
+ */
+
+
+function remove(node, isRemoveChild) {
+  if (!node || !node.parentNode) {
+    return;
+  }
+
+  if (node.removeNode) {
+    return node.removeNode(isRemoveChild);
+  }
+
+  var parent = node.parentNode;
+
+  if (!isRemoveChild) {
+    var nodes = [];
+
+    for (var i = 0, len = node.childNodes.length; i < len; i++) {
+      nodes.push(node.childNodes[i]);
+    }
+
+    for (var _i = 0, _len = nodes.length; _i < _len; _i++) {
+      parent.insertBefore(nodes[_i], node);
+    }
+  }
+
+  parent.removeChild(node);
+}
+/**
+ * @method removeWhile
+ *
+ * @param {Node} node
+ * @param {Function} pred
+ */
+
+
+function removeWhile(node, pred) {
+  while (node) {
+    if (isEditable(node) || !pred(node)) {
+      break;
+    }
+
+    var parent = node.parentNode;
+    remove(node);
+    node = parent;
+  }
+}
+/**
+ * @method replace
+ *
+ * replace node with provided nodeName
+ *
+ * @param {Node} node
+ * @param {String} nodeName
+ * @return {Node} - new node
+ */
+
+
+function replace(node, nodeName) {
+  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {
+    return node;
+  }
+
+  var newNode = create(nodeName);
+
+  if (node.style.cssText) {
+    newNode.style.cssText = node.style.cssText;
+  }
+
+  appendChildNodes(newNode, lists.from(node.childNodes));
+  insertAfter(newNode, node);
+  remove(node);
+  return newNode;
+}
+
+var isTextarea = makePredByNodeName('TEXTAREA');
+/**
+ * @param {jQuery} $node
+ * @param {Boolean} [stripLinebreaks] - default: false
+ */
+
+function value($node, stripLinebreaks) {
+  var val = isTextarea($node[0]) ? $node.val() : $node.html();
+
+  if (stripLinebreaks) {
+    return val.replace(/[\n\r]/g, '');
+  }
+
+  return val;
+}
+/**
+ * @method html
+ *
+ * get the HTML contents of node
+ *
+ * @param {jQuery} $node
+ * @param {Boolean} [isNewlineOnBlock]
+ */
+
+
+function html($node, isNewlineOnBlock) {
+  var markup = value($node);
+
+  if (isNewlineOnBlock) {
+    var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g;
+    markup = markup.replace(regexTag, function (match, endSlash, name) {
+      name = name.toUpperCase();
+      var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) && !!endSlash;
+      var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);
+      return match + (isEndOfInlineContainer || isBlockNode ? '\n' : '');
+    });
+    markup = markup.trim();
+  }
+
+  return markup;
+}
+
+function posFromPlaceholder(placeholder) {
+  var $placeholder = external_jQuery_default()(placeholder);
+  var pos = $placeholder.offset();
+  var height = $placeholder.outerHeight(true); // include margin
+
+  return {
+    left: pos.left,
+    top: pos.top + height
+  };
+}
+
+function attachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.on(key, events[key]);
+  });
+}
+
+function detachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.off(key, events[key]);
+  });
+}
+/**
+ * @method isCustomStyleTag
+ *
+ * assert if a node contains a "note-styletag" class,
+ * which implies that's a custom-made style tag node
+ *
+ * @param {Node} an HTML DOM node
+ */
+
+
+function isCustomStyleTag(node) {
+  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');
+}
+
+/* harmony default export */ const dom = ({
+  /** @property {String} NBSP_CHAR */
+  NBSP_CHAR: NBSP_CHAR,
+
+  /** @property {String} ZERO_WIDTH_NBSP_CHAR */
+  ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR,
+
+  /** @property {String} blank */
+  blank: blankHTML,
+
+  /** @property {String} emptyPara */
+  emptyPara: "<p>".concat(blankHTML, "</p>"),
+  makePredByNodeName: makePredByNodeName,
+  isEditable: isEditable,
+  isControlSizing: isControlSizing,
+  isText: isText,
+  isElement: isElement,
+  isVoid: isVoid,
+  isPara: isPara,
+  isPurePara: isPurePara,
+  isHeading: isHeading,
+  isInline: isInline,
+  isBlock: func.not(isInline),
+  isBodyInline: isBodyInline,
+  isBody: isBody,
+  isParaInline: isParaInline,
+  isPre: isPre,
+  isList: isList,
+  isTable: isTable,
+  isData: isData,
+  isCell: isCell,
+  isBlockquote: isBlockquote,
+  isBodyContainer: isBodyContainer,
+  isAnchor: isAnchor,
+  isDiv: makePredByNodeName('DIV'),
+  isLi: isLi,
+  isBR: makePredByNodeName('BR'),
+  isSpan: makePredByNodeName('SPAN'),
+  isB: makePredByNodeName('B'),
+  isU: makePredByNodeName('U'),
+  isS: makePredByNodeName('S'),
+  isI: makePredByNodeName('I'),
+  isImg: makePredByNodeName('IMG'),
+  isTextarea: isTextarea,
+  deepestChildIsEmpty: deepestChildIsEmpty,
+  isEmpty: dom_isEmpty,
+  isEmptyAnchor: func.and(isAnchor, dom_isEmpty),
+  isClosestSibling: isClosestSibling,
+  withClosestSiblings: withClosestSiblings,
+  nodeLength: nodeLength,
+  isLeftEdgePoint: isLeftEdgePoint,
+  isRightEdgePoint: isRightEdgePoint,
+  isEdgePoint: isEdgePoint,
+  isLeftEdgeOf: isLeftEdgeOf,
+  isRightEdgeOf: isRightEdgeOf,
+  isLeftEdgePointOf: isLeftEdgePointOf,
+  isRightEdgePointOf: isRightEdgePointOf,
+  prevPoint: prevPoint,
+  nextPoint: nextPoint,
+  nextPointWithEmptyNode: nextPointWithEmptyNode,
+  isSamePoint: isSamePoint,
+  isVisiblePoint: isVisiblePoint,
+  prevPointUntil: prevPointUntil,
+  nextPointUntil: nextPointUntil,
+  isCharPoint: isCharPoint,
+  isSpacePoint: isSpacePoint,
+  walkPoint: walkPoint,
+  ancestor: ancestor,
+  singleChildAncestor: singleChildAncestor,
+  listAncestor: listAncestor,
+  lastAncestor: lastAncestor,
+  listNext: listNext,
+  listPrev: listPrev,
+  listDescendant: listDescendant,
+  commonAncestor: commonAncestor,
+  wrap: wrap,
+  insertAfter: insertAfter,
+  appendChildNodes: appendChildNodes,
+  position: position,
+  hasChildren: hasChildren,
+  makeOffsetPath: makeOffsetPath,
+  fromOffsetPath: fromOffsetPath,
+  splitTree: splitTree,
+  splitPoint: splitPoint,
+  create: create,
+  createText: createText,
+  remove: remove,
+  removeWhile: removeWhile,
+  replace: replace,
+  html: html,
+  value: value,
+  posFromPlaceholder: posFromPlaceholder,
+  attachEvents: attachEvents,
+  detachEvents: detachEvents,
+  isCustomStyleTag: isCustomStyleTag
+});
+;// CONCATENATED MODULE: ./src/js/Context.js
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Context = /*#__PURE__*/function () {
+  /**
+   * @param {jQuery} $note
+   * @param {Object} options
+   */
+  function Context($note, options) {
+    _classCallCheck(this, Context);
+
+    this.$note = $note;
+    this.memos = {};
+    this.modules = {};
+    this.layoutInfo = {};
+    this.options = external_jQuery_default().extend(true, {}, options); // init ui with options
+
+    (external_jQuery_default()).summernote.ui = external_jQuery_default().summernote.ui_template(this.options);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.initialize();
+  }
+  /**
+   * create layout and initialize modules and other resources
+   */
+
+
+  _createClass(Context, [{
+    key: "initialize",
+    value: function initialize() {
+      this.layoutInfo = this.ui.createLayout(this.$note);
+
+      this._initialize();
+
+      this.$note.hide();
+      return this;
+    }
+    /**
+     * destroy modules and other resources and remove layout
+     */
+
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this._destroy();
+
+      this.$note.removeData('summernote');
+      this.ui.removeLayout(this.$note, this.layoutInfo);
+    }
+    /**
+     * destory modules and other resources and initialize it again
+     */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      var disabled = this.isDisabled();
+      this.code(dom.emptyPara);
+
+      this._destroy();
+
+      this._initialize();
+
+      if (disabled) {
+        this.disable();
+      }
+    }
+  }, {
+    key: "_initialize",
+    value: function _initialize() {
+      var _this = this;
+
+      // set own id
+      this.options.id = func.uniqueId(external_jQuery_default().now()); // set default container for tooltips, popovers, and dialogs
+
+      this.options.container = this.options.container || this.layoutInfo.editor; // add optional buttons
+
+      var buttons = external_jQuery_default().extend({}, this.options.buttons);
+      Object.keys(buttons).forEach(function (key) {
+        _this.memo('button.' + key, buttons[key]);
+      });
+      var modules = external_jQuery_default().extend({}, this.options.modules, (external_jQuery_default()).summernote.plugins || {}); // add and initialize modules
+
+      Object.keys(modules).forEach(function (key) {
+        _this.module(key, modules[key], true);
+      });
+      Object.keys(this.modules).forEach(function (key) {
+        _this.initializeModule(key);
+      });
+    }
+  }, {
+    key: "_destroy",
+    value: function _destroy() {
+      var _this2 = this;
+
+      // destroy modules with reversed order
+      Object.keys(this.modules).reverse().forEach(function (key) {
+        _this2.removeModule(key);
+      });
+      Object.keys(this.memos).forEach(function (key) {
+        _this2.removeMemo(key);
+      }); // trigger custom onDestroy callback
+
+      this.triggerEvent('destroy', this);
+    }
+  }, {
+    key: "code",
+    value: function code(html) {
+      var isActivated = this.invoke('codeview.isActivated');
+
+      if (html === undefined) {
+        this.invoke('codeview.sync');
+        return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();
+      } else {
+        if (isActivated) {
+          this.invoke('codeview.sync', html);
+        } else {
+          this.layoutInfo.editable.html(html);
+        }
+
+        this.$note.val(html);
+        this.triggerEvent('change', html, this.layoutInfo.editable);
+      }
+    }
+  }, {
+    key: "isDisabled",
+    value: function isDisabled() {
+      return this.layoutInfo.editable.attr('contenteditable') === 'false';
+    }
+  }, {
+    key: "enable",
+    value: function enable() {
+      this.layoutInfo.editable.attr('contenteditable', true);
+      this.invoke('toolbar.activate', true);
+      this.triggerEvent('disable', false);
+      this.options.editing = true;
+    }
+  }, {
+    key: "disable",
+    value: function disable() {
+      // close codeview if codeview is opend
+      if (this.invoke('codeview.isActivated')) {
+        this.invoke('codeview.deactivate');
+      }
+
+      this.layoutInfo.editable.attr('contenteditable', false);
+      this.options.editing = false;
+      this.invoke('toolbar.deactivate', true);
+      this.triggerEvent('disable', true);
+    }
+  }, {
+    key: "triggerEvent",
+    value: function triggerEvent() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];
+
+      if (callback) {
+        callback.apply(this.$note[0], args);
+      }
+
+      this.$note.trigger('summernote.' + namespace, args);
+    }
+  }, {
+    key: "initializeModule",
+    value: function initializeModule(key) {
+      var module = this.modules[key];
+      module.shouldInitialize = module.shouldInitialize || func.ok;
+
+      if (!module.shouldInitialize()) {
+        return;
+      } // initialize module
+
+
+      if (module.initialize) {
+        module.initialize();
+      } // attach events
+
+
+      if (module.events) {
+        dom.attachEvents(this.$note, module.events);
+      }
+    }
+  }, {
+    key: "module",
+    value: function module(key, ModuleClass, withoutIntialize) {
+      if (arguments.length === 1) {
+        return this.modules[key];
+      }
+
+      this.modules[key] = new ModuleClass(this);
+
+      if (!withoutIntialize) {
+        this.initializeModule(key);
+      }
+    }
+  }, {
+    key: "removeModule",
+    value: function removeModule(key) {
+      var module = this.modules[key];
+
+      if (module.shouldInitialize()) {
+        if (module.events) {
+          dom.detachEvents(this.$note, module.events);
+        }
+
+        if (module.destroy) {
+          module.destroy();
+        }
+      }
+
+      delete this.modules[key];
+    }
+  }, {
+    key: "memo",
+    value: function memo(key, obj) {
+      if (arguments.length === 1) {
+        return this.memos[key];
+      }
+
+      this.memos[key] = obj;
+    }
+  }, {
+    key: "removeMemo",
+    value: function removeMemo(key) {
+      if (this.memos[key] && this.memos[key].destroy) {
+        this.memos[key].destroy();
+      }
+
+      delete this.memos[key];
+    }
+    /**
+     * Some buttons need to change their visual style immediately once they get pressed
+     */
+
+  }, {
+    key: "createInvokeHandlerAndUpdateState",
+    value: function createInvokeHandlerAndUpdateState(namespace, value) {
+      var _this3 = this;
+
+      return function (event) {
+        _this3.createInvokeHandler(namespace, value)(event);
+
+        _this3.invoke('buttons.updateCurrentStyle');
+      };
+    }
+  }, {
+    key: "createInvokeHandler",
+    value: function createInvokeHandler(namespace, value) {
+      var _this4 = this;
+
+      return function (event) {
+        event.preventDefault();
+        var $target = external_jQuery_default()(event.target);
+
+        _this4.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);
+      };
+    }
+  }, {
+    key: "invoke",
+    value: function invoke() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var splits = namespace.split('.');
+      var hasSeparator = splits.length > 1;
+      var moduleName = hasSeparator && lists.head(splits);
+      var methodName = hasSeparator ? lists.last(splits) : lists.head(splits);
+      var module = this.modules[moduleName || 'editor'];
+
+      if (!moduleName && this[methodName]) {
+        return this[methodName].apply(this, args);
+      } else if (module && module[methodName] && module.shouldInitialize()) {
+        return module[methodName].apply(module, args);
+      }
+    }
+  }]);
+
+  return Context;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/summernote.js
+
+
+
+
+external_jQuery_default().fn.extend({
+  /**
+   * Summernote API
+   *
+   * @param {Object|String}
+   * @return {this}
+   */
+  summernote: function summernote() {
+    var type = external_jQuery_default().type(lists.head(arguments));
+    var isExternalAPICalled = type === 'string';
+    var hasInitOptions = type === 'object';
+    var options = external_jQuery_default().extend({}, (external_jQuery_default()).summernote.options, hasInitOptions ? lists.head(arguments) : {}); // Update options
+
+    options.langInfo = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.lang["en-US"], (external_jQuery_default()).summernote.lang[options.lang]);
+    options.icons = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.options.icons, options.icons);
+    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;
+    this.each(function (idx, note) {
+      var $note = external_jQuery_default()(note);
+
+      if (!$note.data('summernote')) {
+        var context = new Context($note, options);
+        $note.data('summernote', context);
+        $note.data('summernote').triggerEvent('init', context.layoutInfo);
+      }
+    });
+    var $note = this.first();
+
+    if ($note.length) {
+      var context = $note.data('summernote');
+
+      if (isExternalAPICalled) {
+        return context.invoke.apply(context, lists.from(arguments));
+      } else if (options.focus) {
+        context.invoke('editor.focus');
+      }
+    }
+
+    return this;
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/range.js
+function range_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function range_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function range_createClass(Constructor, protoProps, staticProps) { if (protoProps) range_defineProperties(Constructor.prototype, protoProps); if (staticProps) range_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+/**
+ * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
+ *
+ * @param {TextRange} textRange
+ * @param {Boolean} isStart
+ * @return {BoundaryPoint}
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
+ */
+
+function textRangeToPoint(textRange, isStart) {
+  var container = textRange.parentElement();
+  var offset;
+  var tester = document.body.createTextRange();
+  var prevContainer;
+  var childNodes = lists.from(container.childNodes);
+
+  for (offset = 0; offset < childNodes.length; offset++) {
+    if (dom.isText(childNodes[offset])) {
+      continue;
+    }
+
+    tester.moveToElementText(childNodes[offset]);
+
+    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {
+      break;
+    }
+
+    prevContainer = childNodes[offset];
+  }
+
+  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {
+    var textRangeStart = document.body.createTextRange();
+    var curTextNode = null;
+    textRangeStart.moveToElementText(prevContainer || container);
+    textRangeStart.collapse(!prevContainer);
+    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;
+    var pointTester = textRange.duplicate();
+    pointTester.setEndPoint('StartToStart', textRangeStart);
+    var textCount = pointTester.text.replace(/[\r\n]/g, '').length;
+
+    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    } // [workaround] enforce IE to re-reference curTextNode, hack
+
+
+    var dummy = curTextNode.nodeValue; // eslint-disable-line
+
+    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) && textCount === curTextNode.nodeValue.length) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    }
+
+    container = curTextNode;
+    offset = textCount;
+  }
+
+  return {
+    cont: container,
+    offset: offset
+  };
+}
+/**
+ * return TextRange from boundary point (inspired by google closure-library)
+ * @param {BoundaryPoint} point
+ * @return {TextRange}
+ */
+
+
+function pointToTextRange(point) {
+  var textRangeInfo = function textRangeInfo(container, offset) {
+    var node, isCollapseToStart;
+
+    if (dom.isText(container)) {
+      var prevTextNodes = dom.listPrev(container, func.not(dom.isText));
+      var prevContainer = lists.last(prevTextNodes).previousSibling;
+      node = prevContainer || container.parentNode;
+      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);
+      isCollapseToStart = !prevContainer;
+    } else {
+      node = container.childNodes[offset] || container;
+
+      if (dom.isText(node)) {
+        return textRangeInfo(node, 0);
+      }
+
+      offset = 0;
+      isCollapseToStart = false;
+    }
+
+    return {
+      node: node,
+      collapseToStart: isCollapseToStart,
+      offset: offset
+    };
+  };
+
+  var textRange = document.body.createTextRange();
+  var info = textRangeInfo(point.node, point.offset);
+  textRange.moveToElementText(info.node);
+  textRange.collapse(info.collapseToStart);
+  textRange.moveStart('character', info.offset);
+  return textRange;
+}
+/**
+   * Wrapped Range
+   *
+   * @constructor
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   */
+
+
+var WrappedRange = /*#__PURE__*/function () {
+  function WrappedRange(sc, so, ec, eo) {
+    range_classCallCheck(this, WrappedRange);
+
+    this.sc = sc;
+    this.so = so;
+    this.ec = ec;
+    this.eo = eo; // isOnEditable: judge whether range is on editable or not
+
+    this.isOnEditable = this.makeIsOn(dom.isEditable); // isOnList: judge whether range is on list node or not
+
+    this.isOnList = this.makeIsOn(dom.isList); // isOnAnchor: judge whether range is on anchor node or not
+
+    this.isOnAnchor = this.makeIsOn(dom.isAnchor); // isOnCell: judge whether range is on cell node or not
+
+    this.isOnCell = this.makeIsOn(dom.isCell); // isOnData: judge whether range is on data node or not
+
+    this.isOnData = this.makeIsOn(dom.isData);
+  } // nativeRange: get nativeRange from sc, so, ec, eo
+
+
+  range_createClass(WrappedRange, [{
+    key: "nativeRange",
+    value: function nativeRange() {
+      if (env.isW3CRangeSupport) {
+        var w3cRange = document.createRange();
+        w3cRange.setStart(this.sc, this.so);
+        w3cRange.setEnd(this.ec, this.eo);
+        return w3cRange;
+      } else {
+        var textRange = pointToTextRange({
+          node: this.sc,
+          offset: this.so
+        });
+        textRange.setEndPoint('EndToEnd', pointToTextRange({
+          node: this.ec,
+          offset: this.eo
+        }));
+        return textRange;
+      }
+    }
+  }, {
+    key: "getPoints",
+    value: function getPoints() {
+      return {
+        sc: this.sc,
+        so: this.so,
+        ec: this.ec,
+        eo: this.eo
+      };
+    }
+  }, {
+    key: "getStartPoint",
+    value: function getStartPoint() {
+      return {
+        node: this.sc,
+        offset: this.so
+      };
+    }
+  }, {
+    key: "getEndPoint",
+    value: function getEndPoint() {
+      return {
+        node: this.ec,
+        offset: this.eo
+      };
+    }
+    /**
+     * select update visible range
+     */
+
+  }, {
+    key: "select",
+    value: function select() {
+      var nativeRng = this.nativeRange();
+
+      if (env.isW3CRangeSupport) {
+        var selection = document.getSelection();
+
+        if (selection.rangeCount > 0) {
+          selection.removeAllRanges();
+        }
+
+        selection.addRange(nativeRng);
+      } else {
+        nativeRng.select();
+      }
+
+      return this;
+    }
+    /**
+     * Moves the scrollbar to start container(sc) of current range
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "scrollIntoView",
+    value: function scrollIntoView(container) {
+      var height = external_jQuery_default()(container).height();
+
+      if (container.scrollTop + height < this.sc.offsetTop) {
+        container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);
+      }
+
+      return this;
+    }
+    /**
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "normalize",
+    value: function normalize() {
+      /**
+       * @param {BoundaryPoint} point
+       * @param {Boolean} isLeftToRight - true: prefer to choose right node
+       *                                - false: prefer to choose left node
+       * @return {BoundaryPoint}
+       */
+      var getVisiblePoint = function getVisiblePoint(point, isLeftToRight) {
+        if (!point) {
+          return point;
+        } // Just use the given point [XXX:Adhoc]
+        //  - case 01. if the point is on the middle of the node
+        //  - case 02. if the point is on the right edge and prefer to choose left node
+        //  - case 03. if the point is on the left edge and prefer to choose right node
+        //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void
+        //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void
+        //  - case 06. if the point is on the block node and there is no children
+
+
+        if (dom.isVisiblePoint(point)) {
+          if (!dom.isEdgePoint(point) || dom.isRightEdgePoint(point) && !isLeftToRight || dom.isLeftEdgePoint(point) && isLeftToRight || dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling) || dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling) || dom.isBlock(point.node) && dom.isEmpty(point.node)) {
+            return point;
+          }
+        } // point on block's edge
+
+
+        var block = dom.ancestor(point.node, dom.isBlock);
+        var hasRightNode = false;
+
+        if (!hasRightNode) {
+          var prevPoint = dom.prevPoint(point) || {
+            node: null
+          };
+          hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;
+        }
+
+        var hasLeftNode = false;
+
+        if (!hasLeftNode) {
+          var _nextPoint = dom.nextPoint(point) || {
+            node: null
+          };
+
+          hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(_nextPoint.node)) && isLeftToRight;
+        }
+
+        if (hasRightNode || hasLeftNode) {
+          // returns point already on visible point
+          if (dom.isVisiblePoint(point)) {
+            return point;
+          } // reverse direction
+
+
+          isLeftToRight = !isLeftToRight;
+        }
+
+        var nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint) : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);
+        return nextPoint || point;
+      };
+
+      var endPoint = getVisiblePoint(this.getEndPoint(), false);
+      var startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns matched nodes on range
+     *
+     * @param {Function} [pred] - predicate function
+     * @param {Object} [options]
+     * @param {Boolean} [options.includeAncestor]
+     * @param {Boolean} [options.fullyContains]
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "nodes",
+    value: function nodes(pred, options) {
+      pred = pred || func.ok;
+      var includeAncestor = options && options.includeAncestor;
+      var fullyContains = options && options.fullyContains; // TODO compare points and sort
+
+      var startPoint = this.getStartPoint();
+      var endPoint = this.getEndPoint();
+      var nodes = [];
+      var leftEdgeNodes = [];
+      dom.walkPoint(startPoint, endPoint, function (point) {
+        if (dom.isEditable(point.node)) {
+          return;
+        }
+
+        var node;
+
+        if (fullyContains) {
+          if (dom.isLeftEdgePoint(point)) {
+            leftEdgeNodes.push(point.node);
+          }
+
+          if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {
+            node = point.node;
+          }
+        } else if (includeAncestor) {
+          node = dom.ancestor(point.node, pred);
+        } else {
+          node = point.node;
+        }
+
+        if (node && pred(node)) {
+          nodes.push(node);
+        }
+      }, true);
+      return lists.unique(nodes);
+    }
+    /**
+     * returns commonAncestor of range
+     * @return {Element} - commonAncestor
+     */
+
+  }, {
+    key: "commonAncestor",
+    value: function commonAncestor() {
+      return dom.commonAncestor(this.sc, this.ec);
+    }
+    /**
+     * returns expanded range by pred
+     *
+     * @param {Function} pred - predicate function
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "expand",
+    value: function expand(pred) {
+      var startAncestor = dom.ancestor(this.sc, pred);
+      var endAncestor = dom.ancestor(this.ec, pred);
+
+      if (!startAncestor && !endAncestor) {
+        return new WrappedRange(this.sc, this.so, this.ec, this.eo);
+      }
+
+      var boundaryPoints = this.getPoints();
+
+      if (startAncestor) {
+        boundaryPoints.sc = startAncestor;
+        boundaryPoints.so = 0;
+      }
+
+      if (endAncestor) {
+        boundaryPoints.ec = endAncestor;
+        boundaryPoints.eo = dom.nodeLength(endAncestor);
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * @param {Boolean} isCollapseToStart
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "collapse",
+    value: function collapse(isCollapseToStart) {
+      if (isCollapseToStart) {
+        return new WrappedRange(this.sc, this.so, this.sc, this.so);
+      } else {
+        return new WrappedRange(this.ec, this.eo, this.ec, this.eo);
+      }
+    }
+    /**
+     * splitText on range
+     */
+
+  }, {
+    key: "splitText",
+    value: function splitText() {
+      var isSameContainer = this.sc === this.ec;
+      var boundaryPoints = this.getPoints();
+
+      if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {
+        this.ec.splitText(this.eo);
+      }
+
+      if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {
+        boundaryPoints.sc = this.sc.splitText(this.so);
+        boundaryPoints.so = 0;
+
+        if (isSameContainer) {
+          boundaryPoints.ec = boundaryPoints.sc;
+          boundaryPoints.eo = this.eo - this.so;
+        }
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * delete contents on range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "deleteContents",
+    value: function deleteContents() {
+      if (this.isCollapsed()) {
+        return this;
+      }
+
+      var rng = this.splitText();
+      var nodes = rng.nodes(null, {
+        fullyContains: true
+      }); // find new cursor point
+
+      var point = dom.prevPointUntil(rng.getStartPoint(), function (point) {
+        return !lists.contains(nodes, point.node);
+      });
+      var emptyParents = [];
+      external_jQuery_default().each(nodes, function (idx, node) {
+        // find empty parents
+        var parent = node.parentNode;
+
+        if (point.node !== parent && dom.nodeLength(parent) === 1) {
+          emptyParents.push(parent);
+        }
+
+        dom.remove(node, false);
+      }); // remove empty parents
+
+      external_jQuery_default().each(emptyParents, function (idx, node) {
+        dom.remove(node, false);
+      });
+      return new WrappedRange(point.node, point.offset, point.node, point.offset).normalize();
+    }
+    /**
+     * makeIsOn: return isOn(pred) function
+     */
+
+  }, {
+    key: "makeIsOn",
+    value: function makeIsOn(pred) {
+      return function () {
+        var ancestor = dom.ancestor(this.sc, pred);
+        return !!ancestor && ancestor === dom.ancestor(this.ec, pred);
+      };
+    }
+    /**
+     * @param {Function} pred
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isLeftEdgeOf",
+    value: function isLeftEdgeOf(pred) {
+      if (!dom.isLeftEdgePoint(this.getStartPoint())) {
+        return false;
+      }
+
+      var node = dom.ancestor(this.sc, pred);
+      return node && dom.isLeftEdgeOf(this.sc, node);
+    }
+    /**
+     * returns whether range was collapsed or not
+     */
+
+  }, {
+    key: "isCollapsed",
+    value: function isCollapsed() {
+      return this.sc === this.ec && this.so === this.eo;
+    }
+    /**
+     * wrap inline nodes which children of body with paragraph
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "wrapBodyInlineWithPara",
+    value: function wrapBodyInlineWithPara() {
+      if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {
+        this.sc.innerHTML = dom.emptyPara;
+        return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);
+      }
+      /**
+       * [workaround] firefox often create range on not visible point. so normalize here.
+       *  - firefox: |<p>text</p>|
+       *  - chrome: <p>|text|</p>
+       */
+
+
+      var rng = this.normalize();
+
+      if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {
+        return rng;
+      } // find inline top ancestor
+
+
+      var topAncestor;
+
+      if (dom.isInline(rng.sc)) {
+        var ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));
+        topAncestor = lists.last(ancestors);
+
+        if (!dom.isInline(topAncestor)) {
+          topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];
+        }
+      } else {
+        topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];
+      }
+
+      if (topAncestor) {
+        // siblings not in paragraph
+        var inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();
+        inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline)); // wrap with paragraph
+
+        if (inlineSiblings.length) {
+          var para = dom.wrap(lists.head(inlineSiblings), 'p');
+          dom.appendChildNodes(para, lists.tail(inlineSiblings));
+        }
+      }
+
+      return this.normalize();
+    }
+    /**
+     * insert node at current cursor
+     *
+     * @param {Node} node
+     * @return {Node}
+     */
+
+  }, {
+    key: "insertNode",
+    value: function insertNode(node) {
+      var rng = this;
+
+      if (dom.isText(node) || dom.isInline(node)) {
+        rng = this.wrapBodyInlineWithPara().deleteContents();
+      }
+
+      var info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));
+
+      if (info.rightNode) {
+        info.rightNode.parentNode.insertBefore(node, info.rightNode);
+
+        if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {
+          info.rightNode.parentNode.removeChild(info.rightNode);
+        }
+      } else {
+        info.container.appendChild(node);
+      }
+
+      return node;
+    }
+    /**
+     * insert html at current cursor
+     */
+
+  }, {
+    key: "pasteHTML",
+    value: function pasteHTML(markup) {
+      markup = external_jQuery_default().trim(markup);
+      var contentsContainer = external_jQuery_default()('<div></div>').html(markup)[0];
+      var childNodes = lists.from(contentsContainer.childNodes); // const rng = this.wrapBodyInlineWithPara().deleteContents();
+
+      var rng = this;
+      var reversed = false;
+
+      if (rng.so >= 0) {
+        childNodes = childNodes.reverse();
+        reversed = true;
+      }
+
+      childNodes = childNodes.map(function (childNode) {
+        return rng.insertNode(childNode);
+      });
+
+      if (reversed) {
+        childNodes = childNodes.reverse();
+      }
+
+      return childNodes;
+    }
+    /**
+     * returns text in range
+     *
+     * @return {String}
+     */
+
+  }, {
+    key: "toString",
+    value: function toString() {
+      var nativeRng = this.nativeRange();
+      return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
+    }
+    /**
+     * returns range for word before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordRange",
+    value: function getWordRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      if (!dom.isCharPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        return !dom.isCharPoint(point);
+      });
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, function (point) {
+          return !dom.isCharPoint(point);
+        });
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordsRange",
+    value: function getWordsRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      var isNotTextPoint = function isNotTextPoint(point) {
+        return !dom.isCharPoint(point) && !dom.isSpacePoint(point);
+      };
+
+      if (isNotTextPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor that match with a Regex
+     *
+     * example:
+     *  range: 'hi @Peter Pan'
+     *  regex: '/@[a-z ]+/i'
+     *  return range: '@Peter Pan'
+     *
+     * @param {RegExp} [regex]
+     * @return {WrappedRange|null}
+     */
+
+  }, {
+    key: "getWordsMatchRange",
+    value: function getWordsMatchRange(regex) {
+      var endPoint = this.getEndPoint();
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {
+          return true;
+        }
+
+        var rng = new WrappedRange(point.node, point.offset, endPoint.node, endPoint.offset);
+        var result = regex.exec(rng.toString());
+        return result && result.index === 0;
+      });
+      var rng = new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+      var text = rng.toString();
+      var result = regex.exec(text);
+
+      if (result && result[0].length === text.length) {
+        return rng;
+      } else {
+        return null;
+      }
+    }
+    /**
+     * create offsetPath bookmark
+     *
+     * @param {Node} editable
+     */
+
+  }, {
+    key: "bookmark",
+    value: function bookmark(editable) {
+      return {
+        s: {
+          path: dom.makeOffsetPath(editable, this.sc),
+          offset: this.so
+        },
+        e: {
+          path: dom.makeOffsetPath(editable, this.ec),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * create offsetPath bookmark base on paragraph
+     *
+     * @param {Node[]} paras
+     */
+
+  }, {
+    key: "paraBookmark",
+    value: function paraBookmark(paras) {
+      return {
+        s: {
+          path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),
+          offset: this.so
+        },
+        e: {
+          path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * getClientRects
+     * @return {Rect[]}
+     */
+
+  }, {
+    key: "getClientRects",
+    value: function getClientRects() {
+      var nativeRng = this.nativeRange();
+      return nativeRng.getClientRects();
+    }
+  }]);
+
+  return WrappedRange;
+}();
+/**
+ * Data structure
+ *  * BoundaryPoint: a point of dom tree
+ *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range
+ *
+ * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
+ */
+
+
+/* harmony default export */ const range = ({
+  /**
+   * create Range Object From arguments or Browser Selection
+   *
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   * @return {WrappedRange}
+   */
+  create: function create(sc, so, ec, eo) {
+    if (arguments.length === 4) {
+      return new WrappedRange(sc, so, ec, eo);
+    } else if (arguments.length === 2) {
+      // collapsed
+      ec = sc;
+      eo = so;
+      return new WrappedRange(sc, so, ec, eo);
+    } else {
+      var wrappedRange = this.createFromSelection();
+
+      if (!wrappedRange && arguments.length === 1) {
+        var bodyElement = arguments[0];
+
+        if (dom.isEditable(bodyElement)) {
+          bodyElement = bodyElement.lastChild;
+        }
+
+        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);
+      }
+
+      return wrappedRange;
+    }
+  },
+  createFromBodyElement: function createFromBodyElement(bodyElement) {
+    var isCollapseToStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+    var wrappedRange = this.createFromNode(bodyElement);
+    return wrappedRange.collapse(isCollapseToStart);
+  },
+  createFromSelection: function createFromSelection() {
+    var sc, so, ec, eo;
+
+    if (env.isW3CRangeSupport) {
+      var selection = document.getSelection();
+
+      if (!selection || selection.rangeCount === 0) {
+        return null;
+      } else if (dom.isBody(selection.anchorNode)) {
+        // Firefox: returns entire body as range on initialization.
+        // We won't never need it.
+        return null;
+      }
+
+      var nativeRng = selection.getRangeAt(0);
+      sc = nativeRng.startContainer;
+      so = nativeRng.startOffset;
+      ec = nativeRng.endContainer;
+      eo = nativeRng.endOffset;
+    } else {
+      // IE8: TextRange
+      var textRange = document.selection.createRange();
+      var textRangeEnd = textRange.duplicate();
+      textRangeEnd.collapse(false);
+      var textRangeStart = textRange;
+      textRangeStart.collapse(true);
+      var startPoint = textRangeToPoint(textRangeStart, true);
+      var endPoint = textRangeToPoint(textRangeEnd, false); // same visible point case: range was collapsed.
+
+      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) && dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) && endPoint.node.nextSibling === startPoint.node) {
+        startPoint = endPoint;
+      }
+
+      sc = startPoint.cont;
+      so = startPoint.offset;
+      ec = endPoint.cont;
+      eo = endPoint.offset;
+    }
+
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from node
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNode: function createFromNode(node) {
+    var sc = node;
+    var so = 0;
+    var ec = node;
+    var eo = dom.nodeLength(ec); // browsers can't target a picture or void node
+
+    if (dom.isVoid(sc)) {
+      so = dom.listPrev(sc).length - 1;
+      sc = sc.parentNode;
+    }
+
+    if (dom.isBR(ec)) {
+      eo = dom.listPrev(ec).length - 1;
+      ec = ec.parentNode;
+    } else if (dom.isVoid(ec)) {
+      eo = dom.listPrev(ec).length;
+      ec = ec.parentNode;
+    }
+
+    return this.create(sc, so, ec, eo);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeBefore: function createFromNodeBefore(node) {
+    return this.createFromNode(node).collapse(true);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeAfter: function createFromNodeAfter(node) {
+    return this.createFromNode(node).collapse();
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from bookmark
+   *
+   * @param {Node} editable
+   * @param {Object} bookmark
+   * @return {WrappedRange}
+   */
+  createFromBookmark: function createFromBookmark(editable, bookmark) {
+    var sc = dom.fromOffsetPath(editable, bookmark.s.path);
+    var so = bookmark.s.offset;
+    var ec = dom.fromOffsetPath(editable, bookmark.e.path);
+    var eo = bookmark.e.offset;
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from paraBookmark
+   *
+   * @param {Object} bookmark
+   * @param {Node[]} paras
+   * @return {WrappedRange}
+   */
+  createFromParaBookmark: function createFromParaBookmark(bookmark, paras) {
+    var so = bookmark.s.offset;
+    var eo = bookmark.e.offset;
+    var sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);
+    var ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);
+    return new WrappedRange(sc, so, ec, eo);
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/key.js
+
+
+var KEY_MAP = {
+  'BACKSPACE': 8,
+  'TAB': 9,
+  'ENTER': 13,
+  'ESCAPE': 27,
+  'SPACE': 32,
+  'DELETE': 46,
+  // Arrow
+  'LEFT': 37,
+  'UP': 38,
+  'RIGHT': 39,
+  'DOWN': 40,
+  // Number: 0-9
+  'NUM0': 48,
+  'NUM1': 49,
+  'NUM2': 50,
+  'NUM3': 51,
+  'NUM4': 52,
+  'NUM5': 53,
+  'NUM6': 54,
+  'NUM7': 55,
+  'NUM8': 56,
+  // Alphabet: a-z
+  'B': 66,
+  'E': 69,
+  'I': 73,
+  'J': 74,
+  'K': 75,
+  'L': 76,
+  'R': 82,
+  'S': 83,
+  'U': 85,
+  'V': 86,
+  'Y': 89,
+  'Z': 90,
+  'SLASH': 191,
+  'LEFTBRACKET': 219,
+  'BACKSLASH': 220,
+  'RIGHTBRACKET': 221,
+  // Navigation
+  'HOME': 36,
+  'END': 35,
+  'PAGEUP': 33,
+  'PAGEDOWN': 34
+};
+/**
+ * @class core.key
+ *
+ * Object for keycodes.
+ *
+ * @singleton
+ * @alternateClassName key
+ */
+
+/* harmony default export */ const key = ({
+  /**
+   * @method isEdit
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isEdit: function isEdit(keyCode) {
+    return lists.contains([KEY_MAP.BACKSPACE, KEY_MAP.TAB, KEY_MAP.ENTER, KEY_MAP.SPACE, KEY_MAP.DELETE], keyCode);
+  },
+
+  /**
+   * @method isMove
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isMove: function isMove(keyCode) {
+    return lists.contains([KEY_MAP.LEFT, KEY_MAP.UP, KEY_MAP.RIGHT, KEY_MAP.DOWN], keyCode);
+  },
+
+  /**
+   * @method isNavigation
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isNavigation: function isNavigation(keyCode) {
+    return lists.contains([KEY_MAP.HOME, KEY_MAP.END, KEY_MAP.PAGEUP, KEY_MAP.PAGEDOWN], keyCode);
+  },
+
+  /**
+   * @property {Object} nameFromCode
+   * @property {String} nameFromCode.8 "BACKSPACE"
+   */
+  nameFromCode: func.invertObject(KEY_MAP),
+  code: KEY_MAP
+});
+;// CONCATENATED MODULE: ./src/js/core/async.js
+
+/**
+ * @method readFileAsDataURL
+ *
+ * read contents of file as representing URL
+ *
+ * @param {File} file
+ * @return {Promise} - then: dataUrl
+ */
+
+function readFileAsDataURL(file) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    external_jQuery_default().extend(new FileReader(), {
+      onload: function onload(e) {
+        var dataURL = e.target.result;
+        deferred.resolve(dataURL);
+      },
+      onerror: function onerror(err) {
+        deferred.reject(err);
+      }
+    }).readAsDataURL(file);
+  }).promise();
+}
+/**
+ * @method createImage
+ *
+ * create `<image>` from url string
+ *
+ * @param {String} url
+ * @return {Promise} - then: $image
+ */
+
+function createImage(url) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    var $img = external_jQuery_default()('<img>');
+    $img.one('load', function () {
+      $img.off('error abort');
+      deferred.resolve($img);
+    }).one('error abort', function () {
+      $img.off('load').detach();
+      deferred.reject($img);
+    }).css({
+      display: 'none'
+    }).appendTo(document.body).attr('src', url);
+  }).promise();
+}
+;// CONCATENATED MODULE: ./src/js/editing/History.js
+function History_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function History_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function History_createClass(Constructor, protoProps, staticProps) { if (protoProps) History_defineProperties(Constructor.prototype, protoProps); if (staticProps) History_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var History = /*#__PURE__*/function () {
+  function History(context) {
+    History_classCallCheck(this, History);
+
+    this.stack = [];
+    this.stackOffset = -1;
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+    this.editable = this.$editable[0];
+  }
+
+  History_createClass(History, [{
+    key: "makeSnapshot",
+    value: function makeSnapshot() {
+      var rng = range.create(this.editable);
+      var emptyBookmark = {
+        s: {
+          path: [],
+          offset: 0
+        },
+        e: {
+          path: [],
+          offset: 0
+        }
+      };
+      return {
+        contents: this.$editable.html(),
+        bookmark: rng && rng.isOnEditable() ? rng.bookmark(this.editable) : emptyBookmark
+      };
+    }
+  }, {
+    key: "applySnapshot",
+    value: function applySnapshot(snapshot) {
+      if (snapshot.contents !== null) {
+        this.$editable.html(snapshot.contents);
+      }
+
+      if (snapshot.bookmark !== null) {
+        range.createFromBookmark(this.editable, snapshot.bookmark).select();
+      }
+    }
+    /**
+    * @method rewind
+    * Rewinds the history stack back to the first snapshot taken.
+    * Leaves the stack intact, so that "Redo" can still be used.
+    */
+
+  }, {
+    key: "rewind",
+    value: function rewind() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      } // Return to the first available snapshot.
+
+
+      this.stackOffset = 0; // Apply that snapshot.
+
+      this.applySnapshot(this.stack[this.stackOffset]);
+    }
+    /**
+    *  @method commit
+    *  Resets history stack, but keeps current editor's content.
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+    * @method reset
+    * Resets the history stack completely; reverting to an empty editor.
+    */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Clear the editable area.
+
+      this.$editable.html(''); // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      }
+
+      if (this.stackOffset > 0) {
+        this.stackOffset--;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      if (this.stack.length - 1 > this.stackOffset) {
+        this.stackOffset++;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * recorded undo
+     */
+
+  }, {
+    key: "recordUndo",
+    value: function recordUndo() {
+      this.stackOffset++; // Wash out stack after stackOffset
+
+      if (this.stack.length > this.stackOffset) {
+        this.stack = this.stack.slice(0, this.stackOffset);
+      } // Create new snapshot and push it to the end
+
+
+      this.stack.push(this.makeSnapshot()); // If the stack size reachs to the limit, then slice it
+
+      if (this.stack.length > this.context.options.historyLimit) {
+        this.stack.shift();
+        this.stackOffset -= 1;
+      }
+    }
+  }]);
+
+  return History;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Style.js
+function Style_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Style_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Style_createClass(Constructor, protoProps, staticProps) { if (protoProps) Style_defineProperties(Constructor.prototype, protoProps); if (staticProps) Style_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Style = /*#__PURE__*/function () {
+  function Style() {
+    Style_classCallCheck(this, Style);
+  }
+
+  Style_createClass(Style, [{
+    key: "jQueryCSS",
+    value:
+    /**
+     * @method jQueryCSS
+     *
+     * [workaround] for old jQuery
+     * passing an array of style properties to .css()
+     * will result in an object of property-value pairs.
+     * (compability with version < 1.9)
+     *
+     * @private
+     * @param  {jQuery} $obj
+     * @param  {Array} propertyNames - An array of one or more CSS properties.
+     * @return {Object}
+     */
+    function jQueryCSS($obj, propertyNames) {
+      var result = {};
+      external_jQuery_default().each(propertyNames, function (idx, propertyName) {
+        result[propertyName] = $obj.css(propertyName);
+      });
+      return result;
+    }
+    /**
+     * returns style object from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "fromNode",
+    value: function fromNode($node) {
+      var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
+      var styleInfo = this.jQueryCSS($node, properties) || {};
+      var fontSize = $node[0].style.fontSize || styleInfo['font-size'];
+      styleInfo['font-size'] = parseInt(fontSize, 10);
+      styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);
+      return styleInfo;
+    }
+    /**
+     * paragraph level style
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} styleInfo
+     */
+
+  }, {
+    key: "stylePara",
+    value: function stylePara(rng, styleInfo) {
+      external_jQuery_default().each(rng.nodes(dom.isPara, {
+        includeAncestor: true
+      }), function (idx, para) {
+        external_jQuery_default()(para).css(styleInfo);
+      });
+    }
+    /**
+     * insert and returns styleNodes on range.
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} [options] - options for styleNodes
+     * @param {String} [options.nodeName] - default: `SPAN`
+     * @param {Boolean} [options.expandClosestSibling] - default: `false`
+     * @param {Boolean} [options.onlyPartialContains] - default: `false`
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "styleNodes",
+    value: function styleNodes(rng, options) {
+      rng = rng.splitText();
+      var nodeName = options && options.nodeName || 'SPAN';
+      var expandClosestSibling = !!(options && options.expandClosestSibling);
+      var onlyPartialContains = !!(options && options.onlyPartialContains);
+
+      if (rng.isCollapsed()) {
+        return [rng.insertNode(dom.create(nodeName))];
+      }
+
+      var pred = dom.makePredByNodeName(nodeName);
+      var nodes = rng.nodes(dom.isText, {
+        fullyContains: true
+      }).map(function (text) {
+        return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
+      });
+
+      if (expandClosestSibling) {
+        if (onlyPartialContains) {
+          var nodesInRange = rng.nodes(); // compose with partial contains predication
+
+          pred = func.and(pred, function (node) {
+            return lists.contains(nodesInRange, node);
+          });
+        }
+
+        return nodes.map(function (node) {
+          var siblings = dom.withClosestSiblings(node, pred);
+          var head = lists.head(siblings);
+          var tails = lists.tail(siblings);
+          external_jQuery_default().each(tails, function (idx, elem) {
+            dom.appendChildNodes(head, elem.childNodes);
+            dom.remove(elem);
+          });
+          return lists.head(siblings);
+        });
+      } else {
+        return nodes;
+      }
+    }
+    /**
+     * get current style on cursor
+     *
+     * @param {WrappedRange} rng
+     * @return {Object} - object contains style properties.
+     */
+
+  }, {
+    key: "current",
+    value: function current(rng) {
+      var $cont = external_jQuery_default()(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);
+      var styleInfo = this.fromNode($cont); // document.queryCommandState for toggle state
+      // [workaround] prevent Firefox nsresult: "0x80004005 (NS_ERROR_FAILURE)"
+
+      try {
+        styleInfo = external_jQuery_default().extend(styleInfo, {
+          'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',
+          'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',
+          'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',
+          'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',
+          'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',
+          'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',
+          'font-family': document.queryCommandValue('fontname') || styleInfo['font-family']
+        });
+      } catch (e) {// eslint-disable-next-line
+      } // list-style-type to list-style(unordered, ordered)
+
+
+      if (!rng.isOnList()) {
+        styleInfo['list-style'] = 'none';
+      } else {
+        var orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];
+        var isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;
+        styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';
+      }
+
+      var para = dom.ancestor(rng.sc, dom.isPara);
+
+      if (para && para.style['line-height']) {
+        styleInfo['line-height'] = para.style.lineHeight;
+      } else {
+        var lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);
+        styleInfo['line-height'] = lineHeight.toFixed(1);
+      }
+
+      styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
+      styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
+      styleInfo.range = rng;
+      return styleInfo;
+    }
+  }]);
+
+  return Style;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Bullet.js
+function Bullet_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Bullet_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Bullet_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bullet_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bullet_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var Bullet = /*#__PURE__*/function () {
+  function Bullet() {
+    Bullet_classCallCheck(this, Bullet);
+  }
+
+  Bullet_createClass(Bullet, [{
+    key: "insertOrderedList",
+    value:
+    /**
+     * toggle ordered list
+     */
+    function insertOrderedList(editable) {
+      this.toggleList('OL', editable);
+    }
+    /**
+     * toggle unordered list
+     */
+
+  }, {
+    key: "insertUnorderedList",
+    value: function insertUnorderedList(editable) {
+      this.toggleList('UL', editable);
+    }
+    /**
+     * indent
+     */
+
+  }, {
+    key: "indent",
+    value: function indent(editable) {
+      var _this = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          var previousList = _this.findList(head.previousSibling);
+
+          if (previousList) {
+            paras.map(function (para) {
+              return previousList.appendChild(para);
+            });
+          } else {
+            _this.wrapList(paras, head.parentNode.nodeName);
+
+            paras.map(function (para) {
+              return para.parentNode;
+            }).map(function (para) {
+              return _this.appendToPrevious(para);
+            });
+          }
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              return (parseInt(val, 10) || 0) + 25;
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * outdent
+     */
+
+  }, {
+    key: "outdent",
+    value: function outdent(editable) {
+      var _this2 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          _this2.releaseList([paras]);
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              val = parseInt(val, 10) || 0;
+              return val > 25 ? val - 25 : '';
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * toggle list
+     *
+     * @param {String} listName - OL or UL
+     */
+
+  }, {
+    key: "toggleList",
+    value: function toggleList(listName, editable) {
+      var _this3 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var bookmark = rng.paraBookmark(paras);
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode')); // paragraph to list
+
+      if (lists.find(paras, dom.isPurePara)) {
+        var wrappedParas = [];
+        external_jQuery_default().each(clustereds, function (idx, paras) {
+          wrappedParas = wrappedParas.concat(_this3.wrapList(paras, listName));
+        });
+        paras = wrappedParas; // list to paragraph or change list style
+      } else {
+        var diffLists = rng.nodes(dom.isList, {
+          includeAncestor: true
+        }).filter(function (listNode) {
+          return !external_jQuery_default().nodeName(listNode, listName);
+        });
+
+        if (diffLists.length) {
+          external_jQuery_default().each(diffLists, function (idx, listNode) {
+            dom.replace(listNode, listName);
+          });
+        } else {
+          paras = this.releaseList(clustereds, true);
+        }
+      }
+
+      range.createFromParaBookmark(bookmark, paras).select();
+    }
+    /**
+     * @param {Node[]} paras
+     * @param {String} listName
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "wrapList",
+    value: function wrapList(paras, listName) {
+      var head = lists.head(paras);
+      var last = lists.last(paras);
+      var prevList = dom.isList(head.previousSibling) && head.previousSibling;
+      var nextList = dom.isList(last.nextSibling) && last.nextSibling;
+      var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last); // P to LI
+
+      paras = paras.map(function (para) {
+        return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
+      }); // append to list(<ul>, <ol>)
+
+      dom.appendChildNodes(listNode, paras);
+
+      if (nextList) {
+        dom.appendChildNodes(listNode, lists.from(nextList.childNodes));
+        dom.remove(nextList);
+      }
+
+      return paras;
+    }
+    /**
+     * @method releaseList
+     *
+     * @param {Array[]} clustereds
+     * @param {Boolean} isEscapseToBody
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "releaseList",
+    value: function releaseList(clustereds, isEscapseToBody) {
+      var _this4 = this;
+
+      var releasedParas = [];
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+        var last = lists.last(paras);
+        var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;
+        var parentItem = headList.parentNode;
+
+        if (headList.parentNode.nodeName === 'LI') {
+          paras.map(function (para) {
+            var newList = _this4.findNextSiblings(para);
+
+            if (parentItem.nextSibling) {
+              parentItem.parentNode.insertBefore(para, parentItem.nextSibling);
+            } else {
+              parentItem.parentNode.appendChild(para);
+            }
+
+            if (newList.length) {
+              _this4.wrapList(newList, headList.nodeName);
+
+              para.appendChild(newList[0].parentNode);
+            }
+          });
+
+          if (headList.children.length === 0) {
+            parentItem.removeChild(headList);
+          }
+
+          if (parentItem.childNodes.length === 0) {
+            parentItem.parentNode.removeChild(parentItem);
+          }
+        } else {
+          var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {
+            node: last.parentNode,
+            offset: dom.position(last) + 1
+          }, {
+            isSkipPaddingBlankHTML: true
+          }) : null;
+          var middleList = dom.splitTree(headList, {
+            node: head.parentNode,
+            offset: dom.position(head)
+          }, {
+            isSkipPaddingBlankHTML: true
+          });
+          paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) : lists.from(middleList.childNodes).filter(dom.isLi); // LI to P
+
+          if (isEscapseToBody || !dom.isList(headList.parentNode)) {
+            paras = paras.map(function (para) {
+              return dom.replace(para, 'P');
+            });
+          }
+
+          external_jQuery_default().each(lists.from(paras).reverse(), function (idx, para) {
+            dom.insertAfter(para, headList);
+          }); // remove empty lists
+
+          var rootLists = lists.compact([headList, middleList, lastList]);
+          external_jQuery_default().each(rootLists, function (idx, rootList) {
+            var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));
+            external_jQuery_default().each(listNodes.reverse(), function (idx, listNode) {
+              if (!dom.nodeLength(listNode)) {
+                dom.remove(listNode, true);
+              }
+            });
+          });
+        }
+
+        releasedParas = releasedParas.concat(paras);
+      });
+      return releasedParas;
+    }
+    /**
+     * @method appendToPrevious
+     *
+     * Appends list to previous list item, if
+     * none exist it wraps the list in a new list item.
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "appendToPrevious",
+    value: function appendToPrevious(node) {
+      return node.previousSibling ? dom.appendChildNodes(node.previousSibling, [node]) : this.wrapList([node], 'LI');
+    }
+    /**
+     * @method findList
+     *
+     * Finds an existing list in list item
+     *
+     * @param {HTMLNode} ListItem
+     * @return {Array[]}
+     */
+
+  }, {
+    key: "findList",
+    value: function findList(node) {
+      return node ? lists.find(node.children, function (child) {
+        return ['OL', 'UL'].indexOf(child.nodeName) > -1;
+      }) : null;
+    }
+    /**
+     * @method findNextSiblings
+     *
+     * Finds all list item siblings that follow it
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "findNextSiblings",
+    value: function findNextSiblings(node) {
+      var siblings = [];
+
+      while (node.nextSibling) {
+        siblings.push(node.nextSibling);
+        node = node.nextSibling;
+      }
+
+      return siblings;
+    }
+  }]);
+
+  return Bullet;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Typing.js
+function Typing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Typing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Typing_createClass(Constructor, protoProps, staticProps) { if (protoProps) Typing_defineProperties(Constructor.prototype, protoProps); if (staticProps) Typing_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class editing.Typing
+ *
+ * Typing
+ *
+ */
+
+var Typing = /*#__PURE__*/function () {
+  function Typing(context) {
+    Typing_classCallCheck(this, Typing);
+
+    // a Bullet instance to toggle lists off
+    this.bullet = new Bullet();
+    this.options = context.options;
+  }
+  /**
+   * insert tab
+   *
+   * @param {WrappedRange} rng
+   * @param {Number} tabsize
+   */
+
+
+  Typing_createClass(Typing, [{
+    key: "insertTab",
+    value: function insertTab(rng, tabsize) {
+      var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
+      rng = rng.deleteContents();
+      rng.insertNode(tab, true);
+      rng = range.create(tab, tabsize);
+      rng.select();
+    }
+    /**
+     * insert paragraph
+     *
+     * @param {jQuery} $editable
+     * @param {WrappedRange} rng Can be used in unit tests to "mock" the range
+     *
+     * blockquoteBreakingLevel
+     *   0 - No break, the new paragraph remains inside the quote
+     *   1 - Break the first blockquote in the ancestors list
+     *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)
+     */
+
+  }, {
+    key: "insertParagraph",
+    value: function insertParagraph(editable, rng) {
+      rng = rng || range.create(editable); // deleteContents on range.
+
+      rng = rng.deleteContents(); // Wrap range if it needs to be wrapped by paragraph
+
+      rng = rng.wrapBodyInlineWithPara(); // finding paragraph
+
+      var splitRoot = dom.ancestor(rng.sc, dom.isPara);
+      var nextPara; // on paragraph: split paragraph
+
+      if (splitRoot) {
+        // if it is an empty line with li
+        if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {
+          // toggle UL/OL and escape
+          this.bullet.toggleList(splitRoot.parentNode.nodeName);
+          return;
+        } else {
+          var blockquote = null;
+
+          if (this.options.blockquoteBreakingLevel === 1) {
+            blockquote = dom.ancestor(splitRoot, dom.isBlockquote);
+          } else if (this.options.blockquoteBreakingLevel === 2) {
+            blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);
+          }
+
+          if (blockquote) {
+            // We're inside a blockquote and options ask us to break it
+            nextPara = external_jQuery_default()(dom.emptyPara)[0]; // If the split is right before a <br>, remove it so that there's no "empty line"
+            // after the split in the new blockquote created
+
+            if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {
+              external_jQuery_default()(rng.sc.nextSibling).remove();
+            }
+
+            var split = dom.splitTree(blockquote, rng.getStartPoint(), {
+              isDiscardEmptySplits: true
+            });
+
+            if (split) {
+              split.parentNode.insertBefore(nextPara, split);
+            } else {
+              dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote
+            }
+          } else {
+            nextPara = dom.splitTree(splitRoot, rng.getStartPoint()); // not a blockquote, just insert the paragraph
+
+            var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
+            emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));
+            external_jQuery_default().each(emptyAnchors, function (idx, anchor) {
+              dom.remove(anchor);
+            }); // replace empty heading, pre or custom-made styleTag with P tag
+
+            if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {
+              nextPara = dom.replace(nextPara, 'p');
+            }
+          }
+        } // no paragraph: insert empty paragraph
+
+      } else {
+        var next = rng.sc.childNodes[rng.so];
+        nextPara = external_jQuery_default()(dom.emptyPara)[0];
+
+        if (next) {
+          rng.sc.insertBefore(nextPara, next);
+        } else {
+          rng.sc.appendChild(nextPara);
+        }
+      }
+
+      range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
+    }
+  }]);
+
+  return Typing;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Table.js
+function Table_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Table_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Table_createClass(Constructor, protoProps, staticProps) { if (protoProps) Table_defineProperties(Constructor.prototype, protoProps); if (staticProps) Table_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class Create a virtual table to create what actions to do in change.
+ * @param {object} startPoint Cell selected to apply change.
+ * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where
+ * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction
+ * @param {object} domTable Dom element of table to make changes.
+ */
+
+var TableResultAction = function TableResultAction(startPoint, where, action, domTable) {
+  var _startPoint = {
+    'colPos': 0,
+    'rowPos': 0
+  };
+  var _virtualTable = [];
+  var _actionCellList = []; /// ///////////////////////////////////////////
+  // Private functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Set the startPoint of action.
+   */
+
+  function setStartPoint() {
+    if (!startPoint || !startPoint.tagName || startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th') {
+      // Impossible to identify start Cell point
+      return;
+    }
+
+    _startPoint.colPos = startPoint.cellIndex;
+
+    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {
+      // Impossible to identify start Row point
+      return;
+    }
+
+    _startPoint.rowPos = startPoint.parentElement.rowIndex;
+  }
+  /**
+   * Define virtual table position info object.
+   *
+   * @param {int} rowIndex Index position in line of virtual table.
+   * @param {int} cellIndex Index position in column of virtual table.
+   * @param {object} baseRow Row affected by this position.
+   * @param {object} baseCell Cell affected by this position.
+   * @param {bool} isSpan Inform if it is an span cell/row.
+   */
+
+
+  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {
+    var objPosition = {
+      'baseRow': baseRow,
+      'baseCell': baseCell,
+      'isRowSpan': isRowSpan,
+      'isColSpan': isColSpan,
+      'isVirtual': isVirtualCell
+    };
+
+    if (!_virtualTable[rowIndex]) {
+      _virtualTable[rowIndex] = [];
+    }
+
+    _virtualTable[rowIndex][cellIndex] = objPosition;
+  }
+  /**
+   * Create action cell object.
+   *
+   * @param {object} virtualTableCellObj Object of specific position on virtual table.
+   * @param {enum} resultAction Action to be applied in that item.
+   */
+
+
+  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {
+    return {
+      'baseCell': virtualTableCellObj.baseCell,
+      'action': resultAction,
+      'virtualTable': {
+        'rowIndex': virtualRowPosition,
+        'cellIndex': virtualColPosition
+      }
+    };
+  }
+  /**
+   * Recover free index of row to append Cell.
+   *
+   * @param {int} rowIndex Index of row to find free space.
+   * @param {int} cellIndex Index of cell to find free space in table.
+   */
+
+
+  function recoverCellIndex(rowIndex, cellIndex) {
+    if (!_virtualTable[rowIndex]) {
+      return cellIndex;
+    }
+
+    if (!_virtualTable[rowIndex][cellIndex]) {
+      return cellIndex;
+    }
+
+    var newCellIndex = cellIndex;
+
+    while (_virtualTable[rowIndex][newCellIndex]) {
+      newCellIndex++;
+
+      if (!_virtualTable[rowIndex][newCellIndex]) {
+        return newCellIndex;
+      }
+    }
+  }
+  /**
+   * Recover info about row and cell and add information to virtual table.
+   *
+   * @param {object} row Row to recover information.
+   * @param {object} cell Cell to recover information.
+   */
+
+
+  function addCellInfoToVirtual(row, cell) {
+    var cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);
+    var cellHasColspan = cell.colSpan > 1;
+    var cellHasRowspan = cell.rowSpan > 1;
+    var isThisSelectedCell = row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos;
+    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false); // Add span rows to virtual Table.
+
+    var rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;
+
+    if (rowspanNumber > 1) {
+      for (var rp = 1; rp < rowspanNumber; rp++) {
+        var rowspanIndex = row.rowIndex + rp;
+        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);
+      }
+    } // Add span cols to virtual table.
+
+
+    var colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;
+
+    if (colspanNumber > 1) {
+      for (var cp = 1; cp < colspanNumber; cp++) {
+        var cellspanIndex = recoverCellIndex(row.rowIndex, cellIndex + cp);
+        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);
+      }
+    }
+  }
+  /**
+   * Process validation and adjust of start point if needed
+   *
+   * @param {int} rowIndex
+   * @param {int} cellIndex
+   * @param {object} cell
+   * @param {bool} isSelectedCell
+   */
+
+
+  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {
+    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {
+      _startPoint.colPos++;
+    }
+  }
+  /**
+   * Create virtual table of cells with all cells, including span cells.
+   */
+
+
+  function createVirtualTable() {
+    var rows = domTable.rows;
+
+    for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
+      var cells = rows[rowIndex].cells;
+
+      for (var cellIndex = 0; cellIndex < cells.length; cellIndex++) {
+        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);
+      }
+    }
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getDeleteResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (!cell.isVirtual && cell.isRowSpan) {
+          return TableResultAction.resultAction.AddCell;
+        } else if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.RemoveCell;
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getAddResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isRowSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isColSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.AddCell;
+  }
+
+  function init() {
+    setStartPoint();
+    createVirtualTable();
+  } /// ///////////////////////////////////////////
+  // Public functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Recover array os what to do in table.
+   */
+
+
+  this.getActionList = function () {
+    var fixedRow = where === TableResultAction.where.Row ? _startPoint.rowPos : -1;
+    var fixedCol = where === TableResultAction.where.Column ? _startPoint.colPos : -1;
+    var actualPosition = 0;
+    var canContinue = true;
+
+    while (canContinue) {
+      var rowPosition = fixedRow >= 0 ? fixedRow : actualPosition;
+      var colPosition = fixedCol >= 0 ? fixedCol : actualPosition;
+      var row = _virtualTable[rowPosition];
+
+      if (!row) {
+        canContinue = false;
+        return _actionCellList;
+      }
+
+      var cell = row[colPosition];
+
+      if (!cell) {
+        canContinue = false;
+        return _actionCellList;
+      } // Define action to be applied in this cell
+
+
+      var resultAction = TableResultAction.resultAction.Ignore;
+
+      switch (action) {
+        case TableResultAction.requestAction.Add:
+          resultAction = getAddResultActionToCell(cell);
+          break;
+
+        case TableResultAction.requestAction.Delete:
+          resultAction = getDeleteResultActionToCell(cell);
+          break;
+      }
+
+      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));
+
+      actualPosition++;
+    }
+
+    return _actionCellList;
+  };
+
+  init();
+};
+/**
+*
+* Where action occours enum.
+*/
+
+
+TableResultAction.where = {
+  'Row': 0,
+  'Column': 1
+};
+/**
+*
+* Requested action to apply enum.
+*/
+
+TableResultAction.requestAction = {
+  'Add': 0,
+  'Delete': 1
+};
+/**
+*
+* Result action to be executed enum.
+*/
+
+TableResultAction.resultAction = {
+  'Ignore': 0,
+  'SubtractSpanCount': 1,
+  'RemoveCell': 2,
+  'AddCell': 3,
+  'SumSpanCount': 4
+};
+/**
+ *
+ * @class editing.Table
+ *
+ * Table
+ *
+ */
+
+var Table = /*#__PURE__*/function () {
+  function Table() {
+    Table_classCallCheck(this, Table);
+  }
+
+  Table_createClass(Table, [{
+    key: "tab",
+    value:
+    /**
+     * handle tab key
+     *
+     * @param {WrappedRange} rng
+     * @param {Boolean} isShift
+     */
+    function tab(rng, isShift) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var table = dom.ancestor(cell, dom.isTable);
+      var cells = dom.listDescendant(table, dom.isCell);
+      var nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);
+
+      if (nextCell) {
+        range.create(nextCell, 0).select();
+      }
+    }
+    /**
+     * Add a new row
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (top/bottom)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addRow",
+    value: function addRow(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var currentTr = external_jQuery_default()(cell).closest('tr');
+      var trAttributes = this.recoverAttributes(currentTr);
+      var html = external_jQuery_default()('<tr' + trAttributes + '></tr>');
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Add, external_jQuery_default()(currentTr).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var idCell = 0; idCell < actions.length; idCell++) {
+        var currentCell = actions[idCell];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            {
+              if (position === 'top') {
+                var baseCellTr = currentCell.baseCell.parent;
+                var isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;
+
+                if (isTopFromRowSpan) {
+                  var newTd = external_jQuery_default()('<div></div>').append(external_jQuery_default()('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();
+                  html.append(newTd);
+                  break;
+                }
+              }
+
+              var rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);
+              rowspanNumber++;
+              currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);
+            }
+            break;
+        }
+      }
+
+      if (position === 'top') {
+        currentTr.before(html);
+      } else {
+        var cellHasRowspan = cell.rowSpan > 1;
+
+        if (cellHasRowspan) {
+          var lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);
+          external_jQuery_default()(external_jQuery_default()(currentTr).parent().find('tr')[lastTrIndex]).after(external_jQuery_default()(html));
+          return;
+        }
+
+        currentTr.after(html);
+      }
+    }
+    /**
+     * Add a new col
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (left/right)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addCol",
+    value: function addCol(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var rowsGroup = external_jQuery_default()(row).siblings();
+      rowsGroup.push(row);
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Add, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        var currentCell = actions[actionIndex];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            if (position === 'right') {
+              external_jQuery_default()(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            if (position === 'right') {
+              var colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);
+              colspanNumber++;
+              currentCell.baseCell.setAttribute('colSpan', colspanNumber);
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+        }
+      }
+    }
+    /*
+    * Copy attributes from element.
+    *
+    * @param {object} Element to recover attributes.
+    * @return {string} Copied string elements.
+    */
+
+  }, {
+    key: "recoverAttributes",
+    value: function recoverAttributes(el) {
+      var resultStr = '';
+
+      if (!el) {
+        return resultStr;
+      }
+
+      var attrList = el.attributes || [];
+
+      for (var i = 0; i < attrList.length; i++) {
+        if (attrList[i].name.toLowerCase() === 'id') {
+          continue;
+        }
+
+        if (attrList[i].specified) {
+          resultStr += ' ' + attrList[i].name + '=\'' + attrList[i].value + '\'';
+        }
+      }
+
+      return resultStr;
+    }
+    /**
+     * Delete current row
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteRow",
+    value: function deleteRow(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var rowPos = row[0].rowIndex;
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        var baseCell = actions[actionIndex].baseCell;
+        var virtualPosition = actions[actionIndex].virtualTable;
+        var hasRowspan = baseCell.rowSpan && baseCell.rowSpan > 1;
+        var rowspanNumber = hasRowspan ? parseInt(baseCell.rowSpan, 10) : 0;
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.AddCell:
+            {
+              var nextRow = row.next('tr')[0];
+
+              if (!nextRow) {
+                continue;
+              }
+
+              var cloneRow = row[0].cells[cellPos];
+
+              if (hasRowspan) {
+                if (rowspanNumber > 2) {
+                  rowspanNumber--;
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);
+                  nextRow.cells[cellPos].innerHTML = '';
+                } else if (rowspanNumber === 2) {
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].removeAttribute('rowSpan');
+                  nextRow.cells[cellPos].innerHTML = '';
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            if (hasRowspan) {
+              if (rowspanNumber > 2) {
+                rowspanNumber--;
+                baseCell.setAttribute('rowSpan', rowspanNumber);
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              } else if (rowspanNumber === 2) {
+                baseCell.removeAttribute('rowSpan');
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              }
+            }
+
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            // Do not need remove cell because row will be deleted.
+            continue;
+        }
+      }
+
+      row.remove();
+    }
+    /**
+     * Delete current col
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteCol",
+    value: function deleteCol(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            {
+              var baseCell = actions[actionIndex].baseCell;
+              var hasColspan = baseCell.colSpan && baseCell.colSpan > 1;
+
+              if (hasColspan) {
+                var colspanNumber = baseCell.colSpan ? parseInt(baseCell.colSpan, 10) : 0;
+
+                if (colspanNumber > 2) {
+                  colspanNumber--;
+                  baseCell.setAttribute('colSpan', colspanNumber);
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                } else if (colspanNumber === 2) {
+                  baseCell.removeAttribute('colSpan');
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            dom.remove(actions[actionIndex].baseCell, true);
+            continue;
+        }
+      }
+    }
+    /**
+     * create empty table element
+     *
+     * @param {Number} rowCount
+     * @param {Number} colCount
+     * @return {Node}
+     */
+
+  }, {
+    key: "createTable",
+    value: function createTable(colCount, rowCount, options) {
+      var tds = [];
+      var tdHTML;
+
+      for (var idxCol = 0; idxCol < colCount; idxCol++) {
+        tds.push('<td>' + dom.blank + '</td>');
+      }
+
+      tdHTML = tds.join('');
+      var trs = [];
+      var trHTML;
+
+      for (var idxRow = 0; idxRow < rowCount; idxRow++) {
+        trs.push('<tr>' + tdHTML + '</tr>');
+      }
+
+      trHTML = trs.join('');
+      var $table = external_jQuery_default()('<table>' + trHTML + '</table>');
+
+      if (options && options.tableClassName) {
+        $table.addClass(options.tableClassName);
+      }
+
+      return $table[0];
+    }
+    /**
+     * Delete current table
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteTable",
+    value: function deleteTable(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      external_jQuery_default()(cell).closest('table').remove();
+    }
+  }]);
+
+  return Table;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Editor.js
+function Editor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Editor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Editor_createClass(Constructor, protoProps, staticProps) { if (protoProps) Editor_defineProperties(Constructor.prototype, protoProps); if (staticProps) Editor_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var KEY_BOGUS = 'bogus';
+/**
+ * @class Editor
+ */
+
+var Editor = /*#__PURE__*/function () {
+  function Editor(context) {
+    var _this = this;
+
+    Editor_classCallCheck(this, Editor);
+
+    this.context = context;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.editable = this.$editable[0];
+    this.lastRange = null;
+    this.snapshot = null;
+    this.style = new Style();
+    this.table = new Table();
+    this.typing = new Typing(context);
+    this.bullet = new Bullet();
+    this.history = new History(context);
+    this.context.memo('help.escape', this.lang.help.escape);
+    this.context.memo('help.undo', this.lang.help.undo);
+    this.context.memo('help.redo', this.lang.help.redo);
+    this.context.memo('help.tab', this.lang.help.tab);
+    this.context.memo('help.untab', this.lang.help.untab);
+    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);
+    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);
+    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);
+    this.context.memo('help.indent', this.lang.help.indent);
+    this.context.memo('help.outdent', this.lang.help.outdent);
+    this.context.memo('help.formatPara', this.lang.help.formatPara);
+    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);
+    this.context.memo('help.fontName', this.lang.help.fontName); // native commands(with execCommand), generate function for execCommand
+
+    var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'formatBlock', 'removeFormat', 'backColor'];
+
+    for (var idx = 0, len = commands.length; idx < len; idx++) {
+      this[commands[idx]] = function (sCmd) {
+        return function (value) {
+          _this.beforeCommand();
+
+          document.execCommand(sCmd, false, value);
+
+          _this.afterCommand(true);
+        };
+      }(commands[idx]);
+
+      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);
+    }
+
+    this.fontName = this.wrapCommand(function (value) {
+      return _this.fontStyling('font-family', env.validFontName(value));
+    });
+    this.fontSize = this.wrapCommand(function (value) {
+      var unit = _this.currentStyle()['font-size-unit'];
+
+      return _this.fontStyling('font-size', value + unit);
+    });
+    this.fontSizeUnit = this.wrapCommand(function (value) {
+      var size = _this.currentStyle()['font-size'];
+
+      return _this.fontStyling('font-size', size + value);
+    });
+
+    for (var _idx = 1; _idx <= 6; _idx++) {
+      this['formatH' + _idx] = function (idx) {
+        return function () {
+          _this.formatBlock('H' + idx);
+        };
+      }(_idx);
+
+      this.context.memo('help.formatH' + _idx, this.lang.help['formatH' + _idx]);
+    }
+
+    this.insertParagraph = this.wrapCommand(function () {
+      _this.typing.insertParagraph(_this.editable);
+    });
+    this.insertOrderedList = this.wrapCommand(function () {
+      _this.bullet.insertOrderedList(_this.editable);
+    });
+    this.insertUnorderedList = this.wrapCommand(function () {
+      _this.bullet.insertUnorderedList(_this.editable);
+    });
+    this.indent = this.wrapCommand(function () {
+      _this.bullet.indent(_this.editable);
+    });
+    this.outdent = this.wrapCommand(function () {
+      _this.bullet.outdent(_this.editable);
+    });
+    /**
+     * insertNode
+     * insert node
+     * @param {Node} node
+     */
+
+    this.insertNode = this.wrapCommand(function (node) {
+      if (_this.isLimited(external_jQuery_default()(node).text().length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      rng.insertNode(node);
+
+      _this.setLastRange(range.createFromNodeAfter(node).select());
+    });
+    /**
+     * insert text
+     * @param {String} text
+     */
+
+    this.insertText = this.wrapCommand(function (text) {
+      if (_this.isLimited(text.length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      var textNode = rng.insertNode(dom.createText(text));
+
+      _this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());
+    });
+    /**
+     * paste HTML
+     * @param {String} markup
+     */
+
+    this.pasteHTML = this.wrapCommand(function (markup) {
+      if (_this.isLimited(markup.length)) {
+        return;
+      }
+
+      markup = _this.context.invoke('codeview.purify', markup);
+
+      var contents = _this.getLastRange().pasteHTML(markup);
+
+      _this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());
+    });
+    /**
+     * formatBlock
+     *
+     * @param {String} tagName
+     */
+
+    this.formatBlock = this.wrapCommand(function (tagName, $target) {
+      var onApplyCustomStyle = _this.options.callbacks.onApplyCustomStyle;
+
+      if (onApplyCustomStyle) {
+        onApplyCustomStyle.call(_this, $target, _this.context, _this.onFormatBlock);
+      } else {
+        _this.onFormatBlock(tagName, $target);
+      }
+    });
+    /**
+     * insert horizontal rule
+     */
+
+    this.insertHorizontalRule = this.wrapCommand(function () {
+      var hrNode = _this.getLastRange().insertNode(dom.create('HR'));
+
+      if (hrNode.nextSibling) {
+        _this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());
+      }
+    });
+    /**
+     * lineHeight
+     * @param {String} value
+     */
+
+    this.lineHeight = this.wrapCommand(function (value) {
+      _this.style.stylePara(_this.getLastRange(), {
+        lineHeight: value
+      });
+    });
+    /**
+     * create link (command)
+     *
+     * @param {Object} linkInfo
+     */
+
+    this.createLink = this.wrapCommand(function (linkInfo) {
+      var linkUrl = linkInfo.url;
+      var linkText = linkInfo.text;
+      var isNewWindow = linkInfo.isNewWindow;
+      var checkProtocol = linkInfo.checkProtocol;
+
+      var rng = linkInfo.range || _this.getLastRange();
+
+      var additionalTextLength = linkText.length - rng.toString().length;
+
+      if (additionalTextLength > 0 && _this.isLimited(additionalTextLength)) {
+        return;
+      }
+
+      var isTextChanged = rng.toString() !== linkText; // handle spaced urls from input
+
+      if (typeof linkUrl === 'string') {
+        linkUrl = linkUrl.trim();
+      }
+
+      if (_this.options.onCreateLink) {
+        linkUrl = _this.options.onCreateLink(linkUrl);
+      } else if (checkProtocol) {
+        // if url doesn't have any protocol and not even a relative or a label, use http:// as default
+        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(linkUrl) ? linkUrl : _this.options.defaultProtocol + linkUrl;
+      }
+
+      var anchors = [];
+
+      if (isTextChanged) {
+        rng = rng.deleteContents();
+        var anchor = rng.insertNode(external_jQuery_default()('<A>' + linkText + '</A>')[0]);
+        anchors.push(anchor);
+      } else {
+        anchors = _this.style.styleNodes(rng, {
+          nodeName: 'A',
+          expandClosestSibling: true,
+          onlyPartialContains: true
+        });
+      }
+
+      external_jQuery_default().each(anchors, function (idx, anchor) {
+        external_jQuery_default()(anchor).attr('href', linkUrl);
+
+        if (isNewWindow) {
+          external_jQuery_default()(anchor).attr('target', '_blank');
+        } else {
+          external_jQuery_default()(anchor).removeAttr('target');
+        }
+      });
+
+      _this.setLastRange(_this.createRangeFromList(anchors).select());
+    });
+    /**
+     * setting color
+     *
+     * @param {Object} sObjColor  color code
+     * @param {String} sObjColor.foreColor foreground color
+     * @param {String} sObjColor.backColor background color
+     */
+
+    this.color = this.wrapCommand(function (colorInfo) {
+      var foreColor = colorInfo.foreColor;
+      var backColor = colorInfo.backColor;
+
+      if (foreColor) {
+        document.execCommand('foreColor', false, foreColor);
+      }
+
+      if (backColor) {
+        document.execCommand('backColor', false, backColor);
+      }
+    });
+    /**
+     * Set foreground color
+     *
+     * @param {String} colorCode foreground color code
+     */
+
+    this.foreColor = this.wrapCommand(function (colorInfo) {
+      document.execCommand('foreColor', false, colorInfo);
+    });
+    /**
+     * insert Table
+     *
+     * @param {String} dimension of table (ex : "5x5")
+     */
+
+    this.insertTable = this.wrapCommand(function (dim) {
+      var dimension = dim.split('x');
+
+      var rng = _this.getLastRange().deleteContents();
+
+      rng.insertNode(_this.table.createTable(dimension[0], dimension[1], _this.options));
+    });
+    /**
+     * remove media object and Figure Elements if media object is img with Figure.
+     */
+
+    this.removeMedia = this.wrapCommand(function () {
+      var $target = external_jQuery_default()(_this.restoreTarget()).parent();
+
+      if ($target.closest('figure').length) {
+        $target.closest('figure').remove();
+      } else {
+        $target = external_jQuery_default()(_this.restoreTarget()).detach();
+      }
+
+      _this.context.triggerEvent('media.delete', $target, _this.$editable);
+    });
+    /**
+     * float me
+     *
+     * @param {String} value
+     */
+
+    this.floatMe = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      $target.toggleClass('note-float-left', value === 'left');
+      $target.toggleClass('note-float-right', value === 'right');
+      $target.css('float', value === 'none' ? '' : value);
+    });
+    /**
+     * resize overlay element
+     * @param {String} value
+     */
+
+    this.resize = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      value = parseFloat(value);
+
+      if (value === 0) {
+        $target.css('width', '');
+      } else {
+        $target.css({
+          width: value * 100 + '%',
+          height: ''
+        });
+      }
+    });
+  }
+
+  Editor_createClass(Editor, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      // bind custom events
+      this.$editable.on('keydown', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          _this2.context.triggerEvent('enter', event);
+        }
+
+        _this2.context.triggerEvent('keydown', event); // keep a snapshot to limit text on input event
+
+
+        _this2.snapshot = _this2.history.makeSnapshot();
+        _this2.hasKeyShortCut = false;
+
+        if (!event.isDefaultPrevented()) {
+          if (_this2.options.shortcuts) {
+            _this2.hasKeyShortCut = _this2.handleKeyMap(event);
+          } else {
+            _this2.preventDefaultEditableShortCuts(event);
+          }
+        }
+
+        if (_this2.isLimited(1, event)) {
+          var lastRange = _this2.getLastRange();
+
+          if (lastRange.eo - lastRange.so === 0) {
+            return false;
+          }
+        }
+
+        _this2.setLastRange(); // record undo in the key event except keyMap.
+
+
+        if (_this2.options.recordEveryKeystroke) {
+          if (_this2.hasKeyShortCut === false) {
+            _this2.history.recordUndo();
+          }
+        }
+      }).on('keyup', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('keyup', event);
+      }).on('focus', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('focus', event);
+      }).on('blur', function (event) {
+        _this2.context.triggerEvent('blur', event);
+      }).on('mousedown', function (event) {
+        _this2.context.triggerEvent('mousedown', event);
+      }).on('mouseup', function (event) {
+        _this2.setLastRange();
+
+        _this2.history.recordUndo();
+
+        _this2.context.triggerEvent('mouseup', event);
+      }).on('scroll', function (event) {
+        _this2.context.triggerEvent('scroll', event);
+      }).on('paste', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('paste', event);
+      }).on('input', function () {
+        // To limit composition characters (e.g. Korean)
+        if (_this2.isLimited(0) && _this2.snapshot) {
+          _this2.history.applySnapshot(_this2.snapshot);
+        }
+      });
+      this.$editable.attr('spellcheck', this.options.spellCheck);
+      this.$editable.attr('autocorrect', this.options.spellCheck);
+
+      if (this.options.disableGrammar) {
+        this.$editable.attr('data-gramm', false);
+      } // init content before set event
+
+
+      this.$editable.html(dom.html(this.$note) || dom.emptyPara);
+      this.$editable.on(env.inputEventName, func.debounce(function () {
+        _this2.context.triggerEvent('change', _this2.$editable.html(), _this2.$editable);
+      }, 10));
+      this.$editable.on('focusin', function (event) {
+        _this2.context.triggerEvent('focusin', event);
+      }).on('focusout', function (event) {
+        _this2.context.triggerEvent('focusout', event);
+      });
+
+      if (this.options.airMode) {
+        if (this.options.overrideContextMenu) {
+          this.$editor.on('contextmenu', function (event) {
+            _this2.context.triggerEvent('contextmenu', event);
+
+            return false;
+          });
+        }
+      } else {
+        if (this.options.width) {
+          this.$editor.outerWidth(this.options.width);
+        }
+
+        if (this.options.height) {
+          this.$editable.outerHeight(this.options.height);
+        }
+
+        if (this.options.maxHeight) {
+          this.$editable.css('max-height', this.options.maxHeight);
+        }
+
+        if (this.options.minHeight) {
+          this.$editable.css('min-height', this.options.minHeight);
+        }
+      }
+
+      this.history.recordUndo();
+      this.setLastRange();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$editable.off();
+    }
+  }, {
+    key: "handleKeyMap",
+    value: function handleKeyMap(event) {
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      var keys = [];
+
+      if (event.metaKey) {
+        keys.push('CMD');
+      }
+
+      if (event.ctrlKey && !event.altKey) {
+        keys.push('CTRL');
+      }
+
+      if (event.shiftKey) {
+        keys.push('SHIFT');
+      }
+
+      var keyName = key.nameFromCode[event.keyCode];
+
+      if (keyName) {
+        keys.push(keyName);
+      }
+
+      var eventName = keyMap[keys.join('+')];
+
+      if (keyName === 'TAB' && !this.options.tabDisable) {
+        this.afterCommand();
+      } else if (eventName) {
+        if (this.context.invoke(eventName) !== false) {
+          event.preventDefault(); // if keyMap action was invoked
+
+          return true;
+        }
+      } else if (key.isEdit(event.keyCode)) {
+        this.afterCommand();
+      }
+
+      return false;
+    }
+  }, {
+    key: "preventDefaultEditableShortCuts",
+    value: function preventDefaultEditableShortCuts(event) {
+      // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)
+      if ((event.ctrlKey || event.metaKey) && lists.contains([66, 73, 85], event.keyCode)) {
+        event.preventDefault();
+      }
+    }
+  }, {
+    key: "isLimited",
+    value: function isLimited(pad, event) {
+      pad = pad || 0;
+
+      if (typeof event !== 'undefined') {
+        if (key.isMove(event.keyCode) || key.isNavigation(event.keyCode) || event.ctrlKey || event.metaKey || lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {
+          return false;
+        }
+      }
+
+      if (this.options.maxTextLength > 0) {
+        if (this.$editable.text().length + pad > this.options.maxTextLength) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+    /**
+     * create range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRange",
+    value: function createRange() {
+      this.focus();
+      this.setLastRange();
+      return this.getLastRange();
+    }
+    /**
+     * create a new range from the list of elements
+     *
+     * @param {list} dom element list
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRangeFromList",
+    value: function createRangeFromList(lst) {
+      var startRange = range.createFromNodeBefore(lists.head(lst));
+      var startPoint = startRange.getStartPoint();
+      var endRange = range.createFromNodeAfter(lists.last(lst));
+      var endPoint = endRange.getEndPoint();
+      return range.create(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * set the last range
+     *
+     * if given rng is exist, set rng as the last range
+     * or create a new range at the end of the document
+     *
+     * @param {WrappedRange} rng
+     */
+
+  }, {
+    key: "setLastRange",
+    value: function setLastRange(rng) {
+      if (rng) {
+        this.lastRange = rng;
+      } else {
+        this.lastRange = range.create(this.editable);
+
+        if (external_jQuery_default()(this.lastRange.sc).closest('.note-editable').length === 0) {
+          this.lastRange = range.createFromBodyElement(this.editable);
+        }
+      }
+    }
+    /**
+     * get the last range
+     *
+     * if there is a saved last range, return it
+     * or create a new range and return it
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getLastRange",
+    value: function getLastRange() {
+      if (!this.lastRange) {
+        this.setLastRange();
+      }
+
+      return this.lastRange;
+    }
+    /**
+     * saveRange
+     *
+     * save current range
+     *
+     * @param {Boolean} [thenCollapse=false]
+     */
+
+  }, {
+    key: "saveRange",
+    value: function saveRange(thenCollapse) {
+      if (thenCollapse) {
+        this.getLastRange().collapse().select();
+      }
+    }
+    /**
+     * restoreRange
+     *
+     * restore lately range
+     */
+
+  }, {
+    key: "restoreRange",
+    value: function restoreRange() {
+      if (this.lastRange) {
+        this.lastRange.select();
+        this.focus();
+      }
+    }
+  }, {
+    key: "saveTarget",
+    value: function saveTarget(node) {
+      this.$editable.data('target', node);
+    }
+  }, {
+    key: "clearTarget",
+    value: function clearTarget() {
+      this.$editable.removeData('target');
+    }
+  }, {
+    key: "restoreTarget",
+    value: function restoreTarget() {
+      return this.$editable.data('target');
+    }
+    /**
+     * currentStyle
+     *
+     * current style
+     * @return {Object|Boolean} unfocus
+     */
+
+  }, {
+    key: "currentStyle",
+    value: function currentStyle() {
+      var rng = range.create();
+
+      if (rng) {
+        rng = rng.normalize();
+      }
+
+      return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);
+    }
+    /**
+     * style from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "styleFromNode",
+    value: function styleFromNode($node) {
+      return this.style.fromNode($node);
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.undo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /*
+    * commit
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.commit();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.redo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * before command
+     */
+
+  }, {
+    key: "beforeCommand",
+    value: function beforeCommand() {
+      this.context.triggerEvent('before.command', this.$editable.html()); // Set styleWithCSS before run a command
+
+      document.execCommand('styleWithCSS', false, this.options.styleWithCSS); // keep focus on editable before command execution
+
+      this.focus();
+    }
+    /**
+     * after command
+     * @param {Boolean} isPreventTrigger
+     */
+
+  }, {
+    key: "afterCommand",
+    value: function afterCommand(isPreventTrigger) {
+      this.normalizeContent();
+      this.history.recordUndo();
+
+      if (!isPreventTrigger) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+    /**
+     * handle tab key
+     */
+
+  }, {
+    key: "tab",
+    value: function tab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+
+        if (!this.isLimited(this.options.tabSize)) {
+          this.beforeCommand();
+          this.typing.insertTab(rng, this.options.tabSize);
+          this.afterCommand();
+        }
+      }
+    }
+    /**
+     * handle shift+tab key
+     */
+
+  }, {
+    key: "untab",
+    value: function untab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng, true);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+      }
+    }
+    /**
+     * run given function between beforeCommand and afterCommand
+     */
+
+  }, {
+    key: "wrapCommand",
+    value: function wrapCommand(fn) {
+      return function () {
+        this.beforeCommand();
+        fn.apply(this, arguments);
+        this.afterCommand();
+      };
+    }
+    /**
+     * insert image
+     *
+     * @param {String} src
+     * @param {String|Function} param
+     * @return {Promise}
+     */
+
+  }, {
+    key: "insertImage",
+    value: function insertImage(src, param) {
+      var _this3 = this;
+
+      return createImage(src, param).then(function ($image) {
+        _this3.beforeCommand();
+
+        if (typeof param === 'function') {
+          param($image);
+        } else {
+          if (typeof param === 'string') {
+            $image.attr('data-filename', param);
+          }
+
+          $image.css('width', Math.min(_this3.$editable.width(), $image.width()));
+        }
+
+        $image.show();
+
+        _this3.getLastRange().insertNode($image[0]);
+
+        _this3.setLastRange(range.createFromNodeAfter($image[0]).select());
+
+        _this3.afterCommand();
+      }).fail(function (e) {
+        _this3.context.triggerEvent('image.upload.error', e);
+      });
+    }
+    /**
+     * insertImages
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesAsDataURL",
+    value: function insertImagesAsDataURL(files) {
+      var _this4 = this;
+
+      external_jQuery_default().each(files, function (idx, file) {
+        var filename = file.name;
+
+        if (_this4.options.maximumImageFileSize && _this4.options.maximumImageFileSize < file.size) {
+          _this4.context.triggerEvent('image.upload.error', _this4.lang.image.maximumFileSizeError);
+        } else {
+          readFileAsDataURL(file).then(function (dataURL) {
+            return _this4.insertImage(dataURL, filename);
+          }).fail(function () {
+            _this4.context.triggerEvent('image.upload.error');
+          });
+        }
+      });
+    }
+    /**
+     * insertImagesOrCallback
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesOrCallback",
+    value: function insertImagesOrCallback(files) {
+      var callbacks = this.options.callbacks; // If onImageUpload set,
+
+      if (callbacks.onImageUpload) {
+        this.context.triggerEvent('image.upload', files); // else insert Image as dataURL
+      } else {
+        this.insertImagesAsDataURL(files);
+      }
+    }
+    /**
+     * return selected plain text
+     * @return {String} text
+     */
+
+  }, {
+    key: "getSelectedText",
+    value: function getSelectedText() {
+      var rng = this.getLastRange(); // if range on anchor, expand range with anchor
+
+      if (rng.isOnAnchor()) {
+        rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));
+      }
+
+      return rng.toString();
+    }
+  }, {
+    key: "onFormatBlock",
+    value: function onFormatBlock(tagName, $target) {
+      // [workaround] for MSIE, IE need `<`
+      document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName); // support custom class
+
+      if ($target && $target.length) {
+        // find the exact element has given tagName
+        if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {
+          $target = $target.find(tagName);
+        }
+
+        if ($target && $target.length) {
+          var currentRange = this.createRange();
+          var $parent = external_jQuery_default()([currentRange.sc, currentRange.ec]).closest(tagName); // remove class added for current block
+
+          $parent.removeClass();
+          var className = $target[0].className || '';
+
+          if (className) {
+            $parent.addClass(className);
+          }
+        }
+      }
+    }
+  }, {
+    key: "formatPara",
+    value: function formatPara() {
+      this.formatBlock('P');
+    }
+  }, {
+    key: "fontStyling",
+    value: function fontStyling(target, value) {
+      var rng = this.getLastRange();
+
+      if (rng !== '') {
+        var spans = this.style.styleNodes(rng);
+        this.$editor.find('.note-status-output').html('');
+        external_jQuery_default()(spans).css(target, value); // [workaround] added styled bogus span for style
+        //  - also bogus character needed for cursor position
+
+        if (rng.isCollapsed()) {
+          var firstSpan = lists.head(spans);
+
+          if (firstSpan && !dom.nodeLength(firstSpan)) {
+            firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;
+            range.createFromNode(firstSpan.firstChild).select();
+            this.setLastRange();
+            this.$editable.data(KEY_BOGUS, firstSpan);
+          }
+        } else {
+          this.setLastRange(this.createRangeFromList(spans).select());
+        }
+      } else {
+        var noteStatusOutput = external_jQuery_default().now();
+        this.$editor.find('.note-status-output').html('<div id="note-status-output-' + noteStatusOutput + '" class="alert alert-info">' + this.lang.output.noSelection + '</div>');
+        setTimeout(function () {
+          external_jQuery_default()('#note-status-output-' + noteStatusOutput).remove();
+        }, 5000);
+      }
+    }
+    /**
+     * unlink
+     *
+     * @type command
+     */
+
+  }, {
+    key: "unlink",
+    value: function unlink() {
+      var rng = this.getLastRange();
+
+      if (rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        rng = range.createFromNode(anchor);
+        rng.select();
+        this.setLastRange();
+        this.beforeCommand();
+        document.execCommand('unlink');
+        this.afterCommand();
+      }
+    }
+    /**
+     * returns link info
+     *
+     * @return {Object}
+     * @return {WrappedRange} return.range
+     * @return {String} return.text
+     * @return {Boolean} [return.isNewWindow=true]
+     * @return {String} [return.url=""]
+     */
+
+  }, {
+    key: "getLinkInfo",
+    value: function getLinkInfo() {
+      var rng = this.getLastRange().expand(dom.isAnchor); // Get the first anchor on range(for edit).
+
+      var $anchor = external_jQuery_default()(lists.head(rng.nodes(dom.isAnchor)));
+      var linkInfo = {
+        range: rng,
+        text: rng.toString(),
+        url: $anchor.length ? $anchor.attr('href') : ''
+      }; // When anchor exists,
+
+      if ($anchor.length) {
+        // Set isNewWindow by checking its target.
+        linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
+      }
+
+      return linkInfo;
+    }
+  }, {
+    key: "addRow",
+    value: function addRow(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addRow(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "addCol",
+    value: function addCol(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addCol(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteRow",
+    value: function deleteRow() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteRow(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteCol",
+    value: function deleteCol() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteCol(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteTable",
+    value: function deleteTable() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteTable(rng);
+        this.afterCommand();
+      }
+    }
+    /**
+     * @param {Position} pos
+     * @param {jQuery} $target - target element
+     * @param {Boolean} [bKeepRatio] - keep ratio
+     */
+
+  }, {
+    key: "resizeTo",
+    value: function resizeTo(pos, $target, bKeepRatio) {
+      var imageSize;
+
+      if (bKeepRatio) {
+        var newRatio = pos.y / pos.x;
+        var ratio = $target.data('ratio');
+        imageSize = {
+          width: ratio > newRatio ? pos.x : pos.y / ratio,
+          height: ratio > newRatio ? pos.x * ratio : pos.y
+        };
+      } else {
+        imageSize = {
+          width: pos.x,
+          height: pos.y
+        };
+      }
+
+      $target.css(imageSize);
+    }
+    /**
+     * returns whether editable area has focus or not.
+     */
+
+  }, {
+    key: "hasFocus",
+    value: function hasFocus() {
+      return this.$editable.is(':focus');
+    }
+    /**
+     * set focus
+     */
+
+  }, {
+    key: "focus",
+    value: function focus() {
+      // [workaround] Screen will move when page is scolled in IE.
+      //  - do focus when not focused
+      if (!this.hasFocus()) {
+        this.$editable.focus();
+      }
+    }
+    /**
+     * returns whether contents is empty or not.
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isEmpty",
+    value: function isEmpty() {
+      return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();
+    }
+    /**
+     * Removes all contents and restores the editable instance to an _emptyPara_.
+     */
+
+  }, {
+    key: "empty",
+    value: function empty() {
+      this.context.invoke('code', dom.emptyPara);
+    }
+    /**
+     * normalize content
+     */
+
+  }, {
+    key: "normalizeContent",
+    value: function normalizeContent() {
+      this.$editable[0].normalize();
+    }
+  }]);
+
+  return Editor;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Clipboard.js
+function Clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Clipboard_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Clipboard_createClass(Constructor, protoProps, staticProps) { if (protoProps) Clipboard_defineProperties(Constructor.prototype, protoProps); if (staticProps) Clipboard_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Clipboard = /*#__PURE__*/function () {
+  function Clipboard(context) {
+    Clipboard_classCallCheck(this, Clipboard);
+
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+  }
+
+  Clipboard_createClass(Clipboard, [{
+    key: "initialize",
+    value: function initialize() {
+      this.$editable.on('paste', this.pasteByEvent.bind(this));
+    }
+    /**
+     * paste by clipboard event
+     *
+     * @param {Event} event
+     */
+
+  }, {
+    key: "pasteByEvent",
+    value: function pasteByEvent(event) {
+      var _this = this;
+
+      var clipboardData = event.originalEvent.clipboardData;
+
+      if (clipboardData && clipboardData.items && clipboardData.items.length) {
+        var item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);
+
+        if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
+          // paste img file
+          this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);
+          event.preventDefault();
+        } else if (item.kind === 'string') {
+          // paste text with maxTextLength check
+          if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {
+            event.preventDefault();
+          }
+        }
+      } else if (window.clipboardData) {
+        // for IE
+        var text = window.clipboardData.getData('text');
+
+        if (this.context.invoke('editor.isLimited', text.length)) {
+          event.preventDefault();
+        }
+      } // Call editor.afterCommand after proceeding default event handler
+
+
+      setTimeout(function () {
+        _this.context.invoke('editor.afterCommand');
+      }, 10);
+    }
+  }]);
+
+  return Clipboard;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Dropzone.js
+function Dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) Dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) Dropzone_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Dropzone = /*#__PURE__*/function () {
+  function Dropzone(context) {
+    Dropzone_classCallCheck(this, Dropzone);
+
+    this.context = context;
+    this.$eventListener = external_jQuery_default()(document);
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.documentEventHandlers = {};
+    this.$dropzone = external_jQuery_default()(['<div class="note-dropzone">', '<div class="note-dropzone-message"></div>', '</div>'].join('')).prependTo(this.$editor);
+  }
+  /**
+   * attach Drag and Drop Events
+   */
+
+
+  Dropzone_createClass(Dropzone, [{
+    key: "initialize",
+    value: function initialize() {
+      if (this.options.disableDragAndDrop) {
+        // prevent default drop event
+        this.documentEventHandlers.onDrop = function (e) {
+          e.preventDefault();
+        }; // do not consider outside of dropzone
+
+
+        this.$eventListener = this.$dropzone;
+        this.$eventListener.on('drop', this.documentEventHandlers.onDrop);
+      } else {
+        this.attachDragAndDropEvent();
+      }
+    }
+    /**
+     * attach Drag and Drop Events
+     */
+
+  }, {
+    key: "attachDragAndDropEvent",
+    value: function attachDragAndDropEvent() {
+      var _this = this;
+
+      var collection = external_jQuery_default()();
+      var $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');
+
+      this.documentEventHandlers.onDragenter = function (e) {
+        var isCodeview = _this.context.invoke('codeview.isActivated');
+
+        var hasEditorSize = _this.$editor.width() > 0 && _this.$editor.height() > 0;
+
+        if (!isCodeview && !collection.length && hasEditorSize) {
+          _this.$editor.addClass('dragover');
+
+          _this.$dropzone.width(_this.$editor.width());
+
+          _this.$dropzone.height(_this.$editor.height());
+
+          $dropzoneMessage.text(_this.lang.image.dragImageHere);
+        }
+
+        collection = collection.add(e.target);
+      };
+
+      this.documentEventHandlers.onDragleave = function (e) {
+        collection = collection.not(e.target); // If nodeName is BODY, then just make it over (fix for IE)
+
+        if (!collection.length || e.target.nodeName === 'BODY') {
+          collection = external_jQuery_default()();
+
+          _this.$editor.removeClass('dragover');
+        }
+      };
+
+      this.documentEventHandlers.onDrop = function () {
+        collection = external_jQuery_default()();
+
+        _this.$editor.removeClass('dragover');
+      }; // show dropzone on dragenter when dragging a object to document
+      // -but only if the editor is visible, i.e. has a positive width and height
+
+
+      this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter).on('dragleave', this.documentEventHandlers.onDragleave).on('drop', this.documentEventHandlers.onDrop); // change dropzone's message on hover.
+
+      this.$dropzone.on('dragenter', function () {
+        _this.$dropzone.addClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dropImage);
+      }).on('dragleave', function () {
+        _this.$dropzone.removeClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dragImageHere);
+      }); // attach dropImage
+
+      this.$dropzone.on('drop', function (event) {
+        var dataTransfer = event.originalEvent.dataTransfer; // stop the browser from opening the dropped content
+
+        event.preventDefault();
+
+        if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
+          _this.$editable.focus();
+
+          _this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);
+        } else {
+          external_jQuery_default().each(dataTransfer.types, function (idx, type) {
+            // skip moz-specific types
+            if (type.toLowerCase().indexOf('_moz_') > -1) {
+              return;
+            }
+
+            var content = dataTransfer.getData(type);
+
+            if (type.toLowerCase().indexOf('text') > -1) {
+              _this.context.invoke('editor.pasteHTML', content);
+            } else {
+              external_jQuery_default()(content).each(function (idx, item) {
+                _this.context.invoke('editor.insertNode', item);
+              });
+            }
+          });
+        }
+      }).on('dragover', false); // prevent default dragover event
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      var _this2 = this;
+
+      Object.keys(this.documentEventHandlers).forEach(function (key) {
+        _this2.$eventListener.off(key.substr(2).toLowerCase(), _this2.documentEventHandlers[key]);
+      });
+      this.documentEventHandlers = {};
+    }
+  }]);
+
+  return Dropzone;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Codeview.js
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function Codeview_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Codeview_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Codeview_createClass(Constructor, protoProps, staticProps) { if (protoProps) Codeview_defineProperties(Constructor.prototype, protoProps); if (staticProps) Codeview_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+/**
+ * @class Codeview
+ */
+
+var CodeView = /*#__PURE__*/function () {
+  function CodeView(context) {
+    Codeview_classCallCheck(this, CodeView);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+    this.CodeMirrorConstructor = window.CodeMirror;
+
+    if (this.options.codemirror.CodeMirrorConstructor) {
+      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;
+    }
+  }
+
+  Codeview_createClass(CodeView, [{
+    key: "sync",
+    value: function sync(html) {
+      var isCodeview = this.isActivated();
+      var CodeMirror = this.CodeMirrorConstructor;
+
+      if (isCodeview) {
+        if (html) {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').getDoc().setValue(html);
+          } else {
+            this.$codable.val(html);
+          }
+        } else {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').save();
+          }
+        }
+      }
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.$codable.on('keyup', function (event) {
+        if (event.keyCode === key.code.ESCAPE) {
+          _this.deactivate();
+        }
+      });
+    }
+    /**
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isActivated",
+    value: function isActivated() {
+      return this.$editor.hasClass('codeview');
+    }
+    /**
+     * toggle codeview
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      if (this.isActivated()) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+
+      this.context.triggerEvent('codeview.toggled');
+    }
+    /**
+     * purify input value
+     * @param value
+     * @returns {*}
+     */
+
+  }, {
+    key: "purify",
+    value: function purify(value) {
+      if (this.options.codeviewFilter) {
+        // filter code view regex
+        value = value.replace(this.options.codeviewFilterRegex, ''); // allow specific iframe tag
+
+        if (this.options.codeviewIframeFilter) {
+          var whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);
+          value = value.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi, function (tag) {
+            // remove if src attribute is duplicated
+            if (/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(tag)) {
+              return '';
+            }
+
+            var _iterator = _createForOfIteratorHelper(whitelist),
+                _step;
+
+            try {
+              for (_iterator.s(); !(_step = _iterator.n()).done;) {
+                var src = _step.value;
+
+                // pass if src is trusted
+                if (new RegExp('src="(https?:)?\/\/' + src.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '\/(.+)"').test(tag)) {
+                  return tag;
+                }
+              }
+            } catch (err) {
+              _iterator.e(err);
+            } finally {
+              _iterator.f();
+            }
+
+            return '';
+          });
+        }
+      }
+
+      return value;
+    }
+    /**
+     * activate code view
+     */
+
+  }, {
+    key: "activate",
+    value: function activate() {
+      var _this2 = this;
+
+      var CodeMirror = this.CodeMirrorConstructor;
+      this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));
+      this.$codable.height(this.$editable.height());
+      this.context.invoke('toolbar.updateCodeview', true);
+      this.context.invoke('airPopover.updateCodeview', true);
+      this.$editor.addClass('codeview');
+      this.$codable.focus(); // activate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror); // CodeMirror TernServer
+
+        if (this.options.codemirror.tern) {
+          var server = new CodeMirror.TernServer(this.options.codemirror.tern);
+          cmEditor.ternServer = server;
+          cmEditor.on('cursorActivity', function (cm) {
+            server.updateArgHints(cm);
+          });
+        }
+
+        cmEditor.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);
+        });
+        cmEditor.on('change', function () {
+          _this2.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);
+        }); // CodeMirror hasn't Padding.
+
+        cmEditor.setSize(null, this.$editable.outerHeight());
+        this.$codable.data('cmEditor', cmEditor);
+      } else {
+        this.$codable.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', _this2.$codable.val(), event);
+        });
+        this.$codable.on('input', function () {
+          _this2.context.triggerEvent('change.codeview', _this2.$codable.val(), _this2.$codable);
+        });
+      }
+    }
+    /**
+     * deactivate code view
+     */
+
+  }, {
+    key: "deactivate",
+    value: function deactivate() {
+      var CodeMirror = this.CodeMirrorConstructor; // deactivate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = this.$codable.data('cmEditor');
+        this.$codable.val(cmEditor.getValue());
+        cmEditor.toTextArea();
+      }
+
+      var value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);
+      var isChange = this.$editable.html() !== value;
+      this.$editable.html(value);
+      this.$editable.height(this.options.height ? this.$codable.height() : 'auto');
+      this.$editor.removeClass('codeview');
+
+      if (isChange) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+
+      this.$editable.focus();
+      this.context.invoke('toolbar.updateCodeview', false);
+      this.context.invoke('airPopover.updateCodeview', false);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      if (this.isActivated()) {
+        this.deactivate();
+      }
+    }
+  }]);
+
+  return CodeView;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Statusbar.js
+function Statusbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Statusbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Statusbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Statusbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Statusbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+var EDITABLE_PADDING = 24;
+
+var Statusbar = /*#__PURE__*/function () {
+  function Statusbar(context) {
+    Statusbar_classCallCheck(this, Statusbar);
+
+    this.$document = external_jQuery_default()(document);
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+  }
+
+  Statusbar_createClass(Statusbar, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      if (this.options.airMode || this.options.disableResizeEditor) {
+        this.destroy();
+        return;
+      }
+
+      this.$statusbar.on('mousedown', function (event) {
+        event.preventDefault();
+        event.stopPropagation();
+
+        var editableTop = _this.$editable.offset().top - _this.$document.scrollTop();
+
+        var editableCodeTop = _this.$codable.offset().top - _this.$document.scrollTop();
+
+        var onMouseMove = function onMouseMove(event) {
+          var height = event.clientY - (editableTop + EDITABLE_PADDING);
+          var heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);
+          height = _this.options.minheight > 0 ? Math.max(height, _this.options.minheight) : height;
+          height = _this.options.maxHeight > 0 ? Math.min(height, _this.options.maxHeight) : height;
+          heightCode = _this.options.minheight > 0 ? Math.max(heightCode, _this.options.minheight) : heightCode;
+          heightCode = _this.options.maxHeight > 0 ? Math.min(heightCode, _this.options.maxHeight) : heightCode;
+
+          _this.$editable.height(height);
+
+          _this.$codable.height(heightCode);
+        };
+
+        _this.$document.on('mousemove', onMouseMove).one('mouseup', function () {
+          _this.$document.off('mousemove', onMouseMove);
+        });
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$statusbar.off();
+      this.$statusbar.addClass('locked');
+    }
+  }]);
+
+  return Statusbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Fullscreen.js
+function Fullscreen_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Fullscreen_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Fullscreen_createClass(Constructor, protoProps, staticProps) { if (protoProps) Fullscreen_defineProperties(Constructor.prototype, protoProps); if (staticProps) Fullscreen_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Fullscreen = /*#__PURE__*/function () {
+  function Fullscreen(context) {
+    var _this = this;
+
+    Fullscreen_classCallCheck(this, Fullscreen);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.$window = external_jQuery_default()(window);
+    this.$scrollbar = external_jQuery_default()('html, body');
+    this.scrollbarClassName = 'note-fullscreen-body';
+
+    this.onResize = function () {
+      _this.resizeTo({
+        h: _this.$window.height() - _this.$toolbar.outerHeight()
+      });
+    };
+  }
+
+  Fullscreen_createClass(Fullscreen, [{
+    key: "resizeTo",
+    value: function resizeTo(size) {
+      this.$editable.css('height', size.h);
+      this.$codable.css('height', size.h);
+
+      if (this.$codable.data('cmeditor')) {
+        this.$codable.data('cmeditor').setsize(null, size.h);
+      }
+    }
+    /**
+     * toggle fullscreen
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      this.$editor.toggleClass('fullscreen');
+      var isFullscreen = this.isFullscreen();
+      this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);
+
+      if (isFullscreen) {
+        this.$editable.data('orgHeight', this.$editable.css('height'));
+        this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));
+        this.$editable.css('maxHeight', '');
+        this.$window.on('resize', this.onResize).trigger('resize');
+      } else {
+        this.$window.off('resize', this.onResize);
+        this.resizeTo({
+          h: this.$editable.data('orgHeight')
+        });
+        this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));
+      }
+
+      this.context.invoke('toolbar.updateFullscreen', isFullscreen);
+    }
+  }, {
+    key: "isFullscreen",
+    value: function isFullscreen() {
+      return this.$editor.hasClass('fullscreen');
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$scrollbar.removeClass(this.scrollbarClassName);
+    }
+  }]);
+
+  return Fullscreen;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Handle.js
+function Handle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Handle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Handle_createClass(Constructor, protoProps, staticProps) { if (protoProps) Handle_defineProperties(Constructor.prototype, protoProps); if (staticProps) Handle_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Handle = /*#__PURE__*/function () {
+  function Handle(context) {
+    var _this = this;
+
+    Handle_classCallCheck(this, Handle);
+
+    this.context = context;
+    this.$document = external_jQuery_default()(document);
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        if (_this.update(e.target, e)) {
+          e.preventDefault();
+        }
+      },
+      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': function summernoteKeyupSummernoteScrollSummernoteChangeSummernoteDialogShown() {
+        _this.update();
+      },
+      'summernote.disable summernote.blur': function summernoteDisableSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Handle_createClass(Handle, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$handle = external_jQuery_default()(['<div class="note-handle">', '<div class="note-control-selection">', '<div class="note-control-selection-bg"></div>', '<div class="note-control-holder note-control-nw"></div>', '<div class="note-control-holder note-control-ne"></div>', '<div class="note-control-holder note-control-sw"></div>', '<div class="', this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing', ' note-control-se"></div>', this.options.disableResizeImage ? '' : '<div class="note-control-selection-info"></div>', '</div>', '</div>'].join('')).prependTo(this.$editingArea);
+      this.$handle.on('mousedown', function (event) {
+        if (dom.isControlSizing(event.target)) {
+          event.preventDefault();
+          event.stopPropagation();
+
+          var $target = _this2.$handle.find('.note-control-selection').data('target');
+
+          var posStart = $target.offset();
+
+          var scrollTop = _this2.$document.scrollTop();
+
+          var onMouseMove = function onMouseMove(event) {
+            _this2.context.invoke('editor.resizeTo', {
+              x: event.clientX - posStart.left,
+              y: event.clientY - (posStart.top - scrollTop)
+            }, $target, !event.shiftKey);
+
+            _this2.update($target[0], event);
+          };
+
+          _this2.$document.on('mousemove', onMouseMove).one('mouseup', function (e) {
+            e.preventDefault();
+
+            _this2.$document.off('mousemove', onMouseMove);
+
+            _this2.context.invoke('editor.afterCommand');
+          });
+
+          if (!$target.data('ratio')) {
+            // original ratio.
+            $target.data('ratio', $target.height() / $target.width());
+          }
+        }
+      }); // Listen for scrolling on the handle overlay.
+
+      this.$handle.on('wheel', function (e) {
+        e.preventDefault();
+
+        _this2.update();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$handle.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isImage = dom.isImg(target);
+      var $selection = this.$handle.find('.note-control-selection');
+      this.context.invoke('imagePopover.update', target, event);
+
+      if (isImage) {
+        var $image = external_jQuery_default()(target);
+        var position = $image.position();
+        var pos = {
+          left: position.left + parseInt($image.css('marginLeft'), 10),
+          top: position.top + parseInt($image.css('marginTop'), 10)
+        }; // exclude margin
+
+        var imageSize = {
+          w: $image.outerWidth(false),
+          h: $image.outerHeight(false)
+        };
+        $selection.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top,
+          width: imageSize.w,
+          height: imageSize.h
+        }).data('target', $image); // save current image element.
+
+        var origImageObj = new Image();
+        origImageObj.src = $image.attr('src');
+        var sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';
+        $selection.find('.note-control-selection-info').text(sizingText);
+        this.context.invoke('editor.saveTarget', target);
+      } else {
+        this.hide();
+      }
+
+      return isImage;
+    }
+    /**
+     * hide
+     *
+     * @param {jQuery} $handle
+     */
+
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.context.invoke('editor.clearTarget');
+      this.$handle.children().hide();
+    }
+  }]);
+
+  return Handle;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoLink.js
+function AutoLink_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoLink_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoLink_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoLink_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoLink_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var defaultScheme = 'http://';
+var linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i;
+
+var AutoLink = /*#__PURE__*/function () {
+  function AutoLink(context) {
+    var _this = this;
+
+    AutoLink_classCallCheck(this, AutoLink);
+
+    this.context = context;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoLink_createClass(AutoLink, [{
+    key: "initialize",
+    value: function initialize() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWordRange) {
+        return;
+      }
+
+      var keyword = this.lastWordRange.toString();
+      var match = keyword.match(linkPattern);
+
+      if (match && (match[1] || match[2])) {
+        var link = match[1] ? keyword : defaultScheme + keyword;
+        var urlText = this.options.showDomainOnlyForAutolink ? keyword.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i, '').split('/')[0] : keyword;
+        var node = external_jQuery_default()('<a></a>').html(urlText).attr('href', link)[0];
+
+        if (this.context.options.linkTargetBlank) {
+          external_jQuery_default()(node).attr('target', '_blank');
+        }
+
+        this.lastWordRange.insertNode(node);
+        this.lastWordRange = null;
+        this.context.invoke('editor.focus');
+      }
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWordRange = wordRange;
+      }
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoLink;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoSync.js
+function AutoSync_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoSync_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoSync_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoSync_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoSync_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+/**
+ * textarea auto sync.
+ */
+
+var AutoSync = /*#__PURE__*/function () {
+  function AutoSync(context) {
+    var _this = this;
+
+    AutoSync_classCallCheck(this, AutoSync);
+
+    this.$note = context.layoutInfo.note;
+    this.events = {
+      'summernote.change': function summernoteChange() {
+        _this.$note.val(context.invoke('code'));
+      }
+    };
+  }
+
+  AutoSync_createClass(AutoSync, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return dom.isTextarea(this.$note[0]);
+    }
+  }]);
+
+  return AutoSync;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoReplace.js
+function AutoReplace_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoReplace_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoReplace_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoReplace_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoReplace_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var AutoReplace = /*#__PURE__*/function () {
+  function AutoReplace(context) {
+    var _this = this;
+
+    AutoReplace_classCallCheck(this, AutoReplace);
+
+    this.context = context;
+    this.options = context.options.replace || {};
+    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];
+    this.previousKeydownCode = null;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoReplace_createClass(AutoReplace, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.match;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWord) {
+        return;
+      }
+
+      var self = this;
+      var keyword = this.lastWord.toString();
+      this.options.match(keyword, function (match) {
+        if (match) {
+          var node = '';
+
+          if (typeof match === 'string') {
+            node = dom.createText(match);
+          } else if (match instanceof jQuery) {
+            node = match[0];
+          } else if (match instanceof Node) {
+            node = match;
+          }
+
+          if (!node) return;
+          self.lastWord.insertNode(node);
+          self.lastWord = null;
+          self.context.invoke('editor.focus');
+        }
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      // this forces it to remember the last whole word, even if multiple termination keys are pressed
+      // before the previous key is let go.
+      if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {
+        this.previousKeydownCode = e.keyCode;
+        return;
+      }
+
+      if (lists.contains(this.keys, e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWord = wordRange;
+      }
+
+      this.previousKeydownCode = e.keyCode;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains(this.keys, e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoReplace;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Placeholder.js
+function Placeholder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Placeholder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Placeholder_createClass(Constructor, protoProps, staticProps) { if (protoProps) Placeholder_defineProperties(Constructor.prototype, protoProps); if (staticProps) Placeholder_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Placeholder = /*#__PURE__*/function () {
+  function Placeholder(context) {
+    var _this = this;
+
+    Placeholder_classCallCheck(this, Placeholder);
+
+    this.context = context;
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+
+    if (this.options.inheritPlaceholder === true) {
+      // get placeholder value from the original element
+      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;
+    }
+
+    this.events = {
+      'summernote.init summernote.change': function summernoteInitSummernoteChange() {
+        _this.update();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Placeholder_createClass(Placeholder, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.placeholder;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$placeholder = external_jQuery_default()('<div class="note-placeholder"></div>');
+      this.$placeholder.on('click', function () {
+        _this2.context.invoke('focus');
+      }).html(this.options.placeholder).prependTo(this.$editingArea);
+      this.update();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$placeholder.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      var isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');
+      this.$placeholder.toggle(isShow);
+    }
+  }]);
+
+  return Placeholder;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Buttons.js
+function Buttons_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Buttons_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Buttons_createClass(Constructor, protoProps, staticProps) { if (protoProps) Buttons_defineProperties(Constructor.prototype, protoProps); if (staticProps) Buttons_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Buttons = /*#__PURE__*/function () {
+  function Buttons(context) {
+    Buttons_classCallCheck(this, Buttons);
+
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.context = context;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.invertedKeyMap = func.invertObject(this.options.keyMap[env.isMac ? 'mac' : 'pc']);
+  }
+
+  Buttons_createClass(Buttons, [{
+    key: "representShortcut",
+    value: function representShortcut(editorMethod) {
+      var shortcut = this.invertedKeyMap[editorMethod];
+
+      if (!this.options.shortcuts || !shortcut) {
+        return '';
+      }
+
+      if (env.isMac) {
+        shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');
+      }
+
+      shortcut = shortcut.replace('BACKSLASH', '\\').replace('SLASH', '/').replace('LEFTBRACKET', '[').replace('RIGHTBRACKET', ']');
+      return ' (' + shortcut + ')';
+    }
+  }, {
+    key: "button",
+    value: function button(o) {
+      if (!this.options.tooltip && o.tooltip) {
+        delete o.tooltip;
+      }
+
+      o.container = this.options.container;
+      return this.ui.button(o);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.addToolbarButtons();
+      this.addImagePopoverButtons();
+      this.addLinkPopoverButtons();
+      this.addTablePopoverButtons();
+      this.fontInstalledMap = {};
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      delete this.fontInstalledMap;
+    }
+  }, {
+    key: "isFontInstalled",
+    value: function isFontInstalled(name) {
+      if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {
+        this.fontInstalledMap[name] = env.isFontInstalled(name) || lists.contains(this.options.fontNamesIgnoreCheck, name);
+      }
+
+      return this.fontInstalledMap[name];
+    }
+  }, {
+    key: "isFontDeservedToAdd",
+    value: function isFontDeservedToAdd(name) {
+      name = name.toLowerCase();
+      return name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1;
+    }
+  }, {
+    key: "colorPalette",
+    value: function colorPalette(className, tooltip, backColor, foreColor) {
+      var _this = this;
+
+      return this.ui.buttonGroup({
+        className: 'note-color ' + className,
+        children: [this.button({
+          className: 'note-current-color-button',
+          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),
+          tooltip: tooltip,
+          click: function click(e) {
+            var $button = external_jQuery_default()(e.currentTarget);
+
+            if (backColor && foreColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor'),
+                foreColor: $button.attr('data-foreColor')
+              });
+            } else if (backColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor')
+              });
+            } else if (foreColor) {
+              _this.context.invoke('editor.color', {
+                foreColor: $button.attr('data-foreColor')
+              });
+            }
+          },
+          callback: function callback($button) {
+            var $recentColor = $button.find('.note-recent-color');
+
+            if (backColor) {
+              $recentColor.css('background-color', _this.options.colorButton.backColor);
+              $button.attr('data-backColor', _this.options.colorButton.backColor);
+            }
+
+            if (foreColor) {
+              $recentColor.css('color', _this.options.colorButton.foreColor);
+              $button.attr('data-foreColor', _this.options.colorButton.foreColor);
+            } else {
+              $recentColor.css('color', 'transparent');
+            }
+          }
+        }), this.button({
+          className: 'dropdown-toggle',
+          contents: this.ui.dropdownButtonContents('', this.options),
+          tooltip: this.lang.color.more,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), this.ui.dropdown({
+          items: (backColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.background + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">', this.lang.color.transparent, '</button>', '</div>', '<div class="note-holder" data-event="backColor"><!-- back colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="backColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.backColor + '" data-event="backColorPalette-' + this.options.id + '">', '</div>', '<div class="note-holder-custom" id="backColorPalette-' + this.options.id + '" data-event="backColor"></div>', '</div>'].join('') : '') + (foreColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.foreground + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">', this.lang.color.resetToDefault, '</button>', '</div>', '<div class="note-holder" data-event="foreColor"><!-- fore colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="foreColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.foreColor + '" data-event="foreColorPalette-' + this.options.id + '">', '</div>', // Fix missing Div, Commented to find easily if it's wrong
+          '<div class="note-holder-custom" id="foreColorPalette-' + this.options.id + '" data-event="foreColor"></div>', '</div>'].join('') : ''),
+          callback: function callback($dropdown) {
+            $dropdown.find('.note-holder').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: _this.options.colors,
+                colorsName: _this.options.colorsName,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            /* TODO: do we have to record recent custom colors within cookies? */
+
+            var customColors = [['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF']];
+            $dropdown.find('.note-holder-custom').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: customColors,
+                colorsName: customColors,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            $dropdown.find('input[type=color]').each(function (idx, item) {
+              external_jQuery_default()(item).change(function () {
+                var $chip = $dropdown.find('#' + external_jQuery_default()(this).data('event')).find('.note-color-btn').first();
+                var color = this.value.toUpperCase();
+                $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+                $chip.click();
+              });
+            });
+          },
+          click: function click(event) {
+            event.stopPropagation();
+            var $parent = external_jQuery_default()('.' + className).find('.note-dropdown-menu');
+            var $button = external_jQuery_default()(event.target);
+            var eventName = $button.data('event');
+            var value = $button.attr('data-value');
+
+            if (eventName === 'openPalette') {
+              var $picker = $parent.find('#' + value);
+              var $palette = external_jQuery_default()($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]); // Shift palette chips
+
+              var $chip = $palette.find('.note-color-btn').last().detach(); // Set chip attributes
+
+              var color = $picker.val();
+              $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+              $palette.prepend($chip);
+              $picker.click();
+            } else {
+              if (lists.contains(['backColor', 'foreColor'], eventName)) {
+                var key = eventName === 'backColor' ? 'background-color' : 'color';
+                var $color = $button.closest('.note-color').find('.note-recent-color');
+                var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
+                $color.css(key, value);
+                $currentButton.attr('data-' + eventName, value);
+              }
+
+              _this.context.invoke('editor.' + eventName, value);
+            }
+          }
+        })]
+      }).render();
+    }
+  }, {
+    key: "addToolbarButtons",
+    value: function addToolbarButtons() {
+      var _this2 = this;
+
+      this.context.memo('button.style', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.magic), _this2.options),
+          tooltip: _this2.lang.style.style,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          className: 'dropdown-style',
+          items: _this2.options.styleTags,
+          title: _this2.lang.style.style,
+          template: function template(item) {
+            // TBD: need to be simplified
+            if (typeof item === 'string') {
+              item = {
+                tag: item,
+                title: Object.prototype.hasOwnProperty.call(_this2.lang.style, item) ? _this2.lang.style[item] : item
+              };
+            }
+
+            var tag = item.tag;
+            var title = item.title;
+            var style = item.style ? ' style="' + item.style + '" ' : '';
+            var className = item.className ? ' class="' + item.className + '"' : '';
+            return '<' + tag + style + className + '>' + title + '</' + tag + '>';
+          },
+          click: _this2.context.createInvokeHandler('editor.formatBlock')
+        })]).render();
+      });
+
+      var _loop = function _loop(styleIdx, styleLen) {
+        var item = _this2.options.styleTags[styleIdx];
+
+        _this2.context.memo('button.style.' + item, function () {
+          return _this2.button({
+            className: 'note-btn-style-' + item,
+            contents: '<div data-value="' + item + '">' + item.toUpperCase() + '</div>',
+            tooltip: _this2.lang.style[item],
+            click: _this2.context.createInvokeHandler('editor.formatBlock')
+          }).render();
+        });
+      };
+
+      for (var styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {
+        _loop(styleIdx, styleLen);
+      }
+
+      this.context.memo('button.bold', function () {
+        return _this2.button({
+          className: 'note-btn-bold',
+          contents: _this2.ui.icon(_this2.options.icons.bold),
+          tooltip: _this2.lang.font.bold + _this2.representShortcut('bold'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.bold')
+        }).render();
+      });
+      this.context.memo('button.italic', function () {
+        return _this2.button({
+          className: 'note-btn-italic',
+          contents: _this2.ui.icon(_this2.options.icons.italic),
+          tooltip: _this2.lang.font.italic + _this2.representShortcut('italic'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.italic')
+        }).render();
+      });
+      this.context.memo('button.underline', function () {
+        return _this2.button({
+          className: 'note-btn-underline',
+          contents: _this2.ui.icon(_this2.options.icons.underline),
+          tooltip: _this2.lang.font.underline + _this2.representShortcut('underline'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.underline')
+        }).render();
+      });
+      this.context.memo('button.clear', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.eraser),
+          tooltip: _this2.lang.font.clear + _this2.representShortcut('removeFormat'),
+          click: _this2.context.createInvokeHandler('editor.removeFormat')
+        }).render();
+      });
+      this.context.memo('button.strikethrough', function () {
+        return _this2.button({
+          className: 'note-btn-strikethrough',
+          contents: _this2.ui.icon(_this2.options.icons.strikethrough),
+          tooltip: _this2.lang.font.strikethrough + _this2.representShortcut('strikethrough'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.strikethrough')
+        }).render();
+      });
+      this.context.memo('button.superscript', function () {
+        return _this2.button({
+          className: 'note-btn-superscript',
+          contents: _this2.ui.icon(_this2.options.icons.superscript),
+          tooltip: _this2.lang.font.superscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.superscript')
+        }).render();
+      });
+      this.context.memo('button.subscript', function () {
+        return _this2.button({
+          className: 'note-btn-subscript',
+          contents: _this2.ui.icon(_this2.options.icons.subscript),
+          tooltip: _this2.lang.font.subscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.subscript')
+        }).render();
+      });
+      this.context.memo('button.fontname', function () {
+        var styleInfo = _this2.context.invoke('editor.currentStyle');
+
+        if (_this2.options.addDefaultFonts) {
+          // Add 'default' fonts into the fontnames array if not exist
+          external_jQuery_default().each(styleInfo['font-family'].split(','), function (idx, fontname) {
+            fontname = fontname.trim().replace(/['"]+/g, '');
+
+            if (_this2.isFontDeservedToAdd(fontname)) {
+              if (_this2.options.fontNames.indexOf(fontname) === -1) {
+                _this2.options.fontNames.push(fontname);
+              }
+            }
+          });
+        }
+
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontname"></span>', _this2.options),
+          tooltip: _this2.lang.font.name,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontname',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontNames.filter(_this2.isFontInstalled.bind(_this2)),
+          title: _this2.lang.font.name,
+          template: function template(item) {
+            return '<span style="font-family: ' + env.validFontName(item) + '">' + item + '</span>';
+          },
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontName')
+        })]).render();
+      });
+      this.context.memo('button.fontsize', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>', _this2.options),
+          tooltip: _this2.lang.font.size,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsize',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizes,
+          title: _this2.lang.font.size,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSize')
+        })]).render();
+      });
+      this.context.memo('button.fontsizeunit', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>', _this2.options),
+          tooltip: _this2.lang.font.sizeunit,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsizeunit',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizeUnits,
+          title: _this2.lang.font.sizeunit,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit')
+        })]).render();
+      });
+      this.context.memo('button.color', function () {
+        return _this2.colorPalette('note-color-all', _this2.lang.color.recent, true, true);
+      });
+      this.context.memo('button.forecolor', function () {
+        return _this2.colorPalette('note-color-fore', _this2.lang.color.foreground, false, true);
+      });
+      this.context.memo('button.backcolor', function () {
+        return _this2.colorPalette('note-color-back', _this2.lang.color.background, true, false);
+      });
+      this.context.memo('button.ul', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.unorderedlist),
+          tooltip: _this2.lang.lists.unordered + _this2.representShortcut('insertUnorderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertUnorderedList')
+        }).render();
+      });
+      this.context.memo('button.ol', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.orderedlist),
+          tooltip: _this2.lang.lists.ordered + _this2.representShortcut('insertOrderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertOrderedList')
+        }).render();
+      });
+      var justifyLeft = this.button({
+        contents: this.ui.icon(this.options.icons.alignLeft),
+        tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),
+        click: this.context.createInvokeHandler('editor.justifyLeft')
+      });
+      var justifyCenter = this.button({
+        contents: this.ui.icon(this.options.icons.alignCenter),
+        tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),
+        click: this.context.createInvokeHandler('editor.justifyCenter')
+      });
+      var justifyRight = this.button({
+        contents: this.ui.icon(this.options.icons.alignRight),
+        tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),
+        click: this.context.createInvokeHandler('editor.justifyRight')
+      });
+      var justifyFull = this.button({
+        contents: this.ui.icon(this.options.icons.alignJustify),
+        tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),
+        click: this.context.createInvokeHandler('editor.justifyFull')
+      });
+      var outdent = this.button({
+        contents: this.ui.icon(this.options.icons.outdent),
+        tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),
+        click: this.context.createInvokeHandler('editor.outdent')
+      });
+      var indent = this.button({
+        contents: this.ui.icon(this.options.icons.indent),
+        tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),
+        click: this.context.createInvokeHandler('editor.indent')
+      });
+      this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));
+      this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));
+      this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));
+      this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));
+      this.context.memo('button.outdent', func.invoke(outdent, 'render'));
+      this.context.memo('button.indent', func.invoke(indent, 'render'));
+      this.context.memo('button.paragraph', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.alignLeft), _this2.options),
+          tooltip: _this2.lang.paragraph.paragraph,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown([_this2.ui.buttonGroup({
+          className: 'note-align',
+          children: [justifyLeft, justifyCenter, justifyRight, justifyFull]
+        }), _this2.ui.buttonGroup({
+          className: 'note-list',
+          children: [outdent, indent]
+        })])]).render();
+      });
+      this.context.memo('button.height', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.textHeight), _this2.options),
+          tooltip: _this2.lang.font.height,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          items: _this2.options.lineHeights,
+          checkClassName: _this2.options.icons.menuCheck,
+          className: 'dropdown-line-height',
+          title: _this2.lang.font.height,
+          click: _this2.context.createInvokeHandler('editor.lineHeight')
+        })]).render();
+      });
+      this.context.memo('button.table', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.table), _this2.options),
+          tooltip: _this2.lang.table.table,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          title: _this2.lang.table.table,
+          className: 'note-table',
+          items: ['<div class="note-dimension-picker">', '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>', '<div class="note-dimension-picker-highlighted"></div>', '<div class="note-dimension-picker-unhighlighted"></div>', '</div>', '<div class="note-dimension-display">1 x 1</div>'].join('')
+        })], {
+          callback: function callback($node) {
+            var $catcher = $node.find('.note-dimension-picker-mousecatcher');
+            $catcher.css({
+              width: _this2.options.insertTableMaxSize.col + 'em',
+              height: _this2.options.insertTableMaxSize.row + 'em'
+            }).mouseup(_this2.context.createInvokeHandler('editor.insertTable')).on('mousemove', _this2.tableMoveHandler.bind(_this2));
+          }
+        }).render();
+      });
+      this.context.memo('button.link', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.link),
+          tooltip: _this2.lang.link.link + _this2.representShortcut('linkDialog.show'),
+          click: _this2.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.picture', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.picture),
+          tooltip: _this2.lang.image.image,
+          click: _this2.context.createInvokeHandler('imageDialog.show')
+        }).render();
+      });
+      this.context.memo('button.video', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.video),
+          tooltip: _this2.lang.video.video,
+          click: _this2.context.createInvokeHandler('videoDialog.show')
+        }).render();
+      });
+      this.context.memo('button.hr', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.minus),
+          tooltip: _this2.lang.hr.insert + _this2.representShortcut('insertHorizontalRule'),
+          click: _this2.context.createInvokeHandler('editor.insertHorizontalRule')
+        }).render();
+      });
+      this.context.memo('button.fullscreen', function () {
+        return _this2.button({
+          className: 'btn-fullscreen note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.arrowsAlt),
+          tooltip: _this2.lang.options.fullscreen,
+          click: _this2.context.createInvokeHandler('fullscreen.toggle')
+        }).render();
+      });
+      this.context.memo('button.codeview', function () {
+        return _this2.button({
+          className: 'btn-codeview note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.code),
+          tooltip: _this2.lang.options.codeview,
+          click: _this2.context.createInvokeHandler('codeview.toggle')
+        }).render();
+      });
+      this.context.memo('button.redo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.redo),
+          tooltip: _this2.lang.history.redo + _this2.representShortcut('redo'),
+          click: _this2.context.createInvokeHandler('editor.redo')
+        }).render();
+      });
+      this.context.memo('button.undo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.undo),
+          tooltip: _this2.lang.history.undo + _this2.representShortcut('undo'),
+          click: _this2.context.createInvokeHandler('editor.undo')
+        }).render();
+      });
+      this.context.memo('button.help', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.question),
+          tooltip: _this2.lang.options.help,
+          click: _this2.context.createInvokeHandler('helpDialog.show')
+        }).render();
+      });
+    }
+    /**
+     * image: [
+     *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],
+     *   ['float', ['floatLeft', 'floatRight', 'floatNone']],
+     *   ['remove', ['removeMedia']],
+     * ],
+     */
+
+  }, {
+    key: "addImagePopoverButtons",
+    value: function addImagePopoverButtons() {
+      var _this3 = this;
+
+      // Image Size Buttons
+      this.context.memo('button.resizeFull', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">100%</span>',
+          tooltip: _this3.lang.image.resizeFull,
+          click: _this3.context.createInvokeHandler('editor.resize', '1')
+        }).render();
+      });
+      this.context.memo('button.resizeHalf', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">50%</span>',
+          tooltip: _this3.lang.image.resizeHalf,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.5')
+        }).render();
+      });
+      this.context.memo('button.resizeQuarter', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">25%</span>',
+          tooltip: _this3.lang.image.resizeQuarter,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.25')
+        }).render();
+      });
+      this.context.memo('button.resizeNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.resizeNone,
+          click: _this3.context.createInvokeHandler('editor.resize', '0')
+        }).render();
+      }); // Float Buttons
+
+      this.context.memo('button.floatLeft', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatLeft),
+          tooltip: _this3.lang.image.floatLeft,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'left')
+        }).render();
+      });
+      this.context.memo('button.floatRight', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatRight),
+          tooltip: _this3.lang.image.floatRight,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'right')
+        }).render();
+      });
+      this.context.memo('button.floatNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.floatNone,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'none')
+        }).render();
+      }); // Remove Buttons
+
+      this.context.memo('button.removeMedia', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.trash),
+          tooltip: _this3.lang.image.remove,
+          click: _this3.context.createInvokeHandler('editor.removeMedia')
+        }).render();
+      });
+    }
+  }, {
+    key: "addLinkPopoverButtons",
+    value: function addLinkPopoverButtons() {
+      var _this4 = this;
+
+      this.context.memo('button.linkDialogShow', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.link),
+          tooltip: _this4.lang.link.edit,
+          click: _this4.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.unlink', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.unlink),
+          tooltip: _this4.lang.link.unlink,
+          click: _this4.context.createInvokeHandler('editor.unlink')
+        }).render();
+      });
+    }
+    /**
+     * table : [
+     *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],
+     *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]
+     * ],
+     */
+
+  }, {
+    key: "addTablePopoverButtons",
+    value: function addTablePopoverButtons() {
+      var _this5 = this;
+
+      this.context.memo('button.addRowUp', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowAbove),
+          tooltip: _this5.lang.table.addRowAbove,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'top')
+        }).render();
+      });
+      this.context.memo('button.addRowDown', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowBelow),
+          tooltip: _this5.lang.table.addRowBelow,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'bottom')
+        }).render();
+      });
+      this.context.memo('button.addColLeft', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colBefore),
+          tooltip: _this5.lang.table.addColLeft,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'left')
+        }).render();
+      });
+      this.context.memo('button.addColRight', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colAfter),
+          tooltip: _this5.lang.table.addColRight,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'right')
+        }).render();
+      });
+      this.context.memo('button.deleteRow', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowRemove),
+          tooltip: _this5.lang.table.delRow,
+          click: _this5.context.createInvokeHandler('editor.deleteRow')
+        }).render();
+      });
+      this.context.memo('button.deleteCol', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colRemove),
+          tooltip: _this5.lang.table.delCol,
+          click: _this5.context.createInvokeHandler('editor.deleteCol')
+        }).render();
+      });
+      this.context.memo('button.deleteTable', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.trash),
+          tooltip: _this5.lang.table.delTable,
+          click: _this5.context.createInvokeHandler('editor.deleteTable')
+        }).render();
+      });
+    }
+  }, {
+    key: "build",
+    value: function build($container, groups) {
+      for (var groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {
+        var group = groups[groupIdx];
+        var groupName = Array.isArray(group) ? group[0] : group;
+        var buttons = Array.isArray(group) ? group.length === 1 ? [group[0]] : group[1] : [group];
+        var $group = this.ui.buttonGroup({
+          className: 'note-' + groupName
+        }).render();
+
+        for (var idx = 0, len = buttons.length; idx < len; idx++) {
+          var btn = this.context.memo('button.' + buttons[idx]);
+
+          if (btn) {
+            $group.append(typeof btn === 'function' ? btn(this.context) : btn);
+          }
+        }
+
+        $group.appendTo($container);
+      }
+    }
+    /**
+     * @param {jQuery} [$container]
+     */
+
+  }, {
+    key: "updateCurrentStyle",
+    value: function updateCurrentStyle($container) {
+      var $cont = $container || this.$toolbar;
+      var styleInfo = this.context.invoke('editor.currentStyle');
+      this.updateBtnStates($cont, {
+        '.note-btn-bold': function noteBtnBold() {
+          return styleInfo['font-bold'] === 'bold';
+        },
+        '.note-btn-italic': function noteBtnItalic() {
+          return styleInfo['font-italic'] === 'italic';
+        },
+        '.note-btn-underline': function noteBtnUnderline() {
+          return styleInfo['font-underline'] === 'underline';
+        },
+        '.note-btn-subscript': function noteBtnSubscript() {
+          return styleInfo['font-subscript'] === 'subscript';
+        },
+        '.note-btn-superscript': function noteBtnSuperscript() {
+          return styleInfo['font-superscript'] === 'superscript';
+        },
+        '.note-btn-strikethrough': function noteBtnStrikethrough() {
+          return styleInfo['font-strikethrough'] === 'strikethrough';
+        }
+      });
+
+      if (styleInfo['font-family']) {
+        var fontNames = styleInfo['font-family'].split(',').map(function (name) {
+          return name.replace(/[\'\"]/g, '').replace(/\s+$/, '').replace(/^\s+/, '');
+        });
+        var fontName = lists.find(fontNames, this.isFontInstalled.bind(this));
+        $cont.find('.dropdown-fontname a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontName + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);
+      }
+
+      if (styleInfo['font-size']) {
+        var fontSize = styleInfo['font-size'];
+        $cont.find('.dropdown-fontsize a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontSize + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsize').text(fontSize);
+        var fontSizeUnit = styleInfo['font-size-unit'];
+        $cont.find('.dropdown-fontsizeunit a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item);
+          var isChecked = $item.data('value') + '' === fontSizeUnit + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);
+      }
+
+      if (styleInfo['line-height']) {
+        var lineHeight = styleInfo['line-height'];
+        $cont.find('.dropdown-line-height a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = external_jQuery_default()(item).data('value') + '' === lineHeight + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-line-height').text(lineHeight);
+      }
+    }
+  }, {
+    key: "updateBtnStates",
+    value: function updateBtnStates($container, infos) {
+      var _this6 = this;
+
+      external_jQuery_default().each(infos, function (selector, pred) {
+        _this6.ui.toggleBtnActive($container.find(selector), pred());
+      });
+    }
+  }, {
+    key: "tableMoveHandler",
+    value: function tableMoveHandler(event) {
+      var PX_PER_EM = 18;
+      var $picker = external_jQuery_default()(event.target.parentNode); // target is mousecatcher
+
+      var $dimensionDisplay = $picker.next();
+      var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
+      var $highlighted = $picker.find('.note-dimension-picker-highlighted');
+      var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
+      var posOffset; // HTML5 with jQuery - e.offsetX is undefined in Firefox
+
+      if (event.offsetX === undefined) {
+        var posCatcher = external_jQuery_default()(event.target).offset();
+        posOffset = {
+          x: event.pageX - posCatcher.left,
+          y: event.pageY - posCatcher.top
+        };
+      } else {
+        posOffset = {
+          x: event.offsetX,
+          y: event.offsetY
+        };
+      }
+
+      var dim = {
+        c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
+        r: Math.ceil(posOffset.y / PX_PER_EM) || 1
+      };
+      $highlighted.css({
+        width: dim.c + 'em',
+        height: dim.r + 'em'
+      });
+      $catcher.data('value', dim.c + 'x' + dim.r);
+
+      if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {
+        $unhighlighted.css({
+          width: dim.c + 1 + 'em'
+        });
+      }
+
+      if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {
+        $unhighlighted.css({
+          height: dim.r + 1 + 'em'
+        });
+      }
+
+      $dimensionDisplay.html(dim.c + ' x ' + dim.r);
+    }
+  }]);
+
+  return Buttons;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Toolbar.js
+function Toolbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Toolbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Toolbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Toolbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Toolbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Toolbar = /*#__PURE__*/function () {
+  function Toolbar(context) {
+    Toolbar_classCallCheck(this, Toolbar);
+
+    this.context = context;
+    this.$window = external_jQuery_default()(window);
+    this.$document = external_jQuery_default()(document);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.options = context.options;
+    this.isFollowing = false;
+    this.followScroll = this.followScroll.bind(this);
+  }
+
+  Toolbar_createClass(Toolbar, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !this.options.airMode;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.options.toolbar = this.options.toolbar || [];
+
+      if (!this.options.toolbar.length) {
+        this.$toolbar.hide();
+      } else {
+        this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);
+      }
+
+      if (this.options.toolbarContainer) {
+        this.$toolbar.appendTo(this.options.toolbarContainer);
+      }
+
+      this.changeContainer(false);
+      this.$note.on('summernote.keyup summernote.mouseup summernote.change', function () {
+        _this.context.invoke('buttons.updateCurrentStyle');
+      });
+      this.context.invoke('buttons.updateCurrentStyle');
+
+      if (this.options.followingToolbar) {
+        this.$window.on('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$toolbar.children().remove();
+
+      if (this.options.followingToolbar) {
+        this.$window.off('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "followScroll",
+    value: function followScroll() {
+      if (this.$editor.hasClass('fullscreen')) {
+        return false;
+      }
+
+      var editorHeight = this.$editor.outerHeight();
+      var editorWidth = this.$editor.width();
+      var toolbarHeight = this.$toolbar.height();
+      var statusbarHeight = this.$statusbar.height(); // check if the web app is currently using another static bar
+
+      var otherBarHeight = 0;
+
+      if (this.options.otherStaticBar) {
+        otherBarHeight = external_jQuery_default()(this.options.otherStaticBar).outerHeight();
+      }
+
+      var currentOffset = this.$document.scrollTop();
+      var editorOffsetTop = this.$editor.offset().top;
+      var editorOffsetBottom = editorOffsetTop + editorHeight;
+      var activateOffset = editorOffsetTop - otherBarHeight;
+      var deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;
+
+      if (!this.isFollowing && currentOffset > activateOffset && currentOffset < deactivateOffsetBottom - toolbarHeight) {
+        this.isFollowing = true;
+        this.$editable.css({
+          marginTop: this.$toolbar.outerHeight()
+        });
+        this.$toolbar.css({
+          position: 'fixed',
+          top: otherBarHeight,
+          width: editorWidth,
+          zIndex: 1000
+        });
+      } else if (this.isFollowing && (currentOffset < activateOffset || currentOffset > deactivateOffsetBottom)) {
+        this.isFollowing = false;
+        this.$toolbar.css({
+          position: 'relative',
+          top: 0,
+          width: '100%',
+          zIndex: 'auto'
+        });
+        this.$editable.css({
+          marginTop: ''
+        });
+      }
+    }
+  }, {
+    key: "changeContainer",
+    value: function changeContainer(isFullscreen) {
+      if (isFullscreen) {
+        this.$toolbar.prependTo(this.$editor);
+      } else {
+        if (this.options.toolbarContainer) {
+          this.$toolbar.appendTo(this.options.toolbarContainer);
+        }
+      }
+
+      if (this.options.followingToolbar) {
+        this.followScroll();
+      }
+    }
+  }, {
+    key: "updateFullscreen",
+    value: function updateFullscreen(isFullscreen) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);
+      this.changeContainer(isFullscreen);
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+    }
+  }, {
+    key: "activate",
+    value: function activate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, true);
+    }
+  }, {
+    key: "deactivate",
+    value: function deactivate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, false);
+    }
+  }]);
+
+  return Toolbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkDialog.js
+function LinkDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var LinkDialog = /*#__PURE__*/function () {
+  function LinkDialog(context) {
+    LinkDialog_classCallCheck(this, LinkDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);
+  }
+
+  LinkDialog_createClass(LinkDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group">', "<label for=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.textToDisplay, "</label>"), "<input id=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>"), '</div>', '<div class="form-group note-form-group">', "<label for=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.url, "</label>"), "<input id=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>"), '</div>', !this.options.disableLinkTarget ? external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-open-in-new-window',
+        text: this.lang.link.openInNewWindow,
+        checked: true
+      }).render()).html() : '', external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-use-protocol',
+        text: this.lang.link.useProtocol,
+        checked: true
+      }).render()).html()].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.link.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        className: 'link-dialog',
+        title: this.lang.link.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+    /**
+     * toggle update button
+     */
+
+  }, {
+    key: "toggleLinkBtn",
+    value: function toggleLinkBtn($linkBtn, $linkText, $linkUrl) {
+      this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());
+    }
+    /**
+     * Show link dialog and set event handlers on dialog controls.
+     *
+     * @param {Object} linkInfo
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showLinkDialog",
+    value: function showLinkDialog(linkInfo) {
+      var _this = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $linkText = _this.$dialog.find('.note-link-text');
+
+        var $linkUrl = _this.$dialog.find('.note-link-url');
+
+        var $linkBtn = _this.$dialog.find('.note-link-btn');
+
+        var $openInNewWindow = _this.$dialog.find('.sn-checkbox-open-in-new-window input[type=checkbox]');
+
+        var $useProtocol = _this.$dialog.find('.sn-checkbox-use-protocol input[type=checkbox]');
+
+        _this.ui.onDialogShown(_this.$dialog, function () {
+          _this.context.triggerEvent('dialog.shown'); // If no url was given and given text is valid URL then copy that into URL Field
+
+
+          if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {
+            linkInfo.url = linkInfo.text;
+          }
+
+          $linkText.on('input paste propertychange', function () {
+            // If linktext was modified by input events,
+            // cloning text from linkUrl will be stopped.
+            linkInfo.text = $linkText.val();
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.text);
+          $linkUrl.on('input paste propertychange', function () {
+            // Display same text on `Text to display` as default
+            // when linktext has no text
+            if (!linkInfo.text) {
+              $linkText.val($linkUrl.val());
+            }
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.url);
+
+          if (!env.isSupportTouch) {
+            $linkUrl.trigger('focus');
+          }
+
+          _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+
+          _this.bindEnterKey($linkUrl, $linkBtn);
+
+          _this.bindEnterKey($linkText, $linkBtn);
+
+          var isNewWindowChecked = linkInfo.isNewWindow !== undefined ? linkInfo.isNewWindow : _this.context.options.linkTargetBlank;
+          $openInNewWindow.prop('checked', isNewWindowChecked);
+          var useProtocolChecked = linkInfo.url ? false : _this.context.options.useProtocol;
+          $useProtocol.prop('checked', useProtocolChecked);
+          $linkBtn.one('click', function (event) {
+            event.preventDefault();
+            deferred.resolve({
+              range: linkInfo.range,
+              url: $linkUrl.val(),
+              text: $linkText.val(),
+              isNewWindow: $openInNewWindow.is(':checked'),
+              checkProtocol: $useProtocol.is(':checked')
+            });
+
+            _this.ui.hideDialog(_this.$dialog);
+          });
+        });
+
+        _this.ui.onDialogHidden(_this.$dialog, function () {
+          // detach events
+          $linkText.off();
+          $linkUrl.off();
+          $linkBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this.ui.showDialog(_this.$dialog);
+      }).promise();
+    }
+    /**
+     * @param {Object} layoutInfo
+     */
+
+  }, {
+    key: "show",
+    value: function show() {
+      var _this2 = this;
+
+      var linkInfo = this.context.invoke('editor.getLinkInfo');
+      this.context.invoke('editor.saveRange');
+      this.showLinkDialog(linkInfo).then(function (linkInfo) {
+        _this2.context.invoke('editor.restoreRange');
+
+        _this2.context.invoke('editor.createLink', linkInfo);
+      }).fail(function () {
+        _this2.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return LinkDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkPopover.js
+function LinkPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var LinkPopover = /*#__PURE__*/function () {
+  function LinkPopover(context) {
+    var _this = this;
+
+    LinkPopover_classCallCheck(this, LinkPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteChangeSummernoteScroll() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  LinkPopover_createClass(LinkPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.link);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-link-popover',
+        callback: function callback($node) {
+          var $content = $node.find('.popover-content,.note-popover-content');
+          $content.prepend('<span><a target="_blank"></a>&nbsp;</span>');
+        }
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.link);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      // Prevent focusing on editable when invoke('code') is executed
+      if (!this.context.invoke('editor.hasFocus')) {
+        this.hide();
+        return;
+      }
+
+      var rng = this.context.invoke('editor.getLastRange');
+
+      if (rng.isCollapsed() && rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        var href = external_jQuery_default()(anchor).attr('href');
+        this.$popover.find('a').attr('href', href).text(href);
+        var pos = dom.posFromPlaceholder(anchor);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return LinkPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImageDialog.js
+function ImageDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImageDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImageDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var ImageDialog = /*#__PURE__*/function () {
+  function ImageDialog(context) {
+    ImageDialog_classCallCheck(this, ImageDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  ImageDialog_createClass(ImageDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var imageLimitation = '';
+
+      if (this.options.maximumImageFileSize) {
+        var unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));
+        var readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 + ' ' + ' KMGTP'[unit] + 'B';
+        imageLimitation = "<small>".concat(this.lang.image.maximumFileSize + ' : ' + readableSize, "</small>");
+      }
+
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group note-group-select-from-files">', '<label for="note-dialog-image-file-' + this.options.id + '" class="note-form-label">' + this.lang.image.selectFromFiles + '</label>', '<input id="note-dialog-image-file-' + this.options.id + '" class="note-image-input form-control-file note-form-control note-input" ', ' type="file" name="files" accept="' + this.options.acceptImageFileTypes + '" multiple="multiple"/>', imageLimitation, '</div>', '<div class="form-group note-group-image-url">', '<label for="note-dialog-image-url-' + this.options.id + '" class="note-form-label">' + this.lang.image.url + '</label>', '<input id="note-dialog-image-url-' + this.options.id + '" class="note-image-url form-control note-form-control note-input" type="text"/>', '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.image.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.image.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showImageDialog().then(function (data) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange');
+
+        if (typeof data === 'string') {
+          // image url
+          // If onImageLinkInsert set,
+          if (_this.options.callbacks.onImageLinkInsert) {
+            _this.context.triggerEvent('image.link.insert', data);
+          } else {
+            _this.context.invoke('editor.insertImage', data);
+          }
+        } else {
+          // array of files
+          _this.context.invoke('editor.insertImagesOrCallback', data);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show image dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showImageDialog",
+    value: function showImageDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $imageInput = _this2.$dialog.find('.note-image-input');
+
+        var $imageUrl = _this2.$dialog.find('.note-image-url');
+
+        var $imageBtn = _this2.$dialog.find('.note-image-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown'); // Cloning imageInput to clear element.
+
+
+          $imageInput.replaceWith($imageInput.clone().on('change', function (event) {
+            deferred.resolve(event.target.files || event.target.value);
+          }).val(''));
+          $imageUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($imageBtn, $imageUrl.val());
+          }).val('');
+
+          if (!env.isSupportTouch) {
+            $imageUrl.trigger('focus');
+          }
+
+          $imageBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($imageUrl.val());
+          });
+
+          _this2.bindEnterKey($imageUrl, $imageBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $imageInput.off();
+          $imageUrl.off();
+          $imageBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return ImageDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImagePopover.js
+function ImagePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImagePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImagePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImagePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImagePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+/**
+ * Image popover module
+ *  mouse events that show/hide popover will be handled by Handle.js.
+ *  Handle.js will receive the events and invoke 'imagePopover.update'.
+ */
+
+var ImagePopover = /*#__PURE__*/function () {
+  function ImagePopover(context) {
+    var _this = this;
+
+    ImagePopover_classCallCheck(this, ImagePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.editable = context.layoutInfo.editable[0];
+    this.options = context.options;
+    this.events = {
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  ImagePopover_createClass(ImagePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.image);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-image-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.image);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (dom.isImg(target)) {
+        var position = external_jQuery_default()(target).offset();
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        var pos = {};
+
+        if (this.options.popatmouse) {
+          pos.left = event.pageX - 20;
+          pos.top = event.pageY;
+        } else {
+          pos = position;
+        }
+
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return ImagePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/TablePopover.js
+function TablePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function TablePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function TablePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) TablePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) TablePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var TablePopover = /*#__PURE__*/function () {
+  function TablePopover(context) {
+    var _this = this;
+
+    TablePopover_classCallCheck(this, TablePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.update(e.target);
+      },
+      'summernote.keyup summernote.scroll summernote.change': function summernoteKeyupSummernoteScrollSummernoteChange() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  TablePopover_createClass(TablePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.table);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-table-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.table); // [workaround] Disable Firefox's default table editor
+
+      if (env.isFF) {
+        document.execCommand('enableInlineTableEditing', false, false);
+      }
+
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isCell = dom.isCell(target) || dom.isCell(target === null || target === void 0 ? void 0 : target.parentElement);
+
+      if (isCell) {
+        var pos = dom.posFromPlaceholder(target);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+
+      return isCell;
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return TablePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/VideoDialog.js
+function VideoDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function VideoDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function VideoDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) VideoDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) VideoDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var VideoDialog = /*#__PURE__*/function () {
+  function VideoDialog(context) {
+    VideoDialog_classCallCheck(this, VideoDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  VideoDialog_createClass(VideoDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group row-fluid">', "<label for=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.video.url, " <small class=\"text-muted\">").concat(this.lang.video.providers, "</small></label>"), "<input id=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>"), '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.video.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.video.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "createVideoNode",
+    value: function createVideoNode(url) {
+      // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)
+      var ytRegExp = /\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/;
+      var ytRegExpForStart = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/;
+      var ytMatch = url.match(ytRegExp);
+      var gdRegExp = /(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/;
+      var gdMatch = url.match(gdRegExp);
+      var igRegExp = /(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/;
+      var igMatch = url.match(igRegExp);
+      var vRegExp = /\/\/vine\.co\/v\/([a-zA-Z0-9]+)/;
+      var vMatch = url.match(vRegExp);
+      var vimRegExp = /\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/;
+      var vimMatch = url.match(vimRegExp);
+      var dmRegExp = /.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/;
+      var dmMatch = url.match(dmRegExp);
+      var youkuRegExp = /\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/;
+      var youkuMatch = url.match(youkuRegExp);
+      var peerTubeRegExp = /\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/;
+      var peerTubeMatch = url.match(peerTubeRegExp);
+      var qqRegExp = /\/\/v\.qq\.com.*?vid=(.+)/;
+      var qqMatch = url.match(qqRegExp);
+      var qqRegExp2 = /\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/;
+      var qqMatch2 = url.match(qqRegExp2);
+      var mp4RegExp = /^.+.(mp4|m4v)$/;
+      var mp4Match = url.match(mp4RegExp);
+      var oggRegExp = /^.+.(ogg|ogv)$/;
+      var oggMatch = url.match(oggRegExp);
+      var webmRegExp = /^.+.(webm)$/;
+      var webmMatch = url.match(webmRegExp);
+      var fbRegExp = /(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/;
+      var fbMatch = url.match(fbRegExp);
+      var $video;
+
+      if (ytMatch && ytMatch[1].length === 11) {
+        var youtubeId = ytMatch[1];
+        var start = 0;
+
+        if (typeof ytMatch[2] !== 'undefined') {
+          var ytMatchForStart = ytMatch[2].match(ytRegExpForStart);
+
+          if (ytMatchForStart) {
+            for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {
+              start += typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0;
+            }
+          }
+        }
+
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : '')).attr('width', '640').attr('height', '360');
+      } else if (gdMatch && gdMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview').attr('width', '640').attr('height', '480');
+      } else if (igMatch && igMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/').attr('width', '612').attr('height', '710').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else if (vMatch && vMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', vMatch[0] + '/embed/simple').attr('width', '600').attr('height', '600').attr('class', 'vine-embed');
+      } else if (vimMatch && vimMatch[3].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('src', '//player.vimeo.com/video/' + vimMatch[3]).attr('width', '640').attr('height', '360');
+      } else if (dmMatch && dmMatch[2].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2]).attr('width', '640').attr('height', '360');
+      } else if (youkuMatch && youkuMatch[1].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '498').attr('width', '510').attr('src', '//player.youku.com/embed/' + youkuMatch[1]);
+      } else if (peerTubeMatch && peerTubeMatch[0].length) {
+        var begin = 0;
+        if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];
+        var end = 0;
+        if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];
+        var loop = 0;
+        if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];
+        var autoplay = 0;
+        if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];
+        var muted = 0;
+        if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];
+        $video = external_jQuery_default()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr('frameborder', 0).attr('src', '//' + peerTubeMatch[1] + '/videos/embed/' + peerTubeMatch[2] + "?loop=" + loop + "&autoplay=" + autoplay + "&muted=" + muted + (begin > 0 ? '&start=' + begin : '') + (end > 0 ? '&end=' + start : '')).attr('width', '560').attr('height', '315');
+      } else if (qqMatch && qqMatch[1].length || qqMatch2 && qqMatch2[2].length) {
+        var vid = qqMatch && qqMatch[1].length ? qqMatch[1] : qqMatch2[2];
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '310').attr('width', '500').attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');
+      } else if (mp4Match || oggMatch || webmMatch) {
+        $video = external_jQuery_default()('<video controls>').attr('src', url).attr('width', '640').attr('height', '360');
+      } else if (fbMatch && fbMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560').attr('width', '560').attr('height', '301').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else {
+        // this is not a known video link. Now what, Cat? Now what?
+        return false;
+      }
+
+      $video.addClass('note-video-clip');
+      return $video[0];
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      var text = this.context.invoke('editor.getSelectedText');
+      this.context.invoke('editor.saveRange');
+      this.showVideoDialog(text).then(function (url) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange'); // build node
+
+
+        var $node = _this.createVideoNode(url);
+
+        if ($node) {
+          // insert video node
+          _this.context.invoke('editor.insertNode', $node);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show video dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showVideoDialog",
+    value: function showVideoDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $videoUrl = _this2.$dialog.find('.note-video-url');
+
+        var $videoBtn = _this2.$dialog.find('.note-video-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          $videoUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($videoBtn, $videoUrl.val());
+          });
+
+          if (!env.isSupportTouch) {
+            $videoUrl.trigger('focus');
+          }
+
+          $videoBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($videoUrl.val());
+          });
+
+          _this2.bindEnterKey($videoUrl, $videoBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $videoUrl.off();
+          $videoBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return VideoDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HelpDialog.js
+function HelpDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HelpDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HelpDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) HelpDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) HelpDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var HelpDialog = /*#__PURE__*/function () {
+  function HelpDialog(context) {
+    HelpDialog_classCallCheck(this, HelpDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  HelpDialog_createClass(HelpDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<p class="text-center">', '<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ', '<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ', '<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>', '</p>'].join('');
+      this.$dialog = this.ui.dialog({
+        title: this.lang.options.help,
+        fade: this.options.dialogsFade,
+        body: this.createShortcutList(),
+        footer: body,
+        callback: function callback($node) {
+          $node.find('.modal-body,.note-modal-body').css({
+            'max-height': 300,
+            'overflow': 'scroll'
+          });
+        }
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "createShortcutList",
+    value: function createShortcutList() {
+      var _this = this;
+
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      return Object.keys(keyMap).map(function (key) {
+        var command = keyMap[key];
+        var $row = external_jQuery_default()('<div><div class="help-list-item"></div></div>');
+        $row.append(external_jQuery_default()('<label><kbd>' + key + '</kdb></label>').css({
+          'width': 180,
+          'margin-right': 10
+        })).append(external_jQuery_default()('<span></span>').html(_this.context.memo('help.' + command) || command));
+        return $row.html();
+      }).join('');
+    }
+    /**
+     * show help dialog
+     *
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showHelpDialog",
+    value: function showHelpDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          deferred.resolve();
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      }).promise();
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this3 = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showHelpDialog().then(function () {
+        _this3.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return HelpDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AirPopover.js
+function AirPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AirPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AirPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) AirPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) AirPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var AIRMODE_POPOVER_X_OFFSET = -5;
+var AIRMODE_POPOVER_Y_OFFSET = 5;
+
+var AirPopover = /*#__PURE__*/function () {
+  function AirPopover(context) {
+    var _this = this;
+
+    AirPopover_classCallCheck(this, AirPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.hidable = true;
+    this.onContextmenu = false;
+    this.pageX = null;
+    this.pageY = null;
+    this.events = {
+      'summernote.contextmenu': function summernoteContextmenu(e) {
+        if (_this.options.editing) {
+          e.preventDefault();
+          e.stopPropagation();
+          _this.onContextmenu = true;
+
+          _this.update(true);
+        }
+      },
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.pageX = e.pageX;
+        _this.pageY = e.pageY;
+      },
+      'summernote.keyup summernote.mouseup summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteScroll(we, e) {
+        if (_this.options.editing && !_this.onContextmenu) {
+          _this.pageX = e.pageX;
+          _this.pageY = e.pageY;
+
+          _this.update();
+        }
+
+        _this.onContextmenu = false;
+      },
+      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteChangeSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.focusout': function summernoteFocusout() {
+        if (!_this.$popover.is(':active,:focus')) {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  AirPopover_createClass(AirPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.options.airMode && !lists.isEmpty(this.options.popover.air);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$popover = this.ui.popover({
+        className: 'note-air-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.air); // disable hiding this popover preemptively by 'summernote.blur' event.
+
+      this.$popover.on('mousedown', function () {
+        _this2.hidable = false;
+      }); // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).
+
+      this.$popover.on('mouseup', function () {
+        _this2.hidable = true;
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(forcelyOpen) {
+      var styleInfo = this.context.invoke('editor.currentStyle');
+
+      if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {
+        var rect = {
+          left: this.pageX,
+          top: this.pageY
+        };
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        rect.top -= containerOffset.top;
+        rect.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,
+          top: rect.top + AIRMODE_POPOVER_Y_OFFSET
+        });
+        this.context.invoke('buttons.updateCurrentStyle', this.$popover);
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      if (this.hidable) {
+        this.$popover.hide();
+      }
+    }
+  }]);
+
+  return AirPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HintPopover.js
+function HintPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HintPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HintPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) HintPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) HintPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var POPOVER_DIST = 5;
+
+var HintPopover = /*#__PURE__*/function () {
+  function HintPopover(context) {
+    var _this = this;
+
+    HintPopover_classCallCheck(this, HintPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.hint = this.options.hint || [];
+    this.direction = this.options.hintDirection || 'bottom';
+    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      },
+      'summernote.disable summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      }
+    };
+  }
+
+  HintPopover_createClass(HintPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.hints.length > 0;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.lastWordRange = null;
+      this.matchingWord = null;
+      this.$popover = this.ui.popover({
+        className: 'note-hint-popover',
+        hideArrow: true,
+        direction: ''
+      }).render().appendTo(this.options.container);
+      this.$popover.hide();
+      this.$content = this.$popover.find('.popover-content,.note-popover-content');
+      this.$content.on('click', '.note-hint-item', function (e) {
+        _this2.$content.find('.active').removeClass('active');
+
+        external_jQuery_default()(e.currentTarget).addClass('active');
+
+        _this2.replace();
+      });
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "selectItem",
+    value: function selectItem($item) {
+      this.$content.find('.active').removeClass('active');
+      $item.addClass('active');
+      this.$content[0].scrollTop = $item[0].offsetTop - this.$content.innerHeight() / 2;
+    }
+  }, {
+    key: "moveDown",
+    value: function moveDown() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $next = $current.next();
+
+      if ($next.length) {
+        this.selectItem($next);
+      } else {
+        var $nextGroup = $current.parent().next();
+
+        if (!$nextGroup.length) {
+          $nextGroup = this.$content.find('.note-hint-group').first();
+        }
+
+        this.selectItem($nextGroup.find('.note-hint-item').first());
+      }
+    }
+  }, {
+    key: "moveUp",
+    value: function moveUp() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $prev = $current.prev();
+
+      if ($prev.length) {
+        this.selectItem($prev);
+      } else {
+        var $prevGroup = $current.parent().prev();
+
+        if (!$prevGroup.length) {
+          $prevGroup = this.$content.find('.note-hint-group').last();
+        }
+
+        this.selectItem($prevGroup.find('.note-hint-item').last());
+      }
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      var $item = this.$content.find('.note-hint-item.active');
+
+      if ($item.length) {
+        var node = this.nodeFromItem($item); // If matchingWord length = 0 -> capture OK / open hint / but as mention capture "" (\w*)
+
+        if (this.matchingWord !== null && this.matchingWord.length === 0) {
+          this.lastWordRange.so = this.lastWordRange.eo; // Else si > 0 and normal case -> adjust range "before" for correct position of insertion
+        } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {
+          var rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;
+
+          if (rangeCompute > 0) {
+            this.lastWordRange.so += rangeCompute;
+          }
+        }
+
+        this.lastWordRange.insertNode(node);
+
+        if (this.options.hintSelect === 'next') {
+          var blank = document.createTextNode('');
+          external_jQuery_default()(node).after(blank);
+          range.createFromNodeBefore(blank).select();
+        } else {
+          range.createFromNodeAfter(node).select();
+        }
+
+        this.lastWordRange = null;
+        this.hide();
+        this.context.invoke('editor.focus');
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+  }, {
+    key: "nodeFromItem",
+    value: function nodeFromItem($item) {
+      var hint = this.hints[$item.data('index')];
+      var item = $item.data('item');
+      var node = hint.content ? hint.content(item) : item;
+
+      if (typeof node === 'string') {
+        node = dom.createText(node);
+      }
+
+      return node;
+    }
+  }, {
+    key: "createItemTemplates",
+    value: function createItemTemplates(hintIdx, items) {
+      var hint = this.hints[hintIdx];
+      return items.map(function (item
+      /*, idx */
+      ) {
+        var $item = external_jQuery_default()('<div class="note-hint-item"></div>');
+        $item.append(hint.template ? hint.template(item) : item + '');
+        $item.data({
+          'index': hintIdx,
+          'item': item
+        });
+        return $item;
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (!this.$popover.is(':visible')) {
+        return;
+      }
+
+      if (e.keyCode === key.code.ENTER) {
+        e.preventDefault();
+        this.replace();
+      } else if (e.keyCode === key.code.UP) {
+        e.preventDefault();
+        this.moveUp();
+      } else if (e.keyCode === key.code.DOWN) {
+        e.preventDefault();
+        this.moveDown();
+      }
+    }
+  }, {
+    key: "searchKeyword",
+    value: function searchKeyword(index, keyword, callback) {
+      var hint = this.hints[index];
+
+      if (hint && hint.match.test(keyword) && hint.search) {
+        var matches = hint.match.exec(keyword);
+        this.matchingWord = matches[0];
+        hint.search(matches[1], callback);
+      } else {
+        callback();
+      }
+    }
+  }, {
+    key: "createGroup",
+    value: function createGroup(idx, keyword) {
+      var _this3 = this;
+
+      var $group = external_jQuery_default()('<div class="note-hint-group note-hint-group-' + idx + '"></div>');
+      this.searchKeyword(idx, keyword, function (items) {
+        items = items || [];
+
+        if (items.length) {
+          $group.html(_this3.createItemTemplates(idx, items));
+
+          _this3.show();
+        }
+      });
+      return $group;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      var _this4 = this;
+
+      if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {
+        var _range = this.context.invoke('editor.getLastRange');
+
+        var wordRange, keyword;
+
+        if (this.options.hintMode === 'words') {
+          wordRange = _range.getWordsRange(_range);
+          keyword = wordRange.toString();
+          this.hints.forEach(function (hint) {
+            if (hint.match.test(keyword)) {
+              wordRange = _range.getWordsMatchRange(hint.match);
+              return false;
+            }
+          });
+
+          if (!wordRange) {
+            this.hide();
+            return;
+          }
+
+          keyword = wordRange.toString();
+        } else {
+          wordRange = _range.getWordRange();
+          keyword = wordRange.toString();
+        }
+
+        if (this.hints.length && keyword) {
+          this.$content.empty();
+          var bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));
+          var containerOffset = external_jQuery_default()(this.options.container).offset();
+
+          if (bnd) {
+            bnd.top -= containerOffset.top;
+            bnd.left -= containerOffset.left;
+            this.$popover.hide();
+            this.lastWordRange = wordRange;
+            this.hints.forEach(function (hint, idx) {
+              if (hint.match.test(keyword)) {
+                _this4.createGroup(idx, keyword).appendTo(_this4.$content);
+              }
+            }); // select first .note-hint-item
+
+            this.$content.find('.note-hint-item:first').addClass('active'); // set position for popover after group is created
+
+            if (this.direction === 'top') {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST
+              });
+            } else {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top + bnd.height + POPOVER_DIST
+              });
+            }
+          }
+        } else {
+          this.hide();
+        }
+      }
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      this.$popover.show();
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return HintPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/settings.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  version: '0.8.20',
+  plugins: {},
+  dom: dom,
+  range: range,
+  lists: lists,
+  options: {
+    langInfo: (external_jQuery_default()).summernote.lang["en-US"],
+    editing: true,
+    modules: {
+      'editor': Editor,
+      'clipboard': Clipboard,
+      'dropzone': Dropzone,
+      'codeview': CodeView,
+      'statusbar': Statusbar,
+      'fullscreen': Fullscreen,
+      'handle': Handle,
+      // FIXME: HintPopover must be front of autolink
+      //  - Script error about range when Enter key is pressed on hint popover
+      'hintPopover': HintPopover,
+      'autoLink': AutoLink,
+      'autoSync': AutoSync,
+      'autoReplace': AutoReplace,
+      'placeholder': Placeholder,
+      'buttons': Buttons,
+      'toolbar': Toolbar,
+      'linkDialog': LinkDialog,
+      'linkPopover': LinkPopover,
+      'imageDialog': ImageDialog,
+      'imagePopover': ImagePopover,
+      'tablePopover': TablePopover,
+      'videoDialog': VideoDialog,
+      'helpDialog': HelpDialog,
+      'airPopover': AirPopover
+    },
+    buttons: {},
+    lang: 'en-US',
+    followingToolbar: false,
+    toolbarPosition: 'top',
+    otherStaticBar: '',
+    // toolbar
+    codeviewKeepButton: false,
+    toolbar: [['style', ['style']], ['font', ['bold', 'underline', 'clear']], ['fontname', ['fontname']], ['color', ['color']], ['para', ['ul', 'ol', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture', 'video']], ['view', ['fullscreen', 'codeview', 'help']]],
+    // popover
+    popatmouse: true,
+    popover: {
+      image: [['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']], ['float', ['floatLeft', 'floatRight', 'floatNone']], ['remove', ['removeMedia']]],
+      link: [['link', ['linkDialogShow', 'unlink']]],
+      table: [['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']], ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]],
+      air: [['color', ['color']], ['font', ['bold', 'underline', 'clear']], ['para', ['ul', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture']], ['view', ['fullscreen', 'codeview']]]
+    },
+    // air mode: inline editor
+    airMode: false,
+    overrideContextMenu: false,
+    // TBD
+    width: null,
+    height: null,
+    linkTargetBlank: true,
+    useProtocol: true,
+    defaultProtocol: 'http://',
+    focus: false,
+    tabDisabled: false,
+    tabSize: 4,
+    styleWithCSS: false,
+    shortcuts: true,
+    textareaAutoSync: true,
+    tooltip: 'auto',
+    container: null,
+    maxTextLength: 0,
+    blockquoteBreakingLevel: 2,
+    spellCheck: true,
+    disableGrammar: false,
+    placeholder: null,
+    inheritPlaceholder: false,
+    // TODO: need to be documented
+    recordEveryKeystroke: false,
+    historyLimit: 200,
+    // TODO: need to be documented
+    showDomainOnlyForAutolink: false,
+    // TODO: need to be documented
+    hintMode: 'word',
+    hintSelect: 'after',
+    hintDirection: 'bottom',
+    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
+    fontNames: ['Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande', 'Tahoma', 'Times New Roman', 'Verdana'],
+    fontNamesIgnoreCheck: [],
+    addDefaultFonts: true,
+    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],
+    fontSizeUnits: ['px', 'pt'],
+    // pallete colors(n x n)
+    colors: [['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'], ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'], ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'], ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'], ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'], ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'], ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'], ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031']],
+    // http://chir.ag/projects/name-that-color/
+    colorsName: [['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'], ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'], ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'], ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'], ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'], ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'], ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'], ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou']],
+    colorButton: {
+      foreColor: '#000000',
+      backColor: '#FFFF00'
+    },
+    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],
+    tableClassName: 'table table-bordered',
+    insertTableMaxSize: {
+      col: 10,
+      row: 10
+    },
+    // By default, dialogs are attached in container.
+    dialogsInBody: false,
+    dialogsFade: false,
+    maximumImageFileSize: null,
+    acceptImageFileTypes: "image/*",
+    callbacks: {
+      onBeforeCommand: null,
+      onBlur: null,
+      onBlurCodeview: null,
+      onChange: null,
+      onChangeCodeview: null,
+      onDialogShown: null,
+      onEnter: null,
+      onFocus: null,
+      onImageLinkInsert: null,
+      onImageUpload: null,
+      onImageUploadError: null,
+      onInit: null,
+      onKeydown: null,
+      onKeyup: null,
+      onMousedown: null,
+      onMouseup: null,
+      onPaste: null,
+      onScroll: null
+    },
+    codemirror: {
+      mode: 'text/html',
+      htmlMode: true,
+      lineNumbers: true
+    },
+    codeviewFilter: true,
+    codeviewFilterRegex: /<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,
+    codeviewIframeFilter: true,
+    codeviewIframeWhitelistSrc: [],
+    codeviewIframeWhitelistSrcBase: ['www.youtube.com', 'www.youtube-nocookie.com', 'www.facebook.com', 'vine.co', 'instagram.com', 'player.vimeo.com', 'www.dailymotion.com', 'player.youku.com', 'jumpingbean.tv', 'v.qq.com'],
+    keyMap: {
+      pc: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CTRL+Z': 'undo',
+        'CTRL+Y': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CTRL+B': 'bold',
+        'CTRL+I': 'italic',
+        'CTRL+U': 'underline',
+        'CTRL+SHIFT+S': 'strikethrough',
+        'CTRL+BACKSLASH': 'removeFormat',
+        'CTRL+SHIFT+L': 'justifyLeft',
+        'CTRL+SHIFT+E': 'justifyCenter',
+        'CTRL+SHIFT+R': 'justifyRight',
+        'CTRL+SHIFT+J': 'justifyFull',
+        'CTRL+SHIFT+NUM7': 'insertUnorderedList',
+        'CTRL+SHIFT+NUM8': 'insertOrderedList',
+        'CTRL+LEFTBRACKET': 'outdent',
+        'CTRL+RIGHTBRACKET': 'indent',
+        'CTRL+NUM0': 'formatPara',
+        'CTRL+NUM1': 'formatH1',
+        'CTRL+NUM2': 'formatH2',
+        'CTRL+NUM3': 'formatH3',
+        'CTRL+NUM4': 'formatH4',
+        'CTRL+NUM5': 'formatH5',
+        'CTRL+NUM6': 'formatH6',
+        'CTRL+ENTER': 'insertHorizontalRule',
+        'CTRL+K': 'linkDialog.show'
+      },
+      mac: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CMD+Z': 'undo',
+        'CMD+SHIFT+Z': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CMD+B': 'bold',
+        'CMD+I': 'italic',
+        'CMD+U': 'underline',
+        'CMD+SHIFT+S': 'strikethrough',
+        'CMD+BACKSLASH': 'removeFormat',
+        'CMD+SHIFT+L': 'justifyLeft',
+        'CMD+SHIFT+E': 'justifyCenter',
+        'CMD+SHIFT+R': 'justifyRight',
+        'CMD+SHIFT+J': 'justifyFull',
+        'CMD+SHIFT+NUM7': 'insertUnorderedList',
+        'CMD+SHIFT+NUM8': 'insertOrderedList',
+        'CMD+LEFTBRACKET': 'outdent',
+        'CMD+RIGHTBRACKET': 'indent',
+        'CMD+NUM0': 'formatPara',
+        'CMD+NUM1': 'formatH1',
+        'CMD+NUM2': 'formatH2',
+        'CMD+NUM3': 'formatH3',
+        'CMD+NUM4': 'formatH4',
+        'CMD+NUM5': 'formatH5',
+        'CMD+NUM6': 'formatH6',
+        'CMD+ENTER': 'insertHorizontalRule',
+        'CMD+K': 'linkDialog.show'
+      }
+    },
+    icons: {
+      'align': 'note-icon-align',
+      'alignCenter': 'note-icon-align-center',
+      'alignJustify': 'note-icon-align-justify',
+      'alignLeft': 'note-icon-align-left',
+      'alignRight': 'note-icon-align-right',
+      'rowBelow': 'note-icon-row-below',
+      'colBefore': 'note-icon-col-before',
+      'colAfter': 'note-icon-col-after',
+      'rowAbove': 'note-icon-row-above',
+      'rowRemove': 'note-icon-row-remove',
+      'colRemove': 'note-icon-col-remove',
+      'indent': 'note-icon-align-indent',
+      'outdent': 'note-icon-align-outdent',
+      'arrowsAlt': 'note-icon-arrows-alt',
+      'bold': 'note-icon-bold',
+      'caret': 'note-icon-caret',
+      'circle': 'note-icon-circle',
+      'close': 'note-icon-close',
+      'code': 'note-icon-code',
+      'eraser': 'note-icon-eraser',
+      'floatLeft': 'note-icon-float-left',
+      'floatRight': 'note-icon-float-right',
+      'font': 'note-icon-font',
+      'frame': 'note-icon-frame',
+      'italic': 'note-icon-italic',
+      'link': 'note-icon-link',
+      'unlink': 'note-icon-chain-broken',
+      'magic': 'note-icon-magic',
+      'menuCheck': 'note-icon-menu-check',
+      'minus': 'note-icon-minus',
+      'orderedlist': 'note-icon-orderedlist',
+      'pencil': 'note-icon-pencil',
+      'picture': 'note-icon-picture',
+      'question': 'note-icon-question',
+      'redo': 'note-icon-redo',
+      'rollback': 'note-icon-rollback',
+      'square': 'note-icon-square',
+      'strikethrough': 'note-icon-strikethrough',
+      'subscript': 'note-icon-subscript',
+      'superscript': 'note-icon-superscript',
+      'table': 'note-icon-table',
+      'textHeight': 'note-icon-text-height',
+      'trash': 'note-icon-trash',
+      'underline': 'note-icon-underline',
+      'undo': 'note-icon-undo',
+      'unorderedlist': 'note-icon-unorderedlist',
+      'video': 'note-icon-video'
+    }
+  }
+});
+;// CONCATENATED MODULE: ./src/js/renderer.js
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function renderer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function renderer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function renderer_createClass(Constructor, protoProps, staticProps) { if (protoProps) renderer_defineProperties(Constructor.prototype, protoProps); if (staticProps) renderer_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Renderer = /*#__PURE__*/function () {
+  function Renderer(markup, children, options, callback) {
+    renderer_classCallCheck(this, Renderer);
+
+    this.markup = markup;
+    this.children = children;
+    this.options = options;
+    this.callback = callback;
+  }
+
+  renderer_createClass(Renderer, [{
+    key: "render",
+    value: function render($parent) {
+      var $node = external_jQuery_default()(this.markup);
+
+      if (this.options && this.options.contents) {
+        $node.html(this.options.contents);
+      }
+
+      if (this.options && this.options.className) {
+        $node.addClass(this.options.className);
+      }
+
+      if (this.options && this.options.data) {
+        external_jQuery_default().each(this.options.data, function (k, v) {
+          $node.attr('data-' + k, v);
+        });
+      }
+
+      if (this.options && this.options.click) {
+        $node.on('click', this.options.click);
+      }
+
+      if (this.children) {
+        var $container = $node.find('.note-children-container');
+        this.children.forEach(function (child) {
+          child.render($container.length ? $container : $node);
+        });
+      }
+
+      if (this.callback) {
+        this.callback($node, this.options);
+      }
+
+      if (this.options && this.options.callback) {
+        this.options.callback($node);
+      }
+
+      if ($parent) {
+        $parent.append($node);
+      }
+
+      return $node;
+    }
+  }]);
+
+  return Renderer;
+}();
+
+/* harmony default export */ const renderer = ({
+  create: function create(markup, callback) {
+    return function () {
+      var options = _typeof(arguments[1]) === 'object' ? arguments[1] : arguments[0];
+      var children = Array.isArray(arguments[0]) ? arguments[0] : [];
+
+      if (options && options.children) {
+        children = options.children;
+      }
+
+      return new Renderer(markup, children, options, callback);
+    };
+  }
+});
+;// CONCATENATED MODULE: ./src/styles/lite/js/TooltipUI.js
+function TooltipUI_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function TooltipUI_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function TooltipUI_createClass(Constructor, protoProps, staticProps) { if (protoProps) TooltipUI_defineProperties(Constructor.prototype, protoProps); if (staticProps) TooltipUI_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var TooltipUI = /*#__PURE__*/function () {
+  function TooltipUI($node, options) {
+    TooltipUI_classCallCheck(this, TooltipUI);
+
+    this.$node = $node;
+    this.options = external_jQuery_default().extend({}, {
+      title: '',
+      target: options.container,
+      trigger: 'hover focus',
+      placement: 'bottom'
+    }, options); // create tooltip node
+
+    this.$tooltip = external_jQuery_default()(['<div class="note-tooltip">', '<div class="note-tooltip-arrow"></div>', '<div class="note-tooltip-content"></div>', '</div>'].join('')); // define event
+
+    if (this.options.trigger !== 'manual') {
+      var showCallback = this.show.bind(this);
+      var hideCallback = this.hide.bind(this);
+      var toggleCallback = this.toggle.bind(this);
+      this.options.trigger.split(' ').forEach(function (eventName) {
+        if (eventName === 'hover') {
+          $node.off('mouseenter mouseleave');
+          $node.on('mouseenter', showCallback).on('mouseleave', hideCallback);
+        } else if (eventName === 'click') {
+          $node.on('click', toggleCallback);
+        } else if (eventName === 'focus') {
+          $node.on('focus', showCallback).on('blur', hideCallback);
+        }
+      });
+    }
+  }
+
+  TooltipUI_createClass(TooltipUI, [{
+    key: "show",
+    value: function show() {
+      var $node = this.$node;
+      var offset = $node.offset();
+      var targetOffset = external_jQuery_default()(this.options.target).offset();
+      offset.top -= targetOffset.top;
+      offset.left -= targetOffset.left;
+      var $tooltip = this.$tooltip;
+      var title = this.options.title || $node.attr('title') || $node.data('title');
+      var placement = this.options.placement || $node.data('placement');
+      $tooltip.addClass(placement);
+      $tooltip.find('.note-tooltip-content').text(title);
+      $tooltip.appendTo(this.options.target);
+      var nodeWidth = $node.outerWidth();
+      var nodeHeight = $node.outerHeight();
+      var tooltipWidth = $tooltip.outerWidth();
+      var tooltipHeight = $tooltip.outerHeight();
+
+      if (placement === 'bottom') {
+        $tooltip.css({
+          top: offset.top + nodeHeight,
+          left: offset.left + (nodeWidth / 2 - tooltipWidth / 2)
+        });
+      } else if (placement === 'top') {
+        $tooltip.css({
+          top: offset.top - tooltipHeight,
+          left: offset.left + (nodeWidth / 2 - tooltipWidth / 2)
+        });
+      } else if (placement === 'left') {
+        $tooltip.css({
+          top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),
+          left: offset.left - tooltipWidth
+        });
+      } else if (placement === 'right') {
+        $tooltip.css({
+          top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),
+          left: offset.left + nodeWidth
+        });
+      }
+
+      $tooltip.addClass('in');
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      var _this = this;
+
+      this.$tooltip.removeClass('in');
+      setTimeout(function () {
+        _this.$tooltip.remove();
+      }, 200);
+    }
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      if (this.$tooltip.hasClass('in')) {
+        this.hide();
+      } else {
+        this.show();
+      }
+    }
+  }]);
+
+  return TooltipUI;
+}();
+
+/* harmony default export */ const js_TooltipUI = (TooltipUI);
+;// CONCATENATED MODULE: ./src/styles/lite/js/DropdownUI.js
+function DropdownUI_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function DropdownUI_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function DropdownUI_createClass(Constructor, protoProps, staticProps) { if (protoProps) DropdownUI_defineProperties(Constructor.prototype, protoProps); if (staticProps) DropdownUI_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var DropdownUI = /*#__PURE__*/function () {
+  function DropdownUI($node, options) {
+    DropdownUI_classCallCheck(this, DropdownUI);
+
+    this.$button = $node;
+    this.options = external_jQuery_default().extend({}, {
+      target: options.container
+    }, options);
+    this.setEvent();
+  }
+
+  DropdownUI_createClass(DropdownUI, [{
+    key: "setEvent",
+    value: function setEvent() {
+      var _this = this;
+
+      this.$button.on('click', function (e) {
+        _this.toggle();
+
+        e.stopImmediatePropagation();
+      });
+    }
+  }, {
+    key: "clear",
+    value: function clear() {
+      var $parent = external_jQuery_default()('.note-btn-group.open');
+      $parent.find('.note-btn.active').removeClass('active');
+      $parent.removeClass('open');
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      this.$button.addClass('active');
+      this.$button.parent().addClass('open');
+      var $dropdown = this.$button.next();
+      var offset = $dropdown.offset();
+      var width = $dropdown.outerWidth();
+      var windowWidth = external_jQuery_default()(window).width();
+      var targetMarginRight = parseFloat(external_jQuery_default()(this.options.target).css('margin-right'));
+
+      if (offset.left + width > windowWidth - targetMarginRight) {
+        $dropdown.css('margin-left', windowWidth - targetMarginRight - (offset.left + width));
+      } else {
+        $dropdown.css('margin-left', '');
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$button.removeClass('active');
+      this.$button.parent().removeClass('open');
+    }
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      var isOpened = this.$button.parent().hasClass('open');
+      this.clear();
+
+      if (isOpened) {
+        this.hide();
+      } else {
+        this.show();
+      }
+    }
+  }]);
+
+  return DropdownUI;
+}();
+
+external_jQuery_default()(document).on('click', function (e) {
+  if (!external_jQuery_default()(e.target).closest('.note-btn-group').length) {
+    external_jQuery_default()('.note-btn-group.open').removeClass('open');
+    external_jQuery_default()('.note-btn-group .note-btn.active').removeClass('active');
+  }
+});
+external_jQuery_default()(document).on('click.note-dropdown-menu', function (e) {
+  external_jQuery_default()(e.target).closest('.note-dropdown-menu').parent().removeClass('open');
+  external_jQuery_default()(e.target).closest('.note-dropdown-menu').parent().find('.note-btn.active').removeClass('active');
+});
+/* harmony default export */ const js_DropdownUI = (DropdownUI);
+;// CONCATENATED MODULE: ./src/styles/lite/js/ModalUI.js
+function ModalUI_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ModalUI_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ModalUI_createClass(Constructor, protoProps, staticProps) { if (protoProps) ModalUI_defineProperties(Constructor.prototype, protoProps); if (staticProps) ModalUI_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var ModalUI = /*#__PURE__*/function () {
+  function ModalUI($node
+  /*, options */
+  ) {
+    ModalUI_classCallCheck(this, ModalUI);
+
+    this.$modal = $node;
+    this.$backdrop = external_jQuery_default()('<div class="note-modal-backdrop"></div>');
+  }
+
+  ModalUI_createClass(ModalUI, [{
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      this.$backdrop.appendTo(document.body).show();
+      this.$modal.addClass('open').show();
+      this.$modal.trigger('note.modal.show');
+      this.$modal.off('click', '.close').on('click', '.close', this.hide.bind(this));
+      this.$modal.on('keydown', function (event) {
+        if (event.which === 27) {
+          event.preventDefault();
+
+          _this.hide();
+        }
+      });
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$modal.removeClass('open').hide();
+      this.$backdrop.hide();
+      this.$modal.trigger('note.modal.hide');
+      this.$modal.off('keydown');
+    }
+  }]);
+
+  return ModalUI;
+}();
+
+/* harmony default export */ const js_ModalUI = (ModalUI);
+;// CONCATENATED MODULE: ./src/styles/lite/summernote-lite.js
+
+
+
+
+
+
+
+var editor = renderer.create('<div class="note-editor note-frame"></div>');
+var toolbar = renderer.create('<div class="note-toolbar" role="toolbar"></div>');
+var editingArea = renderer.create('<div class="note-editing-area"></div>');
+var codable = renderer.create('<textarea class="note-codable" aria-multiline="true"></textarea>');
+var editable = renderer.create('<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>');
+var statusbar = renderer.create(['<output class="note-status-output" role="status" aria-live="polite"></output>', '<div class="note-statusbar" role="status">', '<div class="note-resizebar" aria-label="resize">', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '</div>', '</div>'].join(''));
+var airEditor = renderer.create('<div class="note-editor note-airframe"></div>');
+var airEditable = renderer.create(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>', '<output class="note-status-output" role="status" aria-live="polite"></output>'].join(''));
+var buttonGroup = renderer.create('<div class="note-btn-group"></div>');
+var summernote_lite_button = renderer.create('<button type="button" class="note-btn" tabindex="-1"></button>', function ($node, options) {
+  // set button type
+  if (options && options.tooltip) {
+    $node.attr({
+      'aria-label': options.tooltip
+    });
+    $node.data('_lite_tooltip', new js_TooltipUI($node, {
+      title: options.tooltip,
+      container: options.container
+    })).on('click', function (e) {
+      external_jQuery_default()(e.currentTarget).data('_lite_tooltip').hide();
+    });
+  }
+
+  if (options.contents) {
+    $node.html(options.contents);
+  }
+
+  if (options && options.data && options.data.toggle === 'dropdown') {
+    $node.data('_lite_dropdown', new js_DropdownUI($node, {
+      container: options.container
+    }));
+  }
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+var dropdown = renderer.create('<div class="note-dropdown-menu" role="list"></div>', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    var $temp = external_jQuery_default()('<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + value + '"></a>');
+    $temp.html(content).data('item', item);
+    return $temp;
+  }) : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+  $node.on('click', '> .note-dropdown-item', function (e) {
+    var $a = external_jQuery_default()(this);
+    var item = $a.data('item');
+    var value = $a.data('value');
+
+    if (item.click) {
+      item.click($a);
+    } else if (options.itemClick) {
+      options.itemClick(e, item, value);
+    }
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+var dropdownCheck = renderer.create('<div class="note-dropdown-menu note-check" role="list"></div>', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    var $temp = external_jQuery_default()('<a class="note-dropdown-item" href="#" data-value="' + value + '" role="listitem" aria-label="' + item + '"></a>');
+    $temp.html([icon(options.checkClassName), ' ', content]).data('item', item);
+    return $temp;
+  }) : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+  $node.on('click', '> .note-dropdown-item', function (e) {
+    var $a = external_jQuery_default()(this);
+    var item = $a.data('item');
+    var value = $a.data('value');
+
+    if (item.click) {
+      item.click($a);
+    } else if (options.itemClick) {
+      options.itemClick(e, item, value);
+    }
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+
+var dropdownButtonContents = function dropdownButtonContents(contents, options) {
+  return contents + ' ' + icon(options.icons.caret, 'span');
+};
+
+var dropdownButton = function dropdownButton(opt, callback) {
+  return buttonGroup([summernote_lite_button({
+    className: 'dropdown-toggle',
+    contents: opt.title + ' ' + icon('note-icon-caret'),
+    tooltip: opt.tooltip,
+    data: {
+      toggle: 'dropdown'
+    }
+  }), dropdown({
+    className: opt.className,
+    items: opt.items,
+    template: opt.template,
+    itemClick: opt.itemClick
+  })], {
+    callback: callback
+  }).render();
+};
+
+var dropdownCheckButton = function dropdownCheckButton(opt, callback) {
+  return buttonGroup([summernote_lite_button({
+    className: 'dropdown-toggle',
+    contents: opt.title + ' ' + icon('note-icon-caret'),
+    tooltip: opt.tooltip,
+    data: {
+      toggle: 'dropdown'
+    }
+  }), dropdownCheck({
+    className: opt.className,
+    checkClassName: opt.checkClassName,
+    items: opt.items,
+    template: opt.template,
+    itemClick: opt.itemClick
+  })], {
+    callback: callback
+  }).render();
+};
+
+var paragraphDropdownButton = function paragraphDropdownButton(opt) {
+  return buttonGroup([summernote_lite_button({
+    className: 'dropdown-toggle',
+    contents: opt.title + ' ' + icon('note-icon-caret'),
+    tooltip: opt.tooltip,
+    data: {
+      toggle: 'dropdown'
+    }
+  }), dropdown([buttonGroup({
+    className: 'note-align',
+    children: opt.items[0]
+  }), buttonGroup({
+    className: 'note-list',
+    children: opt.items[1]
+  })])]).render();
+};
+
+var tableMoveHandler = function tableMoveHandler(event, col, row) {
+  var PX_PER_EM = 18;
+  var $picker = external_jQuery_default()(event.target.parentNode); // target is mousecatcher
+
+  var $dimensionDisplay = $picker.next();
+  var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
+  var $highlighted = $picker.find('.note-dimension-picker-highlighted');
+  var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
+  var posOffset; // HTML5 with jQuery - e.offsetX is undefined in Firefox
+
+  if (event.offsetX === undefined) {
+    var posCatcher = external_jQuery_default()(event.target).offset();
+    posOffset = {
+      x: event.pageX - posCatcher.left,
+      y: event.pageY - posCatcher.top
+    };
+  } else {
+    posOffset = {
+      x: event.offsetX,
+      y: event.offsetY
+    };
+  }
+
+  var dim = {
+    c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
+    r: Math.ceil(posOffset.y / PX_PER_EM) || 1
+  };
+  $highlighted.css({
+    width: dim.c + 'em',
+    height: dim.r + 'em'
+  });
+  $catcher.data('value', dim.c + 'x' + dim.r);
+
+  if (dim.c > 3 && dim.c < col) {
+    $unhighlighted.css({
+      width: dim.c + 1 + 'em'
+    });
+  }
+
+  if (dim.r > 3 && dim.r < row) {
+    $unhighlighted.css({
+      height: dim.r + 1 + 'em'
+    });
+  }
+
+  $dimensionDisplay.html(dim.c + ' x ' + dim.r);
+};
+
+var tableDropdownButton = function tableDropdownButton(opt) {
+  return buttonGroup([summernote_lite_button({
+    className: 'dropdown-toggle',
+    contents: opt.title + ' ' + icon('note-icon-caret'),
+    tooltip: opt.tooltip,
+    data: {
+      toggle: 'dropdown'
+    }
+  }), dropdown({
+    className: 'note-table',
+    items: ['<div class="note-dimension-picker">', '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>', '<div class="note-dimension-picker-highlighted"></div>', '<div class="note-dimension-picker-unhighlighted"></div>', '</div>', '<div class="note-dimension-display">1 x 1</div>'].join('')
+  })], {
+    callback: function callback($node) {
+      var $catcher = $node.find('.note-dimension-picker-mousecatcher');
+      $catcher.css({
+        width: opt.col + 'em',
+        height: opt.row + 'em'
+      }).mouseup(opt.itemClick).mousemove(function (e) {
+        tableMoveHandler(e, opt.col, opt.row);
+      });
+    }
+  }).render();
+};
+
+var palette = renderer.create('<div class="note-color-palette"></div>', function ($node, options) {
+  var contents = [];
+
+  for (var row = 0, rowSize = options.colors.length; row < rowSize; row++) {
+    var eventName = options.eventName;
+    var colors = options.colors[row];
+    var colorsName = options.colorsName[row];
+    var buttons = [];
+
+    for (var col = 0, colSize = colors.length; col < colSize; col++) {
+      var color = colors[col];
+      var colorName = colorsName[col];
+      buttons.push(['<button type="button" class="note-btn note-color-btn"', 'style="background-color:', color, '" ', 'data-event="', eventName, '" ', 'data-value="', color, '" ', 'data-title="', colorName, '" ', 'aria-label="', colorName, '" ', 'data-toggle="button" tabindex="-1"></button>'].join(''));
+    }
+
+    contents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
+  }
+
+  $node.html(contents.join(''));
+  $node.find('.note-color-btn').each(function () {
+    external_jQuery_default()(this).data('_lite_tooltip', new js_TooltipUI(external_jQuery_default()(this), {
+      container: options.container
+    }));
+  });
+});
+
+var colorDropdownButton = function colorDropdownButton(opt, type) {
+  return buttonGroup({
+    className: 'note-color',
+    children: [summernote_lite_button({
+      className: 'note-current-color-button',
+      contents: opt.title,
+      tooltip: opt.lang.color.recent,
+      click: opt.currentClick,
+      callback: function callback($button) {
+        var $recentColor = $button.find('.note-recent-color');
+
+        if (type !== 'foreColor') {
+          $recentColor.css('background-color', '#FFFF00');
+          $button.attr('data-backColor', '#FFFF00');
+        }
+      }
+    }), summernote_lite_button({
+      className: 'dropdown-toggle',
+      contents: icon('note-icon-caret'),
+      tooltip: opt.lang.color.more,
+      data: {
+        toggle: 'dropdown'
+      }
+    }), dropdown({
+      items: ['<div>', '<div class="note-btn-group btn-background-color">', '<div class="note-palette-title">' + opt.lang.color.background + '</div>', '<div>', '<button type="button" class="note-color-reset note-btn note-btn-block" data-event="backColor" data-value="transparent">', opt.lang.color.transparent, '</button>', '</div>', '<div class="note-holder" data-event="backColor"></div>', '<div class="btn-sm">', '<input type="color" id="html5bcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">', '<button type="button" class="note-color-reset btn" data-event="backColor" data-value="cpbackColor">', opt.lang.color.cpSelect, '</button>', '</div>', '</div>', '<div class="note-btn-group btn-foreground-color">', '<div class="note-palette-title">' + opt.lang.color.foreground + '</div>', '<div>', '<button type="button" class="note-color-reset note-btn note-btn-block" data-event="removeFormat" data-value="foreColor">', opt.lang.color.resetToDefault, '</button>', '</div>', '<div class="note-holder" data-event="foreColor"></div>', '<div class="btn-sm">', '<input type="color" id="html5fcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">', '<button type="button" class="note-color-reset btn" data-event="foreColor" data-value="cpforeColor">', opt.lang.color.cpSelect, '</button>', '</div>', '</div>', '</div>'].join(''),
+      callback: function callback($dropdown) {
+        $dropdown.find('.note-holder').each(function () {
+          var $holder = external_jQuery_default()(this);
+          $holder.append(palette({
+            colors: opt.colors,
+            eventName: $holder.data('event')
+          }).render());
+        });
+
+        if (type === 'fore') {
+          $dropdown.find('.btn-background-color').hide();
+          $dropdown.css({
+            'min-width': '210px'
+          });
+        } else if (type === 'back') {
+          $dropdown.find('.btn-foreground-color').hide();
+          $dropdown.css({
+            'min-width': '210px'
+          });
+        }
+      },
+      click: function click(event) {
+        var $button = external_jQuery_default()(event.target);
+        var eventName = $button.data('event');
+        var value = $button.data('value');
+        var foreinput = document.getElementById('html5fcp').value;
+        var backinput = document.getElementById('html5bcp').value;
+
+        if (value === 'cp') {
+          event.stopPropagation();
+        } else if (value === 'cpbackColor') {
+          value = backinput;
+        } else if (value === 'cpforeColor') {
+          value = foreinput;
+        }
+
+        if (eventName && value) {
+          var key = eventName === 'backColor' ? 'background-color' : 'color';
+          var $color = $button.closest('.note-color').find('.note-recent-color');
+          var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
+          $color.css(key, value);
+          $currentButton.attr('data-' + eventName, value);
+
+          if (type === 'fore') {
+            opt.itemClick('foreColor', value);
+          } else if (type === 'back') {
+            opt.itemClick('backColor', value);
+          } else {
+            opt.itemClick(eventName, value);
+          }
+        }
+      }
+    })]
+  }).render();
+};
+
+var dialog = renderer.create('<div class="note-modal" aria-hidden="false" tabindex="-1" role="dialog"></div>', function ($node, options) {
+  if (options.fade) {
+    $node.addClass('fade');
+  }
+
+  $node.attr({
+    'aria-label': options.title
+  });
+  $node.html(['<div class="note-modal-content">', options.title ? '<div class="note-modal-header"><button type="button" class="close" aria-label="Close" aria-hidden="true"><i class="note-icon-close"></i></button><h4 class="note-modal-title">' + options.title + '</h4></div>' : '', '<div class="note-modal-body">' + options.body + '</div>', options.footer ? '<div class="note-modal-footer">' + options.footer + '</div>' : '', '</div>'].join(''));
+  $node.data('modal', new js_ModalUI($node, options));
+});
+
+var videoDialog = function videoDialog(opt) {
+  var body = '<div class="note-form-group">' + '<label for="note-dialog-video-url-' + opt.id + '" class="note-form-label">' + opt.lang.video.url + ' <small class="text-muted">' + opt.lang.video.providers + '</small></label>' + '<input id="note-dialog-video-url-' + opt.id + '" class="note-video-url note-input" type="text"/>' + '</div>';
+  var footer = ['<button type="button" href="#" class="note-btn note-btn-primary note-video-btn disabled" disabled>', opt.lang.video.insert, '</button>'].join('');
+  return dialog({
+    title: opt.lang.video.insert,
+    fade: opt.fade,
+    body: body,
+    footer: footer
+  }).render();
+};
+
+var imageDialog = function imageDialog(opt) {
+  var body = '<div class="note-form-group note-group-select-from-files">' + '<label for="note-dialog-image-file-' + opt.id + '" class="note-form-label">' + opt.lang.image.selectFromFiles + '</label>' + '<input id="note-dialog-image-file-' + opt.id + '" class="note-note-image-input note-input" type="file" name="files" accept="image/*" multiple="multiple"/>' + opt.imageLimitation + '</div>' + '<div class="note-form-group">' + '<label for="note-dialog-image-url-' + opt.id + '" class="note-form-label">' + opt.lang.image.url + '</label>' + '<input id="note-dialog-image-url-' + opt.id + '" class="note-image-url note-input" type="text"/>' + '</div>';
+  var footer = ['<button href="#" type="button" class="note-btn note-btn-primary note-btn-large note-image-btn disabled" disabled>', opt.lang.image.insert, '</button>'].join('');
+  return dialog({
+    title: opt.lang.image.insert,
+    fade: opt.fade,
+    body: body,
+    footer: footer
+  }).render();
+};
+
+var linkDialog = function linkDialog(opt) {
+  var body = '<div class="note-form-group">' + '<label for="note-dialog-link-txt-' + opt.id + '" class="note-form-label">' + opt.lang.link.textToDisplay + '</label>' + '<input id="note-dialog-link-txt-' + opt.id + '" class="note-link-text note-input" type="text"/>' + '</div>' + '<div class="note-form-group">' + '<label for="note-dialog-link-url-' + opt.id + '" class="note-form-label">' + opt.lang.link.url + '</label>' + '<input id="note-dialog-link-url-' + opt.id + '" class="note-link-url note-input" type="text" value="http://"/>' + '</div>' + (!opt.disableLinkTarget ? '<div class="checkbox"><label for="note-dialog-link-nw-' + opt.id + '"><input id="note-dialog-link-nw-' + opt.id + '" type="checkbox" checked> ' + opt.lang.link.openInNewWindow + '</label></div>' : '') + '<div class="checkbox"><label for="note-dialog-link-up-' + opt.id + '"><input id="note-dialog-link-up-' + opt.id + '" type="checkbox" checked> ' + opt.lang.link.useProtocol + '</label></div>';
+  var footer = ['<button href="#" type="button" class="note-btn note-btn-primary note-link-btn disabled" disabled>', opt.lang.link.insert, '</button>'].join('');
+  return dialog({
+    className: 'link-dialog',
+    title: opt.lang.link.insert,
+    fade: opt.fade,
+    body: body,
+    footer: footer
+  }).render();
+};
+
+var popover = renderer.create(['<div class="note-popover bottom">', '<div class="note-popover-arrow"></div>', '<div class="popover-content note-children-container"></div>', '</div>'].join(''), function ($node, options) {
+  var direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';
+  $node.addClass(direction).hide();
+
+  if (options.hideArrow) {
+    $node.find('.note-popover-arrow').hide();
+  }
+});
+var summernote_lite_checkbox = renderer.create('<div class="checkbox"></div>', function ($node, options) {
+  $node.html(['<label' + (options.id ? ' for="note-' + options.id + '"' : '') + '>', '<input role="checkbox" type="checkbox"' + (options.id ? ' id="note-' + options.id + '"' : ''), options.checked ? ' checked' : '', ' aria-checked="' + (options.checked ? 'true' : 'false') + '"/>', options.text ? options.text : '', '</label>'].join(''));
+});
+
+var icon = function icon(iconClassName, tagName) {
+  if (iconClassName.match(/^</)) {
+    return iconClassName;
+  }
+
+  tagName = tagName || 'i';
+  return '<' + tagName + ' class="' + iconClassName + '"></' + tagName + '>';
+};
+
+var ui = function ui(editorOptions) {
+  return {
+    editor: editor,
+    toolbar: toolbar,
+    editingArea: editingArea,
+    codable: codable,
+    editable: editable,
+    statusbar: statusbar,
+    airEditor: airEditor,
+    airEditable: airEditable,
+    buttonGroup: buttonGroup,
+    button: summernote_lite_button,
+    dropdown: dropdown,
+    dropdownCheck: dropdownCheck,
+    dropdownButton: dropdownButton,
+    dropdownButtonContents: dropdownButtonContents,
+    dropdownCheckButton: dropdownCheckButton,
+    paragraphDropdownButton: paragraphDropdownButton,
+    tableDropdownButton: tableDropdownButton,
+    colorDropdownButton: colorDropdownButton,
+    palette: palette,
+    dialog: dialog,
+    videoDialog: videoDialog,
+    imageDialog: imageDialog,
+    linkDialog: linkDialog,
+    popover: popover,
+    checkbox: summernote_lite_checkbox,
+    icon: icon,
+    options: editorOptions,
+    toggleBtn: function toggleBtn($btn, isEnable) {
+      $btn.toggleClass('disabled', !isEnable);
+      $btn.attr('disabled', !isEnable);
+    },
+    toggleBtnActive: function toggleBtnActive($btn, isActive) {
+      $btn.toggleClass('active', isActive);
+    },
+    check: function check($dom, value) {
+      $dom.find('.checked').removeClass('checked');
+      $dom.find('[data-value="' + value + '"]').addClass('checked');
+    },
+    onDialogShown: function onDialogShown($dialog, handler) {
+      $dialog.one('note.modal.show', handler);
+    },
+    onDialogHidden: function onDialogHidden($dialog, handler) {
+      $dialog.one('note.modal.hide', handler);
+    },
+    showDialog: function showDialog($dialog) {
+      $dialog.data('modal').show();
+    },
+    hideDialog: function hideDialog($dialog) {
+      $dialog.data('modal').hide();
+    },
+
+    /**
+     * get popover content area
+     *
+     * @param $popover
+     * @returns {*}
+     */
+    getPopoverContent: function getPopoverContent($popover) {
+      return $popover.find('.note-popover-content');
+    },
+
+    /**
+     * get dialog's body area
+     *
+     * @param $dialog
+     * @returns {*}
+     */
+    getDialogBody: function getDialogBody($dialog) {
+      return $dialog.find('.note-modal-body');
+    },
+    createLayout: function createLayout($note) {
+      var $editor = (editorOptions.airMode ? airEditor([editingArea([codable(), airEditable()])]) : editorOptions.toolbarPosition === 'bottom' ? editor([editingArea([codable(), editable()]), toolbar(), statusbar()]) : editor([toolbar(), editingArea([codable(), editable()]), statusbar()])).render();
+      $editor.insertAfter($note);
+      return {
+        note: $note,
+        editor: $editor,
+        toolbar: $editor.find('.note-toolbar'),
+        editingArea: $editor.find('.note-editing-area'),
+        editable: $editor.find('.note-editable'),
+        codable: $editor.find('.note-codable'),
+        statusbar: $editor.find('.note-statusbar')
+      };
+    },
+    removeLayout: function removeLayout($note, layoutInfo) {
+      $note.html(layoutInfo.editable.html());
+      layoutInfo.editor.remove();
+      $note.off('summernote'); // remove summernote custom event
+
+      $note.show();
+    }
+  };
+};
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  ui_template: ui,
+  "interface": 'lite'
+});
+})();
+
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote-lite.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js.map
new file mode 100644
index 0000000..097da8e
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote-lite.js","mappings":";;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;;;;;;;;;ACVA;AAEAA,0DAAA,GAAeA,0DAAA,IAAgB;AAC7BE,EAAAA,IAAI,EAAE;AADuB,CAA/B;AAIAF,oDAAA,CAASA,+DAAT,EAA4B;AAC1B,WAAS;AACPI,IAAAA,IAAI,EAAE;AACJC,MAAAA,IAAI,EAAE,MADF;AAEJC,MAAAA,MAAM,EAAE,QAFJ;AAGJC,MAAAA,SAAS,EAAE,WAHP;AAIJC,MAAAA,KAAK,EAAE,mBAJH;AAKJC,MAAAA,MAAM,EAAE,aALJ;AAMJC,MAAAA,IAAI,EAAE,aANF;AAOJC,MAAAA,aAAa,EAAE,eAPX;AAQJC,MAAAA,SAAS,EAAE,WARP;AASJC,MAAAA,WAAW,EAAE,aATT;AAUJC,MAAAA,IAAI,EAAE,WAVF;AAWJC,MAAAA,QAAQ,EAAE;AAXN,KADC;AAcPC,IAAAA,KAAK,EAAE;AACLA,MAAAA,KAAK,EAAE,SADF;AAELC,MAAAA,MAAM,EAAE,cAFH;AAGLC,MAAAA,UAAU,EAAE,aAHP;AAILC,MAAAA,UAAU,EAAE,aAJP;AAKLC,MAAAA,aAAa,EAAE,gBALV;AAMLC,MAAAA,UAAU,EAAE,eANP;AAOLC,MAAAA,SAAS,EAAE,YAPN;AAQLC,MAAAA,UAAU,EAAE,aARP;AASLC,MAAAA,SAAS,EAAE,cATN;AAULC,MAAAA,YAAY,EAAE,gBAVT;AAWLC,MAAAA,WAAW,EAAE,eAXR;AAYLC,MAAAA,cAAc,EAAE,kBAZX;AAaLC,MAAAA,SAAS,EAAE,aAbN;AAcLC,MAAAA,aAAa,EAAE,yBAdV;AAeLC,MAAAA,SAAS,EAAE,oBAfN;AAgBLC,MAAAA,eAAe,EAAE,mBAhBZ;AAiBLC,MAAAA,eAAe,EAAE,mBAjBZ;AAkBLC,MAAAA,oBAAoB,EAAE,6BAlBjB;AAmBLC,MAAAA,GAAG,EAAE,WAnBA;AAoBLC,MAAAA,MAAM,EAAE,cApBH;AAqBLC,MAAAA,QAAQ,EAAE;AArBL,KAdA;AAqCPC,IAAAA,KAAK,EAAE;AACLA,MAAAA,KAAK,EAAE,OADF;AAELC,MAAAA,SAAS,EAAE,YAFN;AAGLrB,MAAAA,MAAM,EAAE,cAHH;AAILiB,MAAAA,GAAG,EAAE,WAJA;AAKLK,MAAAA,SAAS,EAAE;AALN,KArCA;AA4CPC,IAAAA,IAAI,EAAE;AACJA,MAAAA,IAAI,EAAE,MADF;AAEJvB,MAAAA,MAAM,EAAE,aAFJ;AAGJwB,MAAAA,MAAM,EAAE,QAHJ;AAIJC,MAAAA,IAAI,EAAE,MAJF;AAKJC,MAAAA,aAAa,EAAE,iBALX;AAMJT,MAAAA,GAAG,EAAE,kCAND;AAOJU,MAAAA,eAAe,EAAE,oBAPb;AAQJC,MAAAA,WAAW,EAAE;AART,KA5CC;AAsDPC,IAAAA,KAAK,EAAE;AACLA,MAAAA,KAAK,EAAE,OADF;AAELC,MAAAA,WAAW,EAAE,eAFR;AAGLC,MAAAA,WAAW,EAAE,eAHR;AAILC,MAAAA,UAAU,EAAE,iBAJP;AAKLC,MAAAA,WAAW,EAAE,kBALR;AAMLC,MAAAA,MAAM,EAAE,YANH;AAOLC,MAAAA,MAAM,EAAE,eAPH;AAQLC,MAAAA,QAAQ,EAAE;AARL,KAtDA;AAgEPC,IAAAA,EAAE,EAAE;AACFrC,MAAAA,MAAM,EAAE;AADN,KAhEG;AAmEPsC,IAAAA,KAAK,EAAE;AACLA,MAAAA,KAAK,EAAE,OADF;AAELC,MAAAA,CAAC,EAAE,QAFE;AAGLC,MAAAA,UAAU,EAAE,OAHP;AAILC,MAAAA,GAAG,EAAE,MAJA;AAKLC,MAAAA,EAAE,EAAE,UALC;AAMLC,MAAAA,EAAE,EAAE,UANC;AAOLC,MAAAA,EAAE,EAAE,UAPC;AAQLC,MAAAA,EAAE,EAAE,UARC;AASLC,MAAAA,EAAE,EAAE,UATC;AAULC,MAAAA,EAAE,EAAE;AAVC,KAnEA;AA+EPC,IAAAA,KAAK,EAAE;AACLC,MAAAA,SAAS,EAAE,gBADN;AAELC,MAAAA,OAAO,EAAE;AAFJ,KA/EA;AAmFPC,IAAAA,OAAO,EAAE;AACPC,MAAAA,IAAI,EAAE,MADC;AAEPC,MAAAA,UAAU,EAAE,aAFL;AAGPC,MAAAA,QAAQ,EAAE;AAHH,KAnFF;AAwFPC,IAAAA,SAAS,EAAE;AACTA,MAAAA,SAAS,EAAE,WADF;AAETC,MAAAA,OAAO,EAAE,SAFA;AAGTC,MAAAA,MAAM,EAAE,QAHC;AAITC,MAAAA,IAAI,EAAE,YAJG;AAKTC,MAAAA,MAAM,EAAE,cALC;AAMTC,MAAAA,KAAK,EAAE,aANE;AAOTC,MAAAA,OAAO,EAAE;AAPA,KAxFJ;AAiGPC,IAAAA,KAAK,EAAE;AACLC,MAAAA,MAAM,EAAE,cADH;AAELC,MAAAA,IAAI,EAAE,YAFD;AAGLC,MAAAA,UAAU,EAAE,kBAHP;AAILC,MAAAA,UAAU,EAAE,YAJP;AAKLC,MAAAA,WAAW,EAAE,aALR;AAMLC,MAAAA,cAAc,EAAE,iBANX;AAOLC,MAAAA,KAAK,EAAE,OAPF;AAQLC,MAAAA,cAAc,EAAE,kBARX;AASLC,MAAAA,QAAQ,EAAE;AATL,KAjGA;AA4GPC,IAAAA,QAAQ,EAAE;AACRC,MAAAA,SAAS,EAAE,oBADH;AAERC,MAAAA,KAAK,EAAE,OAFC;AAGRC,MAAAA,cAAc,EAAE,iBAHR;AAIRC,MAAAA,MAAM,EAAE,QAJA;AAKRC,MAAAA,mBAAmB,EAAE,sBALb;AAMRC,MAAAA,aAAa,EAAE,gBANP;AAORC,MAAAA,SAAS,EAAE;AAPH,KA5GH;AAqHP3B,IAAAA,IAAI,EAAE;AACJ,gBAAU,QADN;AAEJ,yBAAmB,kBAFf;AAGJ,cAAQ,uBAHJ;AAIJ,cAAQ,uBAJJ;AAKJ,aAAO,KALH;AAMJ,eAAS,OANL;AAOJ,cAAQ,kBAPJ;AAQJ,gBAAU,oBARN;AASJ,mBAAa,uBATT;AAUJ,uBAAiB,2BAVb;AAWJ,sBAAgB,eAXZ;AAYJ,qBAAe,gBAZX;AAaJ,uBAAiB,kBAbb;AAcJ,sBAAgB,iBAdZ;AAeJ,qBAAe,gBAfX;AAgBJ,6BAAuB,uBAhBnB;AAiBJ,2BAAqB,qBAjBjB;AAkBJ,iBAAW,8BAlBP;AAmBJ,gBAAU,6BAnBN;AAoBJ,oBAAc,sDApBV;AAqBJ,kBAAY,sCArBR;AAsBJ,kBAAY,sCAtBR;AAuBJ,kBAAY,sCAvBR;AAwBJ,kBAAY,sCAxBR;AAyBJ,kBAAY,sCAzBR;AA0BJ,kBAAY,sCA1BR;AA2BJ,8BAAwB,wBA3BpB;AA4BJ,yBAAmB;AA5Bf,KArHC;AAmJP4B,IAAAA,OAAO,EAAE;AACPC,MAAAA,IAAI,EAAE,MADC;AAEPC,MAAAA,IAAI,EAAE;AAFC,KAnJF;AAuJPC,IAAAA,WAAW,EAAE;AACXA,MAAAA,WAAW,EAAE,oBADF;AAEXC,MAAAA,MAAM,EAAE;AAFG,KAvJN;AA2JPC,IAAAA,MAAM,EAAE;AACNC,MAAAA,WAAW,EAAE;AADP;AA3JD;AADiB,CAA5B;;;;;;;ACNA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;WCtBA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;;;;;;;;;;;;ACNA;AAEA;AACA;AACA;AACA;AACA;AACA;;AACA,IAAMC,mBAAmB,GAAG,CAAC,YAAD,EAAe,OAAf,EAAwB,WAAxB,EAAqC,SAArC,EAAgD,SAAhD,CAA5B;;AAEA,SAASC,aAAT,CAAuBC,QAAvB,EAAiC;AAC/B,SAAQ1G,iCAAA,CAAU0G,QAAQ,CAACE,WAAT,EAAV,EAAkCJ,mBAAlC,MAA2D,CAAC,CAA7D,cAAsEE,QAAtE,SAAoFA,QAA3F;AACD;;AAED,SAASG,eAAT,CAAyBH,QAAzB,EAAmC;AACjC,MAAMI,YAAY,GAAGJ,QAAQ,KAAK,eAAb,GAA+B,aAA/B,GAA+C,eAApE;AACA,MAAMK,QAAQ,GAAG,iBAAjB;AACA,MAAMC,QAAQ,GAAG,OAAjB;AAEA,MAAIC,MAAM,GAAGC,QAAQ,CAACC,aAAT,CAAuB,QAAvB,CAAb;AACA,MAAIC,OAAO,GAAGH,MAAM,CAACI,UAAP,CAAkB,IAAlB,CAAd;AAEAD,EAAAA,OAAO,CAAChH,IAAR,GAAe4G,QAAQ,GAAG,IAAX,GAAkBF,YAAlB,GAAiC,GAAhD;AACA,MAAMQ,aAAa,GAAGF,OAAO,CAACG,WAAR,CAAoBR,QAApB,EAA8BS,KAApD;AAEAJ,EAAAA,OAAO,CAAChH,IAAR,GAAe4G,QAAQ,GAAG,GAAX,GAAiBP,aAAa,CAACC,QAAD,CAA9B,GAA2C,KAA3C,GAAmDI,YAAnD,GAAkE,GAAjF;AACA,MAAMU,KAAK,GAAGJ,OAAO,CAACG,WAAR,CAAoBR,QAApB,EAA8BS,KAA5C;AAEA,SAAOF,aAAa,KAAKE,KAAzB;AACD;;AAED,IAAMC,SAAS,GAAGC,SAAS,CAACD,SAA5B;AACA,IAAME,MAAM,GAAG,gBAAgBC,IAAhB,CAAqBH,SAArB,CAAf;AACA,IAAII,cAAJ;;AACA,IAAIF,MAAJ,EAAY;AACV,MAAIG,OAAO,GAAG,mBAAmBC,IAAnB,CAAwBN,SAAxB,CAAd;;AACA,MAAIK,OAAJ,EAAa;AACXD,IAAAA,cAAc,GAAGG,UAAU,CAACF,OAAO,CAAC,CAAD,CAAR,CAA3B;AACD;;AACDA,EAAAA,OAAO,GAAG,sCAAsCC,IAAtC,CAA2CN,SAA3C,CAAV;;AACA,MAAIK,OAAJ,EAAa;AACXD,IAAAA,cAAc,GAAGG,UAAU,CAACF,OAAO,CAAC,CAAD,CAAR,CAA3B;AACD;AACF;;AAED,IAAMG,MAAM,GAAG,YAAYL,IAAZ,CAAiBH,SAAjB,CAAf;AAEA,IAAMS,cAAc,GAChB,kBAAkBC,MAAnB,IACCT,SAAS,CAACU,cAAV,GAA2B,CAD5B,IAECV,SAAS,CAACW,gBAAV,GAA6B,CAHjC,EAKA;AACA;;AACA,IAAMC,cAAc,GAAIX,MAAD,GAAW,6DAAX,GAA2E,OAAlG;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,0CAAe;AACbY,EAAAA,KAAK,EAAEb,SAAS,CAACc,UAAV,CAAqBC,OAArB,CAA6B,KAA7B,IAAsC,CAAC,CADjC;AAEbd,EAAAA,MAAM,EAANA,MAFa;AAGbM,EAAAA,MAAM,EAANA,MAHa;AAIbS,EAAAA,IAAI,EAAE,CAACT,MAAD,IAAW,WAAWL,IAAX,CAAgBH,SAAhB,CAJJ;AAKbkB,EAAAA,SAAS,EAAE,aAAaf,IAAb,CAAkBH,SAAlB,CALE;AAMbmB,EAAAA,QAAQ,EAAE,CAACX,MAAD,IAAW,UAAUL,IAAV,CAAeH,SAAf,CANR;AAOboB,EAAAA,QAAQ,EAAE,CAACZ,MAAD,IAAW,UAAUL,IAAV,CAAeH,SAAf,CAPR;AAQbqB,EAAAA,QAAQ,EAAE,CAACb,MAAD,IAAW,UAAUL,IAAV,CAAeH,SAAf,CAAX,IAAyC,CAAC,UAAUG,IAAV,CAAeH,SAAf,CARvC;AASbI,EAAAA,cAAc,EAAdA,cATa;AAUbK,EAAAA,cAAc,EAAdA,cAVa;AAWbrB,EAAAA,eAAe,EAAfA,eAXa;AAYbkC,EAAAA,iBAAiB,EAAE,CAAC,CAAC7B,QAAQ,CAAC8B,WAZjB;AAabV,EAAAA,cAAc,EAAdA,cAba;AAcb9B,EAAAA,mBAAmB,EAAnBA,mBAda;AAebC,EAAAA,aAAa,EAAbA;AAfa,CAAf;;AChEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASwC,EAAT,CAAYC,KAAZ,EAAmB;AACjB,SAAO,UAASC,KAAT,EAAgB;AACrB,WAAOD,KAAK,KAAKC,KAAjB;AACD,GAFD;AAGD;;AAED,SAASC,GAAT,CAAaF,KAAb,EAAoBC,KAApB,EAA2B;AACzB,SAAOD,KAAK,KAAKC,KAAjB;AACD;;AAED,SAASE,IAAT,CAAcC,QAAd,EAAwB;AACtB,SAAO,UAASJ,KAAT,EAAgBC,KAAhB,EAAuB;AAC5B,WAAOD,KAAK,CAACI,QAAD,CAAL,KAAoBH,KAAK,CAACG,QAAD,CAAhC;AACD,GAFD;AAGD;;AAED,SAASC,EAAT,GAAc;AACZ,SAAO,IAAP;AACD;;AAED,SAASC,IAAT,GAAgB;AACd,SAAO,KAAP;AACD;;AAED,SAASC,GAAT,CAAaC,CAAb,EAAgB;AACd,SAAO,YAAW;AAChB,WAAO,CAACA,CAAC,CAACC,KAAF,CAAQD,CAAR,EAAWE,SAAX,CAAR;AACD,GAFD;AAGD;;AAED,SAASC,GAAT,CAAaC,EAAb,EAAiBC,EAAjB,EAAqB;AACnB,SAAO,UAASC,IAAT,EAAe;AACpB,WAAOF,EAAE,CAACE,IAAD,CAAF,IAAYD,EAAE,CAACC,IAAD,CAArB;AACD,GAFD;AAGD;;AAED,SAASC,SAAT,CAAcC,CAAd,EAAiB;AACf,SAAOA,CAAP;AACD;;AAED,SAASC,MAAT,CAAgBC,GAAhB,EAAqBC,MAArB,EAA6B;AAC3B,SAAO,YAAW;AAChB,WAAOD,GAAG,CAACC,MAAD,CAAH,CAAYV,KAAZ,CAAkBS,GAAlB,EAAuBR,SAAvB,CAAP;AACD,GAFD;AAGD;;AAED,IAAIU,SAAS,GAAG,CAAhB;AAEA;AACA;AACA;AACA;;AACA,SAASC,aAAT,GAAyB;AACvBD,EAAAA,SAAS,GAAG,CAAZ;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASE,QAAT,CAAkBC,MAAlB,EAA0B;AACxB,MAAMC,EAAE,GAAG,EAAEJ,SAAF,GAAc,EAAzB;AACA,SAAOG,MAAM,GAAGA,MAAM,GAAGC,EAAZ,GAAiBA,EAA9B;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,QAAT,CAAkBC,IAAlB,EAAwB;AACtB,MAAMC,SAAS,GAAG7K,yBAAC,CAACkH,QAAD,CAAnB;AACA,SAAO;AACL4D,IAAAA,GAAG,EAAEF,IAAI,CAACE,GAAL,GAAWD,SAAS,CAACE,SAAV,EADX;AAELpG,IAAAA,IAAI,EAAEiG,IAAI,CAACjG,IAAL,GAAYkG,SAAS,CAACG,UAAV,EAFb;AAGLxD,IAAAA,KAAK,EAAEoD,IAAI,CAAC/F,KAAL,GAAa+F,IAAI,CAACjG,IAHpB;AAILlE,IAAAA,MAAM,EAAEmK,IAAI,CAACK,MAAL,GAAcL,IAAI,CAACE;AAJtB,GAAP;AAMD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASI,YAAT,CAAsBd,GAAtB,EAA2B;AACzB,MAAMe,QAAQ,GAAG,EAAjB;;AACA,OAAK,IAAMC,GAAX,IAAkBhB,GAAlB,EAAuB;AACrB,QAAIiB,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCpB,GAArC,EAA0CgB,GAA1C,CAAJ,EAAoD;AAClDD,MAAAA,QAAQ,CAACf,GAAG,CAACgB,GAAD,CAAJ,CAAR,GAAqBA,GAArB;AACD;AACF;;AACD,SAAOD,QAAP;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASM,gBAAT,CAA0BC,SAA1B,EAAqCjB,MAArC,EAA6C;AAC3CA,EAAAA,MAAM,GAAGA,MAAM,IAAI,EAAnB;AACA,SAAOA,MAAM,GAAGiB,SAAS,CAACC,KAAV,CAAgB,GAAhB,EAAqBC,GAArB,CAAyB,UAASlL,IAAT,EAAe;AACtD,WAAOA,IAAI,CAACmL,SAAL,CAAe,CAAf,EAAkB,CAAlB,EAAqBC,WAArB,KAAqCpL,IAAI,CAACmL,SAAL,CAAe,CAAf,CAA5C;AACD,GAFe,EAEbE,IAFa,CAER,EAFQ,CAAhB;AAGD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,QAAT,CAAkBC,IAAlB,EAAwBC,IAAxB,EAA8BC,SAA9B,EAAyC;AACvC,MAAIC,OAAJ;AACA,SAAO,YAAW;AAChB,QAAMhF,OAAO,GAAG,IAAhB;AACA,QAAMiF,IAAI,GAAGzC,SAAb;;AACA,QAAM0C,KAAK,GAAG,SAARA,KAAQ,GAAM;AAClBF,MAAAA,OAAO,GAAG,IAAV;;AACA,UAAI,CAACD,SAAL,EAAgB;AACdF,QAAAA,IAAI,CAACtC,KAAL,CAAWvC,OAAX,EAAoBiF,IAApB;AACD;AACF,KALD;;AAMA,QAAME,OAAO,GAAGJ,SAAS,IAAI,CAACC,OAA9B;AACAI,IAAAA,YAAY,CAACJ,OAAD,CAAZ;AACAA,IAAAA,OAAO,GAAGK,UAAU,CAACH,KAAD,EAAQJ,IAAR,CAApB;;AACA,QAAIK,OAAJ,EAAa;AACXN,MAAAA,IAAI,CAACtC,KAAL,CAAWvC,OAAX,EAAoBiF,IAApB;AACD;AACF,GAfD;AAgBD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASK,UAAT,CAAoBxK,GAApB,EAAyB;AACvB,MAAMyK,UAAU,GAAG,4EAAnB;AACA,SAAOA,UAAU,CAAC/E,IAAX,CAAgB1F,GAAhB,CAAP;AACD;;AAED,2CAAe;AACb+G,EAAAA,EAAE,EAAFA,EADa;AAEbG,EAAAA,GAAG,EAAHA,GAFa;AAGbC,EAAAA,IAAI,EAAJA,IAHa;AAIbE,EAAAA,EAAE,EAAFA,EAJa;AAKbC,EAAAA,IAAI,EAAJA,IALa;AAMbS,EAAAA,IAAI,EAAJA,SANa;AAObR,EAAAA,GAAG,EAAHA,GAPa;AAQbI,EAAAA,GAAG,EAAHA,GARa;AASbM,EAAAA,MAAM,EAANA,MATa;AAUbI,EAAAA,aAAa,EAAbA,aAVa;AAWbC,EAAAA,QAAQ,EAARA,QAXa;AAYbG,EAAAA,QAAQ,EAARA,QAZa;AAabO,EAAAA,YAAY,EAAZA,YAba;AAcbO,EAAAA,gBAAgB,EAAhBA,gBAda;AAebO,EAAAA,QAAQ,EAARA,QAfa;AAgBbU,EAAAA,UAAU,EAAVA;AAhBa,CAAf;;ACtKA;AAEA;AACA;AACA;AACA;AACA;;AACA,SAASE,IAAT,CAAcC,KAAd,EAAqB;AACnB,SAAOA,KAAK,CAAC,CAAD,CAAZ;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASC,IAAT,CAAcD,KAAd,EAAqB;AACnB,SAAOA,KAAK,CAACA,KAAK,CAACE,MAAN,GAAe,CAAhB,CAAZ;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASC,OAAT,CAAiBH,KAAjB,EAAwB;AACtB,SAAOA,KAAK,CAACI,KAAN,CAAY,CAAZ,EAAeJ,KAAK,CAACE,MAAN,GAAe,CAA9B,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASG,IAAT,CAAcL,KAAd,EAAqB;AACnB,SAAOA,KAAK,CAACI,KAAN,CAAY,CAAZ,CAAP;AACD;AAED;AACA;AACA;;;AACA,SAASE,IAAT,CAAcN,KAAd,EAAqBO,IAArB,EAA2B;AACzB,OAAK,IAAIC,GAAG,GAAG,CAAV,EAAaC,GAAG,GAAGT,KAAK,CAACE,MAA9B,EAAsCM,GAAG,GAAGC,GAA5C,EAAiDD,GAAG,EAApD,EAAwD;AACtD,QAAMrD,IAAI,GAAG6C,KAAK,CAACQ,GAAD,CAAlB;;AACA,QAAID,IAAI,CAACpD,IAAD,CAAR,EAAgB;AACd,aAAOA,IAAP;AACD;AACF;AACF;AAED;AACA;AACA;;;AACA,SAASuD,SAAT,CAAaV,KAAb,EAAoBO,IAApB,EAA0B;AACxB,OAAK,IAAIC,GAAG,GAAG,CAAV,EAAaC,GAAG,GAAGT,KAAK,CAACE,MAA9B,EAAsCM,GAAG,GAAGC,GAA5C,EAAiDD,GAAG,EAApD,EAAwD;AACtD,QAAI,CAACD,IAAI,CAACP,KAAK,CAACQ,GAAD,CAAN,CAAT,EAAuB;AACrB,aAAO,KAAP;AACD;AACF;;AACD,SAAO,IAAP;AACD;AAED;AACA;AACA;;;AACA,SAASG,QAAT,CAAkBX,KAAlB,EAAyB7C,IAAzB,EAA+B;AAC7B,MAAI6C,KAAK,IAAIA,KAAK,CAACE,MAAf,IAAyB/C,IAA7B,EAAmC;AACjC,QAAI6C,KAAK,CAACpE,OAAV,EAAmB;AACjB,aAAOoE,KAAK,CAACpE,OAAN,CAAcuB,IAAd,MAAwB,CAAC,CAAhC;AACD,KAFD,MAEO,IAAI6C,KAAK,CAACW,QAAV,EAAoB;AACzB;AACA,aAAOX,KAAK,CAACW,QAAN,CAAexD,IAAf,CAAP;AACD;AACF;;AACD,SAAO,KAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASyD,GAAT,CAAaZ,KAAb,EAAoBa,EAApB,EAAwB;AACtBA,EAAAA,EAAE,GAAGA,EAAE,IAAIzB,SAAX;AACA,SAAOY,KAAK,CAACc,MAAN,CAAa,UAASC,IAAT,EAAeC,CAAf,EAAkB;AACpC,WAAOD,IAAI,GAAGF,EAAE,CAACG,CAAD,CAAhB;AACD,GAFM,EAEJ,CAFI,CAAP;AAGD;AAED;AACA;AACA;AACA;;;AACA,SAASC,IAAT,CAAcC,UAAd,EAA0B;AACxB,MAAMC,MAAM,GAAG,EAAf;AACA,MAAMjB,MAAM,GAAGgB,UAAU,CAAChB,MAA1B;AACA,MAAIM,GAAG,GAAG,CAAC,CAAX;;AACA,SAAO,EAAEA,GAAF,GAAQN,MAAf,EAAuB;AACrBiB,IAAAA,MAAM,CAACX,GAAD,CAAN,GAAcU,UAAU,CAACV,GAAD,CAAxB;AACD;;AACD,SAAOW,MAAP;AACD;AAED;AACA;AACA;;;AACA,SAASC,OAAT,CAAiBpB,KAAjB,EAAwB;AACtB,SAAO,CAACA,KAAD,IAAU,CAACA,KAAK,CAACE,MAAxB;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASmB,SAAT,CAAmBrB,KAAnB,EAA0Ba,EAA1B,EAA8B;AAC5B,MAAI,CAACb,KAAK,CAACE,MAAX,EAAmB;AAAE,WAAO,EAAP;AAAY;;AACjC,MAAMoB,KAAK,GAAGjB,IAAI,CAACL,KAAD,CAAlB;AACA,SAAOsB,KAAK,CAACR,MAAN,CAAa,UAASC,IAAT,EAAeC,CAAf,EAAkB;AACpC,QAAMO,KAAK,GAAGtB,IAAI,CAACc,IAAD,CAAlB;;AACA,QAAIF,EAAE,CAACZ,IAAI,CAACsB,KAAD,CAAL,EAAcP,CAAd,CAAN,EAAwB;AACtBO,MAAAA,KAAK,CAACA,KAAK,CAACrB,MAAP,CAAL,GAAsBc,CAAtB;AACD,KAFD,MAEO;AACLD,MAAAA,IAAI,CAACA,IAAI,CAACb,MAAN,CAAJ,GAAoB,CAACc,CAAD,CAApB;AACD;;AACD,WAAOD,IAAP;AACD,GARM,EAQJ,CAAC,CAAChB,IAAI,CAACC,KAAD,CAAL,CAAD,CARI,CAAP;AASD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASwB,OAAT,CAAiBxB,KAAjB,EAAwB;AACtB,MAAMyB,OAAO,GAAG,EAAhB;;AACA,OAAK,IAAIjB,GAAG,GAAG,CAAV,EAAaC,GAAG,GAAGT,KAAK,CAACE,MAA9B,EAAsCM,GAAG,GAAGC,GAA5C,EAAiDD,GAAG,EAApD,EAAwD;AACtD,QAAIR,KAAK,CAACQ,GAAD,CAAT,EAAgB;AAAEiB,MAAAA,OAAO,CAACC,IAAR,CAAa1B,KAAK,CAACQ,GAAD,CAAlB;AAA2B;AAC9C;;AACD,SAAOiB,OAAP;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASE,MAAT,CAAgB3B,KAAhB,EAAuB;AACrB,MAAM4B,OAAO,GAAG,EAAhB;;AAEA,OAAK,IAAIpB,GAAG,GAAG,CAAV,EAAaC,GAAG,GAAGT,KAAK,CAACE,MAA9B,EAAsCM,GAAG,GAAGC,GAA5C,EAAiDD,GAAG,EAApD,EAAwD;AACtD,QAAI,CAACG,QAAQ,CAACiB,OAAD,EAAU5B,KAAK,CAACQ,GAAD,CAAf,CAAb,EAAoC;AAClCoB,MAAAA,OAAO,CAACF,IAAR,CAAa1B,KAAK,CAACQ,GAAD,CAAlB;AACD;AACF;;AAED,SAAOoB,OAAP;AACD;AAED;AACA;AACA;AACA;;;AACA,SAASC,IAAT,CAAc7B,KAAd,EAAqB7C,IAArB,EAA2B;AACzB,MAAI6C,KAAK,IAAIA,KAAK,CAACE,MAAf,IAAyB/C,IAA7B,EAAmC;AACjC,QAAMqD,GAAG,GAAGR,KAAK,CAACpE,OAAN,CAAcuB,IAAd,CAAZ;AACA,WAAOqD,GAAG,KAAK,CAAC,CAAT,GAAa,IAAb,GAAoBR,KAAK,CAACQ,GAAG,GAAG,CAAP,CAAhC;AACD;;AACD,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;;;AACA,SAASsB,IAAT,CAAc9B,KAAd,EAAqB7C,IAArB,EAA2B;AACzB,MAAI6C,KAAK,IAAIA,KAAK,CAACE,MAAf,IAAyB/C,IAA7B,EAAmC;AACjC,QAAMqD,GAAG,GAAGR,KAAK,CAACpE,OAAN,CAAcuB,IAAd,CAAZ;AACA,WAAOqD,GAAG,KAAK,CAAC,CAAT,GAAa,IAAb,GAAoBR,KAAK,CAACQ,GAAG,GAAG,CAAP,CAAhC;AACD;;AACD,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,4CAAe;AACbT,EAAAA,IAAI,EAAJA,IADa;AAEbE,EAAAA,IAAI,EAAJA,IAFa;AAGbE,EAAAA,OAAO,EAAPA,OAHa;AAIbE,EAAAA,IAAI,EAAJA,IAJa;AAKbyB,EAAAA,IAAI,EAAJA,IALa;AAMbD,EAAAA,IAAI,EAAJA,IANa;AAObvB,EAAAA,IAAI,EAAJA,IAPa;AAQbK,EAAAA,QAAQ,EAARA,QARa;AASbD,EAAAA,GAAG,EAAHA,SATa;AAUbE,EAAAA,GAAG,EAAHA,GAVa;AAWbK,EAAAA,IAAI,EAAJA,IAXa;AAYbG,EAAAA,OAAO,EAAPA,OAZa;AAabC,EAAAA,SAAS,EAATA,SAba;AAcbG,EAAAA,OAAO,EAAPA,OAda;AAebG,EAAAA,MAAM,EAANA;AAfa,CAAf;;ACnMA;AACA;AACA;AACA;AAEA,IAAMK,SAAS,GAAGC,MAAM,CAACC,YAAP,CAAoB,GAApB,CAAlB;AACA,IAAMC,oBAAoB,GAAG,QAA7B;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASC,UAAT,CAAoBC,IAApB,EAA0B;AACxB,SAAOA,IAAI,IAAIlP,yBAAC,CAACkP,IAAD,CAAD,CAAQC,QAAR,CAAiB,eAAjB,CAAf;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,eAAT,CAAyBF,IAAzB,EAA+B;AAC7B,SAAOA,IAAI,IAAIlP,yBAAC,CAACkP,IAAD,CAAD,CAAQC,QAAR,CAAiB,qBAAjB,CAAf;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASE,kBAAT,CAA4BC,QAA5B,EAAsC;AACpCA,EAAAA,QAAQ,GAAGA,QAAQ,CAACxD,WAAT,EAAX;AACA,SAAO,UAASoD,IAAT,EAAe;AACpB,WAAOA,IAAI,IAAIA,IAAI,CAACI,QAAL,CAAcxD,WAAd,OAAgCwD,QAA/C;AACD,GAFD;AAGD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,MAAT,CAAgBL,IAAhB,EAAsB;AACpB,SAAOA,IAAI,IAAIA,IAAI,CAACM,QAAL,KAAkB,CAAjC;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,SAAT,CAAmBP,IAAnB,EAAyB;AACvB,SAAOA,IAAI,IAAIA,IAAI,CAACM,QAAL,KAAkB,CAAjC;AACD;AAED;AACA;AACA;AACA;;;AACA,SAASE,MAAT,CAAgBR,IAAhB,EAAsB;AACpB,SAAOA,IAAI,IAAI,2DAA2DtH,IAA3D,CAAgEsH,IAAI,CAACI,QAAL,CAAcxD,WAAd,EAAhE,CAAf;AACD;;AAED,SAAS6D,MAAT,CAAgBT,IAAhB,EAAsB;AACpB,MAAID,UAAU,CAACC,IAAD,CAAd,EAAsB;AACpB,WAAO,KAAP;AACD,GAHmB,CAKpB;;;AACA,SAAOA,IAAI,IAAI,sBAAsBtH,IAAtB,CAA2BsH,IAAI,CAACI,QAAL,CAAcxD,WAAd,EAA3B,CAAf;AACD;;AAED,SAAS8D,SAAT,CAAmBV,IAAnB,EAAyB;AACvB,SAAOA,IAAI,IAAI,UAAUtH,IAAV,CAAesH,IAAI,CAACI,QAAL,CAAcxD,WAAd,EAAf,CAAf;AACD;;AAED,IAAM+D,KAAK,GAAGR,kBAAkB,CAAC,KAAD,CAAhC;AAEA,IAAMS,IAAI,GAAGT,kBAAkB,CAAC,IAAD,CAA/B;;AAEA,SAASU,UAAT,CAAoBb,IAApB,EAA0B;AACxB,SAAOS,MAAM,CAACT,IAAD,CAAN,IAAgB,CAACY,IAAI,CAACZ,IAAD,CAA5B;AACD;;AAED,IAAMc,OAAO,GAAGX,kBAAkB,CAAC,OAAD,CAAlC;AAEA,IAAMY,MAAM,GAAGZ,kBAAkB,CAAC,MAAD,CAAjC;;AAEA,SAASa,QAAT,CAAkBhB,IAAlB,EAAwB;AACtB,SAAO,CAACiB,eAAe,CAACjB,IAAD,CAAhB,IACA,CAACkB,MAAM,CAAClB,IAAD,CADP,IAEA,CAACmB,IAAI,CAACnB,IAAD,CAFL,IAGA,CAACS,MAAM,CAACT,IAAD,CAHP,IAIA,CAACc,OAAO,CAACd,IAAD,CAJR,IAKA,CAACoB,YAAY,CAACpB,IAAD,CALb,IAMA,CAACe,MAAM,CAACf,IAAD,CANd;AAOD;;AAED,SAASkB,MAAT,CAAgBlB,IAAhB,EAAsB;AACpB,SAAOA,IAAI,IAAI,UAAUtH,IAAV,CAAesH,IAAI,CAACI,QAAL,CAAcxD,WAAd,EAAf,CAAf;AACD;;AAED,IAAMuE,IAAI,GAAGhB,kBAAkB,CAAC,IAAD,CAA/B;;AAEA,SAASkB,MAAT,CAAgBrB,IAAhB,EAAsB;AACpB,SAAOA,IAAI,IAAI,UAAUtH,IAAV,CAAesH,IAAI,CAACI,QAAL,CAAcxD,WAAd,EAAf,CAAf;AACD;;AAED,IAAMwE,YAAY,GAAGjB,kBAAkB,CAAC,YAAD,CAAvC;;AAEA,SAASc,eAAT,CAAyBjB,IAAzB,EAA+B;AAC7B,SAAOqB,MAAM,CAACrB,IAAD,CAAN,IAAgBoB,YAAY,CAACpB,IAAD,CAA5B,IAAsCD,UAAU,CAACC,IAAD,CAAvD;AACD;;AAED,IAAMsB,QAAQ,GAAGnB,kBAAkB,CAAC,GAAD,CAAnC;;AAEA,SAASoB,YAAT,CAAsBvB,IAAtB,EAA4B;AAC1B,SAAOgB,QAAQ,CAAChB,IAAD,CAAR,IAAkB,CAAC,CAACwB,QAAQ,CAACxB,IAAD,EAAOS,MAAP,CAAnC;AACD;;AAED,SAASgB,YAAT,CAAsBzB,IAAtB,EAA4B;AAC1B,SAAOgB,QAAQ,CAAChB,IAAD,CAAR,IAAkB,CAACwB,QAAQ,CAACxB,IAAD,EAAOS,MAAP,CAAlC;AACD;;AAED,IAAMiB,MAAM,GAAGvB,kBAAkB,CAAC,MAAD,CAAjC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASwB,gBAAT,CAA0BC,KAA1B,EAAiCC,KAAjC,EAAwC;AACtC,SAAOD,KAAK,CAACE,WAAN,KAAsBD,KAAtB,IACAD,KAAK,CAACG,eAAN,KAA0BF,KADjC;AAED;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASG,mBAAT,CAA6BhC,IAA7B,EAAmC9B,IAAnC,EAAyC;AACvCA,EAAAA,IAAI,GAAGA,IAAI,IAAInB,OAAf;AAEA,MAAMkF,QAAQ,GAAG,EAAjB;;AACA,MAAIjC,IAAI,CAAC+B,eAAL,IAAwB7D,IAAI,CAAC8B,IAAI,CAAC+B,eAAN,CAAhC,EAAwD;AACtDE,IAAAA,QAAQ,CAAC5C,IAAT,CAAcW,IAAI,CAAC+B,eAAnB;AACD;;AACDE,EAAAA,QAAQ,CAAC5C,IAAT,CAAcW,IAAd;;AACA,MAAIA,IAAI,CAAC8B,WAAL,IAAoB5D,IAAI,CAAC8B,IAAI,CAAC8B,WAAN,CAA5B,EAAgD;AAC9CG,IAAAA,QAAQ,CAAC5C,IAAT,CAAcW,IAAI,CAAC8B,WAAnB;AACD;;AACD,SAAOG,QAAP;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,IAAMC,SAAS,GAAGxC,UAAA,IAAcA,kBAAA,GAAqB,EAAnC,GAAwC,QAAxC,GAAmD,MAArE;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAASyC,UAAT,CAAoBnC,IAApB,EAA0B;AACxB,MAAIK,MAAM,CAACL,IAAD,CAAV,EAAkB;AAChB,WAAOA,IAAI,CAACoC,SAAL,CAAevE,MAAtB;AACD;;AAED,MAAImC,IAAJ,EAAU;AACR,WAAOA,IAAI,CAACqC,UAAL,CAAgBxE,MAAvB;AACD;;AAED,SAAO,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASyE,mBAAT,CAA6BtC,IAA7B,EAAmC;AACjC,KAAG;AACD,QAAIA,IAAI,CAACuC,iBAAL,KAA2B,IAA3B,IAAmCvC,IAAI,CAACuC,iBAAL,CAAuBC,SAAvB,KAAqC,EAA5E,EAAgF;AACjF,GAFD,QAEUxC,IAAI,GAAGA,IAAI,CAACuC,iBAFtB;;AAIA,SAAOxD,WAAO,CAACiB,IAAD,CAAd;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASjB,WAAT,CAAiBiB,IAAjB,EAAuB;AACrB,MAAM5B,GAAG,GAAG+D,UAAU,CAACnC,IAAD,CAAtB;;AAEA,MAAI5B,GAAG,KAAK,CAAZ,EAAe;AACb,WAAO,IAAP;AACD,GAFD,MAEO,IAAI,CAACiC,MAAM,CAACL,IAAD,CAAP,IAAiB5B,GAAG,KAAK,CAAzB,IAA8B4B,IAAI,CAACwC,SAAL,KAAmBN,SAArD,EAAgE;AACrE;AACA,WAAO,IAAP;AACD,GAHM,MAGA,IAAInN,SAAA,CAAUiL,IAAI,CAACqC,UAAf,EAA2BhC,MAA3B,KAAsCL,IAAI,CAACwC,SAAL,KAAmB,EAA7D,EAAiE;AACtE;AACA,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD;AAED;AACA;AACA;;;AACA,SAASC,gBAAT,CAA0BzC,IAA1B,EAAgC;AAC9B,MAAI,CAACQ,MAAM,CAACR,IAAD,CAAP,IAAiB,CAACmC,UAAU,CAACnC,IAAD,CAAhC,EAAwC;AACtCA,IAAAA,IAAI,CAACwC,SAAL,GAAiBN,SAAjB;AACD;AACF;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASV,QAAT,CAAkBxB,IAAlB,EAAwB9B,IAAxB,EAA8B;AAC5B,SAAO8B,IAAP,EAAa;AACX,QAAI9B,IAAI,CAAC8B,IAAD,CAAR,EAAgB;AAAE,aAAOA,IAAP;AAAc;;AAChC,QAAID,UAAU,CAACC,IAAD,CAAd,EAAsB;AAAE;AAAQ;;AAEhCA,IAAAA,IAAI,GAAGA,IAAI,CAAC0C,UAAZ;AACD;;AACD,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,mBAAT,CAA6B3C,IAA7B,EAAmC9B,IAAnC,EAAyC;AACvC8B,EAAAA,IAAI,GAAGA,IAAI,CAAC0C,UAAZ;;AAEA,SAAO1C,IAAP,EAAa;AACX,QAAImC,UAAU,CAACnC,IAAD,CAAV,KAAqB,CAAzB,EAA4B;AAAE;AAAQ;;AACtC,QAAI9B,IAAI,CAAC8B,IAAD,CAAR,EAAgB;AAAE,aAAOA,IAAP;AAAc;;AAChC,QAAID,UAAU,CAACC,IAAD,CAAd,EAAsB;AAAE;AAAQ;;AAEhCA,IAAAA,IAAI,GAAGA,IAAI,CAAC0C,UAAZ;AACD;;AACD,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASE,YAAT,CAAsB5C,IAAtB,EAA4B9B,IAA5B,EAAkC;AAChCA,EAAAA,IAAI,GAAGA,IAAI,IAAInB,SAAf;AAEA,MAAM8F,SAAS,GAAG,EAAlB;AACArB,EAAAA,QAAQ,CAACxB,IAAD,EAAO,UAAS8C,EAAT,EAAa;AAC1B,QAAI,CAAC/C,UAAU,CAAC+C,EAAD,CAAf,EAAqB;AACnBD,MAAAA,SAAS,CAACxD,IAAV,CAAeyD,EAAf;AACD;;AAED,WAAO5E,IAAI,CAAC4E,EAAD,CAAX;AACD,GANO,CAAR;AAOA,SAAOD,SAAP;AACD;AAED;AACA;AACA;;;AACA,SAASE,YAAT,CAAsB/C,IAAtB,EAA4B9B,IAA5B,EAAkC;AAChC,MAAM2E,SAAS,GAAGD,YAAY,CAAC5C,IAAD,CAA9B;AACA,SAAOjL,UAAA,CAAW8N,SAAS,CAACG,MAAV,CAAiB9E,IAAjB,CAAX,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAS+E,cAAT,CAAwBrB,KAAxB,EAA+BC,KAA/B,EAAsC;AACpC,MAAMgB,SAAS,GAAGD,YAAY,CAAChB,KAAD,CAA9B;;AACA,OAAK,IAAIsB,CAAC,GAAGrB,KAAb,EAAoBqB,CAApB,EAAuBA,CAAC,GAAGA,CAAC,CAACR,UAA7B,EAAyC;AACvC,QAAIG,SAAS,CAACtJ,OAAV,CAAkB2J,CAAlB,IAAuB,CAAC,CAA5B,EAA+B,OAAOA,CAAP;AAChC;;AACD,SAAO,IAAP,CALoC,CAKvB;AACd;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,QAAT,CAAkBnD,IAAlB,EAAwB9B,IAAxB,EAA8B;AAC5BA,EAAAA,IAAI,GAAGA,IAAI,IAAInB,SAAf;AAEA,MAAMqG,KAAK,GAAG,EAAd;;AACA,SAAOpD,IAAP,EAAa;AACX,QAAI9B,IAAI,CAAC8B,IAAD,CAAR,EAAgB;AAAE;AAAQ;;AAC1BoD,IAAAA,KAAK,CAAC/D,IAAN,CAAWW,IAAX;AACAA,IAAAA,IAAI,GAAGA,IAAI,CAAC+B,eAAZ;AACD;;AACD,SAAOqB,KAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,QAAT,CAAkBrD,IAAlB,EAAwB9B,IAAxB,EAA8B;AAC5BA,EAAAA,IAAI,GAAGA,IAAI,IAAInB,SAAf;AAEA,MAAMqG,KAAK,GAAG,EAAd;;AACA,SAAOpD,IAAP,EAAa;AACX,QAAI9B,IAAI,CAAC8B,IAAD,CAAR,EAAgB;AAAE;AAAQ;;AAC1BoD,IAAAA,KAAK,CAAC/D,IAAN,CAAWW,IAAX;AACAA,IAAAA,IAAI,GAAGA,IAAI,CAAC8B,WAAZ;AACD;;AACD,SAAOsB,KAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASE,cAAT,CAAwBtD,IAAxB,EAA8B9B,IAA9B,EAAoC;AAClC,MAAMqF,WAAW,GAAG,EAApB;AACArF,EAAAA,IAAI,GAAGA,IAAI,IAAInB,OAAf,CAFkC,CAIlC;;AACA,GAAC,SAASyG,MAAT,CAAgBC,OAAhB,EAAyB;AACxB,QAAIzD,IAAI,KAAKyD,OAAT,IAAoBvF,IAAI,CAACuF,OAAD,CAA5B,EAAuC;AACrCF,MAAAA,WAAW,CAAClE,IAAZ,CAAiBoE,OAAjB;AACD;;AACD,SAAK,IAAItF,GAAG,GAAG,CAAV,EAAaC,GAAG,GAAGqF,OAAO,CAACpB,UAAR,CAAmBxE,MAA3C,EAAmDM,GAAG,GAAGC,GAAzD,EAA8DD,GAAG,EAAjE,EAAqE;AACnEqF,MAAAA,MAAM,CAACC,OAAO,CAACpB,UAAR,CAAmBlE,GAAnB,CAAD,CAAN;AACD;AACF,GAPD,EAOG6B,IAPH;;AASA,SAAOuD,WAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASG,IAAT,CAAc1D,IAAd,EAAoB2D,WAApB,EAAiC;AAC/B,MAAMC,MAAM,GAAG5D,IAAI,CAAC0C,UAApB;AACA,MAAMmB,OAAO,GAAG/S,yBAAC,CAAC,MAAM6S,WAAN,GAAoB,GAArB,CAAD,CAA2B,CAA3B,CAAhB;AAEAC,EAAAA,MAAM,CAACE,YAAP,CAAoBD,OAApB,EAA6B7D,IAA7B;AACA6D,EAAAA,OAAO,CAACE,WAAR,CAAoB/D,IAApB;AAEA,SAAO6D,OAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASG,WAAT,CAAqBhE,IAArB,EAA2BiE,SAA3B,EAAsC;AACpC,MAAMzE,IAAI,GAAGyE,SAAS,CAACnC,WAAvB;AACA,MAAI8B,MAAM,GAAGK,SAAS,CAACvB,UAAvB;;AACA,MAAIlD,IAAJ,EAAU;AACRoE,IAAAA,MAAM,CAACE,YAAP,CAAoB9D,IAApB,EAA0BR,IAA1B;AACD,GAFD,MAEO;AACLoE,IAAAA,MAAM,CAACG,WAAP,CAAmB/D,IAAnB;AACD;;AACD,SAAOA,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASkE,gBAAT,CAA0BlE,IAA1B,EAAgCmE,MAAhC,EAAwC;AACtCrT,EAAAA,8BAAA,CAAOqT,MAAP,EAAe,UAAShG,GAAT,EAAckG,KAAd,EAAqB;AAClCrE,IAAAA,IAAI,CAAC+D,WAAL,CAAiBM,KAAjB;AACD,GAFD;AAGA,SAAOrE,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASsE,eAAT,CAAyBC,KAAzB,EAAgC;AAC9B,SAAOA,KAAK,CAACC,MAAN,KAAiB,CAAxB;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,gBAAT,CAA0BF,KAA1B,EAAiC;AAC/B,SAAOA,KAAK,CAACC,MAAN,KAAiBrC,UAAU,CAACoC,KAAK,CAACvE,IAAP,CAAlC;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAS0E,WAAT,CAAqBH,KAArB,EAA4B;AAC1B,SAAOD,eAAe,CAACC,KAAD,CAAf,IAA0BE,gBAAgB,CAACF,KAAD,CAAjD;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASI,YAAT,CAAsB3E,IAAtB,EAA4BwB,QAA5B,EAAsC;AACpC,SAAOxB,IAAI,IAAIA,IAAI,KAAKwB,QAAxB,EAAkC;AAChC,QAAIoD,QAAQ,CAAC5E,IAAD,CAAR,KAAmB,CAAvB,EAA0B;AACxB,aAAO,KAAP;AACD;;AACDA,IAAAA,IAAI,GAAGA,IAAI,CAAC0C,UAAZ;AACD;;AAED,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASmC,aAAT,CAAuB7E,IAAvB,EAA6BwB,QAA7B,EAAuC;AACrC,MAAI,CAACA,QAAL,EAAe;AACb,WAAO,KAAP;AACD;;AACD,SAAOxB,IAAI,IAAIA,IAAI,KAAKwB,QAAxB,EAAkC;AAChC,QAAIoD,QAAQ,CAAC5E,IAAD,CAAR,KAAmBmC,UAAU,CAACnC,IAAI,CAAC0C,UAAN,CAAV,GAA8B,CAArD,EAAwD;AACtD,aAAO,KAAP;AACD;;AACD1C,IAAAA,IAAI,GAAGA,IAAI,CAAC0C,UAAZ;AACD;;AAED,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASoC,iBAAT,CAA2BP,KAA3B,EAAkC/C,QAAlC,EAA4C;AAC1C,SAAO8C,eAAe,CAACC,KAAD,CAAf,IAA0BI,YAAY,CAACJ,KAAK,CAACvE,IAAP,EAAawB,QAAb,CAA7C;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASuD,kBAAT,CAA4BR,KAA5B,EAAmC/C,QAAnC,EAA6C;AAC3C,SAAOiD,gBAAgB,CAACF,KAAD,CAAhB,IAA2BM,aAAa,CAACN,KAAK,CAACvE,IAAP,EAAawB,QAAb,CAA/C;AACD;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASoD,QAAT,CAAkB5E,IAAlB,EAAwB;AACtB,MAAIwE,MAAM,GAAG,CAAb;;AACA,SAAQxE,IAAI,GAAGA,IAAI,CAAC+B,eAApB,EAAsC;AACpCyC,IAAAA,MAAM,IAAI,CAAV;AACD;;AACD,SAAOA,MAAP;AACD;;AAED,SAASQ,WAAT,CAAqBhF,IAArB,EAA2B;AACzB,SAAO,CAAC,EAAEA,IAAI,IAAIA,IAAI,CAACqC,UAAb,IAA2BrC,IAAI,CAACqC,UAAL,CAAgBxE,MAA7C,CAAR;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASoH,SAAT,CAAmBV,KAAnB,EAA0BW,iBAA1B,EAA6C;AAC3C,MAAIlF,IAAJ;AACA,MAAIwE,MAAJ;;AAEA,MAAID,KAAK,CAACC,MAAN,KAAiB,CAArB,EAAwB;AACtB,QAAIzE,UAAU,CAACwE,KAAK,CAACvE,IAAP,CAAd,EAA4B;AAC1B,aAAO,IAAP;AACD;;AAEDA,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAW0C,UAAlB;AACA8B,IAAAA,MAAM,GAAGI,QAAQ,CAACL,KAAK,CAACvE,IAAP,CAAjB;AACD,GAPD,MAOO,IAAIgF,WAAW,CAACT,KAAK,CAACvE,IAAP,CAAf,EAA6B;AAClCA,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAWqC,UAAX,CAAsBkC,KAAK,CAACC,MAAN,GAAe,CAArC,CAAP;AACAA,IAAAA,MAAM,GAAGrC,UAAU,CAACnC,IAAD,CAAnB;AACD,GAHM,MAGA;AACLA,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAb;AACAwE,IAAAA,MAAM,GAAGU,iBAAiB,GAAG,CAAH,GAAOX,KAAK,CAACC,MAAN,GAAe,CAAhD;AACD;;AAED,SAAO;AACLxE,IAAAA,IAAI,EAAEA,IADD;AAELwE,IAAAA,MAAM,EAAEA;AAFH,GAAP;AAID;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASW,SAAT,CAAmBZ,KAAnB,EAA0BW,iBAA1B,EAA6C;AAC3C,MAAIlF,IAAJ,EAAUwE,MAAV;;AAEA,MAAIrC,UAAU,CAACoC,KAAK,CAACvE,IAAP,CAAV,KAA2BuE,KAAK,CAACC,MAArC,EAA6C;AAC3C,QAAIzE,UAAU,CAACwE,KAAK,CAACvE,IAAP,CAAd,EAA4B;AAC1B,aAAO,IAAP;AACD;;AAED,QAAIoF,YAAY,GAAGC,eAAe,CAACd,KAAK,CAACvE,IAAP,CAAlC;;AACA,QAAIoF,YAAJ,EAAkB;AAChBpF,MAAAA,IAAI,GAAGoF,YAAP;AACAZ,MAAAA,MAAM,GAAG,CAAT;AACD,KAHD,MAGO;AACLxE,MAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAW0C,UAAlB;AACA8B,MAAAA,MAAM,GAAGI,QAAQ,CAACL,KAAK,CAACvE,IAAP,CAAR,GAAuB,CAAhC;AACD;AACF,GAbD,MAaO,IAAIgF,WAAW,CAACT,KAAK,CAACvE,IAAP,CAAf,EAA6B;AAClCA,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAWqC,UAAX,CAAsBkC,KAAK,CAACC,MAA5B,CAAP;AACAA,IAAAA,MAAM,GAAG,CAAT;AACD,GAHM,MAGA;AACLxE,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAb;AACAwE,IAAAA,MAAM,GAAGU,iBAAiB,GAAG/C,UAAU,CAACoC,KAAK,CAACvE,IAAP,CAAb,GAA4BuE,KAAK,CAACC,MAAN,GAAe,CAArE;AACD;;AAED,SAAO;AACLxE,IAAAA,IAAI,EAAEA,IADD;AAELwE,IAAAA,MAAM,EAAEA;AAFH,GAAP;AAID;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASc,sBAAT,CAAgCf,KAAhC,EAAuCW,iBAAvC,EAA0D;AACxD,MAAIlF,IAAJ;AAAA,MAAUwE,MAAM,GAAG,CAAnB,CADwD,CAGxD;;AACA,MAAIzF,WAAO,CAACwF,KAAK,CAACvE,IAAP,CAAX,EAAyB;AACvB,QAAGuE,KAAK,CAACvE,IAAN,KAAe,IAAlB,EAAuB;AACrB,aAAO,IAAP;AACD;;AAEDA,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAW8B,WAAlB;AACA0C,IAAAA,MAAM,GAAG,CAAT;AAEA,WAAO;AACLxE,MAAAA,IAAI,EAAEA,IADD;AAELwE,MAAAA,MAAM,EAAEA;AAFH,KAAP;AAID;;AAED,MAAIrC,UAAU,CAACoC,KAAK,CAACvE,IAAP,CAAV,KAA2BuE,KAAK,CAACC,MAArC,EAA6C;AAC3C,QAAIzE,UAAU,CAACwE,KAAK,CAACvE,IAAP,CAAd,EAA4B;AAC1B,aAAO,IAAP;AACD;;AAEDA,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAW0C,UAAlB;AACA8B,IAAAA,MAAM,GAAGI,QAAQ,CAACL,KAAK,CAACvE,IAAP,CAAR,GAAuB,CAAhC,CAN2C,CAQ3C;;AACA,QAAID,UAAU,CAACC,IAAD,CAAd,EAAsB;AACpBA,MAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAW8B,WAAlB;AACA0C,MAAAA,MAAM,GAAG,CAAT;AACD;AAEF,GAdD,MAcO,IAAIQ,WAAW,CAACT,KAAK,CAACvE,IAAP,CAAf,EAA6B;AAClCA,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAN,CAAWqC,UAAX,CAAsBkC,KAAK,CAACC,MAA5B,CAAP;AACAA,IAAAA,MAAM,GAAG,CAAT;;AACA,QAAIzF,WAAO,CAACiB,IAAD,CAAX,EAAmB;AACjB,UAAI,CAACjB,WAAO,CAACwF,KAAK,CAACvE,IAAN,CAAW8B,WAAZ,CAAZ,EAAsC;AACpC,eAAO;AACL9B,UAAAA,IAAI,EAAEuE,KAAK,CAACvE,IAAN,CAAW8B,WADZ;AAEL0C,UAAAA,MAAM,EAAEA;AAFH,SAAP;AAID;;AACD,aAAO,IAAP;AACD;AACF,GAZM,MAYA;AACLxE,IAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAb;AACAwE,IAAAA,MAAM,GAAGU,iBAAiB,GAAG/C,UAAU,CAACoC,KAAK,CAACvE,IAAP,CAAb,GAA4BuE,KAAK,CAACC,MAAN,GAAe,CAArE;;AAEA,QAAIzF,WAAO,CAACiB,IAAD,CAAX,EAAmB;AACjB,aAAO,IAAP;AACD;AACF;;AAED,SAAO;AACLA,IAAAA,IAAI,EAAEA,IADD;AAELwE,IAAAA,MAAM,EAAEA;AAFH,GAAP;AAID;AAED;AACA;AACA;;;AACA,SAASa,eAAT,CAAyBE,MAAzB,EAAiC;AAC/B,MAAG,CAACA,MAAM,CAACzD,WAAX,EAAwB,OAAO0D,SAAP;AACxB,MAAGD,MAAM,CAAC3B,MAAP,KAAkB2B,MAAM,CAACzD,WAAP,CAAmB8B,MAAxC,EAAgD,OAAO4B,SAAP;AAEhD,MAAGnF,MAAM,CAACkF,MAAM,CAACzD,WAAR,CAAT,EAAgC,OAAOyD,MAAM,CAACzD,WAAd,CAAhC,KACK,OAAOuD,eAAe,CAACE,MAAM,CAACzD,WAAR,CAAtB;AACN;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAS2D,WAAT,CAAqBC,MAArB,EAA6BC,MAA7B,EAAqC;AACnC,SAAOD,MAAM,CAAC1F,IAAP,KAAgB2F,MAAM,CAAC3F,IAAvB,IAA+B0F,MAAM,CAAClB,MAAP,KAAkBmB,MAAM,CAACnB,MAA/D;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASoB,cAAT,CAAwBrB,KAAxB,EAA+B;AAC7B,MAAIlE,MAAM,CAACkE,KAAK,CAACvE,IAAP,CAAN,IAAsB,CAACgF,WAAW,CAACT,KAAK,CAACvE,IAAP,CAAlC,IAAkDjB,WAAO,CAACwF,KAAK,CAACvE,IAAP,CAA7D,EAA2E;AACzE,WAAO,IAAP;AACD;;AAED,MAAM6F,QAAQ,GAAGtB,KAAK,CAACvE,IAAN,CAAWqC,UAAX,CAAsBkC,KAAK,CAACC,MAAN,GAAe,CAArC,CAAjB;AACA,MAAMsB,SAAS,GAAGvB,KAAK,CAACvE,IAAN,CAAWqC,UAAX,CAAsBkC,KAAK,CAACC,MAA5B,CAAlB;;AACA,MAAI,CAAC,CAACqB,QAAD,IAAarF,MAAM,CAACqF,QAAD,CAApB,MAAoC,CAACC,SAAD,IAActF,MAAM,CAACsF,SAAD,CAAxD,KAAwEhF,OAAO,CAACgF,SAAD,CAAnF,EAAgG;AAC9F,WAAO,IAAP;AACD;;AAED,SAAO,KAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,cAAT,CAAwBxB,KAAxB,EAA+BrG,IAA/B,EAAqC;AACnC,SAAOqG,KAAP,EAAc;AACZ,QAAIrG,IAAI,CAACqG,KAAD,CAAR,EAAiB;AACf,aAAOA,KAAP;AACD;;AAEDA,IAAAA,KAAK,GAAGU,SAAS,CAACV,KAAD,CAAjB;AACD;;AAED,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASyB,cAAT,CAAwBzB,KAAxB,EAA+BrG,IAA/B,EAAqC;AACnC,SAAOqG,KAAP,EAAc;AACZ,QAAIrG,IAAI,CAACqG,KAAD,CAAR,EAAiB;AACf,aAAOA,KAAP;AACD;;AAEDA,IAAAA,KAAK,GAAGY,SAAS,CAACZ,KAAD,CAAjB;AACD;;AAED,SAAO,IAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAS0B,WAAT,CAAqB1B,KAArB,EAA4B;AAC1B,MAAI,CAAClE,MAAM,CAACkE,KAAK,CAACvE,IAAP,CAAX,EAAyB;AACvB,WAAO,KAAP;AACD;;AAED,MAAMkG,EAAE,GAAG3B,KAAK,CAACvE,IAAN,CAAWoC,SAAX,CAAqB+D,MAArB,CAA4B5B,KAAK,CAACC,MAAN,GAAe,CAA3C,CAAX;AACA,SAAO0B,EAAE,IAAKA,EAAE,KAAK,GAAP,IAAcA,EAAE,KAAKvG,SAAnC;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASyG,YAAT,CAAsB7B,KAAtB,EAA6B;AAC3B,MAAI,CAAClE,MAAM,CAACkE,KAAK,CAACvE,IAAP,CAAX,EAAyB;AACvB,WAAO,KAAP;AACD;;AAED,MAAMkG,EAAE,GAAG3B,KAAK,CAACvE,IAAN,CAAWoC,SAAX,CAAqB+D,MAArB,CAA4B5B,KAAK,CAACC,MAAN,GAAe,CAA3C,CAAX;AACA,SAAO0B,EAAE,KAAK,GAAP,IAAcA,EAAE,KAAKvG,SAA5B;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAS0G,SAAT,CAAmBC,UAAnB,EAA+BC,QAA/B,EAAyCC,OAAzC,EAAkDtB,iBAAlD,EAAqE;AACnE,MAAIX,KAAK,GAAG+B,UAAZ;;AAEA,SAAO/B,KAAP,EAAc;AACZiC,IAAAA,OAAO,CAACjC,KAAD,CAAP;;AAEA,QAAIkB,WAAW,CAAClB,KAAD,EAAQgC,QAAR,CAAf,EAAkC;AAChC;AACD;;AAED,QAAME,YAAY,GAAGvB,iBAAiB,IACnBoB,UAAU,CAACtG,IAAX,KAAoBuE,KAAK,CAACvE,IADxB,IAEFuG,QAAQ,CAACvG,IAAT,KAAkBuE,KAAK,CAACvE,IAF3C;AAGAuE,IAAAA,KAAK,GAAGe,sBAAsB,CAACf,KAAD,EAAQkC,YAAR,CAA9B;AACD;AACF;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,cAAT,CAAwBlF,QAAxB,EAAkCxB,IAAlC,EAAwC;AACtC,MAAM6C,SAAS,GAAGD,YAAY,CAAC5C,IAAD,EAAOjD,OAAA,CAAQyE,QAAR,CAAP,CAA9B;AACA,SAAOqB,SAAS,CAACnG,GAAV,CAAckI,QAAd,EAAwB+B,OAAxB,EAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,cAAT,CAAwBpF,QAAxB,EAAkCqF,OAAlC,EAA2C;AACzC,MAAIpD,OAAO,GAAGjC,QAAd;;AACA,OAAK,IAAIsF,CAAC,GAAG,CAAR,EAAW1I,GAAG,GAAGyI,OAAO,CAAChJ,MAA9B,EAAsCiJ,CAAC,GAAG1I,GAA1C,EAA+C0I,CAAC,EAAhD,EAAoD;AAClD,QAAIrD,OAAO,CAACpB,UAAR,CAAmBxE,MAAnB,IAA6BgJ,OAAO,CAACC,CAAD,CAAxC,EAA6C;AAC3CrD,MAAAA,OAAO,GAAGA,OAAO,CAACpB,UAAR,CAAmBoB,OAAO,CAACpB,UAAR,CAAmBxE,MAAnB,GAA4B,CAA/C,CAAV;AACD,KAFD,MAEO;AACL4F,MAAAA,OAAO,GAAGA,OAAO,CAACpB,UAAR,CAAmBwE,OAAO,CAACC,CAAD,CAA1B,CAAV;AACD;AACF;;AACD,SAAOrD,OAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASsD,SAAT,CAAmBxC,KAAnB,EAA0BrP,OAA1B,EAAmC;AACjC,MAAI8R,sBAAsB,GAAG9R,OAAO,IAAIA,OAAO,CAAC8R,sBAAhD;AACA,MAAMC,mBAAmB,GAAG/R,OAAO,IAAIA,OAAO,CAAC+R,mBAA/C;AACA,MAAMC,oBAAoB,GAAGhS,OAAO,IAAIA,OAAO,CAACgS,oBAAhD;;AAEA,MAAIA,oBAAJ,EAA0B;AACxBF,IAAAA,sBAAsB,GAAG,IAAzB;AACD,GAPgC,CASjC;;;AACA,MAAItC,WAAW,CAACH,KAAD,CAAX,KAAuBlE,MAAM,CAACkE,KAAK,CAACvE,IAAP,CAAN,IAAsBiH,mBAA7C,CAAJ,EAAuE;AACrE,QAAI3C,eAAe,CAACC,KAAD,CAAnB,EAA4B;AAC1B,aAAOA,KAAK,CAACvE,IAAb;AACD,KAFD,MAEO,IAAIyE,gBAAgB,CAACF,KAAD,CAApB,EAA6B;AAClC,aAAOA,KAAK,CAACvE,IAAN,CAAW8B,WAAlB;AACD;AACF,GAhBgC,CAkBjC;;;AACA,MAAIzB,MAAM,CAACkE,KAAK,CAACvE,IAAP,CAAV,EAAwB;AACtB,WAAOuE,KAAK,CAACvE,IAAN,CAAWmH,SAAX,CAAqB5C,KAAK,CAACC,MAA3B,CAAP;AACD,GAFD,MAEO;AACL,QAAM4C,SAAS,GAAG7C,KAAK,CAACvE,IAAN,CAAWqC,UAAX,CAAsBkC,KAAK,CAACC,MAA5B,CAAlB;AACA,QAAM6C,KAAK,GAAGrD,WAAW,CAACO,KAAK,CAACvE,IAAN,CAAWsH,SAAX,CAAqB,KAArB,CAAD,EAA8B/C,KAAK,CAACvE,IAApC,CAAzB;AACAkE,IAAAA,gBAAgB,CAACmD,KAAD,EAAQhE,QAAQ,CAAC+D,SAAD,CAAhB,CAAhB;;AAEA,QAAI,CAACJ,sBAAL,EAA6B;AAC3BvE,MAAAA,gBAAgB,CAAC8B,KAAK,CAACvE,IAAP,CAAhB;AACAyC,MAAAA,gBAAgB,CAAC4E,KAAD,CAAhB;AACD;;AAED,QAAIH,oBAAJ,EAA0B;AACxB,UAAInI,WAAO,CAACwF,KAAK,CAACvE,IAAP,CAAX,EAAyB;AACvB/M,QAAAA,MAAM,CAACsR,KAAK,CAACvE,IAAP,CAAN;AACD;;AACD,UAAIjB,WAAO,CAACsI,KAAD,CAAX,EAAoB;AAClBpU,QAAAA,MAAM,CAACoU,KAAD,CAAN;AACA,eAAO9C,KAAK,CAACvE,IAAN,CAAW8B,WAAlB;AACD;AACF;;AAED,WAAOuF,KAAP;AACD;AACF;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASE,SAAT,CAAmBC,IAAnB,EAAyBjD,KAAzB,EAAgCrP,OAAhC,EAAyC;AACvC;AACA,MAAM2N,SAAS,GAAGD,YAAY,CAAC2B,KAAK,CAACvE,IAAP,EAAajD,OAAA,CAAQyK,IAAR,CAAb,CAA9B;;AAEA,MAAI,CAAC3E,SAAS,CAAChF,MAAf,EAAuB;AACrB,WAAO,IAAP;AACD,GAFD,MAEO,IAAIgF,SAAS,CAAChF,MAAV,KAAqB,CAAzB,EAA4B;AACjC,WAAOkJ,SAAS,CAACxC,KAAD,EAAQrP,OAAR,CAAhB;AACD;;AAED,SAAO2N,SAAS,CAACpE,MAAV,CAAiB,UAASuB,IAAT,EAAe4D,MAAf,EAAuB;AAC7C,QAAI5D,IAAI,KAAKuE,KAAK,CAACvE,IAAnB,EAAyB;AACvBA,MAAAA,IAAI,GAAG+G,SAAS,CAACxC,KAAD,EAAQrP,OAAR,CAAhB;AACD;;AAED,WAAO6R,SAAS,CAAC;AACf/G,MAAAA,IAAI,EAAE4D,MADS;AAEfY,MAAAA,MAAM,EAAExE,IAAI,GAAG4E,QAAQ,CAAC5E,IAAD,CAAX,GAAoBmC,UAAU,CAACyB,MAAD;AAF3B,KAAD,EAGb1O,OAHa,CAAhB;AAID,GATM,CAAP;AAUD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASuS,UAAT,CAAoBlD,KAApB,EAA2BvD,QAA3B,EAAqC;AACnC;AACA;AACA;AACA,MAAM9C,IAAI,GAAG8C,QAAQ,GAAGP,MAAH,GAAYQ,eAAjC;AACA,MAAM4B,SAAS,GAAGD,YAAY,CAAC2B,KAAK,CAACvE,IAAP,EAAa9B,IAAb,CAA9B;AACA,MAAMwJ,WAAW,GAAG3S,UAAA,CAAW8N,SAAX,KAAyB0B,KAAK,CAACvE,IAAnD;AAEA,MAAI2H,SAAJ,EAAeC,SAAf;;AACA,MAAI1J,IAAI,CAACwJ,WAAD,CAAR,EAAuB;AACrBC,IAAAA,SAAS,GAAG9E,SAAS,CAACA,SAAS,CAAChF,MAAV,GAAmB,CAApB,CAArB;AACA+J,IAAAA,SAAS,GAAGF,WAAZ;AACD,GAHD,MAGO;AACLC,IAAAA,SAAS,GAAGD,WAAZ;AACAE,IAAAA,SAAS,GAAGD,SAAS,CAACjF,UAAtB;AACD,GAfkC,CAiBnC;;;AACA,MAAImF,KAAK,GAAGF,SAAS,IAAIJ,SAAS,CAACI,SAAD,EAAYpD,KAAZ,EAAmB;AACnDyC,IAAAA,sBAAsB,EAAEhG,QAD2B;AAEnDiG,IAAAA,mBAAmB,EAAEjG;AAF8B,GAAnB,CAAlC,CAlBmC,CAuBnC;;AACA,MAAI,CAAC6G,KAAD,IAAUD,SAAS,KAAKrD,KAAK,CAACvE,IAAlC,EAAwC;AACtC6H,IAAAA,KAAK,GAAGtD,KAAK,CAACvE,IAAN,CAAWqC,UAAX,CAAsBkC,KAAK,CAACC,MAA5B,CAAR;AACD;;AAED,SAAO;AACLsB,IAAAA,SAAS,EAAE+B,KADN;AAELD,IAAAA,SAAS,EAAEA;AAFN,GAAP;AAID;;AAED,SAASE,MAAT,CAAgB1H,QAAhB,EAA0B;AACxB,SAAOpI,QAAQ,CAACC,aAAT,CAAuBmI,QAAvB,CAAP;AACD;;AAED,SAAS2H,UAAT,CAAoBC,IAApB,EAA0B;AACxB,SAAOhQ,QAAQ,CAACiQ,cAAT,CAAwBD,IAAxB,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAS/U,MAAT,CAAgB+M,IAAhB,EAAsBkI,aAAtB,EAAqC;AACnC,MAAI,CAAClI,IAAD,IAAS,CAACA,IAAI,CAAC0C,UAAnB,EAA+B;AAAE;AAAS;;AAC1C,MAAI1C,IAAI,CAACmI,UAAT,EAAqB;AAAE,WAAOnI,IAAI,CAACmI,UAAL,CAAgBD,aAAhB,CAAP;AAAwC;;AAE/D,MAAMtE,MAAM,GAAG5D,IAAI,CAAC0C,UAApB;;AACA,MAAI,CAACwF,aAAL,EAAoB;AAClB,QAAM9E,KAAK,GAAG,EAAd;;AACA,SAAK,IAAI0D,CAAC,GAAG,CAAR,EAAW1I,GAAG,GAAG4B,IAAI,CAACqC,UAAL,CAAgBxE,MAAtC,EAA8CiJ,CAAC,GAAG1I,GAAlD,EAAuD0I,CAAC,EAAxD,EAA4D;AAC1D1D,MAAAA,KAAK,CAAC/D,IAAN,CAAWW,IAAI,CAACqC,UAAL,CAAgByE,CAAhB,CAAX;AACD;;AAED,SAAK,IAAIA,EAAC,GAAG,CAAR,EAAW1I,IAAG,GAAGgF,KAAK,CAACvF,MAA5B,EAAoCiJ,EAAC,GAAG1I,IAAxC,EAA6C0I,EAAC,EAA9C,EAAkD;AAChDlD,MAAAA,MAAM,CAACE,YAAP,CAAoBV,KAAK,CAAC0D,EAAD,CAAzB,EAA8B9G,IAA9B;AACD;AACF;;AAED4D,EAAAA,MAAM,CAACwE,WAAP,CAAmBpI,IAAnB;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASqI,WAAT,CAAqBrI,IAArB,EAA2B9B,IAA3B,EAAiC;AAC/B,SAAO8B,IAAP,EAAa;AACX,QAAID,UAAU,CAACC,IAAD,CAAV,IAAoB,CAAC9B,IAAI,CAAC8B,IAAD,CAA7B,EAAqC;AACnC;AACD;;AAED,QAAM4D,MAAM,GAAG5D,IAAI,CAAC0C,UAApB;AACAzP,IAAAA,MAAM,CAAC+M,IAAD,CAAN;AACAA,IAAAA,IAAI,GAAG4D,MAAP;AACD;AACF;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAAS0E,OAAT,CAAiBtI,IAAjB,EAAuBI,QAAvB,EAAiC;AAC/B,MAAIJ,IAAI,CAACI,QAAL,CAAcxD,WAAd,OAAgCwD,QAAQ,CAACxD,WAAT,EAApC,EAA4D;AAC1D,WAAOoD,IAAP;AACD;;AAED,MAAMuI,OAAO,GAAGT,MAAM,CAAC1H,QAAD,CAAtB;;AAEA,MAAIJ,IAAI,CAAC3L,KAAL,CAAWmU,OAAf,EAAwB;AACtBD,IAAAA,OAAO,CAAClU,KAAR,CAAcmU,OAAd,GAAwBxI,IAAI,CAAC3L,KAAL,CAAWmU,OAAnC;AACD;;AAEDtE,EAAAA,gBAAgB,CAACqE,OAAD,EAAUxT,UAAA,CAAWiL,IAAI,CAACqC,UAAhB,CAAV,CAAhB;AACA2B,EAAAA,WAAW,CAACuE,OAAD,EAAUvI,IAAV,CAAX;AACA/M,EAAAA,MAAM,CAAC+M,IAAD,CAAN;AAEA,SAAOuI,OAAP;AACD;;AAED,IAAME,UAAU,GAAGtI,kBAAkB,CAAC,UAAD,CAArC;AAEA;AACA;AACA;AACA;;AACA,SAASuI,KAAT,CAAeC,KAAf,EAAsBC,eAAtB,EAAuC;AACrC,MAAMC,GAAG,GAAGJ,UAAU,CAACE,KAAK,CAAC,CAAD,CAAN,CAAV,GAAuBA,KAAK,CAACE,GAAN,EAAvB,GAAqCF,KAAK,CAACG,IAAN,EAAjD;;AACA,MAAIF,eAAJ,EAAqB;AACnB,WAAOC,GAAG,CAACP,OAAJ,CAAY,SAAZ,EAAuB,EAAvB,CAAP;AACD;;AACD,SAAOO,GAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASC,IAAT,CAAcH,KAAd,EAAqBI,gBAArB,EAAuC;AACrC,MAAIC,MAAM,GAAGN,KAAK,CAACC,KAAD,CAAlB;;AAEA,MAAII,gBAAJ,EAAsB;AACpB,QAAME,QAAQ,GAAG,uCAAjB;AACAD,IAAAA,MAAM,GAAGA,MAAM,CAACV,OAAP,CAAeW,QAAf,EAAyB,UAASC,KAAT,EAAgBC,QAAhB,EAA0B3X,IAA1B,EAAgC;AAChEA,MAAAA,IAAI,GAAGA,IAAI,CAACoL,WAAL,EAAP;AACA,UAAMwM,sBAAsB,GAAG,8BAA8B1Q,IAA9B,CAAmClH,IAAnC,KACF,CAAC,CAAC2X,QAD/B;AAEA,UAAME,WAAW,GAAG,4CAA4C3Q,IAA5C,CAAiDlH,IAAjD,CAApB;AAEA,aAAO0X,KAAK,IAAKE,sBAAsB,IAAIC,WAA3B,GAA0C,IAA1C,GAAiD,EAArD,CAAZ;AACD,KAPQ,CAAT;AAQAL,IAAAA,MAAM,GAAGA,MAAM,CAACM,IAAP,EAAT;AACD;;AAED,SAAON,MAAP;AACD;;AAED,SAASO,kBAAT,CAA4BC,WAA5B,EAAyC;AACvC,MAAMC,YAAY,GAAG3Y,yBAAC,CAAC0Y,WAAD,CAAtB;AACA,MAAME,GAAG,GAAGD,YAAY,CAACjF,MAAb,EAAZ;AACA,MAAMjT,MAAM,GAAGkY,YAAY,CAACE,WAAb,CAAyB,IAAzB,CAAf,CAHuC,CAGQ;;AAE/C,SAAO;AACLlU,IAAAA,IAAI,EAAEiU,GAAG,CAACjU,IADL;AAELmG,IAAAA,GAAG,EAAE8N,GAAG,CAAC9N,GAAJ,GAAUrK;AAFV,GAAP;AAID;;AAED,SAASqY,YAAT,CAAsBjB,KAAtB,EAA6BkB,MAA7B,EAAqC;AACnC1N,EAAAA,MAAM,CAAC2N,IAAP,CAAYD,MAAZ,EAAoBE,OAApB,CAA4B,UAAS7N,GAAT,EAAc;AACxCyM,IAAAA,KAAK,CAACqB,EAAN,CAAS9N,GAAT,EAAc2N,MAAM,CAAC3N,GAAD,CAApB;AACD,GAFD;AAGD;;AAED,SAAS+N,YAAT,CAAsBtB,KAAtB,EAA6BkB,MAA7B,EAAqC;AACnC1N,EAAAA,MAAM,CAAC2N,IAAP,CAAYD,MAAZ,EAAoBE,OAApB,CAA4B,UAAS7N,GAAT,EAAc;AACxCyM,IAAAA,KAAK,CAACuB,GAAN,CAAUhO,GAAV,EAAe2N,MAAM,CAAC3N,GAAD,CAArB;AACD,GAFD;AAGD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,SAASiO,gBAAT,CAA0BnK,IAA1B,EAAgC;AAC9B,SAAOA,IAAI,IAAI,CAACK,MAAM,CAACL,IAAD,CAAf,IAAyBjL,cAAA,CAAeiL,IAAI,CAACoK,SAApB,EAA+B,eAA/B,CAAhC;AACD;;AAED,0CAAe;AACb;AACAzK,EAAAA,SAAS,EAATA,SAFa;;AAGb;AACAG,EAAAA,oBAAoB,EAApBA,oBAJa;;AAKb;AACAuK,EAAAA,KAAK,EAAEnI,SANM;;AAOb;AACAoI,EAAAA,SAAS,eAAQpI,SAAR,SARI;AASb/B,EAAAA,kBAAkB,EAAlBA,kBATa;AAUbJ,EAAAA,UAAU,EAAVA,UAVa;AAWbG,EAAAA,eAAe,EAAfA,eAXa;AAYbG,EAAAA,MAAM,EAANA,MAZa;AAabE,EAAAA,SAAS,EAATA,SAba;AAcbC,EAAAA,MAAM,EAANA,MAda;AAebC,EAAAA,MAAM,EAANA,MAfa;AAgBbI,EAAAA,UAAU,EAAVA,UAhBa;AAiBbH,EAAAA,SAAS,EAATA,SAjBa;AAkBbM,EAAAA,QAAQ,EAARA,QAlBa;AAmBbuJ,EAAAA,OAAO,EAAExN,QAAA,CAASiE,QAAT,CAnBI;AAoBbS,EAAAA,YAAY,EAAZA,YApBa;AAqBbC,EAAAA,MAAM,EAANA,MArBa;AAsBbH,EAAAA,YAAY,EAAZA,YAtBa;AAuBbZ,EAAAA,KAAK,EAALA,KAvBa;AAwBbO,EAAAA,MAAM,EAANA,MAxBa;AAyBbJ,EAAAA,OAAO,EAAPA,OAzBa;AA0BbC,EAAAA,MAAM,EAANA,MA1Ba;AA2BbM,EAAAA,MAAM,EAANA,MA3Ba;AA4BbD,EAAAA,YAAY,EAAZA,YA5Ba;AA6BbH,EAAAA,eAAe,EAAfA,eA7Ba;AA8BbK,EAAAA,QAAQ,EAARA,QA9Ba;AA+BbkJ,EAAAA,KAAK,EAAErK,kBAAkB,CAAC,KAAD,CA/BZ;AAgCbS,EAAAA,IAAI,EAAJA,IAhCa;AAiCb6J,EAAAA,IAAI,EAAEtK,kBAAkB,CAAC,IAAD,CAjCX;AAkCbuK,EAAAA,MAAM,EAAEvK,kBAAkB,CAAC,MAAD,CAlCb;AAmCbwK,EAAAA,GAAG,EAAExK,kBAAkB,CAAC,GAAD,CAnCV;AAoCbyK,EAAAA,GAAG,EAAEzK,kBAAkB,CAAC,GAAD,CApCV;AAqCb0K,EAAAA,GAAG,EAAE1K,kBAAkB,CAAC,GAAD,CArCV;AAsCb2K,EAAAA,GAAG,EAAE3K,kBAAkB,CAAC,GAAD,CAtCV;AAuCb4K,EAAAA,KAAK,EAAE5K,kBAAkB,CAAC,KAAD,CAvCZ;AAwCbsI,EAAAA,UAAU,EAAVA,UAxCa;AAyCbnG,EAAAA,mBAAmB,EAAnBA,mBAzCa;AA0CbvD,EAAAA,OAAO,EAAPA,WA1Ca;AA2CbiM,EAAAA,aAAa,EAAEjO,QAAA,CAASuE,QAAT,EAAmBvC,WAAnB,CA3CF;AA4Cb4C,EAAAA,gBAAgB,EAAhBA,gBA5Ca;AA6CbK,EAAAA,mBAAmB,EAAnBA,mBA7Ca;AA8CbG,EAAAA,UAAU,EAAVA,UA9Ca;AA+CbmC,EAAAA,eAAe,EAAfA,eA/Ca;AAgDbG,EAAAA,gBAAgB,EAAhBA,gBAhDa;AAiDbC,EAAAA,WAAW,EAAXA,WAjDa;AAkDbC,EAAAA,YAAY,EAAZA,YAlDa;AAmDbE,EAAAA,aAAa,EAAbA,aAnDa;AAoDbC,EAAAA,iBAAiB,EAAjBA,iBApDa;AAqDbC,EAAAA,kBAAkB,EAAlBA,kBArDa;AAsDbE,EAAAA,SAAS,EAATA,SAtDa;AAuDbE,EAAAA,SAAS,EAATA,SAvDa;AAwDbG,EAAAA,sBAAsB,EAAtBA,sBAxDa;AAyDbG,EAAAA,WAAW,EAAXA,WAzDa;AA0DbG,EAAAA,cAAc,EAAdA,cA1Da;AA2DbG,EAAAA,cAAc,EAAdA,cA3Da;AA4DbC,EAAAA,cAAc,EAAdA,cA5Da;AA6DbC,EAAAA,WAAW,EAAXA,WA7Da;AA8DbG,EAAAA,YAAY,EAAZA,YA9Da;AA+DbC,EAAAA,SAAS,EAATA,SA/Da;AAgEb7E,EAAAA,QAAQ,EAARA,QAhEa;AAiEbmB,EAAAA,mBAAmB,EAAnBA,mBAjEa;AAkEbC,EAAAA,YAAY,EAAZA,YAlEa;AAmEbG,EAAAA,YAAY,EAAZA,YAnEa;AAoEbM,EAAAA,QAAQ,EAARA,QApEa;AAqEbF,EAAAA,QAAQ,EAARA,QArEa;AAsEbG,EAAAA,cAAc,EAAdA,cAtEa;AAuEbL,EAAAA,cAAc,EAAdA,cAvEa;AAwEbS,EAAAA,IAAI,EAAJA,IAxEa;AAyEbM,EAAAA,WAAW,EAAXA,WAzEa;AA0EbE,EAAAA,gBAAgB,EAAhBA,gBA1Ea;AA2EbU,EAAAA,QAAQ,EAARA,QA3Ea;AA4EbI,EAAAA,WAAW,EAAXA,WA5Ea;AA6Eb0B,EAAAA,cAAc,EAAdA,cA7Ea;AA8EbE,EAAAA,cAAc,EAAdA,cA9Ea;AA+EbW,EAAAA,SAAS,EAATA,SA/Ea;AAgFbE,EAAAA,UAAU,EAAVA,UAhFa;AAiFbK,EAAAA,MAAM,EAANA,MAjFa;AAkFbC,EAAAA,UAAU,EAAVA,UAlFa;AAmFb9U,EAAAA,MAAM,EAANA,MAnFa;AAoFboV,EAAAA,WAAW,EAAXA,WApFa;AAqFbC,EAAAA,OAAO,EAAPA,OArFa;AAsFbQ,EAAAA,IAAI,EAAJA,IAtFa;AAuFbJ,EAAAA,KAAK,EAALA,KAvFa;AAwFba,EAAAA,kBAAkB,EAAlBA,kBAxFa;AAyFbK,EAAAA,YAAY,EAAZA,YAzFa;AA0FbK,EAAAA,YAAY,EAAZA,YA1Fa;AA2FbE,EAAAA,gBAAgB,EAAhBA;AA3Fa,CAAf;;;;;;;;ACtmCA;AACA;AACA;AACA;;IAEqBe;AACnB;AACF;AACA;AACA;AACE,mBAAYC,KAAZ,EAAmBjW,OAAnB,EAA4B;AAAA;;AAC1B,SAAKiW,KAAL,GAAaA,KAAb;AAEA,SAAKC,KAAL,GAAa,EAAb;AACA,SAAKC,OAAL,GAAe,EAAf;AACA,SAAKC,UAAL,GAAkB,EAAlB;AACA,SAAKpW,OAAL,GAAepE,gCAAA,CAAS,IAAT,EAAe,EAAf,EAAmBoE,OAAnB,CAAf,CAN0B,CAQ1B;;AACApE,IAAAA,yCAAA,GAAkBA,gDAAA,CAAyB,KAAKoE,OAA9B,CAAlB;AACA,SAAKqW,EAAL,GAAUza,yCAAV;AAEA,SAAK2a,UAAL;AACD;AAED;AACF;AACA;;;;;WACE,sBAAa;AACX,WAAKH,UAAL,GAAkB,KAAKC,EAAL,CAAQG,YAAR,CAAqB,KAAKP,KAA1B,CAAlB;;AACA,WAAKQ,WAAL;;AACA,WAAKR,KAAL,CAAWS,IAAX;AACA,aAAO,IAAP;AACD;AAED;AACF;AACA;;;;WACE,mBAAU;AACR,WAAKC,QAAL;;AACA,WAAKV,KAAL,CAAWW,UAAX,CAAsB,YAAtB;AACA,WAAKP,EAAL,CAAQQ,YAAR,CAAqB,KAAKZ,KAA1B,EAAiC,KAAKG,UAAtC;AACD;AAED;AACF;AACA;;;;WACE,iBAAQ;AACN,UAAMU,QAAQ,GAAG,KAAKC,UAAL,EAAjB;AACA,WAAKC,IAAL,CAAUjB,aAAV;;AACA,WAAKY,QAAL;;AACA,WAAKF,WAAL;;AAEA,UAAIK,QAAJ,EAAc;AACZ,aAAKG,OAAL;AACD;AACF;;;WAED,uBAAc;AAAA;;AACZ;AACA,WAAKjX,OAAL,CAAasG,EAAb,GAAkBuB,aAAA,CAAcjM,6BAAA,EAAd,CAAlB,CAFY,CAGZ;;AACA,WAAKoE,OAAL,CAAa0S,SAAb,GAAyB,KAAK1S,OAAL,CAAa0S,SAAb,IAA0B,KAAK0D,UAAL,CAAgBe,MAAnE,CAJY,CAMZ;;AACA,UAAMC,OAAO,GAAGxb,gCAAA,CAAS,EAAT,EAAa,KAAKoE,OAAL,CAAaoX,OAA1B,CAAhB;AACAnQ,MAAAA,MAAM,CAAC2N,IAAP,CAAYwC,OAAZ,EAAqBvC,OAArB,CAA6B,UAAC7N,GAAD,EAAS;AACpC,aAAI,CAACwC,IAAL,CAAU,YAAYxC,GAAtB,EAA2BoQ,OAAO,CAACpQ,GAAD,CAAlC;AACD,OAFD;AAIA,UAAMmP,OAAO,GAAGva,gCAAA,CAAS,EAAT,EAAa,KAAKoE,OAAL,CAAamW,OAA1B,EAAmCva,8CAAA,IAAwB,EAA3D,CAAhB,CAZY,CAcZ;;AACAqL,MAAAA,MAAM,CAAC2N,IAAP,CAAYuB,OAAZ,EAAqBtB,OAArB,CAA6B,UAAC7N,GAAD,EAAS;AACpC,aAAI,CAACsQ,MAAL,CAAYtQ,GAAZ,EAAiBmP,OAAO,CAACnP,GAAD,CAAxB,EAA+B,IAA/B;AACD,OAFD;AAIAC,MAAAA,MAAM,CAAC2N,IAAP,CAAY,KAAKuB,OAAjB,EAA0BtB,OAA1B,CAAkC,UAAC7N,GAAD,EAAS;AACzC,aAAI,CAACuQ,gBAAL,CAAsBvQ,GAAtB;AACD,OAFD;AAGD;;;WAED,oBAAW;AAAA;;AACT;AACAC,MAAAA,MAAM,CAAC2N,IAAP,CAAY,KAAKuB,OAAjB,EAA0B1E,OAA1B,GAAoCoD,OAApC,CAA4C,UAAC7N,GAAD,EAAS;AACnD,cAAI,CAACwQ,YAAL,CAAkBxQ,GAAlB;AACD,OAFD;AAIAC,MAAAA,MAAM,CAAC2N,IAAP,CAAY,KAAKsB,KAAjB,EAAwBrB,OAAxB,CAAgC,UAAC7N,GAAD,EAAS;AACvC,cAAI,CAACyQ,UAAL,CAAgBzQ,GAAhB;AACD,OAFD,EANS,CAST;;AACA,WAAK0Q,YAAL,CAAkB,SAAlB,EAA6B,IAA7B;AACD;;;WAED,cAAK9D,IAAL,EAAW;AACT,UAAM+D,WAAW,GAAG,KAAK5R,MAAL,CAAY,sBAAZ,CAApB;;AAEA,UAAI6N,IAAI,KAAKtD,SAAb,EAAwB;AACtB,aAAKvK,MAAL,CAAY,eAAZ;AACA,eAAO4R,WAAW,GAAG,KAAKvB,UAAL,CAAgBwB,OAAhB,CAAwBjE,GAAxB,EAAH,GAAmC,KAAKyC,UAAL,CAAgByB,QAAhB,CAAyBjE,IAAzB,EAArD;AACD,OAHD,MAGO;AACL,YAAI+D,WAAJ,EAAiB;AACf,eAAK5R,MAAL,CAAY,eAAZ,EAA6B6N,IAA7B;AACD,SAFD,MAEO;AACL,eAAKwC,UAAL,CAAgByB,QAAhB,CAAyBjE,IAAzB,CAA8BA,IAA9B;AACD;;AACD,aAAKqC,KAAL,CAAWtC,GAAX,CAAeC,IAAf;AACA,aAAK8D,YAAL,CAAkB,QAAlB,EAA4B9D,IAA5B,EAAkC,KAAKwC,UAAL,CAAgByB,QAAlD;AACD;AACF;;;WAED,sBAAa;AACX,aAAO,KAAKzB,UAAL,CAAgByB,QAAhB,CAAyBC,IAAzB,CAA8B,iBAA9B,MAAqD,OAA5D;AACD;;;WAED,kBAAS;AACP,WAAK1B,UAAL,CAAgByB,QAAhB,CAAyBC,IAAzB,CAA8B,iBAA9B,EAAiD,IAAjD;AACA,WAAK/R,MAAL,CAAY,kBAAZ,EAAgC,IAAhC;AACA,WAAK2R,YAAL,CAAkB,SAAlB,EAA6B,KAA7B;AACA,WAAK1X,OAAL,CAAa+X,OAAb,GAAuB,IAAvB;AACD;;;WAED,mBAAU;AACR;AACA,UAAI,KAAKhS,MAAL,CAAY,sBAAZ,CAAJ,EAAyC;AACvC,aAAKA,MAAL,CAAY,qBAAZ;AACD;;AACD,WAAKqQ,UAAL,CAAgByB,QAAhB,CAAyBC,IAAzB,CAA8B,iBAA9B,EAAiD,KAAjD;AACA,WAAK9X,OAAL,CAAa+X,OAAb,GAAuB,KAAvB;AACA,WAAKhS,MAAL,CAAY,oBAAZ,EAAkC,IAAlC;AAEA,WAAK2R,YAAL,CAAkB,SAAlB,EAA6B,IAA7B;AACD;;;WAED,wBAAe;AACb,UAAMpQ,SAAS,GAAGzH,UAAA,CAAW2F,SAAX,CAAlB;AACA,UAAMyC,IAAI,GAAGpI,UAAA,CAAWA,UAAA,CAAW2F,SAAX,CAAX,CAAb;AAEA,UAAMwS,QAAQ,GAAG,KAAKhY,OAAL,CAAaiY,SAAb,CAAuBpQ,qBAAA,CAAsBP,SAAtB,EAAiC,IAAjC,CAAvB,CAAjB;;AACA,UAAI0Q,QAAJ,EAAc;AACZA,QAAAA,QAAQ,CAACzS,KAAT,CAAe,KAAK0Q,KAAL,CAAW,CAAX,CAAf,EAA8BhO,IAA9B;AACD;;AACD,WAAKgO,KAAL,CAAWiC,OAAX,CAAmB,gBAAgB5Q,SAAnC,EAA8CW,IAA9C;AACD;;;WAED,0BAAiBjB,GAAjB,EAAsB;AACpB,UAAMsQ,MAAM,GAAG,KAAKnB,OAAL,CAAanP,GAAb,CAAf;AACAsQ,MAAAA,MAAM,CAACa,gBAAP,GAA0Bb,MAAM,CAACa,gBAAP,IAA2BtQ,OAArD;;AACA,UAAI,CAACyP,MAAM,CAACa,gBAAP,EAAL,EAAgC;AAC9B;AACD,OALmB,CAOpB;;;AACA,UAAIb,MAAM,CAACf,UAAX,EAAuB;AACrBe,QAAAA,MAAM,CAACf,UAAP;AACD,OAVmB,CAYpB;;;AACA,UAAIe,MAAM,CAAC3C,MAAX,EAAmB;AACjBoB,QAAAA,gBAAA,CAAiB,KAAKE,KAAtB,EAA6BqB,MAAM,CAAC3C,MAApC;AACD;AACF;;;WAED,gBAAO3N,GAAP,EAAYoR,WAAZ,EAAyBC,gBAAzB,EAA2C;AACzC,UAAI7S,SAAS,CAACmD,MAAV,KAAqB,CAAzB,EAA4B;AAC1B,eAAO,KAAKwN,OAAL,CAAanP,GAAb,CAAP;AACD;;AAED,WAAKmP,OAAL,CAAanP,GAAb,IAAoB,IAAIoR,WAAJ,CAAgB,IAAhB,CAApB;;AAEA,UAAI,CAACC,gBAAL,EAAuB;AACrB,aAAKd,gBAAL,CAAsBvQ,GAAtB;AACD;AACF;;;WAED,sBAAaA,GAAb,EAAkB;AAChB,UAAMsQ,MAAM,GAAG,KAAKnB,OAAL,CAAanP,GAAb,CAAf;;AACA,UAAIsQ,MAAM,CAACa,gBAAP,EAAJ,EAA+B;AAC7B,YAAIb,MAAM,CAAC3C,MAAX,EAAmB;AACjBoB,UAAAA,gBAAA,CAAiB,KAAKE,KAAtB,EAA6BqB,MAAM,CAAC3C,MAApC;AACD;;AAED,YAAI2C,MAAM,CAACgB,OAAX,EAAoB;AAClBhB,UAAAA,MAAM,CAACgB,OAAP;AACD;AACF;;AAED,aAAO,KAAKnC,OAAL,CAAanP,GAAb,CAAP;AACD;;;WAED,cAAKA,GAAL,EAAUhB,GAAV,EAAe;AACb,UAAIR,SAAS,CAACmD,MAAV,KAAqB,CAAzB,EAA4B;AAC1B,eAAO,KAAKuN,KAAL,CAAWlP,GAAX,CAAP;AACD;;AACD,WAAKkP,KAAL,CAAWlP,GAAX,IAAkBhB,GAAlB;AACD;;;WAED,oBAAWgB,GAAX,EAAgB;AACd,UAAI,KAAKkP,KAAL,CAAWlP,GAAX,KAAmB,KAAKkP,KAAL,CAAWlP,GAAX,EAAgBsR,OAAvC,EAAgD;AAC9C,aAAKpC,KAAL,CAAWlP,GAAX,EAAgBsR,OAAhB;AACD;;AAED,aAAO,KAAKpC,KAAL,CAAWlP,GAAX,CAAP;AACD;AAED;AACF;AACA;;;;WACE,2CAAkCM,SAAlC,EAA6CkM,KAA7C,EAAoD;AAAA;;AAClD,aAAO,UAAC+E,KAAD,EAAW;AAChB,cAAI,CAACC,mBAAL,CAAyBlR,SAAzB,EAAoCkM,KAApC,EAA2C+E,KAA3C;;AACA,cAAI,CAACxS,MAAL,CAAY,4BAAZ;AACD,OAHD;AAID;;;WAED,6BAAoBuB,SAApB,EAA+BkM,KAA/B,EAAsC;AAAA;;AACpC,aAAO,UAAC+E,KAAD,EAAW;AAChBA,QAAAA,KAAK,CAACE,cAAN;AACA,YAAMC,OAAO,GAAG9c,yBAAC,CAAC2c,KAAK,CAACI,MAAP,CAAjB;;AACA,cAAI,CAAC5S,MAAL,CAAYuB,SAAZ,EAAuBkM,KAAK,IAAIkF,OAAO,CAACE,OAAR,CAAgB,cAAhB,EAAgCC,IAAhC,CAAqC,OAArC,CAAhC,EAA+EH,OAA/E;AACD,OAJD;AAKD;;;WAED,kBAAS;AACP,UAAMpR,SAAS,GAAGzH,UAAA,CAAW2F,SAAX,CAAlB;AACA,UAAMyC,IAAI,GAAGpI,UAAA,CAAWA,UAAA,CAAW2F,SAAX,CAAX,CAAb;AAEA,UAAMsT,MAAM,GAAGxR,SAAS,CAACC,KAAV,CAAgB,GAAhB,CAAf;AACA,UAAMwR,YAAY,GAAGD,MAAM,CAACnQ,MAAP,GAAgB,CAArC;AACA,UAAMqQ,UAAU,GAAGD,YAAY,IAAIlZ,UAAA,CAAWiZ,MAAX,CAAnC;AACA,UAAMG,UAAU,GAAGF,YAAY,GAAGlZ,UAAA,CAAWiZ,MAAX,CAAH,GAAwBjZ,UAAA,CAAWiZ,MAAX,CAAvD;AAEA,UAAMxB,MAAM,GAAG,KAAKnB,OAAL,CAAa6C,UAAU,IAAI,QAA3B,CAAf;;AACA,UAAI,CAACA,UAAD,IAAe,KAAKC,UAAL,CAAnB,EAAqC;AACnC,eAAO,KAAKA,UAAL,EAAiB1T,KAAjB,CAAuB,IAAvB,EAA6B0C,IAA7B,CAAP;AACD,OAFD,MAEO,IAAIqP,MAAM,IAAIA,MAAM,CAAC2B,UAAD,CAAhB,IAAgC3B,MAAM,CAACa,gBAAP,EAApC,EAA+D;AACpE,eAAOb,MAAM,CAAC2B,UAAD,CAAN,CAAmB1T,KAAnB,CAAyB+R,MAAzB,EAAiCrP,IAAjC,CAAP;AACD;AACF;;;;;;;;AC/OH;AACA;AACA;AACA;AAEArM,mCAAA,CAAY;AACV;AACF;AACA;AACA;AACA;AACA;AACEC,EAAAA,UAAU,EAAE,sBAAW;AACrB,QAAMqd,IAAI,GAAGtd,8BAAA,CAAOiE,UAAA,CAAW2F,SAAX,CAAP,CAAb;AACA,QAAM2T,mBAAmB,GAAGD,IAAI,KAAK,QAArC;AACA,QAAME,cAAc,GAAGF,IAAI,KAAK,QAAhC;AAEA,QAAMlZ,OAAO,GAAGpE,gCAAA,CAAS,EAAT,EAAaA,8CAAb,EAAmCwd,cAAc,GAAGvZ,UAAA,CAAW2F,SAAX,CAAH,GAA2B,EAA5E,CAAhB,CALqB,CAOrB;;AACAxF,IAAAA,OAAO,CAACqZ,QAAR,GAAmBzd,gCAAA,CAAS,IAAT,EAAe,EAAf,EAAmBA,oDAAnB,EAA+CA,2CAAA,CAAkBoE,OAAO,CAAClE,IAA1B,CAA/C,CAAnB;AACAkE,IAAAA,OAAO,CAACsZ,KAAR,GAAgB1d,gCAAA,CAAS,IAAT,EAAe,EAAf,EAAmBA,oDAAnB,EAA+CoE,OAAO,CAACsZ,KAAvD,CAAhB;AACAtZ,IAAAA,OAAO,CAACuZ,OAAR,GAAkBvZ,OAAO,CAACuZ,OAAR,KAAoB,MAApB,GAA6B,CAAC/O,kBAA9B,GAAmDxK,OAAO,CAACuZ,OAA7E;AAEA,SAAKrK,IAAL,CAAU,UAACjG,GAAD,EAAMuQ,IAAN,EAAe;AACvB,UAAMvD,KAAK,GAAGra,yBAAC,CAAC4d,IAAD,CAAf;;AACA,UAAI,CAACvD,KAAK,CAAC4C,IAAN,CAAW,YAAX,CAAL,EAA+B;AAC7B,YAAM7V,OAAO,GAAG,IAAIgT,OAAJ,CAAYC,KAAZ,EAAmBjW,OAAnB,CAAhB;AACAiW,QAAAA,KAAK,CAAC4C,IAAN,CAAW,YAAX,EAAyB7V,OAAzB;AACAiT,QAAAA,KAAK,CAAC4C,IAAN,CAAW,YAAX,EAAyBnB,YAAzB,CAAsC,MAAtC,EAA8C1U,OAAO,CAACoT,UAAtD;AACD;AACF,KAPD;AASA,QAAMH,KAAK,GAAG,KAAKwD,KAAL,EAAd;;AACA,QAAIxD,KAAK,CAACtN,MAAV,EAAkB;AAChB,UAAM3F,OAAO,GAAGiT,KAAK,CAAC4C,IAAN,CAAW,YAAX,CAAhB;;AACA,UAAIM,mBAAJ,EAAyB;AACvB,eAAOnW,OAAO,CAAC+C,MAAR,CAAeR,KAAf,CAAqBvC,OAArB,EAA8BnD,UAAA,CAAW2F,SAAX,CAA9B,CAAP;AACD,OAFD,MAEO,IAAIxF,OAAO,CAAC0Z,KAAZ,EAAmB;AACxB1W,QAAAA,OAAO,CAAC+C,MAAR,CAAe,cAAf;AACD;AACF;;AAED,WAAO,IAAP;AACD;AAvCS,CAAZ;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,SAAS4T,gBAAT,CAA0BC,SAA1B,EAAqCC,OAArC,EAA8C;AAC5C,MAAInH,SAAS,GAAGkH,SAAS,CAACE,aAAV,EAAhB;AACA,MAAIxK,MAAJ;AAEA,MAAMyK,MAAM,GAAGjX,QAAQ,CAACkX,IAAT,CAAcC,eAAd,EAAf;AACA,MAAIC,aAAJ;AACA,MAAM/M,UAAU,GAAGtN,UAAA,CAAW6S,SAAS,CAACvF,UAArB,CAAnB;;AACA,OAAKmC,MAAM,GAAG,CAAd,EAAiBA,MAAM,GAAGnC,UAAU,CAACxE,MAArC,EAA6C2G,MAAM,EAAnD,EAAuD;AACrD,QAAIyG,UAAA,CAAW5I,UAAU,CAACmC,MAAD,CAArB,CAAJ,EAAoC;AAClC;AACD;;AACDyK,IAAAA,MAAM,CAACI,iBAAP,CAAyBhN,UAAU,CAACmC,MAAD,CAAnC;;AACA,QAAIyK,MAAM,CAACK,gBAAP,CAAwB,cAAxB,EAAwCR,SAAxC,KAAsD,CAA1D,EAA6D;AAC3D;AACD;;AACDM,IAAAA,aAAa,GAAG/M,UAAU,CAACmC,MAAD,CAA1B;AACD;;AAED,MAAIA,MAAM,KAAK,CAAX,IAAgByG,UAAA,CAAW5I,UAAU,CAACmC,MAAM,GAAG,CAAV,CAArB,CAApB,EAAwD;AACtD,QAAM+K,cAAc,GAAGvX,QAAQ,CAACkX,IAAT,CAAcC,eAAd,EAAvB;AACA,QAAIK,WAAW,GAAG,IAAlB;AACAD,IAAAA,cAAc,CAACF,iBAAf,CAAiCD,aAAa,IAAIxH,SAAlD;AACA2H,IAAAA,cAAc,CAACE,QAAf,CAAwB,CAACL,aAAzB;AACAI,IAAAA,WAAW,GAAGJ,aAAa,GAAGA,aAAa,CAACtN,WAAjB,GAA+B8F,SAAS,CAAC8H,UAApE;AAEA,QAAMC,WAAW,GAAGb,SAAS,CAACc,SAAV,EAApB;AACAD,IAAAA,WAAW,CAACE,WAAZ,CAAwB,cAAxB,EAAwCN,cAAxC;AACA,QAAIO,SAAS,GAAGH,WAAW,CAAC3H,IAAZ,CAAiBM,OAAjB,CAAyB,SAAzB,EAAoC,EAApC,EAAwCzK,MAAxD;;AAEA,WAAOiS,SAAS,GAAGN,WAAW,CAACpN,SAAZ,CAAsBvE,MAAlC,IAA4C2R,WAAW,CAAC1N,WAA/D,EAA4E;AAC1EgO,MAAAA,SAAS,IAAIN,WAAW,CAACpN,SAAZ,CAAsBvE,MAAnC;AACA2R,MAAAA,WAAW,GAAGA,WAAW,CAAC1N,WAA1B;AACD,KAdqD,CAgBtD;;;AACA,QAAMiO,KAAK,GAAGP,WAAW,CAACpN,SAA1B,CAjBsD,CAiBjB;;AAErC,QAAI2M,OAAO,IAAIS,WAAW,CAAC1N,WAAvB,IAAsCmJ,UAAA,CAAWuE,WAAW,CAAC1N,WAAvB,CAAtC,IACFgO,SAAS,KAAKN,WAAW,CAACpN,SAAZ,CAAsBvE,MADtC,EAC8C;AAC5CiS,MAAAA,SAAS,IAAIN,WAAW,CAACpN,SAAZ,CAAsBvE,MAAnC;AACA2R,MAAAA,WAAW,GAAGA,WAAW,CAAC1N,WAA1B;AACD;;AAED8F,IAAAA,SAAS,GAAG4H,WAAZ;AACAhL,IAAAA,MAAM,GAAGsL,SAAT;AACD;;AAED,SAAO;AACLE,IAAAA,IAAI,EAAEpI,SADD;AAELpD,IAAAA,MAAM,EAAEA;AAFH,GAAP;AAID;AAED;AACA;AACA;AACA;AACA;;;AACA,SAASyL,gBAAT,CAA0B1L,KAA1B,EAAiC;AAC/B,MAAM2L,aAAa,GAAG,SAAhBA,aAAgB,CAAStI,SAAT,EAAoBpD,MAApB,EAA4B;AAChD,QAAIxE,IAAJ,EAAUmQ,iBAAV;;AAEA,QAAIlF,UAAA,CAAWrD,SAAX,CAAJ,EAA2B;AACzB,UAAMwI,aAAa,GAAGnF,YAAA,CAAarD,SAAb,EAAwB7K,QAAA,CAASkO,UAAT,CAAxB,CAAtB;AACA,UAAMmE,aAAa,GAAGra,UAAA,CAAWqb,aAAX,EAA0BrO,eAAhD;AACA/B,MAAAA,IAAI,GAAGoP,aAAa,IAAIxH,SAAS,CAAClF,UAAlC;AACA8B,MAAAA,MAAM,IAAIzP,SAAA,CAAUA,UAAA,CAAWqb,aAAX,CAAV,EAAqCnF,cAArC,CAAV;AACAkF,MAAAA,iBAAiB,GAAG,CAACf,aAArB;AACD,KAND,MAMO;AACLpP,MAAAA,IAAI,GAAG4H,SAAS,CAACvF,UAAV,CAAqBmC,MAArB,KAAgCoD,SAAvC;;AACA,UAAIqD,UAAA,CAAWjL,IAAX,CAAJ,EAAsB;AACpB,eAAOkQ,aAAa,CAAClQ,IAAD,EAAO,CAAP,CAApB;AACD;;AAEDwE,MAAAA,MAAM,GAAG,CAAT;AACA2L,MAAAA,iBAAiB,GAAG,KAApB;AACD;;AAED,WAAO;AACLnQ,MAAAA,IAAI,EAAEA,IADD;AAELqQ,MAAAA,eAAe,EAAEF,iBAFZ;AAGL3L,MAAAA,MAAM,EAAEA;AAHH,KAAP;AAKD,GAxBD;;AA0BA,MAAMsK,SAAS,GAAG9W,QAAQ,CAACkX,IAAT,CAAcC,eAAd,EAAlB;AACA,MAAMmB,IAAI,GAAGJ,aAAa,CAAC3L,KAAK,CAACvE,IAAP,EAAauE,KAAK,CAACC,MAAnB,CAA1B;AAEAsK,EAAAA,SAAS,CAACO,iBAAV,CAA4BiB,IAAI,CAACtQ,IAAjC;AACA8O,EAAAA,SAAS,CAACW,QAAV,CAAmBa,IAAI,CAACD,eAAxB;AACAvB,EAAAA,SAAS,CAACyB,SAAV,CAAoB,WAApB,EAAiCD,IAAI,CAAC9L,MAAtC;AACA,SAAOsK,SAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;IACM0B;AACJ,wBAAYC,EAAZ,EAAgBC,EAAhB,EAAoBC,EAApB,EAAwBC,EAAxB,EAA4B;AAAA;;AAC1B,SAAKH,EAAL,GAAUA,EAAV;AACA,SAAKC,EAAL,GAAUA,EAAV;AACA,SAAKC,EAAL,GAAUA,EAAV;AACA,SAAKC,EAAL,GAAUA,EAAV,CAJ0B,CAM1B;;AACA,SAAKC,YAAL,GAAoB,KAAKC,QAAL,CAAc7F,cAAd,CAApB,CAP0B,CAQ1B;;AACA,SAAK8F,QAAL,GAAgB,KAAKD,QAAL,CAAc7F,UAAd,CAAhB,CAT0B,CAU1B;;AACA,SAAK+F,UAAL,GAAkB,KAAKF,QAAL,CAAc7F,YAAd,CAAlB,CAX0B,CAY1B;;AACA,SAAKgG,QAAL,GAAgB,KAAKH,QAAL,CAAc7F,UAAd,CAAhB,CAb0B,CAc1B;;AACA,SAAKiG,QAAL,GAAgB,KAAKJ,QAAL,CAAc7F,UAAd,CAAhB;AACD,IAED;;;;;WACA,uBAAc;AACZ,UAAIvL,qBAAJ,EAA2B;AACzB,YAAMyR,QAAQ,GAAGnZ,QAAQ,CAAC8B,WAAT,EAAjB;AACAqX,QAAAA,QAAQ,CAACC,QAAT,CAAkB,KAAKX,EAAvB,EAA2B,KAAKC,EAAhC;AACAS,QAAAA,QAAQ,CAACE,MAAT,CAAgB,KAAKV,EAArB,EAAyB,KAAKC,EAA9B;AAEA,eAAOO,QAAP;AACD,OAND,MAMO;AACL,YAAMrC,SAAS,GAAGmB,gBAAgB,CAAC;AACjCjQ,UAAAA,IAAI,EAAE,KAAKyQ,EADsB;AAEjCjM,UAAAA,MAAM,EAAE,KAAKkM;AAFoB,SAAD,CAAlC;AAKA5B,QAAAA,SAAS,CAACe,WAAV,CAAsB,UAAtB,EAAkCI,gBAAgB,CAAC;AACjDjQ,UAAAA,IAAI,EAAE,KAAK2Q,EADsC;AAEjDnM,UAAAA,MAAM,EAAE,KAAKoM;AAFoC,SAAD,CAAlD;AAKA,eAAO9B,SAAP;AACD;AACF;;;WAED,qBAAY;AACV,aAAO;AACL2B,QAAAA,EAAE,EAAE,KAAKA,EADJ;AAELC,QAAAA,EAAE,EAAE,KAAKA,EAFJ;AAGLC,QAAAA,EAAE,EAAE,KAAKA,EAHJ;AAILC,QAAAA,EAAE,EAAE,KAAKA;AAJJ,OAAP;AAMD;;;WAED,yBAAgB;AACd,aAAO;AACL5Q,QAAAA,IAAI,EAAE,KAAKyQ,EADN;AAELjM,QAAAA,MAAM,EAAE,KAAKkM;AAFR,OAAP;AAID;;;WAED,uBAAc;AACZ,aAAO;AACL1Q,QAAAA,IAAI,EAAE,KAAK2Q,EADN;AAELnM,QAAAA,MAAM,EAAE,KAAKoM;AAFR,OAAP;AAID;AAED;AACF;AACA;;;;WACE,kBAAS;AACP,UAAMU,SAAS,GAAG,KAAKC,WAAL,EAAlB;;AACA,UAAI7R,qBAAJ,EAA2B;AACzB,YAAM8R,SAAS,GAAGxZ,QAAQ,CAACyZ,YAAT,EAAlB;;AACA,YAAID,SAAS,CAACE,UAAV,GAAuB,CAA3B,EAA8B;AAC5BF,UAAAA,SAAS,CAACG,eAAV;AACD;;AACDH,QAAAA,SAAS,CAACI,QAAV,CAAmBN,SAAnB;AACD,OAND,MAMO;AACLA,QAAAA,SAAS,CAACna,MAAV;AACD;;AAED,aAAO,IAAP;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,wBAAeyQ,SAAf,EAA0B;AACxB,UAAMrW,MAAM,GAAGT,yBAAC,CAAC8W,SAAD,CAAD,CAAarW,MAAb,EAAf;;AACA,UAAIqW,SAAS,CAAC/L,SAAV,GAAsBtK,MAAtB,GAA+B,KAAKkf,EAAL,CAAQoB,SAA3C,EAAsD;AACpDjK,QAAAA,SAAS,CAAC/L,SAAV,IAAuBiW,IAAI,CAACC,GAAL,CAASnK,SAAS,CAAC/L,SAAV,GAAsBtK,MAAtB,GAA+B,KAAKkf,EAAL,CAAQoB,SAAhD,CAAvB;AACD;;AAED,aAAO,IAAP;AACD;AAED;AACF;AACA;;;;WACE,qBAAY;AACV;AACJ;AACA;AACA;AACA;AACA;AACI,UAAMG,eAAe,GAAG,SAAlBA,eAAkB,CAASzN,KAAT,EAAgB0N,aAAhB,EAA+B;AACrD,YAAI,CAAC1N,KAAL,EAAY;AACV,iBAAOA,KAAP;AACD,SAHoD,CAKrD;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,YAAI0G,kBAAA,CAAmB1G,KAAnB,CAAJ,EAA+B;AAC7B,cAAI,CAAC0G,eAAA,CAAgB1G,KAAhB,CAAD,IACC0G,oBAAA,CAAqB1G,KAArB,KAA+B,CAAC0N,aADjC,IAEChH,mBAAA,CAAoB1G,KAApB,KAA8B0N,aAF/B,IAGChH,oBAAA,CAAqB1G,KAArB,KAA+B0N,aAA/B,IAAgDhH,UAAA,CAAW1G,KAAK,CAACvE,IAAN,CAAW8B,WAAtB,CAHjD,IAICmJ,mBAAA,CAAoB1G,KAApB,KAA8B,CAAC0N,aAA/B,IAAgDhH,UAAA,CAAW1G,KAAK,CAACvE,IAAN,CAAW+B,eAAtB,CAJjD,IAKCkJ,WAAA,CAAY1G,KAAK,CAACvE,IAAlB,KAA2BiL,WAAA,CAAY1G,KAAK,CAACvE,IAAlB,CALhC,EAK0D;AACxD,mBAAOuE,KAAP;AACD;AACF,SArBoD,CAuBrD;;;AACA,YAAM2N,KAAK,GAAGjH,YAAA,CAAa1G,KAAK,CAACvE,IAAnB,EAAyBiL,WAAzB,CAAd;AACA,YAAIkH,YAAY,GAAG,KAAnB;;AAEA,YAAI,CAACA,YAAL,EAAmB;AACjB,cAAMlN,SAAS,GAAGgG,aAAA,CAAc1G,KAAd,KAAwB;AAAEvE,YAAAA,IAAI,EAAE;AAAR,WAA1C;AACAmS,UAAAA,YAAY,GAAG,CAAClH,qBAAA,CAAsB1G,KAAtB,EAA6B2N,KAA7B,KAAuCjH,UAAA,CAAWhG,SAAS,CAACjF,IAArB,CAAxC,KAAuE,CAACiS,aAAvF;AACD;;AAED,YAAIG,WAAW,GAAG,KAAlB;;AACA,YAAI,CAACA,WAAL,EAAkB;AAChB,cAAMjN,UAAS,GAAG8F,aAAA,CAAc1G,KAAd,KAAwB;AAAEvE,YAAAA,IAAI,EAAE;AAAR,WAA1C;;AACAoS,UAAAA,WAAW,GAAG,CAACnH,sBAAA,CAAuB1G,KAAvB,EAA8B2N,KAA9B,KAAwCjH,UAAA,CAAW9F,UAAS,CAACnF,IAArB,CAAzC,KAAwEiS,aAAtF;AACD;;AAED,YAAIE,YAAY,IAAIC,WAApB,EAAiC;AAC/B;AACA,cAAInH,kBAAA,CAAmB1G,KAAnB,CAAJ,EAA+B;AAC7B,mBAAOA,KAAP;AACD,WAJ8B,CAK/B;;;AACA0N,UAAAA,aAAa,GAAG,CAACA,aAAjB;AACD;;AAED,YAAM9M,SAAS,GAAG8M,aAAa,GAAGhH,kBAAA,CAAmBA,aAAA,CAAc1G,KAAd,CAAnB,EAAyC0G,kBAAzC,CAAH,GAC3BA,kBAAA,CAAmBA,aAAA,CAAc1G,KAAd,CAAnB,EAAyC0G,kBAAzC,CADJ;AAEA,eAAO9F,SAAS,IAAIZ,KAApB;AACD,OAlDD;;AAoDA,UAAMgC,QAAQ,GAAGyL,eAAe,CAAC,KAAKK,WAAL,EAAD,EAAqB,KAArB,CAAhC;AACA,UAAM/L,UAAU,GAAG,KAAKgM,WAAL,KAAqB/L,QAArB,GAAgCyL,eAAe,CAAC,KAAKO,aAAL,EAAD,EAAuB,IAAvB,CAAlE;AAEA,aAAO,IAAI/B,YAAJ,CACLlK,UAAU,CAACtG,IADN,EAELsG,UAAU,CAAC9B,MAFN,EAGL+B,QAAQ,CAACvG,IAHJ,EAILuG,QAAQ,CAAC/B,MAJJ,CAAP;AAMD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,eAAMtG,IAAN,EAAYhJ,OAAZ,EAAqB;AACnBgJ,MAAAA,IAAI,GAAGA,IAAI,IAAInB,OAAf;AAEA,UAAMyV,eAAe,GAAGtd,OAAO,IAAIA,OAAO,CAACsd,eAA3C;AACA,UAAMC,aAAa,GAAGvd,OAAO,IAAIA,OAAO,CAACud,aAAzC,CAJmB,CAMnB;;AACA,UAAMnM,UAAU,GAAG,KAAKiM,aAAL,EAAnB;AACA,UAAMhM,QAAQ,GAAG,KAAK8L,WAAL,EAAjB;AAEA,UAAMjP,KAAK,GAAG,EAAd;AACA,UAAMsP,aAAa,GAAG,EAAtB;AAEAzH,MAAAA,aAAA,CAAc3E,UAAd,EAA0BC,QAA1B,EAAoC,UAAShC,KAAT,EAAgB;AAClD,YAAI0G,cAAA,CAAe1G,KAAK,CAACvE,IAArB,CAAJ,EAAgC;AAC9B;AACD;;AAED,YAAIA,IAAJ;;AACA,YAAIyS,aAAJ,EAAmB;AACjB,cAAIxH,mBAAA,CAAoB1G,KAApB,CAAJ,EAAgC;AAC9BmO,YAAAA,aAAa,CAACrT,IAAd,CAAmBkF,KAAK,CAACvE,IAAzB;AACD;;AACD,cAAIiL,oBAAA,CAAqB1G,KAArB,KAA+BxP,cAAA,CAAe2d,aAAf,EAA8BnO,KAAK,CAACvE,IAApC,CAAnC,EAA8E;AAC5EA,YAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAb;AACD;AACF,SAPD,MAOO,IAAIwS,eAAJ,EAAqB;AAC1BxS,UAAAA,IAAI,GAAGiL,YAAA,CAAa1G,KAAK,CAACvE,IAAnB,EAAyB9B,IAAzB,CAAP;AACD,SAFM,MAEA;AACL8B,UAAAA,IAAI,GAAGuE,KAAK,CAACvE,IAAb;AACD;;AAED,YAAIA,IAAI,IAAI9B,IAAI,CAAC8B,IAAD,CAAhB,EAAwB;AACtBoD,UAAAA,KAAK,CAAC/D,IAAN,CAAWW,IAAX;AACD;AACF,OAtBD,EAsBG,IAtBH;AAwBA,aAAOjL,YAAA,CAAaqO,KAAb,CAAP;AACD;AAED;AACF;AACA;AACA;;;;WACE,0BAAiB;AACf,aAAO6H,kBAAA,CAAmB,KAAKwF,EAAxB,EAA4B,KAAKE,EAAjC,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,gBAAOzS,IAAP,EAAa;AACX,UAAMyU,aAAa,GAAG1H,YAAA,CAAa,KAAKwF,EAAlB,EAAsBvS,IAAtB,CAAtB;AACA,UAAM0U,WAAW,GAAG3H,YAAA,CAAa,KAAK0F,EAAlB,EAAsBzS,IAAtB,CAApB;;AAEA,UAAI,CAACyU,aAAD,IAAkB,CAACC,WAAvB,EAAoC;AAClC,eAAO,IAAIpC,YAAJ,CAAiB,KAAKC,EAAtB,EAA0B,KAAKC,EAA/B,EAAmC,KAAKC,EAAxC,EAA4C,KAAKC,EAAjD,CAAP;AACD;;AAED,UAAMiC,cAAc,GAAG,KAAKC,SAAL,EAAvB;;AAEA,UAAIH,aAAJ,EAAmB;AACjBE,QAAAA,cAAc,CAACpC,EAAf,GAAoBkC,aAApB;AACAE,QAAAA,cAAc,CAACnC,EAAf,GAAoB,CAApB;AACD;;AAED,UAAIkC,WAAJ,EAAiB;AACfC,QAAAA,cAAc,CAAClC,EAAf,GAAoBiC,WAApB;AACAC,QAAAA,cAAc,CAACjC,EAAf,GAAoB3F,cAAA,CAAe2H,WAAf,CAApB;AACD;;AAED,aAAO,IAAIpC,YAAJ,CACLqC,cAAc,CAACpC,EADV,EAELoC,cAAc,CAACnC,EAFV,EAGLmC,cAAc,CAAClC,EAHV,EAILkC,cAAc,CAACjC,EAJV,CAAP;AAMD;AAED;AACF;AACA;AACA;;;;WACE,kBAAST,iBAAT,EAA4B;AAC1B,UAAIA,iBAAJ,EAAuB;AACrB,eAAO,IAAIK,YAAJ,CAAiB,KAAKC,EAAtB,EAA0B,KAAKC,EAA/B,EAAmC,KAAKD,EAAxC,EAA4C,KAAKC,EAAjD,CAAP;AACD,OAFD,MAEO;AACL,eAAO,IAAIF,YAAJ,CAAiB,KAAKG,EAAtB,EAA0B,KAAKC,EAA/B,EAAmC,KAAKD,EAAxC,EAA4C,KAAKC,EAAjD,CAAP;AACD;AACF;AAED;AACF;AACA;;;;WACE,qBAAY;AACV,UAAMmC,eAAe,GAAG,KAAKtC,EAAL,KAAY,KAAKE,EAAzC;AACA,UAAMkC,cAAc,GAAG,KAAKC,SAAL,EAAvB;;AAEA,UAAI7H,UAAA,CAAW,KAAK0F,EAAhB,KAAuB,CAAC1F,eAAA,CAAgB,KAAKoH,WAAL,EAAhB,CAA5B,EAAiE;AAC/D,aAAK1B,EAAL,CAAQxJ,SAAR,CAAkB,KAAKyJ,EAAvB;AACD;;AAED,UAAI3F,UAAA,CAAW,KAAKwF,EAAhB,KAAuB,CAACxF,eAAA,CAAgB,KAAKsH,aAAL,EAAhB,CAA5B,EAAmE;AACjEM,QAAAA,cAAc,CAACpC,EAAf,GAAoB,KAAKA,EAAL,CAAQtJ,SAAR,CAAkB,KAAKuJ,EAAvB,CAApB;AACAmC,QAAAA,cAAc,CAACnC,EAAf,GAAoB,CAApB;;AAEA,YAAIqC,eAAJ,EAAqB;AACnBF,UAAAA,cAAc,CAAClC,EAAf,GAAoBkC,cAAc,CAACpC,EAAnC;AACAoC,UAAAA,cAAc,CAACjC,EAAf,GAAoB,KAAKA,EAAL,GAAU,KAAKF,EAAnC;AACD;AACF;;AAED,aAAO,IAAIF,YAAJ,CACLqC,cAAc,CAACpC,EADV,EAELoC,cAAc,CAACnC,EAFV,EAGLmC,cAAc,CAAClC,EAHV,EAILkC,cAAc,CAACjC,EAJV,CAAP;AAMD;AAED;AACF;AACA;AACA;;;;WACE,0BAAiB;AACf,UAAI,KAAK0B,WAAL,EAAJ,EAAwB;AACtB,eAAO,IAAP;AACD;;AAED,UAAMU,GAAG,GAAG,KAAK7L,SAAL,EAAZ;AACA,UAAM/D,KAAK,GAAG4P,GAAG,CAAC5P,KAAJ,CAAU,IAAV,EAAgB;AAC5BqP,QAAAA,aAAa,EAAE;AADa,OAAhB,CAAd,CANe,CAUf;;AACA,UAAMlO,KAAK,GAAG0G,kBAAA,CAAmB+H,GAAG,CAACT,aAAJ,EAAnB,EAAwC,UAAShO,KAAT,EAAgB;AACpE,eAAO,CAACxP,cAAA,CAAeqO,KAAf,EAAsBmB,KAAK,CAACvE,IAA5B,CAAR;AACD,OAFa,CAAd;AAIA,UAAMiT,YAAY,GAAG,EAArB;AACAniB,MAAAA,8BAAA,CAAOsS,KAAP,EAAc,UAASjF,GAAT,EAAc6B,IAAd,EAAoB;AAChC;AACA,YAAM4D,MAAM,GAAG5D,IAAI,CAAC0C,UAApB;;AACA,YAAI6B,KAAK,CAACvE,IAAN,KAAe4D,MAAf,IAAyBqH,cAAA,CAAerH,MAAf,MAA2B,CAAxD,EAA2D;AACzDqP,UAAAA,YAAY,CAAC5T,IAAb,CAAkBuE,MAAlB;AACD;;AACDqH,QAAAA,UAAA,CAAWjL,IAAX,EAAiB,KAAjB;AACD,OAPD,EAhBe,CAyBf;;AACAlP,MAAAA,8BAAA,CAAOmiB,YAAP,EAAqB,UAAS9U,GAAT,EAAc6B,IAAd,EAAoB;AACvCiL,QAAAA,UAAA,CAAWjL,IAAX,EAAiB,KAAjB;AACD,OAFD;AAIA,aAAO,IAAIwQ,YAAJ,CACLjM,KAAK,CAACvE,IADD,EAELuE,KAAK,CAACC,MAFD,EAGLD,KAAK,CAACvE,IAHD,EAILuE,KAAK,CAACC,MAJD,EAKL0O,SALK,EAAP;AAMD;AAED;AACF;AACA;;;;WACE,kBAAShV,IAAT,EAAe;AACb,aAAO,YAAW;AAChB,YAAMsD,QAAQ,GAAGyJ,YAAA,CAAa,KAAKwF,EAAlB,EAAsBvS,IAAtB,CAAjB;AACA,eAAO,CAAC,CAACsD,QAAF,IAAeA,QAAQ,KAAKyJ,YAAA,CAAa,KAAK0F,EAAlB,EAAsBzS,IAAtB,CAAnC;AACD,OAHD;AAID;AAED;AACF;AACA;AACA;;;;WACE,sBAAaA,IAAb,EAAmB;AACjB,UAAI,CAAC+M,mBAAA,CAAoB,KAAKsH,aAAL,EAApB,CAAL,EAAgD;AAC9C,eAAO,KAAP;AACD;;AAED,UAAMvS,IAAI,GAAGiL,YAAA,CAAa,KAAKwF,EAAlB,EAAsBvS,IAAtB,CAAb;AACA,aAAO8B,IAAI,IAAIiL,gBAAA,CAAiB,KAAKwF,EAAtB,EAA0BzQ,IAA1B,CAAf;AACD;AAED;AACF;AACA;;;;WACE,uBAAc;AACZ,aAAO,KAAKyQ,EAAL,KAAY,KAAKE,EAAjB,IAAuB,KAAKD,EAAL,KAAY,KAAKE,EAA/C;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,kCAAyB;AACvB,UAAI3F,mBAAA,CAAoB,KAAKwF,EAAzB,KAAgCxF,WAAA,CAAY,KAAKwF,EAAjB,CAApC,EAA0D;AACxD,aAAKA,EAAL,CAAQjO,SAAR,GAAoByI,aAApB;AACA,eAAO,IAAIuF,YAAJ,CAAiB,KAAKC,EAAL,CAAQf,UAAzB,EAAqC,CAArC,EAAwC,KAAKe,EAAL,CAAQf,UAAhD,EAA4D,CAA5D,CAAP;AACD;AAED;AACJ;AACA;AACA;AACA;;;AACI,UAAMsD,GAAG,GAAG,KAAKE,SAAL,EAAZ;;AACA,UAAIjI,gBAAA,CAAiB,KAAKwF,EAAtB,KAA6BxF,UAAA,CAAW,KAAKwF,EAAhB,CAAjC,EAAsD;AACpD,eAAOuC,GAAP;AACD,OAdsB,CAgBvB;;;AACA,UAAItL,WAAJ;;AACA,UAAIuD,YAAA,CAAa+H,GAAG,CAACvC,EAAjB,CAAJ,EAA0B;AACxB,YAAM5N,SAAS,GAAGoI,gBAAA,CAAiB+H,GAAG,CAACvC,EAArB,EAAyB1T,QAAA,CAASkO,YAAT,CAAzB,CAAlB;AACAvD,QAAAA,WAAW,GAAG3S,UAAA,CAAW8N,SAAX,CAAd;;AACA,YAAI,CAACoI,YAAA,CAAavD,WAAb,CAAL,EAAgC;AAC9BA,UAAAA,WAAW,GAAG7E,SAAS,CAACA,SAAS,CAAChF,MAAV,GAAmB,CAApB,CAAT,IAAmCmV,GAAG,CAACvC,EAAJ,CAAOpO,UAAP,CAAkB2Q,GAAG,CAACtC,EAAtB,CAAjD;AACD;AACF,OAND,MAMO;AACLhJ,QAAAA,WAAW,GAAGsL,GAAG,CAACvC,EAAJ,CAAOpO,UAAP,CAAkB2Q,GAAG,CAACtC,EAAJ,GAAS,CAAT,GAAasC,GAAG,CAACtC,EAAJ,GAAS,CAAtB,GAA0B,CAA5C,CAAd;AACD;;AAED,UAAIhJ,WAAJ,EAAiB;AACf;AACA,YAAIyL,cAAc,GAAGlI,YAAA,CAAavD,WAAb,EAA0BuD,gBAA1B,EAA4CtE,OAA5C,EAArB;AACAwM,QAAAA,cAAc,GAAGA,cAAc,CAACC,MAAf,CAAsBnI,YAAA,CAAavD,WAAW,CAAC5F,WAAzB,EAAsCmJ,gBAAtC,CAAtB,CAAjB,CAHe,CAKf;;AACA,YAAIkI,cAAc,CAACtV,MAAnB,EAA2B;AACzB,cAAMwV,IAAI,GAAGpI,QAAA,CAASlW,UAAA,CAAWoe,cAAX,CAAT,EAAqC,GAArC,CAAb;AACAlI,UAAAA,oBAAA,CAAqBoI,IAArB,EAA2Bte,UAAA,CAAWoe,cAAX,CAA3B;AACD;AACF;;AAED,aAAO,KAAKD,SAAL,EAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,oBAAWlT,IAAX,EAAiB;AACf,UAAIgT,GAAG,GAAG,IAAV;;AAEA,UAAI/H,UAAA,CAAWjL,IAAX,KAAoBiL,YAAA,CAAajL,IAAb,CAAxB,EAA4C;AAC1CgT,QAAAA,GAAG,GAAG,KAAKM,sBAAL,GAA8BC,cAA9B,EAAN;AACD;;AAED,UAAMjD,IAAI,GAAGrF,cAAA,CAAe+H,GAAG,CAACT,aAAJ,EAAf,EAAoCtH,YAAA,CAAajL,IAAb,CAApC,CAAb;;AACA,UAAIsQ,IAAI,CAACxK,SAAT,EAAoB;AAClBwK,QAAAA,IAAI,CAACxK,SAAL,CAAepD,UAAf,CAA0BoB,YAA1B,CAAuC9D,IAAvC,EAA6CsQ,IAAI,CAACxK,SAAlD;;AACA,YAAImF,WAAA,CAAYqF,IAAI,CAACxK,SAAjB,KAA+BmF,UAAA,CAAWjL,IAAX,CAAnC,EAAqD;AACnDsQ,UAAAA,IAAI,CAACxK,SAAL,CAAepD,UAAf,CAA0B0F,WAA1B,CAAsCkI,IAAI,CAACxK,SAA3C;AACD;AACF,OALD,MAKO;AACLwK,QAAAA,IAAI,CAAC1I,SAAL,CAAe7D,WAAf,CAA2B/D,IAA3B;AACD;;AAED,aAAOA,IAAP;AACD;AAED;AACF;AACA;;;;WACE,mBAAUgJ,MAAV,EAAkB;AAChBA,MAAAA,MAAM,GAAGlY,8BAAA,CAAOkY,MAAP,CAAT;AAEA,UAAMwK,iBAAiB,GAAG1iB,yBAAC,CAAC,aAAD,CAAD,CAAiBgY,IAAjB,CAAsBE,MAAtB,EAA8B,CAA9B,CAA1B;AACA,UAAI3G,UAAU,GAAGtN,UAAA,CAAWye,iBAAiB,CAACnR,UAA7B,CAAjB,CAJgB,CAMhB;;AACA,UAAM2Q,GAAG,GAAG,IAAZ;AACA,UAAIS,QAAQ,GAAG,KAAf;;AAEA,UAAIT,GAAG,CAACtC,EAAJ,IAAU,CAAd,EAAiB;AACfrO,QAAAA,UAAU,GAAGA,UAAU,CAACsE,OAAX,EAAb;AACA8M,QAAAA,QAAQ,GAAG,IAAX;AACD;;AAEDpR,MAAAA,UAAU,GAAGA,UAAU,CAAC3F,GAAX,CAAe,UAAS0K,SAAT,EAAoB;AAC9C,eAAO4L,GAAG,CAACU,UAAJ,CAAetM,SAAf,CAAP;AACD,OAFY,CAAb;;AAIA,UAAIqM,QAAJ,EAAc;AACZpR,QAAAA,UAAU,GAAGA,UAAU,CAACsE,OAAX,EAAb;AACD;;AACD,aAAOtE,UAAP;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,oBAAW;AACT,UAAMiP,SAAS,GAAG,KAAKC,WAAL,EAAlB;AACA,aAAO7R,qBAAA,GAAwB4R,SAAS,CAACqC,QAAV,EAAxB,GAA+CrC,SAAS,CAACtJ,IAAhE;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,sBAAa4L,SAAb,EAAwB;AACtB,UAAIrN,QAAQ,GAAG,KAAK8L,WAAL,EAAf;;AAEA,UAAI,CAACpH,eAAA,CAAgB1E,QAAhB,CAAL,EAAgC;AAC9B,eAAO,IAAP;AACD;;AAED,UAAMD,UAAU,GAAG2E,kBAAA,CAAmB1E,QAAnB,EAA6B,UAAShC,KAAT,EAAgB;AAC9D,eAAO,CAAC0G,eAAA,CAAgB1G,KAAhB,CAAR;AACD,OAFkB,CAAnB;;AAIA,UAAIqP,SAAJ,EAAe;AACbrN,QAAAA,QAAQ,GAAG0E,kBAAA,CAAmB1E,QAAnB,EAA6B,UAAShC,KAAT,EAAgB;AACtD,iBAAO,CAAC0G,eAAA,CAAgB1G,KAAhB,CAAR;AACD,SAFU,CAAX;AAGD;;AAED,aAAO,IAAIiM,YAAJ,CACLlK,UAAU,CAACtG,IADN,EAELsG,UAAU,CAAC9B,MAFN,EAGL+B,QAAQ,CAACvG,IAHJ,EAILuG,QAAQ,CAAC/B,MAJJ,CAAP;AAMD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,uBAAcoP,SAAd,EAAyB;AACvB,UAAIrN,QAAQ,GAAG,KAAK8L,WAAL,EAAf;;AAEA,UAAIwB,cAAc,GAAG,SAAjBA,cAAiB,CAAStP,KAAT,EAAgB;AACnC,eAAO,CAAC0G,eAAA,CAAgB1G,KAAhB,CAAD,IAA2B,CAAC0G,gBAAA,CAAiB1G,KAAjB,CAAnC;AACD,OAFD;;AAIA,UAAIsP,cAAc,CAACtN,QAAD,CAAlB,EAA8B;AAC5B,eAAO,IAAP;AACD;;AAED,UAAID,UAAU,GAAG2E,kBAAA,CAAmB1E,QAAnB,EAA6BsN,cAA7B,CAAjB;;AAEA,UAAID,SAAJ,EAAe;AACbrN,QAAAA,QAAQ,GAAG0E,kBAAA,CAAmB1E,QAAnB,EAA6BsN,cAA7B,CAAX;AACD;;AAED,aAAO,IAAIrD,YAAJ,CACLlK,UAAU,CAACtG,IADN,EAELsG,UAAU,CAAC9B,MAFN,EAGL+B,QAAQ,CAACvG,IAHJ,EAILuG,QAAQ,CAAC/B,MAJJ,CAAP;AAMD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,4BAAmBsP,KAAnB,EAA0B;AACxB,UAAIvN,QAAQ,GAAG,KAAK8L,WAAL,EAAf;AAEA,UAAI/L,UAAU,GAAG2E,kBAAA,CAAmB1E,QAAnB,EAA6B,UAAShC,KAAT,EAAgB;AAC5D,YAAI,CAAC0G,eAAA,CAAgB1G,KAAhB,CAAD,IAA2B,CAAC0G,gBAAA,CAAiB1G,KAAjB,CAAhC,EAAyD;AACvD,iBAAO,IAAP;AACD;;AACD,YAAIyO,GAAG,GAAG,IAAIxC,YAAJ,CACRjM,KAAK,CAACvE,IADE,EAERuE,KAAK,CAACC,MAFE,EAGR+B,QAAQ,CAACvG,IAHD,EAIRuG,QAAQ,CAAC/B,MAJD,CAAV;AAMA,YAAI1F,MAAM,GAAGgV,KAAK,CAACjb,IAAN,CAAWma,GAAG,CAACW,QAAJ,EAAX,CAAb;AACA,eAAO7U,MAAM,IAAIA,MAAM,CAACiV,KAAP,KAAiB,CAAlC;AACD,OAZgB,CAAjB;AAcA,UAAIf,GAAG,GAAG,IAAIxC,YAAJ,CACRlK,UAAU,CAACtG,IADH,EAERsG,UAAU,CAAC9B,MAFH,EAGR+B,QAAQ,CAACvG,IAHD,EAIRuG,QAAQ,CAAC/B,MAJD,CAAV;AAOA,UAAIwD,IAAI,GAAGgL,GAAG,CAACW,QAAJ,EAAX;AACA,UAAI7U,MAAM,GAAGgV,KAAK,CAACjb,IAAN,CAAWmP,IAAX,CAAb;;AAEA,UAAIlJ,MAAM,IAAIA,MAAM,CAAC,CAAD,CAAN,CAAUjB,MAAV,KAAqBmK,IAAI,CAACnK,MAAxC,EAAgD;AAC9C,eAAOmV,GAAP;AACD,OAFD,MAEO;AACL,eAAO,IAAP;AACD;AACF;AAED;AACF;AACA;AACA;AACA;;;;WACE,kBAASjG,QAAT,EAAmB;AACjB,aAAO;AACLiH,QAAAA,CAAC,EAAE;AACDC,UAAAA,IAAI,EAAEhJ,kBAAA,CAAmB8B,QAAnB,EAA6B,KAAK0D,EAAlC,CADL;AAEDjM,UAAAA,MAAM,EAAE,KAAKkM;AAFZ,SADE;AAKLwD,QAAAA,CAAC,EAAE;AACDD,UAAAA,IAAI,EAAEhJ,kBAAA,CAAmB8B,QAAnB,EAA6B,KAAK4D,EAAlC,CADL;AAEDnM,UAAAA,MAAM,EAAE,KAAKoM;AAFZ;AALE,OAAP;AAUD;AAED;AACF;AACA;AACA;AACA;;;;WACE,sBAAauD,KAAb,EAAoB;AAClB,aAAO;AACLH,QAAAA,CAAC,EAAE;AACDC,UAAAA,IAAI,EAAElf,UAAA,CAAWkW,kBAAA,CAAmBlW,UAAA,CAAWof,KAAX,CAAnB,EAAsC,KAAK1D,EAA3C,CAAX,CADL;AAEDjM,UAAAA,MAAM,EAAE,KAAKkM;AAFZ,SADE;AAKLwD,QAAAA,CAAC,EAAE;AACDD,UAAAA,IAAI,EAAElf,UAAA,CAAWkW,kBAAA,CAAmBlW,UAAA,CAAWof,KAAX,CAAnB,EAAsC,KAAKxD,EAA3C,CAAX,CADL;AAEDnM,UAAAA,MAAM,EAAE,KAAKoM;AAFZ;AALE,OAAP;AAUD;AAED;AACF;AACA;AACA;;;;WACE,0BAAiB;AACf,UAAMU,SAAS,GAAG,KAAKC,WAAL,EAAlB;AACA,aAAOD,SAAS,CAAC8C,cAAV,EAAP;AACD;;;;;AAGH;AACA;AACA;AACA;AACA;AACA;AACA;;;AACA,4CAAe;AACb;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACEtM,EAAAA,MAAM,EAAE,gBAAS2I,EAAT,EAAaC,EAAb,EAAiBC,EAAjB,EAAqBC,EAArB,EAAyB;AAC/B,QAAIlW,SAAS,CAACmD,MAAV,KAAqB,CAAzB,EAA4B;AAC1B,aAAO,IAAI2S,YAAJ,CAAiBC,EAAjB,EAAqBC,EAArB,EAAyBC,EAAzB,EAA6BC,EAA7B,CAAP;AACD,KAFD,MAEO,IAAIlW,SAAS,CAACmD,MAAV,KAAqB,CAAzB,EAA4B;AAAE;AACnC8S,MAAAA,EAAE,GAAGF,EAAL;AACAG,MAAAA,EAAE,GAAGF,EAAL;AACA,aAAO,IAAIF,YAAJ,CAAiBC,EAAjB,EAAqBC,EAArB,EAAyBC,EAAzB,EAA6BC,EAA7B,CAAP;AACD,KAJM,MAIA;AACL,UAAIyD,YAAY,GAAG,KAAKC,mBAAL,EAAnB;;AAEA,UAAI,CAACD,YAAD,IAAiB3Z,SAAS,CAACmD,MAAV,KAAqB,CAA1C,EAA6C;AAC3C,YAAI0W,WAAW,GAAG7Z,SAAS,CAAC,CAAD,CAA3B;;AACA,YAAIuQ,cAAA,CAAesJ,WAAf,CAAJ,EAAiC;AAC/BA,UAAAA,WAAW,GAAGA,WAAW,CAACC,SAA1B;AACD;;AACD,eAAO,KAAKC,qBAAL,CAA2BF,WAA3B,EAAwCtJ,aAAA,KAAkBvQ,SAAS,CAAC,CAAD,CAAT,CAAa8H,SAAvE,CAAP;AACD;;AACD,aAAO6R,YAAP;AACD;AACF,GA7BY;AA+BbI,EAAAA,qBAAqB,EAAE,+BAASF,WAAT,EAAiD;AAAA,QAA3BpE,iBAA2B,uEAAP,KAAO;AACtE,QAAIkE,YAAY,GAAG,KAAKK,cAAL,CAAoBH,WAApB,CAAnB;AACA,WAAOF,YAAY,CAAC5E,QAAb,CAAsBU,iBAAtB,CAAP;AACD,GAlCY;AAoCbmE,EAAAA,mBAAmB,EAAE,+BAAW;AAC9B,QAAI7D,EAAJ,EAAQC,EAAR,EAAYC,EAAZ,EAAgBC,EAAhB;;AACA,QAAIlR,qBAAJ,EAA2B;AACzB,UAAM8R,SAAS,GAAGxZ,QAAQ,CAACyZ,YAAT,EAAlB;;AACA,UAAI,CAACD,SAAD,IAAcA,SAAS,CAACE,UAAV,KAAyB,CAA3C,EAA8C;AAC5C,eAAO,IAAP;AACD,OAFD,MAEO,IAAIzG,UAAA,CAAWuG,SAAS,CAACmD,UAArB,CAAJ,EAAsC;AAC3C;AACA;AACA,eAAO,IAAP;AACD;;AAED,UAAMrD,SAAS,GAAGE,SAAS,CAACoD,UAAV,CAAqB,CAArB,CAAlB;AACAnE,MAAAA,EAAE,GAAGa,SAAS,CAACuD,cAAf;AACAnE,MAAAA,EAAE,GAAGY,SAAS,CAACwD,WAAf;AACAnE,MAAAA,EAAE,GAAGW,SAAS,CAACyD,YAAf;AACAnE,MAAAA,EAAE,GAAGU,SAAS,CAAC0D,SAAf;AACD,KAfD,MAeO;AAAE;AACP,UAAMlG,SAAS,GAAG9W,QAAQ,CAACwZ,SAAT,CAAmB1X,WAAnB,EAAlB;AACA,UAAMmb,YAAY,GAAGnG,SAAS,CAACc,SAAV,EAArB;AACAqF,MAAAA,YAAY,CAACxF,QAAb,CAAsB,KAAtB;AACA,UAAMF,cAAc,GAAGT,SAAvB;AACAS,MAAAA,cAAc,CAACE,QAAf,CAAwB,IAAxB;AAEA,UAAInJ,UAAU,GAAGuI,gBAAgB,CAACU,cAAD,EAAiB,IAAjB,CAAjC;AACA,UAAIhJ,QAAQ,GAAGsI,gBAAgB,CAACoG,YAAD,EAAe,KAAf,CAA/B,CARK,CAUL;;AACA,UAAIhK,UAAA,CAAW3E,UAAU,CAACtG,IAAtB,KAA+BiL,mBAAA,CAAoB3E,UAApB,CAA/B,IACF2E,cAAA,CAAe1E,QAAQ,CAACvG,IAAxB,CADE,IAC+BiL,oBAAA,CAAqB1E,QAArB,CAD/B,IAEFA,QAAQ,CAACvG,IAAT,CAAc8B,WAAd,KAA8BwE,UAAU,CAACtG,IAF3C,EAEiD;AAC/CsG,QAAAA,UAAU,GAAGC,QAAb;AACD;;AAEDkK,MAAAA,EAAE,GAAGnK,UAAU,CAAC0J,IAAhB;AACAU,MAAAA,EAAE,GAAGpK,UAAU,CAAC9B,MAAhB;AACAmM,MAAAA,EAAE,GAAGpK,QAAQ,CAACyJ,IAAd;AACAY,MAAAA,EAAE,GAAGrK,QAAQ,CAAC/B,MAAd;AACD;;AAED,WAAO,IAAIgM,YAAJ,CAAiBC,EAAjB,EAAqBC,EAArB,EAAyBC,EAAzB,EAA6BC,EAA7B,CAAP;AACD,GA7EY;;AA+Eb;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACE8D,EAAAA,cAAc,EAAE,wBAAS1U,IAAT,EAAe;AAC7B,QAAIyQ,EAAE,GAAGzQ,IAAT;AACA,QAAI0Q,EAAE,GAAG,CAAT;AACA,QAAIC,EAAE,GAAG3Q,IAAT;AACA,QAAI4Q,EAAE,GAAG3F,cAAA,CAAe0F,EAAf,CAAT,CAJ6B,CAM7B;;AACA,QAAI1F,UAAA,CAAWwF,EAAX,CAAJ,EAAoB;AAClBC,MAAAA,EAAE,GAAGzF,YAAA,CAAawF,EAAb,EAAiB5S,MAAjB,GAA0B,CAA/B;AACA4S,MAAAA,EAAE,GAAGA,EAAE,CAAC/N,UAAR;AACD;;AACD,QAAIuI,QAAA,CAAS0F,EAAT,CAAJ,EAAkB;AAChBC,MAAAA,EAAE,GAAG3F,YAAA,CAAa0F,EAAb,EAAiB9S,MAAjB,GAA0B,CAA/B;AACA8S,MAAAA,EAAE,GAAGA,EAAE,CAACjO,UAAR;AACD,KAHD,MAGO,IAAIuI,UAAA,CAAW0F,EAAX,CAAJ,EAAoB;AACzBC,MAAAA,EAAE,GAAG3F,YAAA,CAAa0F,EAAb,EAAiB9S,MAAtB;AACA8S,MAAAA,EAAE,GAAGA,EAAE,CAACjO,UAAR;AACD;;AAED,WAAO,KAAKoF,MAAL,CAAY2I,EAAZ,EAAgBC,EAAhB,EAAoBC,EAApB,EAAwBC,EAAxB,CAAP;AACD,GA3GY;;AA6Gb;AACF;AACA;AACA;AACA;AACA;AACEuE,EAAAA,oBAAoB,EAAE,8BAASnV,IAAT,EAAe;AACnC,WAAO,KAAK0U,cAAL,CAAoB1U,IAApB,EAA0ByP,QAA1B,CAAmC,IAAnC,CAAP;AACD,GArHY;;AAuHb;AACF;AACA;AACA;AACA;AACA;AACE2F,EAAAA,mBAAmB,EAAE,6BAASpV,IAAT,EAAe;AAClC,WAAO,KAAK0U,cAAL,CAAoB1U,IAApB,EAA0ByP,QAA1B,EAAP;AACD,GA/HY;;AAiIb;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACE4F,EAAAA,kBAAkB,EAAE,4BAAStI,QAAT,EAAmBuI,QAAnB,EAA6B;AAC/C,QAAM7E,EAAE,GAAGxF,kBAAA,CAAmB8B,QAAnB,EAA6BuI,QAAQ,CAACtB,CAAT,CAAWC,IAAxC,CAAX;AACA,QAAMvD,EAAE,GAAG4E,QAAQ,CAACtB,CAAT,CAAWxP,MAAtB;AACA,QAAMmM,EAAE,GAAG1F,kBAAA,CAAmB8B,QAAnB,EAA6BuI,QAAQ,CAACpB,CAAT,CAAWD,IAAxC,CAAX;AACA,QAAMrD,EAAE,GAAG0E,QAAQ,CAACpB,CAAT,CAAW1P,MAAtB;AACA,WAAO,IAAIgM,YAAJ,CAAiBC,EAAjB,EAAqBC,EAArB,EAAyBC,EAAzB,EAA6BC,EAA7B,CAAP;AACD,GAhJY;;AAkJb;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACE2E,EAAAA,sBAAsB,EAAE,gCAASD,QAAT,EAAmBnB,KAAnB,EAA0B;AAChD,QAAMzD,EAAE,GAAG4E,QAAQ,CAACtB,CAAT,CAAWxP,MAAtB;AACA,QAAMoM,EAAE,GAAG0E,QAAQ,CAACpB,CAAT,CAAW1P,MAAtB;AACA,QAAMiM,EAAE,GAAGxF,kBAAA,CAAmBlW,UAAA,CAAWof,KAAX,CAAnB,EAAsCmB,QAAQ,CAACtB,CAAT,CAAWC,IAAjD,CAAX;AACA,QAAMtD,EAAE,GAAG1F,kBAAA,CAAmBlW,UAAA,CAAWof,KAAX,CAAnB,EAAsCmB,QAAQ,CAACpB,CAAT,CAAWD,IAAjD,CAAX;AAEA,WAAO,IAAIzD,YAAJ,CAAiBC,EAAjB,EAAqBC,EAArB,EAAyBC,EAAzB,EAA6BC,EAA7B,CAAP;AACD;AAlKY,CAAf;;AC5vBA;AACA;AAEA,IAAM4E,OAAO,GAAG;AACd,eAAa,CADC;AAEd,SAAO,CAFO;AAGd,WAAS,EAHK;AAId,YAAU,EAJI;AAKd,WAAS,EALK;AAMd,YAAU,EANI;AAQd;AACA,UAAQ,EATM;AAUd,QAAM,EAVQ;AAWd,WAAS,EAXK;AAYd,UAAQ,EAZM;AAcd;AACA,UAAQ,EAfM;AAgBd,UAAQ,EAhBM;AAiBd,UAAQ,EAjBM;AAkBd,UAAQ,EAlBM;AAmBd,UAAQ,EAnBM;AAoBd,UAAQ,EApBM;AAqBd,UAAQ,EArBM;AAsBd,UAAQ,EAtBM;AAuBd,UAAQ,EAvBM;AAyBd;AACA,OAAK,EA1BS;AA2Bd,OAAK,EA3BS;AA4Bd,OAAK,EA5BS;AA6Bd,OAAK,EA7BS;AA8Bd,OAAK,EA9BS;AA+Bd,OAAK,EA/BS;AAgCd,OAAK,EAhCS;AAiCd,OAAK,EAjCS;AAkCd,OAAK,EAlCS;AAmCd,OAAK,EAnCS;AAoCd,OAAK,EApCS;AAqCd,OAAK,EArCS;AAuCd,WAAS,GAvCK;AAwCd,iBAAe,GAxCD;AAyCd,eAAa,GAzCC;AA0Cd,kBAAgB,GA1CF;AA4Cd;AACA,UAAQ,EA7CM;AA8Cd,SAAO,EA9CO;AA+Cd,YAAU,EA/CI;AAgDd,cAAY;AAhDE,CAAhB;AAmDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,0CAAe;AACb;AACF;AACA;AACA;AACA;AACA;AACEC,EAAAA,MAAM,EAAE,gBAACC,OAAD,EAAa;AACnB,WAAO3gB,cAAA,CAAe,CACpBygB,OAAO,CAACG,SADY,EAEpBH,OAAO,CAACI,GAFY,EAGpBJ,OAAO,CAACK,KAHY,EAIpBL,OAAO,CAACM,KAJY,EAKpBN,OAAO,CAACO,MALY,CAAf,EAMJL,OANI,CAAP;AAOD,GAfY;;AAgBb;AACF;AACA;AACA;AACA;AACA;AACEM,EAAAA,MAAM,EAAE,gBAACN,OAAD,EAAa;AACnB,WAAO3gB,cAAA,CAAe,CACpBygB,OAAO,CAACS,IADY,EAEpBT,OAAO,CAACU,EAFY,EAGpBV,OAAO,CAACW,KAHY,EAIpBX,OAAO,CAACY,IAJY,CAAf,EAKJV,OALI,CAAP;AAMD,GA7BY;;AA8Bb;AACF;AACA;AACA;AACA;AACA;AACEW,EAAAA,YAAY,EAAE,sBAACX,OAAD,EAAa;AACzB,WAAO3gB,cAAA,CAAe,CACpBygB,OAAO,CAACc,IADY,EAEpBd,OAAO,CAACe,GAFY,EAGpBf,OAAO,CAACgB,MAHY,EAIpBhB,OAAO,CAACiB,QAJY,CAAf,EAKJf,OALI,CAAP;AAMD,GA3CY;;AA4Cb;AACF;AACA;AACA;AACEgB,EAAAA,YAAY,EAAE3Z,iBAAA,CAAkByY,OAAlB,CAhDD;AAiDbtJ,EAAAA,IAAI,EAAEsJ;AAjDO,CAAf;;AC9DA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACO,SAASmB,iBAAT,CAA2BC,IAA3B,EAAiC;AACtC,SAAO9lB,kCAAA,CAAW,UAACgmB,QAAD,EAAc;AAC9BhmB,IAAAA,gCAAA,CAAS,IAAIimB,UAAJ,EAAT,EAA2B;AACzBC,MAAAA,MAAM,EAAE,gBAAC9C,CAAD,EAAO;AACb,YAAM+C,OAAO,GAAG/C,CAAC,CAACrG,MAAF,CAAS/O,MAAzB;AACAgY,QAAAA,QAAQ,CAACI,OAAT,CAAiBD,OAAjB;AACD,OAJwB;AAKzBE,MAAAA,OAAO,EAAE,iBAACC,GAAD,EAAS;AAChBN,QAAAA,QAAQ,CAACO,MAAT,CAAgBD,GAAhB;AACD;AAPwB,KAA3B,EAQGE,aARH,CAQiBV,IARjB;AASD,GAVM,EAUJW,OAVI,EAAP;AAWD;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACO,SAASC,WAAT,CAAqBxkB,GAArB,EAA0B;AAC/B,SAAOlC,kCAAA,CAAW,UAACgmB,QAAD,EAAc;AAC9B,QAAMW,IAAI,GAAG3mB,yBAAC,CAAC,OAAD,CAAd;AAEA2mB,IAAAA,IAAI,CAACC,GAAL,CAAS,MAAT,EAAiB,YAAM;AACrBD,MAAAA,IAAI,CAACvN,GAAL,CAAS,aAAT;AACA4M,MAAAA,QAAQ,CAACI,OAAT,CAAiBO,IAAjB;AACD,KAHD,EAGGC,GAHH,CAGO,aAHP,EAGsB,YAAM;AAC1BD,MAAAA,IAAI,CAACvN,GAAL,CAAS,MAAT,EAAiByN,MAAjB;AACAb,MAAAA,QAAQ,CAACO,MAAT,CAAgBI,IAAhB;AACD,KAND,EAMGG,GANH,CAMO;AACLC,MAAAA,OAAO,EAAE;AADJ,KANP,EAQGC,QARH,CAQY9f,QAAQ,CAACkX,IARrB,EAQ2BlC,IAR3B,CAQgC,KARhC,EAQuCha,GARvC;AASD,GAZM,EAYJukB,OAZI,EAAP;AAaD;;;;;;;;AC9CD;;IAEqBS;AACnB,mBAAY9f,OAAZ,EAAqB;AAAA;;AACnB,SAAK+f,KAAL,GAAa,EAAb;AACA,SAAKC,WAAL,GAAmB,CAAC,CAApB;AACA,SAAKhgB,OAAL,GAAeA,OAAf;AACA,SAAKigB,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAKA,QAAL,GAAgB,KAAKoL,SAAL,CAAe,CAAf,CAAhB;AACD;;;;WAED,wBAAe;AACb,UAAMnF,GAAG,GAAG+E,YAAA,CAAa,KAAKhL,QAAlB,CAAZ;AACA,UAAMqL,aAAa,GAAG;AAAEpE,QAAAA,CAAC,EAAE;AAAEC,UAAAA,IAAI,EAAE,EAAR;AAAYzP,UAAAA,MAAM,EAAE;AAApB,SAAL;AAA8B0P,QAAAA,CAAC,EAAE;AAAED,UAAAA,IAAI,EAAE,EAAR;AAAYzP,UAAAA,MAAM,EAAE;AAApB;AAAjC,OAAtB;AAEA,aAAO;AACL6T,QAAAA,QAAQ,EAAE,KAAKF,SAAL,CAAerP,IAAf,EADL;AAELwM,QAAAA,QAAQ,EAAItC,GAAG,IAAIA,GAAG,CAACnC,YAAJ,EAAR,GAA8BmC,GAAG,CAACsC,QAAJ,CAAa,KAAKvI,QAAlB,CAA9B,GAA4DqL;AAFlE,OAAP;AAID;;;WAED,uBAAcE,QAAd,EAAwB;AACtB,UAAIA,QAAQ,CAACD,QAAT,KAAsB,IAA1B,EAAgC;AAC9B,aAAKF,SAAL,CAAerP,IAAf,CAAoBwP,QAAQ,CAACD,QAA7B;AACD;;AACD,UAAIC,QAAQ,CAAChD,QAAT,KAAsB,IAA1B,EAAgC;AAC9ByC,QAAAA,wBAAA,CAAyB,KAAKhL,QAA9B,EAAwCuL,QAAQ,CAAChD,QAAjD,EAA2Dne,MAA3D;AACD;AACF;AAED;AACF;AACA;AACA;AACA;;;;WACE,kBAAS;AACP;AACA,UAAI,KAAKghB,SAAL,CAAerP,IAAf,OAA0B,KAAKmP,KAAL,CAAW,KAAKC,WAAhB,EAA6BG,QAA3D,EAAqE;AACnE,aAAKE,UAAL;AACD,OAJM,CAMP;;;AACA,WAAKL,WAAL,GAAmB,CAAnB,CAPO,CASP;;AACA,WAAKM,aAAL,CAAmB,KAAKP,KAAL,CAAW,KAAKC,WAAhB,CAAnB;AACD;AAED;AACF;AACA;AACA;;;;WACE,kBAAS;AACP;AACA,WAAKD,KAAL,GAAa,EAAb,CAFO,CAIP;;AACA,WAAKC,WAAL,GAAmB,CAAC,CAApB,CALO,CAOP;;AACA,WAAKK,UAAL;AACD;AAED;AACF;AACA;AACA;;;;WACE,iBAAQ;AACN;AACA,WAAKN,KAAL,GAAa,EAAb,CAFM,CAIN;;AACA,WAAKC,WAAL,GAAmB,CAAC,CAApB,CALM,CAON;;AACA,WAAKC,SAAL,CAAerP,IAAf,CAAoB,EAApB,EARM,CAUN;;AACA,WAAKyP,UAAL;AACD;AAED;AACF;AACA;;;;WACE,gBAAO;AACL;AACA,UAAI,KAAKJ,SAAL,CAAerP,IAAf,OAA0B,KAAKmP,KAAL,CAAW,KAAKC,WAAhB,EAA6BG,QAA3D,EAAqE;AACnE,aAAKE,UAAL;AACD;;AAED,UAAI,KAAKL,WAAL,GAAmB,CAAvB,EAA0B;AACxB,aAAKA,WAAL;AACA,aAAKM,aAAL,CAAmB,KAAKP,KAAL,CAAW,KAAKC,WAAhB,CAAnB;AACD;AACF;AAED;AACF;AACA;;;;WACE,gBAAO;AACL,UAAI,KAAKD,KAAL,CAAWpa,MAAX,GAAoB,CAApB,GAAwB,KAAKqa,WAAjC,EAA8C;AAC5C,aAAKA,WAAL;AACA,aAAKM,aAAL,CAAmB,KAAKP,KAAL,CAAW,KAAKC,WAAhB,CAAnB;AACD;AACF;AAED;AACF;AACA;;;;WACE,sBAAa;AACX,WAAKA,WAAL,GADW,CAGX;;AACA,UAAI,KAAKD,KAAL,CAAWpa,MAAX,GAAoB,KAAKqa,WAA7B,EAA0C;AACxC,aAAKD,KAAL,GAAa,KAAKA,KAAL,CAAWla,KAAX,CAAiB,CAAjB,EAAoB,KAAKma,WAAzB,CAAb;AACD,OANU,CAQX;;;AACA,WAAKD,KAAL,CAAW5Y,IAAX,CAAgB,KAAKoZ,YAAL,EAAhB,EATW,CAWX;;AACA,UAAI,KAAKR,KAAL,CAAWpa,MAAX,GAAoB,KAAK3F,OAAL,CAAahD,OAAb,CAAqBwjB,YAA7C,EAA2D;AACzD,aAAKT,KAAL,CAAWU,KAAX;AACA,aAAKT,WAAL,IAAoB,CAApB;AACD;AACF;;;;;;;;;;;;;;AC7HH;AACA;AACA;AACA;;IAEqBU;;;;;;;;AACnB;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACE,uBAAUC,IAAV,EAAgBC,aAAhB,EAA+B;AAC7B,UAAMha,MAAM,GAAG,EAAf;AACAhO,MAAAA,8BAAA,CAAOgoB,aAAP,EAAsB,UAAC3a,GAAD,EAAM4a,YAAN,EAAuB;AAC3Cja,QAAAA,MAAM,CAACia,YAAD,CAAN,GAAuBF,IAAI,CAACjB,GAAL,CAASmB,YAAT,CAAvB;AACD,OAFD;AAGA,aAAOja,MAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,kBAAS6J,KAAT,EAAgB;AACd,UAAMqQ,UAAU,GAAG,CAAC,aAAD,EAAgB,WAAhB,EAA6B,YAA7B,EAA2C,iBAA3C,EAA8D,aAA9D,CAAnB;AACA,UAAMC,SAAS,GAAG,KAAKC,SAAL,CAAevQ,KAAf,EAAsBqQ,UAAtB,KAAqC,EAAvD;AAEA,UAAMG,QAAQ,GAAGxQ,KAAK,CAAC,CAAD,CAAL,CAAStU,KAAT,CAAe8kB,QAAf,IAA2BF,SAAS,CAAC,WAAD,CAArD;AAEAA,MAAAA,SAAS,CAAC,WAAD,CAAT,GAAyBG,QAAQ,CAACD,QAAD,EAAW,EAAX,CAAjC;AACAF,MAAAA,SAAS,CAAC,gBAAD,CAAT,GAA8BE,QAAQ,CAACjQ,KAAT,CAAe,UAAf,CAA9B;AAEA,aAAO+P,SAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,mBAAUjG,GAAV,EAAeiG,SAAf,EAA0B;AACxBnoB,MAAAA,8BAAA,CAAOkiB,GAAG,CAAC5P,KAAJ,CAAU6H,UAAV,EAAsB;AAC3BuH,QAAAA,eAAe,EAAE;AADU,OAAtB,CAAP,EAEI,UAACrU,GAAD,EAAMkV,IAAN,EAAe;AACjBviB,QAAAA,yBAAC,CAACuiB,IAAD,CAAD,CAAQuE,GAAR,CAAYqB,SAAZ;AACD,OAJD;AAKD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,oBAAWjG,GAAX,EAAgB9d,OAAhB,EAAyB;AACvB8d,MAAAA,GAAG,GAAGA,GAAG,CAAC7L,SAAJ,EAAN;AAEA,UAAM/G,QAAQ,GAAIlL,OAAO,IAAIA,OAAO,CAACkL,QAApB,IAAiC,MAAlD;AACA,UAAMiZ,oBAAoB,GAAG,CAAC,EAAEnkB,OAAO,IAAIA,OAAO,CAACmkB,oBAArB,CAA9B;AACA,UAAMC,mBAAmB,GAAG,CAAC,EAAEpkB,OAAO,IAAIA,OAAO,CAACokB,mBAArB,CAA7B;;AAEA,UAAItG,GAAG,CAACV,WAAJ,EAAJ,EAAuB;AACrB,eAAO,CAACU,GAAG,CAACU,UAAJ,CAAezI,UAAA,CAAW7K,QAAX,CAAf,CAAD,CAAP;AACD;;AAED,UAAIlC,IAAI,GAAG+M,sBAAA,CAAuB7K,QAAvB,CAAX;AACA,UAAMgD,KAAK,GAAG4P,GAAG,CAAC5P,KAAJ,CAAU6H,UAAV,EAAsB;AAClCwH,QAAAA,aAAa,EAAE;AADmB,OAAtB,EAEX/V,GAFW,CAEP,UAACsL,IAAD,EAAU;AACf,eAAOiD,uBAAA,CAAwBjD,IAAxB,EAA8B9J,IAA9B,KAAuC+M,QAAA,CAASjD,IAAT,EAAe5H,QAAf,CAA9C;AACD,OAJa,CAAd;;AAMA,UAAIiZ,oBAAJ,EAA0B;AACxB,YAAIC,mBAAJ,EAAyB;AACvB,cAAMC,YAAY,GAAGvG,GAAG,CAAC5P,KAAJ,EAArB,CADuB,CAEvB;;AACAlF,UAAAA,IAAI,GAAGnB,QAAA,CAASmB,IAAT,EAAe,UAAC8B,IAAD,EAAU;AAC9B,mBAAOjL,cAAA,CAAewkB,YAAf,EAA6BvZ,IAA7B,CAAP;AACD,WAFM,CAAP;AAGD;;AAED,eAAOoD,KAAK,CAAC1G,GAAN,CAAU,UAACsD,IAAD,EAAU;AACzB,cAAMiC,QAAQ,GAAGgJ,uBAAA,CAAwBjL,IAAxB,EAA8B9B,IAA9B,CAAjB;AACA,cAAMR,IAAI,GAAG3I,UAAA,CAAWkN,QAAX,CAAb;AACA,cAAMuX,KAAK,GAAGzkB,UAAA,CAAWkN,QAAX,CAAd;AACAnR,UAAAA,8BAAA,CAAO0oB,KAAP,EAAc,UAACrb,GAAD,EAAMsb,IAAN,EAAe;AAC3BxO,YAAAA,oBAAA,CAAqBvN,IAArB,EAA2B+b,IAAI,CAACpX,UAAhC;AACA4I,YAAAA,UAAA,CAAWwO,IAAX;AACD,WAHD;AAIA,iBAAO1kB,UAAA,CAAWkN,QAAX,CAAP;AACD,SATM,CAAP;AAUD,OAnBD,MAmBO;AACL,eAAOmB,KAAP;AACD;AACF;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,iBAAQ4P,GAAR,EAAa;AACX,UAAM0G,KAAK,GAAG5oB,yBAAC,CAAC,CAACma,aAAA,CAAc+H,GAAG,CAACvC,EAAlB,CAAD,GAAyBuC,GAAG,CAACvC,EAAJ,CAAO/N,UAAhC,GAA6CsQ,GAAG,CAACvC,EAAlD,CAAf;AACA,UAAIwI,SAAS,GAAG,KAAKU,QAAL,CAAcD,KAAd,CAAhB,CAFW,CAIX;AACA;;AACA,UAAI;AACFT,QAAAA,SAAS,GAAGnoB,gCAAA,CAASmoB,SAAT,EAAoB;AAC9B,uBAAajhB,QAAQ,CAAC4hB,iBAAT,CAA2B,MAA3B,IAAqC,MAArC,GAA8C,QAD7B;AAE9B,yBAAe5hB,QAAQ,CAAC4hB,iBAAT,CAA2B,QAA3B,IAAuC,QAAvC,GAAkD,QAFnC;AAG9B,4BAAkB5hB,QAAQ,CAAC4hB,iBAAT,CAA2B,WAA3B,IAA0C,WAA1C,GAAwD,QAH5C;AAI9B,4BAAkB5hB,QAAQ,CAAC4hB,iBAAT,CAA2B,WAA3B,IAA0C,WAA1C,GAAwD,QAJ5C;AAK9B,8BAAoB5hB,QAAQ,CAAC4hB,iBAAT,CAA2B,aAA3B,IAA4C,aAA5C,GAA4D,QALlD;AAM9B,gCAAsB5hB,QAAQ,CAAC4hB,iBAAT,CAA2B,eAA3B,IAA8C,eAA9C,GAAgE,QANxD;AAO9B,yBAAe5hB,QAAQ,CAAC6hB,iBAAT,CAA2B,UAA3B,KAA0CZ,SAAS,CAAC,aAAD;AAPpC,SAApB,CAAZ;AASD,OAVD,CAUE,OAAO/E,CAAP,EAAU,CACV;AACD,OAlBU,CAoBX;;;AACA,UAAI,CAAClB,GAAG,CAACjC,QAAJ,EAAL,EAAqB;AACnBkI,QAAAA,SAAS,CAAC,YAAD,CAAT,GAA0B,MAA1B;AACD,OAFD,MAEO;AACL,YAAMa,YAAY,GAAG,CAAC,QAAD,EAAW,MAAX,EAAmB,mBAAnB,EAAwC,QAAxC,CAArB;AACA,YAAMC,WAAW,GAAGD,YAAY,CAACvgB,OAAb,CAAqB0f,SAAS,CAAC,iBAAD,CAA9B,IAAqD,CAAC,CAA1E;AACAA,QAAAA,SAAS,CAAC,YAAD,CAAT,GAA0Bc,WAAW,GAAG,WAAH,GAAiB,SAAtD;AACD;;AAED,UAAM1G,IAAI,GAAGpI,YAAA,CAAa+H,GAAG,CAACvC,EAAjB,EAAqBxF,UAArB,CAAb;;AACA,UAAIoI,IAAI,IAAIA,IAAI,CAAChf,KAAL,CAAW,aAAX,CAAZ,EAAuC;AACrC4kB,QAAAA,SAAS,CAAC,aAAD,CAAT,GAA2B5F,IAAI,CAAChf,KAAL,CAAW2lB,UAAtC;AACD,OAFD,MAEO;AACL,YAAMA,UAAU,GAAGZ,QAAQ,CAACH,SAAS,CAAC,aAAD,CAAV,EAA2B,EAA3B,CAAR,GAAyCG,QAAQ,CAACH,SAAS,CAAC,WAAD,CAAV,EAAyB,EAAzB,CAApE;AACAA,QAAAA,SAAS,CAAC,aAAD,CAAT,GAA2Be,UAAU,CAACC,OAAX,CAAmB,CAAnB,CAA3B;AACD;;AAEDhB,MAAAA,SAAS,CAACiB,MAAV,GAAmBlH,GAAG,CAAChC,UAAJ,MAAoB/F,YAAA,CAAa+H,GAAG,CAACvC,EAAjB,EAAqBxF,YAArB,CAAvC;AACAgO,MAAAA,SAAS,CAACpW,SAAV,GAAsBoI,gBAAA,CAAiB+H,GAAG,CAACvC,EAArB,EAAyBxF,cAAzB,CAAtB;AACAgO,MAAAA,SAAS,CAAClB,KAAV,GAAkB/E,GAAlB;AAEA,aAAOiG,SAAP;AACD;;;;;;;;;;;;;;AC/JH;AACA;AACA;AACA;AACA;;IAEqBkB;;;;;;;;AACnB;AACF;AACA;AACE,+BAAkBpN,QAAlB,EAA4B;AAC1B,WAAKqN,UAAL,CAAgB,IAAhB,EAAsBrN,QAAtB;AACD;AAED;AACF;AACA;;;;WACE,6BAAoBA,QAApB,EAA8B;AAC5B,WAAKqN,UAAL,CAAgB,IAAhB,EAAsBrN,QAAtB;AACD;AAED;AACF;AACA;;;;WACE,gBAAOA,QAAP,EAAiB;AAAA;;AACf,UAAMiG,GAAG,GAAG+E,YAAA,CAAahL,QAAb,EAAuBuG,sBAAvB,EAAZ;AAEA,UAAMa,KAAK,GAAGnB,GAAG,CAAC5P,KAAJ,CAAU6H,UAAV,EAAsB;AAAEuH,QAAAA,eAAe,EAAE;AAAnB,OAAtB,CAAd;AACA,UAAM6H,UAAU,GAAGtlB,eAAA,CAAgBof,KAAhB,EAAuBpX,SAAA,CAAU,YAAV,CAAvB,CAAnB;AAEAjM,MAAAA,8BAAA,CAAOupB,UAAP,EAAmB,UAAClc,GAAD,EAAMgW,KAAN,EAAgB;AACjC,YAAMzW,IAAI,GAAG3I,UAAA,CAAWof,KAAX,CAAb;;AACA,YAAIlJ,QAAA,CAASvN,IAAT,CAAJ,EAAoB;AAClB,cAAM4c,YAAY,GAAG,KAAI,CAACC,QAAL,CAAc7c,IAAI,CAACqE,eAAnB,CAArB;;AACA,cAAIuY,YAAJ,EAAkB;AAChBnG,YAAAA,KAAK,CACFzX,GADH,CACO,UAAA2W,IAAI;AAAA,qBAAIiH,YAAY,CAACvW,WAAb,CAAyBsP,IAAzB,CAAJ;AAAA,aADX;AAED,WAHD,MAGO;AACL,iBAAI,CAACmH,QAAL,CAAcrG,KAAd,EAAqBzW,IAAI,CAACgF,UAAL,CAAgBtC,QAArC;;AACA+T,YAAAA,KAAK,CACFzX,GADH,CACO,UAAC2W,IAAD;AAAA,qBAAUA,IAAI,CAAC3Q,UAAf;AAAA,aADP,EAEGhG,GAFH,CAEO,UAAC2W,IAAD;AAAA,qBAAU,KAAI,CAACoH,gBAAL,CAAsBpH,IAAtB,CAAV;AAAA,aAFP;AAGD;AACF,SAXD,MAWO;AACLviB,UAAAA,8BAAA,CAAOqjB,KAAP,EAAc,UAAChW,GAAD,EAAMkV,IAAN,EAAe;AAC3BviB,YAAAA,yBAAC,CAACuiB,IAAD,CAAD,CAAQuE,GAAR,CAAY,YAAZ,EAA0B,UAACzZ,GAAD,EAAM0K,GAAN,EAAc;AACtC,qBAAO,CAACuQ,QAAQ,CAACvQ,GAAD,EAAM,EAAN,CAAR,IAAqB,CAAtB,IAA2B,EAAlC;AACD,aAFD;AAGD,WAJD;AAKD;AACF,OApBD;AAsBAmK,MAAAA,GAAG,CAAC7b,MAAJ;AACD;AAED;AACF;AACA;;;;WACE,iBAAQ4V,QAAR,EAAkB;AAAA;;AAChB,UAAMiG,GAAG,GAAG+E,YAAA,CAAahL,QAAb,EAAuBuG,sBAAvB,EAAZ;AAEA,UAAMa,KAAK,GAAGnB,GAAG,CAAC5P,KAAJ,CAAU6H,UAAV,EAAsB;AAAEuH,QAAAA,eAAe,EAAE;AAAnB,OAAtB,CAAd;AACA,UAAM6H,UAAU,GAAGtlB,eAAA,CAAgBof,KAAhB,EAAuBpX,SAAA,CAAU,YAAV,CAAvB,CAAnB;AAEAjM,MAAAA,8BAAA,CAAOupB,UAAP,EAAmB,UAAClc,GAAD,EAAMgW,KAAN,EAAgB;AACjC,YAAMzW,IAAI,GAAG3I,UAAA,CAAWof,KAAX,CAAb;;AACA,YAAIlJ,QAAA,CAASvN,IAAT,CAAJ,EAAoB;AAClB,gBAAI,CAACgd,WAAL,CAAiB,CAACvG,KAAD,CAAjB;AACD,SAFD,MAEO;AACLrjB,UAAAA,8BAAA,CAAOqjB,KAAP,EAAc,UAAChW,GAAD,EAAMkV,IAAN,EAAe;AAC3BviB,YAAAA,yBAAC,CAACuiB,IAAD,CAAD,CAAQuE,GAAR,CAAY,YAAZ,EAA0B,UAACzZ,GAAD,EAAM0K,GAAN,EAAc;AACtCA,cAAAA,GAAG,GAAIuQ,QAAQ,CAACvQ,GAAD,EAAM,EAAN,CAAR,IAAqB,CAA5B;AACA,qBAAOA,GAAG,GAAG,EAAN,GAAWA,GAAG,GAAG,EAAjB,GAAsB,EAA7B;AACD,aAHD;AAID,WALD;AAMD;AACF,OAZD;AAcAmK,MAAAA,GAAG,CAAC7b,MAAJ;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,oBAAWwjB,QAAX,EAAqB5N,QAArB,EAA+B;AAAA;;AAC7B,UAAMiG,GAAG,GAAG+E,YAAA,CAAahL,QAAb,EAAuBuG,sBAAvB,EAAZ;AAEA,UAAIa,KAAK,GAAGnB,GAAG,CAAC5P,KAAJ,CAAU6H,UAAV,EAAsB;AAAEuH,QAAAA,eAAe,EAAE;AAAnB,OAAtB,CAAZ;AACA,UAAM8C,QAAQ,GAAGtC,GAAG,CAAC4H,YAAJ,CAAiBzG,KAAjB,CAAjB;AACA,UAAMkG,UAAU,GAAGtlB,eAAA,CAAgBof,KAAhB,EAAuBpX,SAAA,CAAU,YAAV,CAAvB,CAAnB,CAL6B,CAO7B;;AACA,UAAIhI,UAAA,CAAWof,KAAX,EAAkBlJ,cAAlB,CAAJ,EAAuC;AACrC,YAAI4P,YAAY,GAAG,EAAnB;AACA/pB,QAAAA,8BAAA,CAAOupB,UAAP,EAAmB,UAAClc,GAAD,EAAMgW,KAAN,EAAgB;AACjC0G,UAAAA,YAAY,GAAGA,YAAY,CAACzH,MAAb,CAAoB,MAAI,CAACoH,QAAL,CAAcrG,KAAd,EAAqBwG,QAArB,CAApB,CAAf;AACD,SAFD;AAGAxG,QAAAA,KAAK,GAAG0G,YAAR,CALqC,CAMvC;AACC,OAPD,MAOO;AACL,YAAMC,SAAS,GAAG9H,GAAG,CAAC5P,KAAJ,CAAU6H,UAAV,EAAsB;AACtCuH,UAAAA,eAAe,EAAE;AADqB,SAAtB,EAEfxP,MAFe,CAER,UAAC+X,QAAD,EAAc;AACtB,iBAAO,CAACjqB,kCAAA,CAAWiqB,QAAX,EAAqBJ,QAArB,CAAR;AACD,SAJiB,CAAlB;;AAMA,YAAIG,SAAS,CAACjd,MAAd,EAAsB;AACpB/M,UAAAA,8BAAA,CAAOgqB,SAAP,EAAkB,UAAC3c,GAAD,EAAM4c,QAAN,EAAmB;AACnC9P,YAAAA,WAAA,CAAY8P,QAAZ,EAAsBJ,QAAtB;AACD,WAFD;AAGD,SAJD,MAIO;AACLxG,UAAAA,KAAK,GAAG,KAAKuG,WAAL,CAAiBL,UAAjB,EAA6B,IAA7B,CAAR;AACD;AACF;;AAEDtC,MAAAA,4BAAA,CAA6BzC,QAA7B,EAAuCnB,KAAvC,EAA8Chd,MAA9C;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,kBAASgd,KAAT,EAAgBwG,QAAhB,EAA0B;AACxB,UAAMjd,IAAI,GAAG3I,UAAA,CAAWof,KAAX,CAAb;AACA,UAAMvW,IAAI,GAAG7I,UAAA,CAAWof,KAAX,CAAb;AAEA,UAAM6G,QAAQ,GAAG/P,UAAA,CAAWvN,IAAI,CAACqE,eAAhB,KAAoCrE,IAAI,CAACqE,eAA1D;AACA,UAAMkZ,QAAQ,GAAGhQ,UAAA,CAAWrN,IAAI,CAACkE,WAAhB,KAAgClE,IAAI,CAACkE,WAAtD;AAEA,UAAMiZ,QAAQ,GAAGC,QAAQ,IAAI/P,eAAA,CAAgBA,UAAA,CAAW0P,QAAQ,IAAI,IAAvB,CAAhB,EAA8C/c,IAA9C,CAA7B,CAPwB,CASxB;;AACAuW,MAAAA,KAAK,GAAGA,KAAK,CAACzX,GAAN,CAAU,UAAC2W,IAAD,EAAU;AAC1B,eAAOpI,cAAA,CAAeoI,IAAf,IAAuBpI,WAAA,CAAYoI,IAAZ,EAAkB,IAAlB,CAAvB,GAAiDA,IAAxD;AACD,OAFO,CAAR,CAVwB,CAcxB;;AACApI,MAAAA,oBAAA,CAAqB8P,QAArB,EAA+B5G,KAA/B;;AAEA,UAAI8G,QAAJ,EAAc;AACZhQ,QAAAA,oBAAA,CAAqB8P,QAArB,EAA+BhmB,UAAA,CAAWkmB,QAAQ,CAAC5Y,UAApB,CAA/B;AACA4I,QAAAA,UAAA,CAAWgQ,QAAX;AACD;;AAED,aAAO9G,KAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,qBAAYkG,UAAZ,EAAwBa,eAAxB,EAAyC;AAAA;;AACvC,UAAIC,aAAa,GAAG,EAApB;AAEArqB,MAAAA,8BAAA,CAAOupB,UAAP,EAAmB,UAAClc,GAAD,EAAMgW,KAAN,EAAgB;AACjC,YAAMzW,IAAI,GAAG3I,UAAA,CAAWof,KAAX,CAAb;AACA,YAAMvW,IAAI,GAAG7I,UAAA,CAAWof,KAAX,CAAb;AAEA,YAAMiH,QAAQ,GAAGF,eAAe,GAAGjQ,gBAAA,CAAiBvN,IAAjB,EAAuBuN,UAAvB,CAAH,GAAwCvN,IAAI,CAACgF,UAA7E;AACA,YAAM2Y,UAAU,GAAGD,QAAQ,CAAC1Y,UAA5B;;AAEA,YAAI0Y,QAAQ,CAAC1Y,UAAT,CAAoBtC,QAApB,KAAiC,IAArC,EAA2C;AACzC+T,UAAAA,KAAK,CAACzX,GAAN,CAAU,UAAA2W,IAAI,EAAI;AAChB,gBAAMiI,OAAO,GAAG,MAAI,CAACC,gBAAL,CAAsBlI,IAAtB,CAAhB;;AAEA,gBAAIgI,UAAU,CAACvZ,WAAf,EAA4B;AAC1BuZ,cAAAA,UAAU,CAAC3Y,UAAX,CAAsBoB,YAAtB,CACEuP,IADF,EAEEgI,UAAU,CAACvZ,WAFb;AAID,aALD,MAKO;AACLuZ,cAAAA,UAAU,CAAC3Y,UAAX,CAAsBqB,WAAtB,CAAkCsP,IAAlC;AACD;;AAED,gBAAIiI,OAAO,CAACzd,MAAZ,EAAoB;AAClB,oBAAI,CAAC2c,QAAL,CAAcc,OAAd,EAAuBF,QAAQ,CAAChb,QAAhC;;AACAiT,cAAAA,IAAI,CAACtP,WAAL,CAAiBuX,OAAO,CAAC,CAAD,CAAP,CAAW5Y,UAA5B;AACD;AACF,WAhBD;;AAkBA,cAAI0Y,QAAQ,CAACI,QAAT,CAAkB3d,MAAlB,KAA6B,CAAjC,EAAoC;AAClCwd,YAAAA,UAAU,CAACjT,WAAX,CAAuBgT,QAAvB;AACD;;AAED,cAAIC,UAAU,CAAChZ,UAAX,CAAsBxE,MAAtB,KAAiC,CAArC,EAAwC;AACtCwd,YAAAA,UAAU,CAAC3Y,UAAX,CAAsB0F,WAAtB,CAAkCiT,UAAlC;AACD;AACF,SA1BD,MA0BO;AACL,cAAMI,QAAQ,GAAGL,QAAQ,CAAC/Y,UAAT,CAAoBxE,MAApB,GAA6B,CAA7B,GAAiCoN,aAAA,CAAcmQ,QAAd,EAAwB;AACxEpb,YAAAA,IAAI,EAAEpC,IAAI,CAAC8E,UAD6D;AAExE8B,YAAAA,MAAM,EAAEyG,YAAA,CAAarN,IAAb,IAAqB;AAF2C,WAAxB,EAG/C;AACDoJ,YAAAA,sBAAsB,EAAE;AADvB,WAH+C,CAAjC,GAKZ,IALL;AAOA,cAAM0U,UAAU,GAAGzQ,aAAA,CAAcmQ,QAAd,EAAwB;AACzCpb,YAAAA,IAAI,EAAEtC,IAAI,CAACgF,UAD8B;AAEzC8B,YAAAA,MAAM,EAAEyG,YAAA,CAAavN,IAAb;AAFiC,WAAxB,EAGhB;AACDsJ,YAAAA,sBAAsB,EAAE;AADvB,WAHgB,CAAnB;AAOAmN,UAAAA,KAAK,GAAG+G,eAAe,GAAGjQ,kBAAA,CAAmByQ,UAAnB,EAA+BzQ,QAA/B,CAAH,GACnBlW,UAAA,CAAW2mB,UAAU,CAACrZ,UAAtB,EAAkCW,MAAlC,CAAyCiI,QAAzC,CADJ,CAfK,CAkBL;;AACA,cAAIiQ,eAAe,IAAI,CAACjQ,UAAA,CAAWmQ,QAAQ,CAAC1Y,UAApB,CAAxB,EAAyD;AACvDyR,YAAAA,KAAK,GAAGA,KAAK,CAACzX,GAAN,CAAU,UAAC2W,IAAD,EAAU;AAC1B,qBAAOpI,WAAA,CAAYoI,IAAZ,EAAkB,GAAlB,CAAP;AACD,aAFO,CAAR;AAGD;;AAEDviB,UAAAA,8BAAA,CAAOiE,UAAA,CAAWof,KAAX,EAAkBxN,OAAlB,EAAP,EAAoC,UAACxI,GAAD,EAAMkV,IAAN,EAAe;AACjDpI,YAAAA,eAAA,CAAgBoI,IAAhB,EAAsB+H,QAAtB;AACD,WAFD,EAzBK,CA6BL;;AACA,cAAMO,SAAS,GAAG5mB,aAAA,CAAc,CAACqmB,QAAD,EAAWM,UAAX,EAAuBD,QAAvB,CAAd,CAAlB;AACA3qB,UAAAA,8BAAA,CAAO6qB,SAAP,EAAkB,UAACxd,GAAD,EAAMyd,QAAN,EAAmB;AACnC,gBAAMC,SAAS,GAAG,CAACD,QAAD,EAAWxI,MAAX,CAAkBnI,kBAAA,CAAmB2Q,QAAnB,EAA6B3Q,UAA7B,CAAlB,CAAlB;AACAna,YAAAA,8BAAA,CAAO+qB,SAAS,CAAClV,OAAV,EAAP,EAA4B,UAACxI,GAAD,EAAM4c,QAAN,EAAmB;AAC7C,kBAAI,CAAC9P,cAAA,CAAe8P,QAAf,CAAL,EAA+B;AAC7B9P,gBAAAA,UAAA,CAAW8P,QAAX,EAAqB,IAArB;AACD;AACF,aAJD;AAKD,WAPD;AAQD;;AAEDI,QAAAA,aAAa,GAAGA,aAAa,CAAC/H,MAAd,CAAqBe,KAArB,CAAhB;AACD,OA3ED;AA6EA,aAAOgH,aAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBnb,IAAjB,EAAuB;AACrB,aAAOA,IAAI,CAAC+B,eAAL,GACHkJ,oBAAA,CAAqBjL,IAAI,CAAC+B,eAA1B,EAA2C,CAAC/B,IAAD,CAA3C,CADG,GAEH,KAAKwa,QAAL,CAAc,CAACxa,IAAD,CAAd,EAAsB,IAAtB,CAFJ;AAGD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,kBAASA,IAAT,EAAe;AACb,aAAOA,IAAI,GACPjL,UAAA,CAAWiL,IAAI,CAACwb,QAAhB,EAA0B,UAAAnX,KAAK;AAAA,eAAI,CAAC,IAAD,EAAO,IAAP,EAAa9K,OAAb,CAAqB8K,KAAK,CAACjE,QAA3B,IAAuC,CAAC,CAA5C;AAAA,OAA/B,CADO,GAEP,IAFJ;AAGD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,0BAAiBJ,IAAjB,EAAuB;AACrB,UAAMiC,QAAQ,GAAG,EAAjB;;AACA,aAAOjC,IAAI,CAAC8B,WAAZ,EAAyB;AACvBG,QAAAA,QAAQ,CAAC5C,IAAT,CAAcW,IAAI,CAAC8B,WAAnB;AACA9B,QAAAA,IAAI,GAAGA,IAAI,CAAC8B,WAAZ;AACD;;AACD,aAAOG,QAAP;AACD;;;;;;;;;;;;;;AC5RH;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;IACqB6Z;AACnB,kBAAY5jB,OAAZ,EAAqB;AAAA;;AACnB;AACA,SAAK6jB,MAAL,GAAc,IAAI5B,MAAJ,EAAd;AACA,SAAKjlB,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;;WACE,mBAAU8d,GAAV,EAAegJ,OAAf,EAAwB;AACtB,UAAMC,GAAG,GAAGhR,cAAA,CAAe,IAAIiR,KAAJ,CAAUF,OAAO,GAAG,CAApB,EAAuBnf,IAAvB,CAA4BoO,aAA5B,CAAf,CAAZ;AACA+H,MAAAA,GAAG,GAAGA,GAAG,CAACO,cAAJ,EAAN;AACAP,MAAAA,GAAG,CAACU,UAAJ,CAAeuI,GAAf,EAAoB,IAApB;AAEAjJ,MAAAA,GAAG,GAAG+E,YAAA,CAAakE,GAAb,EAAkBD,OAAlB,CAAN;AACAhJ,MAAAA,GAAG,CAAC7b,MAAJ;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,yBAAgB4V,QAAhB,EAA0BiG,GAA1B,EAA+B;AAC7BA,MAAAA,GAAG,GAAGA,GAAG,IAAI+E,YAAA,CAAahL,QAAb,CAAb,CAD6B,CAG7B;;AACAiG,MAAAA,GAAG,GAAGA,GAAG,CAACO,cAAJ,EAAN,CAJ6B,CAM7B;;AACAP,MAAAA,GAAG,GAAGA,GAAG,CAACM,sBAAJ,EAAN,CAP6B,CAS7B;;AACA,UAAM3L,SAAS,GAAGsD,YAAA,CAAa+H,GAAG,CAACvC,EAAjB,EAAqBxF,UAArB,CAAlB;AAEA,UAAIkR,QAAJ,CAZ6B,CAa7B;;AACA,UAAIxU,SAAJ,EAAe;AACb;AACA,YAAIsD,QAAA,CAAStD,SAAT,MAAwBsD,WAAA,CAAYtD,SAAZ,KAA0BsD,uBAAA,CAAwBtD,SAAxB,CAAlD,CAAJ,EAA2F;AACzF;AACA,eAAKoU,MAAL,CAAY3B,UAAZ,CAAuBzS,SAAS,CAACjF,UAAV,CAAqBtC,QAA5C;AACA;AACD,SAJD,MAIO;AACL,cAAI7L,UAAU,GAAG,IAAjB;;AACA,cAAI,KAAKW,OAAL,CAAaknB,uBAAb,KAAyC,CAA7C,EAAgD;AAC9C7nB,YAAAA,UAAU,GAAG0W,YAAA,CAAatD,SAAb,EAAwBsD,gBAAxB,CAAb;AACD,WAFD,MAEO,IAAI,KAAK/V,OAAL,CAAaknB,uBAAb,KAAyC,CAA7C,EAAgD;AACrD7nB,YAAAA,UAAU,GAAG0W,gBAAA,CAAiBtD,SAAjB,EAA4BsD,gBAA5B,CAAb;AACD;;AAED,cAAI1W,UAAJ,EAAgB;AACd;AACA4nB,YAAAA,QAAQ,GAAGrrB,yBAAC,CAACma,aAAD,CAAD,CAAiB,CAAjB,CAAX,CAFc,CAGd;AACA;;AACA,gBAAIA,oBAAA,CAAqB+H,GAAG,CAACT,aAAJ,EAArB,KAA6CtH,QAAA,CAAS+H,GAAG,CAACvC,EAAJ,CAAO3O,WAAhB,CAAjD,EAA+E;AAC7EhR,cAAAA,yBAAC,CAACkiB,GAAG,CAACvC,EAAJ,CAAO3O,WAAR,CAAD,CAAsB7O,MAAtB;AACD;;AACD,gBAAMwJ,KAAK,GAAGwO,aAAA,CAAc1W,UAAd,EAA0Bye,GAAG,CAACT,aAAJ,EAA1B,EAA+C;AAAErL,cAAAA,oBAAoB,EAAE;AAAxB,aAA/C,CAAd;;AACA,gBAAIzK,KAAJ,EAAW;AACTA,cAAAA,KAAK,CAACiG,UAAN,CAAiBoB,YAAjB,CAA8BqY,QAA9B,EAAwC1f,KAAxC;AACD,aAFD,MAEO;AACLwO,cAAAA,eAAA,CAAgBkR,QAAhB,EAA0B5nB,UAA1B,EADK,CACkC;AACxC;AACF,WAdD,MAcO;AACL4nB,YAAAA,QAAQ,GAAGlR,aAAA,CAActD,SAAd,EAAyBqL,GAAG,CAACT,aAAJ,EAAzB,CAAX,CADK,CAGL;;AACA,gBAAI8J,YAAY,GAAGpR,kBAAA,CAAmBtD,SAAnB,EAA8BsD,iBAA9B,CAAnB;AACAoR,YAAAA,YAAY,GAAGA,YAAY,CAACjJ,MAAb,CAAoBnI,kBAAA,CAAmBkR,QAAnB,EAA6BlR,iBAA7B,CAApB,CAAf;AAEAna,YAAAA,8BAAA,CAAOurB,YAAP,EAAqB,UAACle,GAAD,EAAM+b,MAAN,EAAiB;AACpCjP,cAAAA,UAAA,CAAWiP,MAAX;AACD,aAFD,EAPK,CAWL;;AACA,gBAAI,CAACjP,aAAA,CAAckR,QAAd,KAA2BlR,SAAA,CAAUkR,QAAV,CAA3B,IAAkDlR,oBAAA,CAAqBkR,QAArB,CAAnD,KAAsFlR,WAAA,CAAYkR,QAAZ,CAA1F,EAAiH;AAC/GA,cAAAA,QAAQ,GAAGlR,WAAA,CAAYkR,QAAZ,EAAsB,GAAtB,CAAX;AACD;AACF;AACF,SA5CY,CA6Cf;;AACC,OA9CD,MA8CO;AACL,YAAM3c,IAAI,GAAGwT,GAAG,CAACvC,EAAJ,CAAOpO,UAAP,CAAkB2Q,GAAG,CAACtC,EAAtB,CAAb;AACAyL,QAAAA,QAAQ,GAAGrrB,yBAAC,CAACma,aAAD,CAAD,CAAiB,CAAjB,CAAX;;AACA,YAAIzL,IAAJ,EAAU;AACRwT,UAAAA,GAAG,CAACvC,EAAJ,CAAO3M,YAAP,CAAoBqY,QAApB,EAA8B3c,IAA9B;AACD,SAFD,MAEO;AACLwT,UAAAA,GAAG,CAACvC,EAAJ,CAAO1M,WAAP,CAAmBoY,QAAnB;AACD;AACF;;AAEDpE,MAAAA,YAAA,CAAaoE,QAAb,EAAuB,CAAvB,EAA0BjJ,SAA1B,GAAsC/b,MAAtC,GAA+CmlB,cAA/C,CAA8DvP,QAA9D;AACD;;;;;;;;;;;;;;ACnHH;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,IAAMwP,iBAAiB,GAAG,SAApBA,iBAAoB,CAASjW,UAAT,EAAqBkW,KAArB,EAA4B7lB,MAA5B,EAAoC8lB,QAApC,EAA8C;AACtE,MAAMC,WAAW,GAAG;AAAE,cAAU,CAAZ;AAAe,cAAU;AAAzB,GAApB;AACA,MAAMC,aAAa,GAAG,EAAtB;AACA,MAAMC,eAAe,GAAG,EAAxB,CAHsE,CAKtE;AACA;AACA;;AAEA;AACF;AACA;;AACE,WAASC,aAAT,GAAyB;AACvB,QAAI,CAACvW,UAAD,IAAe,CAACA,UAAU,CAACwW,OAA3B,IAAuCxW,UAAU,CAACwW,OAAX,CAAmBplB,WAAnB,OAAqC,IAArC,IAA6C4O,UAAU,CAACwW,OAAX,CAAmBplB,WAAnB,OAAqC,IAA7H,EAAoI;AAClI;AACA;AACD;;AACDglB,IAAAA,WAAW,CAACK,MAAZ,GAAqBzW,UAAU,CAAC0W,SAAhC;;AACA,QAAI,CAAC1W,UAAU,CAAC0I,aAAZ,IAA6B,CAAC1I,UAAU,CAAC0I,aAAX,CAAyB8N,OAAvD,IAAkExW,UAAU,CAAC0I,aAAX,CAAyB8N,OAAzB,CAAiCplB,WAAjC,OAAmD,IAAzH,EAA+H;AAC7H;AACA;AACD;;AACDglB,IAAAA,WAAW,CAACO,MAAZ,GAAqB3W,UAAU,CAAC0I,aAAX,CAAyBkO,QAA9C;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACE,WAASC,uBAAT,CAAiCD,QAAjC,EAA2CF,SAA3C,EAAsDI,OAAtD,EAA+DC,QAA/D,EAAyEC,SAAzE,EAAoFC,SAApF,EAA+FC,aAA/F,EAA8G;AAC5G,QAAMC,WAAW,GAAG;AAClB,iBAAWL,OADO;AAElB,kBAAYC,QAFM;AAGlB,mBAAaC,SAHK;AAIlB,mBAAaC,SAJK;AAKlB,mBAAaC;AALK,KAApB;;AAOA,QAAI,CAACb,aAAa,CAACO,QAAD,CAAlB,EAA8B;AAC5BP,MAAAA,aAAa,CAACO,QAAD,CAAb,GAA0B,EAA1B;AACD;;AACDP,IAAAA,aAAa,CAACO,QAAD,CAAb,CAAwBF,SAAxB,IAAqCS,WAArC;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACE,WAASC,aAAT,CAAuBC,mBAAvB,EAA4CC,YAA5C,EAA0DC,kBAA1D,EAA8EC,kBAA9E,EAAkG;AAChG,WAAO;AACL,kBAAYH,mBAAmB,CAACN,QAD3B;AAEL,gBAAUO,YAFL;AAGL,sBAAgB;AACd,oBAAYC,kBADE;AAEd,qBAAaC;AAFC;AAHX,KAAP;AAQD;AAED;AACF;AACA;AACA;AACA;AACA;;;AACE,WAASC,gBAAT,CAA0Bb,QAA1B,EAAoCF,SAApC,EAA+C;AAC7C,QAAI,CAACL,aAAa,CAACO,QAAD,CAAlB,EAA8B;AAC5B,aAAOF,SAAP;AACD;;AACD,QAAI,CAACL,aAAa,CAACO,QAAD,CAAb,CAAwBF,SAAxB,CAAL,EAAyC;AACvC,aAAOA,SAAP;AACD;;AAED,QAAIgB,YAAY,GAAGhB,SAAnB;;AACA,WAAOL,aAAa,CAACO,QAAD,CAAb,CAAwBc,YAAxB,CAAP,EAA8C;AAC5CA,MAAAA,YAAY;;AACZ,UAAI,CAACrB,aAAa,CAACO,QAAD,CAAb,CAAwBc,YAAxB,CAAL,EAA4C;AAC1C,eAAOA,YAAP;AACD;AACF;AACF;AAED;AACF;AACA;AACA;AACA;AACA;;;AACE,WAASC,oBAAT,CAA8BC,GAA9B,EAAmCC,IAAnC,EAAyC;AACvC,QAAMnB,SAAS,GAAGe,gBAAgB,CAACG,GAAG,CAAChB,QAAL,EAAeiB,IAAI,CAACnB,SAApB,CAAlC;AACA,QAAMoB,cAAc,GAAID,IAAI,CAACE,OAAL,GAAe,CAAvC;AACA,QAAMC,cAAc,GAAIH,IAAI,CAACI,OAAL,GAAe,CAAvC;AACA,QAAMC,kBAAkB,GAAIN,GAAG,CAAChB,QAAJ,KAAiBR,WAAW,CAACO,MAA7B,IAAuCkB,IAAI,CAACnB,SAAL,KAAmBN,WAAW,CAACK,MAAlG;AACAI,IAAAA,uBAAuB,CAACe,GAAG,CAAChB,QAAL,EAAeF,SAAf,EAA0BkB,GAA1B,EAA+BC,IAA/B,EAAqCG,cAArC,EAAqDF,cAArD,EAAqE,KAArE,CAAvB,CALuC,CAOvC;;AACA,QAAMK,aAAa,GAAGN,IAAI,CAACO,UAAL,CAAgBH,OAAhB,GAA0BnF,QAAQ,CAAC+E,IAAI,CAACO,UAAL,CAAgBH,OAAhB,CAAwB7V,KAAzB,EAAgC,EAAhC,CAAlC,GAAwE,CAA9F;;AACA,QAAI+V,aAAa,GAAG,CAApB,EAAuB;AACrB,WAAK,IAAIE,EAAE,GAAG,CAAd,EAAiBA,EAAE,GAAGF,aAAtB,EAAqCE,EAAE,EAAvC,EAA2C;AACzC,YAAMC,YAAY,GAAGV,GAAG,CAAChB,QAAJ,GAAeyB,EAApC;AACAE,QAAAA,gBAAgB,CAACD,YAAD,EAAe5B,SAAf,EAA0BmB,IAA1B,EAAgCK,kBAAhC,CAAhB;AACArB,QAAAA,uBAAuB,CAACyB,YAAD,EAAe5B,SAAf,EAA0BkB,GAA1B,EAA+BC,IAA/B,EAAqC,IAArC,EAA2CC,cAA3C,EAA2D,IAA3D,CAAvB;AACD;AACF,KAfsC,CAiBvC;;;AACA,QAAMU,aAAa,GAAGX,IAAI,CAACO,UAAL,CAAgBL,OAAhB,GAA0BjF,QAAQ,CAAC+E,IAAI,CAACO,UAAL,CAAgBL,OAAhB,CAAwB3V,KAAzB,EAAgC,EAAhC,CAAlC,GAAwE,CAA9F;;AACA,QAAIoW,aAAa,GAAG,CAApB,EAAuB;AACrB,WAAK,IAAIC,EAAE,GAAG,CAAd,EAAiBA,EAAE,GAAGD,aAAtB,EAAqCC,EAAE,EAAvC,EAA2C;AACzC,YAAMC,aAAa,GAAGjB,gBAAgB,CAACG,GAAG,CAAChB,QAAL,EAAgBF,SAAS,GAAG+B,EAA5B,CAAtC;AACAF,QAAAA,gBAAgB,CAACX,GAAG,CAAChB,QAAL,EAAe8B,aAAf,EAA8Bb,IAA9B,EAAoCK,kBAApC,CAAhB;AACArB,QAAAA,uBAAuB,CAACe,GAAG,CAAChB,QAAL,EAAe8B,aAAf,EAA8Bd,GAA9B,EAAmCC,IAAnC,EAAyCG,cAAzC,EAAyD,IAAzD,EAA+D,IAA/D,CAAvB;AACD;AACF;AACF;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;AACE,WAASO,gBAAT,CAA0B3B,QAA1B,EAAoCF,SAApC,EAA+CmB,IAA/C,EAAqDc,cAArD,EAAqE;AACnE,QAAI/B,QAAQ,KAAKR,WAAW,CAACO,MAAzB,IAAmCP,WAAW,CAACK,MAAZ,IAAsBoB,IAAI,CAACnB,SAA9D,IAA2EmB,IAAI,CAACnB,SAAL,IAAkBA,SAA7F,IAA0G,CAACiC,cAA/G,EAA+H;AAC7HvC,MAAAA,WAAW,CAACK,MAAZ;AACD;AACF;AAED;AACF;AACA;;;AACE,WAASmC,kBAAT,GAA8B;AAC5B,QAAMC,IAAI,GAAG1C,QAAQ,CAAC0C,IAAtB;;AACA,SAAK,IAAIjC,QAAQ,GAAG,CAApB,EAAuBA,QAAQ,GAAGiC,IAAI,CAACthB,MAAvC,EAA+Cqf,QAAQ,EAAvD,EAA2D;AACzD,UAAMkC,KAAK,GAAGD,IAAI,CAACjC,QAAD,CAAJ,CAAekC,KAA7B;;AACA,WAAK,IAAIpC,SAAS,GAAG,CAArB,EAAwBA,SAAS,GAAGoC,KAAK,CAACvhB,MAA1C,EAAkDmf,SAAS,EAA3D,EAA+D;AAC7DiB,QAAAA,oBAAoB,CAACkB,IAAI,CAACjC,QAAD,CAAL,EAAiBkC,KAAK,CAACpC,SAAD,CAAtB,CAApB;AACD;AACF;AACF;AAED;AACF;AACA;AACA;AACA;;;AACE,WAASqC,2BAAT,CAAqClB,IAArC,EAA2C;AACzC,YAAQ3B,KAAR;AACE,WAAKD,iBAAiB,CAACC,KAAlB,CAAwB8C,MAA7B;AACE,YAAInB,IAAI,CAACZ,SAAT,EAAoB;AAClB,iBAAOhB,iBAAiB,CAACqB,YAAlB,CAA+B2B,iBAAtC;AACD;;AACD;;AACF,WAAKhD,iBAAiB,CAACC,KAAlB,CAAwBgD,GAA7B;AACE,YAAI,CAACrB,IAAI,CAACsB,SAAN,IAAmBtB,IAAI,CAACb,SAA5B,EAAuC;AACrC,iBAAOf,iBAAiB,CAACqB,YAAlB,CAA+B8B,OAAtC;AACD,SAFD,MAEO,IAAIvB,IAAI,CAACb,SAAT,EAAoB;AACzB,iBAAOf,iBAAiB,CAACqB,YAAlB,CAA+B2B,iBAAtC;AACD;;AACD;AAZJ;;AAcA,WAAOhD,iBAAiB,CAACqB,YAAlB,CAA+B+B,UAAtC;AACD;AAED;AACF;AACA;AACA;AACA;;;AACE,WAASC,wBAAT,CAAkCzB,IAAlC,EAAwC;AACtC,YAAQ3B,KAAR;AACE,WAAKD,iBAAiB,CAACC,KAAlB,CAAwB8C,MAA7B;AACE,YAAInB,IAAI,CAACZ,SAAT,EAAoB;AAClB,iBAAOhB,iBAAiB,CAACqB,YAAlB,CAA+BiC,YAAtC;AACD,SAFD,MAEO,IAAI1B,IAAI,CAACb,SAAL,IAAkBa,IAAI,CAACsB,SAA3B,EAAsC;AAC3C,iBAAOlD,iBAAiB,CAACqB,YAAlB,CAA+BkC,MAAtC;AACD;;AACD;;AACF,WAAKvD,iBAAiB,CAACC,KAAlB,CAAwBgD,GAA7B;AACE,YAAIrB,IAAI,CAACb,SAAT,EAAoB;AAClB,iBAAOf,iBAAiB,CAACqB,YAAlB,CAA+BiC,YAAtC;AACD,SAFD,MAEO,IAAI1B,IAAI,CAACZ,SAAL,IAAkBY,IAAI,CAACsB,SAA3B,EAAsC;AAC3C,iBAAOlD,iBAAiB,CAACqB,YAAlB,CAA+BkC,MAAtC;AACD;;AACD;AAdJ;;AAgBA,WAAOvD,iBAAiB,CAACqB,YAAlB,CAA+B8B,OAAtC;AACD;;AAED,WAASK,IAAT,GAAgB;AACdlD,IAAAA,aAAa;AACbqC,IAAAA,kBAAkB;AACnB,GAxMqE,CA0MtE;AACA;AACA;;AAEA;AACF;AACA;;;AACE,OAAKc,aAAL,GAAqB,YAAW;AAC9B,QAAMC,QAAQ,GAAIzD,KAAK,KAAKD,iBAAiB,CAACC,KAAlB,CAAwBgD,GAAnC,GAA0C9C,WAAW,CAACO,MAAtD,GAA+D,CAAC,CAAjF;AACA,QAAMiD,QAAQ,GAAI1D,KAAK,KAAKD,iBAAiB,CAACC,KAAlB,CAAwB8C,MAAnC,GAA6C5C,WAAW,CAACK,MAAzD,GAAkE,CAAC,CAApF;AAEA,QAAIoD,cAAc,GAAG,CAArB;AACA,QAAIC,WAAW,GAAG,IAAlB;;AACA,WAAOA,WAAP,EAAoB;AAClB,UAAMC,WAAW,GAAIJ,QAAQ,IAAI,CAAb,GAAkBA,QAAlB,GAA6BE,cAAjD;AACA,UAAMG,WAAW,GAAIJ,QAAQ,IAAI,CAAb,GAAkBA,QAAlB,GAA6BC,cAAjD;AACA,UAAMjC,GAAG,GAAGvB,aAAa,CAAC0D,WAAD,CAAzB;;AACA,UAAI,CAACnC,GAAL,EAAU;AACRkC,QAAAA,WAAW,GAAG,KAAd;AACA,eAAOxD,eAAP;AACD;;AACD,UAAMuB,IAAI,GAAGD,GAAG,CAACoC,WAAD,CAAhB;;AACA,UAAI,CAACnC,IAAL,EAAW;AACTiC,QAAAA,WAAW,GAAG,KAAd;AACA,eAAOxD,eAAP;AACD,OAZiB,CAclB;;;AACA,UAAIgB,YAAY,GAAGrB,iBAAiB,CAACqB,YAAlB,CAA+BkC,MAAlD;;AACA,cAAQnpB,MAAR;AACE,aAAK4lB,iBAAiB,CAACgE,aAAlB,CAAgCC,GAArC;AACE5C,UAAAA,YAAY,GAAGgC,wBAAwB,CAACzB,IAAD,CAAvC;AACA;;AACF,aAAK5B,iBAAiB,CAACgE,aAAlB,CAAgCE,MAArC;AACE7C,UAAAA,YAAY,GAAGyB,2BAA2B,CAAClB,IAAD,CAA1C;AACA;AANJ;;AAQAvB,MAAAA,eAAe,CAACvd,IAAhB,CAAqBqe,aAAa,CAACS,IAAD,EAAOP,YAAP,EAAqByC,WAArB,EAAkCC,WAAlC,CAAlC;;AACAH,MAAAA,cAAc;AACf;;AAED,WAAOvD,eAAP;AACD,GAnCD;;AAqCAmD,EAAAA,IAAI;AACL,CAvPD;AAwPA;AACA;AACA;AACA;;;AACAxD,iBAAiB,CAACC,KAAlB,GAA0B;AAAE,SAAO,CAAT;AAAY,YAAU;AAAtB,CAA1B;AACA;AACA;AACA;AACA;;AACAD,iBAAiB,CAACgE,aAAlB,GAAkC;AAAE,SAAO,CAAT;AAAY,YAAU;AAAtB,CAAlC;AACA;AACA;AACA;AACA;;AACAhE,iBAAiB,CAACqB,YAAlB,GAAiC;AAAE,YAAU,CAAZ;AAAe,uBAAqB,CAApC;AAAuC,gBAAc,CAArD;AAAwD,aAAW,CAAnE;AAAsE,kBAAgB;AAAtF,CAAjC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;IACqB8C;;;;;;;;AACnB;AACF;AACA;AACA;AACA;AACA;AACE,iBAAI1N,GAAJ,EAAS2N,OAAT,EAAkB;AAChB,UAAMxC,IAAI,GAAGlT,YAAA,CAAa+H,GAAG,CAAC/P,cAAJ,EAAb,EAAmCgI,UAAnC,CAAb;AACA,UAAMrX,KAAK,GAAGqX,YAAA,CAAakT,IAAb,EAAmBlT,WAAnB,CAAd;AACA,UAAMmU,KAAK,GAAGnU,kBAAA,CAAmBrX,KAAnB,EAA0BqX,UAA1B,CAAd;AAEA,UAAM2V,QAAQ,GAAG7rB,KAAK,CAAC4rB,OAAO,GAAG,MAAH,GAAY,MAApB,CAAL,CAAiCvB,KAAjC,EAAwCjB,IAAxC,CAAjB;;AACA,UAAIyC,QAAJ,EAAc;AACZ7I,QAAAA,YAAA,CAAa6I,QAAb,EAAuB,CAAvB,EAA0BzpB,MAA1B;AACD;AACF;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,gBAAO6b,GAAP,EAAYpO,QAAZ,EAAsB;AACpB,UAAMuZ,IAAI,GAAGlT,YAAA,CAAa+H,GAAG,CAAC/P,cAAJ,EAAb,EAAmCgI,UAAnC,CAAb;AAEA,UAAM4V,SAAS,GAAG/vB,yBAAC,CAACqtB,IAAD,CAAD,CAAQrQ,OAAR,CAAgB,IAAhB,CAAlB;AACA,UAAMgT,YAAY,GAAG,KAAKC,iBAAL,CAAuBF,SAAvB,CAArB;AACA,UAAM/X,IAAI,GAAGhY,yBAAC,CAAC,QAAQgwB,YAAR,GAAuB,QAAxB,CAAd;AAEA,UAAME,MAAM,GAAG,IAAIzE,iBAAJ,CAAsB4B,IAAtB,EAA4B5B,iBAAiB,CAACC,KAAlB,CAAwBgD,GAApD,EACbjD,iBAAiB,CAACgE,aAAlB,CAAgCC,GADnB,EACwB1vB,yBAAC,CAAC+vB,SAAD,CAAD,CAAa/S,OAAb,CAAqB,OAArB,EAA8B,CAA9B,CADxB,CAAf;AAEA,UAAMmT,OAAO,GAAGD,MAAM,CAAChB,aAAP,EAAhB;;AAEA,WAAK,IAAIkB,MAAM,GAAG,CAAlB,EAAqBA,MAAM,GAAGD,OAAO,CAACpjB,MAAtC,EAA8CqjB,MAAM,EAApD,EAAwD;AACtD,YAAMC,WAAW,GAAGF,OAAO,CAACC,MAAD,CAA3B;AACA,YAAME,YAAY,GAAG,KAAKL,iBAAL,CAAuBI,WAAW,CAAC9D,QAAnC,CAArB;;AACA,gBAAQ8D,WAAW,CAACxqB,MAApB;AACE,eAAK4lB,iBAAiB,CAACqB,YAAlB,CAA+B8B,OAApC;AACE5W,YAAAA,IAAI,CAACuY,MAAL,CAAY,QAAQD,YAAR,GAAuB,GAAvB,GAA6BnW,SAA7B,GAAyC,OAArD;AACA;;AACF,eAAKsR,iBAAiB,CAACqB,YAAlB,CAA+BiC,YAApC;AACE;AACE,kBAAIjb,QAAQ,KAAK,KAAjB,EAAwB;AACtB,oBAAM0c,UAAU,GAAGH,WAAW,CAAC9D,QAAZ,CAAqBzZ,MAAxC;AACA,oBAAM2d,gBAAgB,GAAG,CAAC,CAACD,UAAD,GAAc,CAAd,GAAkBH,WAAW,CAAC9D,QAAZ,CAAqBvP,OAArB,CAA6B,IAA7B,EAAmCoP,QAAtD,KAAmE2D,SAAS,CAAC,CAAD,CAAT,CAAa3D,QAAzG;;AACA,oBAAIqE,gBAAJ,EAAsB;AACpB,sBAAMC,KAAK,GAAG1wB,yBAAC,CAAC,aAAD,CAAD,CAAiBuwB,MAAjB,CAAwBvwB,yBAAC,CAAC,QAAQswB,YAAR,GAAuB,GAAvB,GAA6BnW,SAA7B,GAAyC,OAA1C,CAAD,CAAoDwW,UAApD,CAA+D,SAA/D,CAAxB,EAAmG3Y,IAAnG,EAAd;AACAA,kBAAAA,IAAI,CAACuY,MAAL,CAAYG,KAAZ;AACA;AACD;AACF;;AACD,kBAAI/C,aAAa,GAAGrF,QAAQ,CAAC+H,WAAW,CAAC9D,QAAZ,CAAqBkB,OAAtB,EAA+B,EAA/B,CAA5B;AACAE,cAAAA,aAAa;AACb0C,cAAAA,WAAW,CAAC9D,QAAZ,CAAqBqE,YAArB,CAAkC,SAAlC,EAA6CjD,aAA7C;AACD;AACD;AAnBJ;AAqBD;;AAED,UAAI7Z,QAAQ,KAAK,KAAjB,EAAwB;AACtBic,QAAAA,SAAS,CAACc,MAAV,CAAiB7Y,IAAjB;AACD,OAFD,MAEO;AACL,YAAMwV,cAAc,GAAIH,IAAI,CAACI,OAAL,GAAe,CAAvC;;AACA,YAAID,cAAJ,EAAoB;AAClB,cAAMsD,WAAW,GAAGf,SAAS,CAAC,CAAD,CAAT,CAAa3D,QAAb,IAAyBiB,IAAI,CAACI,OAAL,GAAe,CAAxC,CAApB;AACAztB,UAAAA,yBAAC,CAACA,yBAAC,CAAC+vB,SAAD,CAAD,CAAajd,MAAb,GAAsB3F,IAAtB,CAA2B,IAA3B,EAAiC2jB,WAAjC,CAAD,CAAD,CAAiDC,KAAjD,CAAuD/wB,yBAAC,CAACgY,IAAD,CAAxD;AACA;AACD;;AACD+X,QAAAA,SAAS,CAACgB,KAAV,CAAgB/Y,IAAhB;AACD;AACF;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,gBAAOkK,GAAP,EAAYpO,QAAZ,EAAsB;AACpB,UAAMuZ,IAAI,GAAGlT,YAAA,CAAa+H,GAAG,CAAC/P,cAAJ,EAAb,EAAmCgI,UAAnC,CAAb;AACA,UAAMiT,GAAG,GAAGptB,yBAAC,CAACqtB,IAAD,CAAD,CAAQrQ,OAAR,CAAgB,IAAhB,CAAZ;AACA,UAAMgU,SAAS,GAAGhxB,yBAAC,CAACotB,GAAD,CAAD,CAAOjc,QAAP,EAAlB;AACA6f,MAAAA,SAAS,CAACziB,IAAV,CAAe6e,GAAf;AAEA,UAAM8C,MAAM,GAAG,IAAIzE,iBAAJ,CAAsB4B,IAAtB,EAA4B5B,iBAAiB,CAACC,KAAlB,CAAwB8C,MAApD,EACb/C,iBAAiB,CAACgE,aAAlB,CAAgCC,GADnB,EACwB1vB,yBAAC,CAACotB,GAAD,CAAD,CAAOpQ,OAAP,CAAe,OAAf,EAAwB,CAAxB,CADxB,CAAf;AAEA,UAAMmT,OAAO,GAAGD,MAAM,CAAChB,aAAP,EAAhB;;AAEA,WAAK,IAAI+B,WAAW,GAAG,CAAvB,EAA0BA,WAAW,GAAGd,OAAO,CAACpjB,MAAhD,EAAwDkkB,WAAW,EAAnE,EAAuE;AACrE,YAAMZ,WAAW,GAAGF,OAAO,CAACc,WAAD,CAA3B;AACA,YAAMX,YAAY,GAAG,KAAKL,iBAAL,CAAuBI,WAAW,CAAC9D,QAAnC,CAArB;;AACA,gBAAQ8D,WAAW,CAACxqB,MAApB;AACE,eAAK4lB,iBAAiB,CAACqB,YAAlB,CAA+B8B,OAApC;AACE,gBAAI9a,QAAQ,KAAK,OAAjB,EAA0B;AACxB9T,cAAAA,yBAAC,CAACqwB,WAAW,CAAC9D,QAAb,CAAD,CAAwBwE,KAAxB,CAA8B,QAAQT,YAAR,GAAuB,GAAvB,GAA6BnW,SAA7B,GAAyC,OAAvE;AACD,aAFD,MAEO;AACLna,cAAAA,yBAAC,CAACqwB,WAAW,CAAC9D,QAAb,CAAD,CAAwBsE,MAAxB,CAA+B,QAAQP,YAAR,GAAuB,GAAvB,GAA6BnW,SAA7B,GAAyC,OAAxE;AACD;;AACD;;AACF,eAAKsR,iBAAiB,CAACqB,YAAlB,CAA+BiC,YAApC;AACE,gBAAIjb,QAAQ,KAAK,OAAjB,EAA0B;AACxB,kBAAIka,aAAa,GAAG1F,QAAQ,CAAC+H,WAAW,CAAC9D,QAAZ,CAAqBgB,OAAtB,EAA+B,EAA/B,CAA5B;AACAS,cAAAA,aAAa;AACbqC,cAAAA,WAAW,CAAC9D,QAAZ,CAAqBqE,YAArB,CAAkC,SAAlC,EAA6C5C,aAA7C;AACD,aAJD,MAIO;AACLhuB,cAAAA,yBAAC,CAACqwB,WAAW,CAAC9D,QAAb,CAAD,CAAwBsE,MAAxB,CAA+B,QAAQP,YAAR,GAAuB,GAAvB,GAA6BnW,SAA7B,GAAyC,OAAxE;AACD;;AACD;AAhBJ;AAkBD;AACF;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,2BAAkBnI,EAAlB,EAAsB;AACpB,UAAIkf,SAAS,GAAG,EAAhB;;AAEA,UAAI,CAAClf,EAAL,EAAS;AACP,eAAOkf,SAAP;AACD;;AAED,UAAMC,QAAQ,GAAGnf,EAAE,CAAC4b,UAAH,IAAiB,EAAlC;;AAEA,WAAK,IAAI5X,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGmb,QAAQ,CAACpkB,MAA7B,EAAqCiJ,CAAC,EAAtC,EAA0C;AACxC,YAAImb,QAAQ,CAACnb,CAAD,CAAR,CAAYtV,IAAZ,CAAiBkG,WAAjB,OAAmC,IAAvC,EAA6C;AAC3C;AACD;;AAED,YAAIuqB,QAAQ,CAACnb,CAAD,CAAR,CAAYob,SAAhB,EAA2B;AACzBF,UAAAA,SAAS,IAAI,MAAMC,QAAQ,CAACnb,CAAD,CAAR,CAAYtV,IAAlB,GAAyB,KAAzB,GAAiCywB,QAAQ,CAACnb,CAAD,CAAR,CAAY4B,KAA7C,GAAqD,IAAlE;AACD;AACF;;AAED,aAAOsZ,SAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,mBAAUhP,GAAV,EAAe;AACb,UAAMmL,IAAI,GAAGlT,YAAA,CAAa+H,GAAG,CAAC/P,cAAJ,EAAb,EAAmCgI,UAAnC,CAAb;AACA,UAAMiT,GAAG,GAAGptB,yBAAC,CAACqtB,IAAD,CAAD,CAAQrQ,OAAR,CAAgB,IAAhB,CAAZ;AACA,UAAMqU,OAAO,GAAGjE,GAAG,CAAC1C,QAAJ,CAAa,QAAb,EAAuBzH,KAAvB,CAA6BjjB,yBAAC,CAACqtB,IAAD,CAA9B,CAAhB;AACA,UAAMlB,MAAM,GAAGiB,GAAG,CAAC,CAAD,CAAH,CAAOhB,QAAtB;AAEA,UAAM8D,MAAM,GAAG,IAAIzE,iBAAJ,CAAsB4B,IAAtB,EAA4B5B,iBAAiB,CAACC,KAAlB,CAAwBgD,GAApD,EACbjD,iBAAiB,CAACgE,aAAlB,CAAgCE,MADnB,EAC2B3vB,yBAAC,CAACotB,GAAD,CAAD,CAAOpQ,OAAP,CAAe,OAAf,EAAwB,CAAxB,CAD3B,CAAf;AAEA,UAAMmT,OAAO,GAAGD,MAAM,CAAChB,aAAP,EAAhB;;AAEA,WAAK,IAAI+B,WAAW,GAAG,CAAvB,EAA0BA,WAAW,GAAGd,OAAO,CAACpjB,MAAhD,EAAwDkkB,WAAW,EAAnE,EAAuE;AACrE,YAAI,CAACd,OAAO,CAACc,WAAD,CAAZ,EAA2B;AACzB;AACD;;AAED,YAAM1E,QAAQ,GAAG4D,OAAO,CAACc,WAAD,CAAP,CAAqB1E,QAAtC;AACA,YAAM+E,eAAe,GAAGnB,OAAO,CAACc,WAAD,CAAP,CAAqBM,YAA7C;AACA,YAAMC,UAAU,GAAIjF,QAAQ,CAACkB,OAAT,IAAoBlB,QAAQ,CAACkB,OAAT,GAAmB,CAA3D;AACA,YAAIE,aAAa,GAAI6D,UAAD,GAAelJ,QAAQ,CAACiE,QAAQ,CAACkB,OAAV,EAAmB,EAAnB,CAAvB,GAAgD,CAApE;;AACA,gBAAQ0C,OAAO,CAACc,WAAD,CAAP,CAAqBprB,MAA7B;AACE,eAAK4lB,iBAAiB,CAACqB,YAAlB,CAA+BkC,MAApC;AACE;;AACF,eAAKvD,iBAAiB,CAACqB,YAAlB,CAA+B8B,OAApC;AACE;AACE,kBAAM6C,OAAO,GAAGrE,GAAG,CAAC1e,IAAJ,CAAS,IAAT,EAAe,CAAf,CAAhB;;AACA,kBAAI,CAAC+iB,OAAL,EAAc;AAAE;AAAW;;AAC3B,kBAAMC,QAAQ,GAAGtE,GAAG,CAAC,CAAD,CAAH,CAAOkB,KAAP,CAAa+C,OAAb,CAAjB;;AACA,kBAAIG,UAAJ,EAAgB;AACd,oBAAI7D,aAAa,GAAG,CAApB,EAAuB;AACrBA,kBAAAA,aAAa;AACb8D,kBAAAA,OAAO,CAACze,YAAR,CAAqB0e,QAArB,EAA+BD,OAAO,CAACnD,KAAR,CAAc+C,OAAd,CAA/B;AACAI,kBAAAA,OAAO,CAACnD,KAAR,CAAc+C,OAAd,EAAuBT,YAAvB,CAAoC,SAApC,EAA+CjD,aAA/C;AACA8D,kBAAAA,OAAO,CAACnD,KAAR,CAAc+C,OAAd,EAAuB3f,SAAvB,GAAmC,EAAnC;AACD,iBALD,MAKO,IAAIic,aAAa,KAAK,CAAtB,EAAyB;AAC9B8D,kBAAAA,OAAO,CAACze,YAAR,CAAqB0e,QAArB,EAA+BD,OAAO,CAACnD,KAAR,CAAc+C,OAAd,CAA/B;AACAI,kBAAAA,OAAO,CAACnD,KAAR,CAAc+C,OAAd,EAAuBM,eAAvB,CAAuC,SAAvC;AACAF,kBAAAA,OAAO,CAACnD,KAAR,CAAc+C,OAAd,EAAuB3f,SAAvB,GAAmC,EAAnC;AACD;AACF;AACF;AACD;;AACF,eAAK+Z,iBAAiB,CAACqB,YAAlB,CAA+B2B,iBAApC;AACE,gBAAI+C,UAAJ,EAAgB;AACd,kBAAI7D,aAAa,GAAG,CAApB,EAAuB;AACrBA,gBAAAA,aAAa;AACbpB,gBAAAA,QAAQ,CAACqE,YAAT,CAAsB,SAAtB,EAAiCjD,aAAjC;;AACA,oBAAI2D,eAAe,CAAClF,QAAhB,KAA6BD,MAA7B,IAAuCI,QAAQ,CAACL,SAAT,KAAuBmF,OAAlE,EAA2E;AAAE9E,kBAAAA,QAAQ,CAAC7a,SAAT,GAAqB,EAArB;AAA0B;AACxG,eAJD,MAIO,IAAIic,aAAa,KAAK,CAAtB,EAAyB;AAC9BpB,gBAAAA,QAAQ,CAACoF,eAAT,CAAyB,SAAzB;;AACA,oBAAIL,eAAe,CAAClF,QAAhB,KAA6BD,MAA7B,IAAuCI,QAAQ,CAACL,SAAT,KAAuBmF,OAAlE,EAA2E;AAAE9E,kBAAAA,QAAQ,CAAC7a,SAAT,GAAqB,EAArB;AAA0B;AACxG;AACF;;AACD;;AACF,eAAK+Z,iBAAiB,CAACqB,YAAlB,CAA+B+B,UAApC;AACE;AACA;AApCJ;AAsCD;;AACDzB,MAAAA,GAAG,CAACjrB,MAAJ;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,mBAAU+f,GAAV,EAAe;AACb,UAAMmL,IAAI,GAAGlT,YAAA,CAAa+H,GAAG,CAAC/P,cAAJ,EAAb,EAAmCgI,UAAnC,CAAb;AACA,UAAMiT,GAAG,GAAGptB,yBAAC,CAACqtB,IAAD,CAAD,CAAQrQ,OAAR,CAAgB,IAAhB,CAAZ;AACA,UAAMqU,OAAO,GAAGjE,GAAG,CAAC1C,QAAJ,CAAa,QAAb,EAAuBzH,KAAvB,CAA6BjjB,yBAAC,CAACqtB,IAAD,CAA9B,CAAhB;AAEA,UAAM6C,MAAM,GAAG,IAAIzE,iBAAJ,CAAsB4B,IAAtB,EAA4B5B,iBAAiB,CAACC,KAAlB,CAAwB8C,MAApD,EACb/C,iBAAiB,CAACgE,aAAlB,CAAgCE,MADnB,EAC2B3vB,yBAAC,CAACotB,GAAD,CAAD,CAAOpQ,OAAP,CAAe,OAAf,EAAwB,CAAxB,CAD3B,CAAf;AAEA,UAAMmT,OAAO,GAAGD,MAAM,CAAChB,aAAP,EAAhB;;AAEA,WAAK,IAAI+B,WAAW,GAAG,CAAvB,EAA0BA,WAAW,GAAGd,OAAO,CAACpjB,MAAhD,EAAwDkkB,WAAW,EAAnE,EAAuE;AACrE,YAAI,CAACd,OAAO,CAACc,WAAD,CAAZ,EAA2B;AACzB;AACD;;AACD,gBAAQd,OAAO,CAACc,WAAD,CAAP,CAAqBprB,MAA7B;AACE,eAAK4lB,iBAAiB,CAACqB,YAAlB,CAA+BkC,MAApC;AACE;;AACF,eAAKvD,iBAAiB,CAACqB,YAAlB,CAA+B2B,iBAApC;AACE;AACE,kBAAMlC,QAAQ,GAAG4D,OAAO,CAACc,WAAD,CAAP,CAAqB1E,QAAtC;AACA,kBAAMqF,UAAU,GAAIrF,QAAQ,CAACgB,OAAT,IAAoBhB,QAAQ,CAACgB,OAAT,GAAmB,CAA3D;;AACA,kBAAIqE,UAAJ,EAAgB;AACd,oBAAI5D,aAAa,GAAIzB,QAAQ,CAACgB,OAAV,GAAqBjF,QAAQ,CAACiE,QAAQ,CAACgB,OAAV,EAAmB,EAAnB,CAA7B,GAAsD,CAA1E;;AACA,oBAAIS,aAAa,GAAG,CAApB,EAAuB;AACrBA,kBAAAA,aAAa;AACbzB,kBAAAA,QAAQ,CAACqE,YAAT,CAAsB,SAAtB,EAAiC5C,aAAjC;;AACA,sBAAIzB,QAAQ,CAACL,SAAT,KAAuBmF,OAA3B,EAAoC;AAAE9E,oBAAAA,QAAQ,CAAC7a,SAAT,GAAqB,EAArB;AAA0B;AACjE,iBAJD,MAIO,IAAIsc,aAAa,KAAK,CAAtB,EAAyB;AAC9BzB,kBAAAA,QAAQ,CAACoF,eAAT,CAAyB,SAAzB;;AACA,sBAAIpF,QAAQ,CAACL,SAAT,KAAuBmF,OAA3B,EAAoC;AAAE9E,oBAAAA,QAAQ,CAAC7a,SAAT,GAAqB,EAArB;AAA0B;AACjE;AACF;AACF;AACD;;AACF,eAAK+Z,iBAAiB,CAACqB,YAAlB,CAA+B+B,UAApC;AACE1U,YAAAA,UAAA,CAAWgW,OAAO,CAACc,WAAD,CAAP,CAAqB1E,QAAhC,EAA0C,IAA1C;AACA;AAtBJ;AAwBD;AACF;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,qBAAYsF,QAAZ,EAAsBC,QAAtB,EAAgC1tB,OAAhC,EAAyC;AACvC,UAAM2tB,GAAG,GAAG,EAAZ;AACA,UAAIC,MAAJ;;AACA,WAAK,IAAIC,MAAM,GAAG,CAAlB,EAAqBA,MAAM,GAAGJ,QAA9B,EAAwCI,MAAM,EAA9C,EAAkD;AAChDF,QAAAA,GAAG,CAACxjB,IAAJ,CAAS,SAAS4L,SAAT,GAAqB,OAA9B;AACD;;AACD6X,MAAAA,MAAM,GAAGD,GAAG,CAAChmB,IAAJ,CAAS,EAAT,CAAT;AAEA,UAAMmmB,GAAG,GAAG,EAAZ;AACA,UAAIC,MAAJ;;AACA,WAAK,IAAIC,MAAM,GAAG,CAAlB,EAAqBA,MAAM,GAAGN,QAA9B,EAAwCM,MAAM,EAA9C,EAAkD;AAChDF,QAAAA,GAAG,CAAC3jB,IAAJ,CAAS,SAASyjB,MAAT,GAAkB,OAA3B;AACD;;AACDG,MAAAA,MAAM,GAAGD,GAAG,CAACnmB,IAAJ,CAAS,EAAT,CAAT;AACA,UAAMsmB,MAAM,GAAGryB,yBAAC,CAAC,YAAYmyB,MAAZ,GAAqB,UAAtB,CAAhB;;AACA,UAAI/tB,OAAO,IAAIA,OAAO,CAACkuB,cAAvB,EAAuC;AACrCD,QAAAA,MAAM,CAACE,QAAP,CAAgBnuB,OAAO,CAACkuB,cAAxB;AACD;;AAED,aAAOD,MAAM,CAAC,CAAD,CAAb;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,qBAAYnQ,GAAZ,EAAiB;AACf,UAAMmL,IAAI,GAAGlT,YAAA,CAAa+H,GAAG,CAAC/P,cAAJ,EAAb,EAAmCgI,UAAnC,CAAb;AACAna,MAAAA,yBAAC,CAACqtB,IAAD,CAAD,CAAQrQ,OAAR,CAAgB,OAAhB,EAAyB7a,MAAzB;AACD;;;;;;;;;;;;;;AClkBH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,IAAMqwB,SAAS,GAAG,OAAlB;AAEA;AACA;AACA;;IACqBC;AACnB,kBAAYrrB,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKiT,KAAL,GAAajT,OAAO,CAACoT,UAAR,CAAmBoD,IAAhC;AACA,SAAK8U,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAK8L,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAK7X,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AAEA,SAAKxB,QAAL,GAAgB,KAAKoL,SAAL,CAAe,CAAf,CAAhB;AACA,SAAKsL,SAAL,GAAiB,IAAjB;AACA,SAAKnL,QAAL,GAAgB,IAAhB;AAEA,SAAKjkB,KAAL,GAAa,IAAIukB,KAAJ,EAAb;AACA,SAAKhlB,KAAL,GAAa,IAAI8sB,KAAJ,EAAb;AACA,SAAKgD,MAAL,GAAc,IAAI5H,MAAJ,CAAW5jB,OAAX,CAAd;AACA,SAAK6jB,MAAL,GAAc,IAAI5B,MAAJ,EAAd;AACA,SAAKpjB,OAAL,GAAe,IAAIihB,OAAJ,CAAY9f,OAAZ,CAAf;AAEA,SAAKA,OAAL,CAAawG,IAAb,CAAkB,aAAlB,EAAiC,KAAK1N,IAAL,CAAUmE,IAAV,CAAewuB,MAAhD;AACA,SAAKzrB,OAAL,CAAawG,IAAb,CAAkB,WAAlB,EAA+B,KAAK1N,IAAL,CAAUmE,IAAV,CAAe6B,IAA9C;AACA,SAAKkB,OAAL,CAAawG,IAAb,CAAkB,WAAlB,EAA+B,KAAK1N,IAAL,CAAUmE,IAAV,CAAe8B,IAA9C;AACA,SAAKiB,OAAL,CAAawG,IAAb,CAAkB,UAAlB,EAA8B,KAAK1N,IAAL,CAAUmE,IAAV,CAAe8mB,GAA7C;AACA,SAAK/jB,OAAL,CAAawG,IAAb,CAAkB,YAAlB,EAAgC,KAAK1N,IAAL,CAAUmE,IAAV,CAAeyuB,KAA/C;AACA,SAAK1rB,OAAL,CAAawG,IAAb,CAAkB,sBAAlB,EAA0C,KAAK1N,IAAL,CAAUmE,IAAV,CAAe0uB,eAAzD;AACA,SAAK3rB,OAAL,CAAawG,IAAb,CAAkB,wBAAlB,EAA4C,KAAK1N,IAAL,CAAUmE,IAAV,CAAe2uB,iBAA3D;AACA,SAAK5rB,OAAL,CAAawG,IAAb,CAAkB,0BAAlB,EAA8C,KAAK1N,IAAL,CAAUmE,IAAV,CAAe4uB,mBAA7D;AACA,SAAK7rB,OAAL,CAAawG,IAAb,CAAkB,aAAlB,EAAiC,KAAK1N,IAAL,CAAUmE,IAAV,CAAeK,MAAhD;AACA,SAAK0C,OAAL,CAAawG,IAAb,CAAkB,cAAlB,EAAkC,KAAK1N,IAAL,CAAUmE,IAAV,CAAeI,OAAjD;AACA,SAAK2C,OAAL,CAAawG,IAAb,CAAkB,iBAAlB,EAAqC,KAAK1N,IAAL,CAAUmE,IAAV,CAAe6uB,UAApD;AACA,SAAK9rB,OAAL,CAAawG,IAAb,CAAkB,2BAAlB,EAA+C,KAAK1N,IAAL,CAAUmE,IAAV,CAAe8uB,oBAA9D;AACA,SAAK/rB,OAAL,CAAawG,IAAb,CAAkB,eAAlB,EAAmC,KAAK1N,IAAL,CAAUmE,IAAV,CAAeqC,QAAlD,EA/BmB,CAiCnB;;AACA,QAAM0sB,QAAQ,GAAG,CACf,MADe,EACP,QADO,EACG,WADH,EACgB,eADhB,EACiC,aADjC,EACgD,WADhD,EAEf,aAFe,EAEA,eAFA,EAEiB,cAFjB,EAEiC,aAFjC,EAGf,aAHe,EAGA,cAHA,EAGgB,WAHhB,CAAjB;;AAMA,SAAK,IAAI/lB,GAAG,GAAG,CAAV,EAAaC,GAAG,GAAG8lB,QAAQ,CAACrmB,MAAjC,EAAyCM,GAAG,GAAGC,GAA/C,EAAoDD,GAAG,EAAvD,EAA2D;AACzD,WAAK+lB,QAAQ,CAAC/lB,GAAD,CAAb,IAAuB,UAACgmB,IAAD,EAAU;AAC/B,eAAO,UAACzb,KAAD,EAAW;AAChB,eAAI,CAAC0b,aAAL;;AACApsB,UAAAA,QAAQ,CAACqsB,WAAT,CAAqBF,IAArB,EAA2B,KAA3B,EAAkCzb,KAAlC;;AACA,eAAI,CAAC4b,YAAL,CAAkB,IAAlB;AACD,SAJD;AAKD,OANqB,CAMnBJ,QAAQ,CAAC/lB,GAAD,CANW,CAAtB;;AAOA,WAAKjG,OAAL,CAAawG,IAAb,CAAkB,UAAUwlB,QAAQ,CAAC/lB,GAAD,CAApC,EAA2C,KAAKnN,IAAL,CAAUmE,IAAV,CAAe+uB,QAAQ,CAAC/lB,GAAD,CAAvB,CAA3C;AACD;;AAED,SAAK3G,QAAL,GAAgB,KAAK+sB,WAAL,CAAiB,UAAC7b,KAAD,EAAW;AAC1C,aAAO,KAAI,CAAC8b,WAAL,CAAiB,aAAjB,EAAgC9kB,iBAAA,CAAkBgJ,KAAlB,CAAhC,CAAP;AACD,KAFe,CAAhB;AAIA,SAAKyQ,QAAL,GAAgB,KAAKoL,WAAL,CAAiB,UAAC7b,KAAD,EAAW;AAC1C,UAAM+b,IAAI,GAAG,KAAI,CAACC,YAAL,GAAoB,gBAApB,CAAb;;AACA,aAAO,KAAI,CAACF,WAAL,CAAiB,WAAjB,EAA8B9b,KAAK,GAAG+b,IAAtC,CAAP;AACD,KAHe,CAAhB;AAKA,SAAKE,YAAL,GAAoB,KAAKJ,WAAL,CAAiB,UAAC7b,KAAD,EAAW;AAC9C,UAAM9W,IAAI,GAAG,KAAI,CAAC8yB,YAAL,GAAoB,WAApB,CAAb;;AACA,aAAO,KAAI,CAACF,WAAL,CAAiB,WAAjB,EAA8B5yB,IAAI,GAAG8W,KAArC,CAAP;AACD,KAHmB,CAApB;;AAKA,SAAK,IAAIvK,IAAG,GAAG,CAAf,EAAkBA,IAAG,IAAI,CAAzB,EAA4BA,IAAG,EAA/B,EAAmC;AACjC,WAAK,YAAYA,IAAjB,IAAyB,UAACA,GAAD,EAAS;AAChC,eAAO,YAAM;AACX,eAAI,CAACymB,WAAL,CAAiB,MAAMzmB,GAAvB;AACD,SAFD;AAGD,OAJuB,CAIrBA,IAJqB,CAAxB;;AAKA,WAAKjG,OAAL,CAAawG,IAAb,CAAkB,iBAAiBP,IAAnC,EAAwC,KAAKnN,IAAL,CAAUmE,IAAV,CAAe,YAAYgJ,IAA3B,CAAxC;AACD;;AAED,SAAK0lB,eAAL,GAAuB,KAAKU,WAAL,CAAiB,YAAM;AAC5C,WAAI,CAACb,MAAL,CAAYG,eAAZ,CAA4B,KAAI,CAAC9W,QAAjC;AACD,KAFsB,CAAvB;AAIA,SAAK+W,iBAAL,GAAyB,KAAKS,WAAL,CAAiB,YAAM;AAC9C,WAAI,CAACxI,MAAL,CAAY+H,iBAAZ,CAA8B,KAAI,CAAC/W,QAAnC;AACD,KAFwB,CAAzB;AAIA,SAAKgX,mBAAL,GAA2B,KAAKQ,WAAL,CAAiB,YAAM;AAChD,WAAI,CAACxI,MAAL,CAAYgI,mBAAZ,CAAgC,KAAI,CAAChX,QAArC;AACD,KAF0B,CAA3B;AAIA,SAAKvX,MAAL,GAAc,KAAK+uB,WAAL,CAAiB,YAAM;AACnC,WAAI,CAACxI,MAAL,CAAYvmB,MAAZ,CAAmB,KAAI,CAACuX,QAAxB;AACD,KAFa,CAAd;AAIA,SAAKxX,OAAL,GAAe,KAAKgvB,WAAL,CAAiB,YAAM;AACpC,WAAI,CAACxI,MAAL,CAAYxmB,OAAZ,CAAoB,KAAI,CAACwX,QAAzB;AACD,KAFc,CAAf;AAIA;AACJ;AACA;AACA;AACA;;AACI,SAAK2G,UAAL,GAAkB,KAAK6Q,WAAL,CAAiB,UAACvkB,IAAD,EAAU;AAC3C,UAAI,KAAI,CAAC6kB,SAAL,CAAe/zB,yBAAC,CAACkP,IAAD,CAAD,CAAQgI,IAAR,GAAenK,MAA9B,CAAJ,EAA2C;AACzC;AACD;;AACD,UAAMmV,GAAG,GAAG,KAAI,CAAC8R,YAAL,EAAZ;;AACA9R,MAAAA,GAAG,CAACU,UAAJ,CAAe1T,IAAf;;AACA,WAAI,CAAC+kB,YAAL,CAAkBhN,yBAAA,CAA0B/X,IAA1B,EAAgC7I,MAAhC,EAAlB;AACD,KAPiB,CAAlB;AASA;AACJ;AACA;AACA;;AACI,SAAK6tB,UAAL,GAAkB,KAAKT,WAAL,CAAiB,UAACvc,IAAD,EAAU;AAC3C,UAAI,KAAI,CAAC6c,SAAL,CAAe7c,IAAI,CAACnK,MAApB,CAAJ,EAAiC;AAC/B;AACD;;AACD,UAAMmV,GAAG,GAAG,KAAI,CAAC8R,YAAL,EAAZ;;AACA,UAAMG,QAAQ,GAAGjS,GAAG,CAACU,UAAJ,CAAezI,cAAA,CAAejD,IAAf,CAAf,CAAjB;;AACA,WAAI,CAAC+c,YAAL,CAAkBhN,YAAA,CAAakN,QAAb,EAAuBha,cAAA,CAAega,QAAf,CAAvB,EAAiD9tB,MAAjD,EAAlB;AACD,KAPiB,CAAlB;AASA;AACJ;AACA;AACA;;AACI,SAAK+tB,SAAL,GAAiB,KAAKX,WAAL,CAAiB,UAACvb,MAAD,EAAY;AAC5C,UAAI,KAAI,CAAC6b,SAAL,CAAe7b,MAAM,CAACnL,MAAtB,CAAJ,EAAmC;AACjC;AACD;;AACDmL,MAAAA,MAAM,GAAG,KAAI,CAAC9Q,OAAL,CAAa+C,MAAb,CAAoB,iBAApB,EAAuC+N,MAAvC,CAAT;;AACA,UAAMqP,QAAQ,GAAG,KAAI,CAACyM,YAAL,GAAoBI,SAApB,CAA8Blc,MAA9B,CAAjB;;AACA,WAAI,CAAC+b,YAAL,CAAkBhN,yBAAA,CAA0BhjB,UAAA,CAAWsjB,QAAX,CAA1B,EAAgDlhB,MAAhD,EAAlB;AACD,KAPgB,CAAjB;AASA;AACJ;AACA;AACA;AACA;;AACI,SAAKytB,WAAL,GAAmB,KAAKL,WAAL,CAAiB,UAACzH,OAAD,EAAUlP,OAAV,EAAsB;AACxD,UAAMuX,kBAAkB,GAAG,KAAI,CAACjwB,OAAL,CAAaiY,SAAb,CAAuBgY,kBAAlD;;AACA,UAAIA,kBAAJ,EAAwB;AACtBA,QAAAA,kBAAkB,CAAC7oB,IAAnB,CAAwB,KAAxB,EAA8BsR,OAA9B,EAAuC,KAAI,CAAC1V,OAA5C,EAAqD,KAAI,CAACktB,aAA1D;AACD,OAFD,MAEO;AACL,aAAI,CAACA,aAAL,CAAmBtI,OAAnB,EAA4BlP,OAA5B;AACD;AACF,KAPkB,CAAnB;AASA;AACJ;AACA;;AACI,SAAKqW,oBAAL,GAA4B,KAAKM,WAAL,CAAiB,YAAM;AACjD,UAAMc,MAAM,GAAG,KAAI,CAACP,YAAL,GAAoBpR,UAApB,CAA+BzI,UAAA,CAAW,IAAX,CAA/B,CAAf;;AACA,UAAIoa,MAAM,CAACvjB,WAAX,EAAwB;AACtB,aAAI,CAACijB,YAAL,CAAkBhN,YAAA,CAAasN,MAAM,CAACvjB,WAApB,EAAiC,CAAjC,EAAoCoR,SAApC,GAAgD/b,MAAhD,EAAlB;AACD;AACF,KAL2B,CAA5B;AAOA;AACJ;AACA;AACA;;AACI,SAAK6iB,UAAL,GAAkB,KAAKuK,WAAL,CAAiB,UAAC7b,KAAD,EAAW;AAC5C,WAAI,CAACrU,KAAL,CAAWixB,SAAX,CAAqB,KAAI,CAACR,YAAL,EAArB,EAA0C;AACxC9K,QAAAA,UAAU,EAAEtR;AAD4B,OAA1C;AAGD,KAJiB,CAAlB;AAMA;AACJ;AACA;AACA;AACA;;AACI,SAAK6c,UAAL,GAAkB,KAAKhB,WAAL,CAAiB,UAACiB,QAAD,EAAc;AAC/C,UAAIC,OAAO,GAAGD,QAAQ,CAACxyB,GAAvB;AACA,UAAM0yB,QAAQ,GAAGF,QAAQ,CAACxd,IAA1B;AACA,UAAM2d,WAAW,GAAGH,QAAQ,CAACG,WAA7B;AACA,UAAMC,aAAa,GAAGJ,QAAQ,CAACI,aAA/B;;AACA,UAAI5S,GAAG,GAAGwS,QAAQ,CAACzN,KAAT,IAAkB,KAAI,CAAC+M,YAAL,EAA5B;;AACA,UAAMe,oBAAoB,GAAGH,QAAQ,CAAC7nB,MAAT,GAAkBmV,GAAG,CAACW,QAAJ,GAAe9V,MAA9D;;AACA,UAAIgoB,oBAAoB,GAAG,CAAvB,IAA4B,KAAI,CAAChB,SAAL,CAAegB,oBAAf,CAAhC,EAAsE;AACpE;AACD;;AACD,UAAMC,aAAa,GAAG9S,GAAG,CAACW,QAAJ,OAAmB+R,QAAzC,CAV+C,CAY/C;;AACA,UAAI,OAAOD,OAAP,KAAmB,QAAvB,EAAiC;AAC/BA,QAAAA,OAAO,GAAGA,OAAO,CAACnc,IAAR,EAAV;AACD;;AAED,UAAI,KAAI,CAACpU,OAAL,CAAa6wB,YAAjB,EAA+B;AAC7BN,QAAAA,OAAO,GAAG,KAAI,CAACvwB,OAAL,CAAa6wB,YAAb,CAA0BN,OAA1B,CAAV;AACD,OAFD,MAEO,IAAIG,aAAJ,EAAmB;AACxB;AACAH,QAAAA,OAAO,GAAG,oCAAoC/sB,IAApC,CAAyC+sB,OAAzC,IACNA,OADM,GACI,KAAI,CAACvwB,OAAL,CAAa8wB,eAAb,GAA+BP,OAD7C;AAED;;AAED,UAAIQ,OAAO,GAAG,EAAd;;AACA,UAAIH,aAAJ,EAAmB;AACjB9S,QAAAA,GAAG,GAAGA,GAAG,CAACO,cAAJ,EAAN;AACA,YAAM2G,MAAM,GAAGlH,GAAG,CAACU,UAAJ,CAAe5iB,yBAAC,CAAC,QAAQ40B,QAAR,GAAmB,MAApB,CAAD,CAA6B,CAA7B,CAAf,CAAf;AACAO,QAAAA,OAAO,CAAC5mB,IAAR,CAAa6a,MAAb;AACD,OAJD,MAIO;AACL+L,QAAAA,OAAO,GAAG,KAAI,CAAC5xB,KAAL,CAAW6xB,UAAX,CAAsBlT,GAAtB,EAA2B;AACnC5S,UAAAA,QAAQ,EAAE,GADyB;AAEnCiZ,UAAAA,oBAAoB,EAAE,IAFa;AAGnCC,UAAAA,mBAAmB,EAAE;AAHc,SAA3B,CAAV;AAKD;;AAEDxoB,MAAAA,8BAAA,CAAOm1B,OAAP,EAAgB,UAAC9nB,GAAD,EAAM+b,MAAN,EAAiB;AAC/BppB,QAAAA,yBAAC,CAACopB,MAAD,CAAD,CAAUlN,IAAV,CAAe,MAAf,EAAuByY,OAAvB;;AACA,YAAIE,WAAJ,EAAiB;AACf70B,UAAAA,yBAAC,CAACopB,MAAD,CAAD,CAAUlN,IAAV,CAAe,QAAf,EAAyB,QAAzB;AACD,SAFD,MAEO;AACLlc,UAAAA,yBAAC,CAACopB,MAAD,CAAD,CAAUuH,UAAV,CAAqB,QAArB;AACD;AACF,OAPD;;AASA,WAAI,CAACsD,YAAL,CACE,KAAI,CAACoB,mBAAL,CAAyBF,OAAzB,EAAkC9uB,MAAlC,EADF;AAGD,KAlDiB,CAAlB;AAoDA;AACJ;AACA;AACA;AACA;AACA;AACA;;AACI,SAAKtB,KAAL,GAAa,KAAK0uB,WAAL,CAAiB,UAAC6B,SAAD,EAAe;AAC3C,UAAMC,SAAS,GAAGD,SAAS,CAACC,SAA5B;AACA,UAAMC,SAAS,GAAGF,SAAS,CAACE,SAA5B;;AAEA,UAAID,SAAJ,EAAe;AAAEruB,QAAAA,QAAQ,CAACqsB,WAAT,CAAqB,WAArB,EAAkC,KAAlC,EAAyCgC,SAAzC;AAAsD;;AACvE,UAAIC,SAAJ,EAAe;AAAEtuB,QAAAA,QAAQ,CAACqsB,WAAT,CAAqB,WAArB,EAAkC,KAAlC,EAAyCiC,SAAzC;AAAsD;AACxE,KANY,CAAb;AAQA;AACJ;AACA;AACA;AACA;;AACI,SAAKD,SAAL,GAAiB,KAAK9B,WAAL,CAAiB,UAAC6B,SAAD,EAAe;AAC/CpuB,MAAAA,QAAQ,CAACqsB,WAAT,CAAqB,WAArB,EAAkC,KAAlC,EAAyC+B,SAAzC;AACD,KAFgB,CAAjB;AAIA;AACJ;AACA;AACA;AACA;;AACI,SAAKG,WAAL,GAAmB,KAAKhC,WAAL,CAAiB,UAACiC,GAAD,EAAS;AAC3C,UAAMC,SAAS,GAAGD,GAAG,CAAC/pB,KAAJ,CAAU,GAAV,CAAlB;;AAEA,UAAMuW,GAAG,GAAG,KAAI,CAAC8R,YAAL,GAAoBvR,cAApB,EAAZ;;AACAP,MAAAA,GAAG,CAACU,UAAJ,CAAe,KAAI,CAAC9f,KAAL,CAAW8yB,WAAX,CAAuBD,SAAS,CAAC,CAAD,CAAhC,EAAqCA,SAAS,CAAC,CAAD,CAA9C,EAAmD,KAAI,CAACvxB,OAAxD,CAAf;AACD,KALkB,CAAnB;AAOA;AACJ;AACA;;AACI,SAAKyxB,WAAL,GAAmB,KAAKpC,WAAL,CAAiB,YAAM;AACxC,UAAI3W,OAAO,GAAG9c,yBAAC,CAAC,KAAI,CAAC81B,aAAL,EAAD,CAAD,CAAwBhjB,MAAxB,EAAd;;AACA,UAAIgK,OAAO,CAACE,OAAR,CAAgB,QAAhB,EAA0BjQ,MAA9B,EAAsC;AACpC+P,QAAAA,OAAO,CAACE,OAAR,CAAgB,QAAhB,EAA0B7a,MAA1B;AACD,OAFD,MAEO;AACL2a,QAAAA,OAAO,GAAG9c,yBAAC,CAAC,KAAI,CAAC81B,aAAL,EAAD,CAAD,CAAwBjP,MAAxB,EAAV;AACD;;AACD,WAAI,CAACzf,OAAL,CAAa0U,YAAb,CAA0B,cAA1B,EAA0CgB,OAA1C,EAAmD,KAAI,CAACuK,SAAxD;AACD,KARkB,CAAnB;AAUA;AACJ;AACA;AACA;AACA;;AACI,SAAK0O,OAAL,GAAe,KAAKtC,WAAL,CAAiB,UAAC7b,KAAD,EAAW;AACzC,UAAMkF,OAAO,GAAG9c,yBAAC,CAAC,KAAI,CAAC81B,aAAL,EAAD,CAAjB;AACAhZ,MAAAA,OAAO,CAACkZ,WAAR,CAAoB,iBAApB,EAAuCpe,KAAK,KAAK,MAAjD;AACAkF,MAAAA,OAAO,CAACkZ,WAAR,CAAoB,kBAApB,EAAwCpe,KAAK,KAAK,OAAlD;AACAkF,MAAAA,OAAO,CAACgK,GAAR,CAAY,OAAZ,EAAsBlP,KAAK,KAAK,MAAV,GAAmB,EAAnB,GAAwBA,KAA9C;AACD,KALc,CAAf;AAOA;AACJ;AACA;AACA;;AACI,SAAKqe,MAAL,GAAc,KAAKxC,WAAL,CAAiB,UAAC7b,KAAD,EAAW;AACxC,UAAMkF,OAAO,GAAG9c,yBAAC,CAAC,KAAI,CAAC81B,aAAL,EAAD,CAAjB;AACAle,MAAAA,KAAK,GAAG5P,UAAU,CAAC4P,KAAD,CAAlB;;AACA,UAAIA,KAAK,KAAK,CAAd,EAAiB;AACfkF,QAAAA,OAAO,CAACgK,GAAR,CAAY,OAAZ,EAAqB,EAArB;AACD,OAFD,MAEO;AACLhK,QAAAA,OAAO,CAACgK,GAAR,CAAY;AACVtf,UAAAA,KAAK,EAAEoQ,KAAK,GAAG,GAAR,GAAc,GADX;AAEVnX,UAAAA,MAAM,EAAE;AAFE,SAAZ;AAID;AACF,KAXa,CAAd;AAYD;;;;WAED,sBAAa;AAAA;;AACX;AACA,WAAK4mB,SAAL,CAAenO,EAAf,CAAkB,SAAlB,EAA6B,UAACyD,KAAD,EAAW;AACtC,YAAIA,KAAK,CAACiI,OAAN,KAAkBxZ,cAAtB,EAAsC;AACpC,gBAAI,CAAChE,OAAL,CAAa0U,YAAb,CAA0B,OAA1B,EAAmCa,KAAnC;AACD;;AACD,cAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,SAA1B,EAAqCa,KAArC,EAJsC,CAMtC;;;AACA,cAAI,CAAC6K,QAAL,GAAgB,MAAI,CAACvhB,OAAL,CAAa0hB,YAAb,EAAhB;AACA,cAAI,CAACuO,cAAL,GAAsB,KAAtB;;AACA,YAAI,CAACvZ,KAAK,CAACwZ,kBAAN,EAAL,EAAiC;AAC/B,cAAI,MAAI,CAAC/xB,OAAL,CAAasB,SAAjB,EAA4B;AAC1B,kBAAI,CAACwwB,cAAL,GAAsB,MAAI,CAACE,YAAL,CAAkBzZ,KAAlB,CAAtB;AACD,WAFD,MAEO;AACL,kBAAI,CAAC0Z,+BAAL,CAAqC1Z,KAArC;AACD;AACF;;AACD,YAAI,MAAI,CAACoX,SAAL,CAAe,CAAf,EAAkBpX,KAAlB,CAAJ,EAA8B;AAC5B,cAAMgW,SAAS,GAAG,MAAI,CAACqB,YAAL,EAAlB;;AACA,cAAIrB,SAAS,CAAC7S,EAAV,GAAe6S,SAAS,CAAC/S,EAAzB,KAAgC,CAApC,EAAuC;AACrC,mBAAO,KAAP;AACD;AACF;;AACD,cAAI,CAACqU,YAAL,GAtBsC,CAwBtC;;;AACA,YAAI,MAAI,CAAC7vB,OAAL,CAAakyB,oBAAjB,EAAuC;AACrC,cAAI,MAAI,CAACJ,cAAL,KAAwB,KAA5B,EAAmC;AACjC,kBAAI,CAACjwB,OAAL,CAAawhB,UAAb;AACD;AACF;AACF,OA9BD,EA8BGvO,EA9BH,CA8BM,OA9BN,EA8Be,UAACyD,KAAD,EAAW;AACxB,cAAI,CAACsX,YAAL;;AACA,cAAI,CAAC7sB,OAAL,CAAa0U,YAAb,CAA0B,OAA1B,EAAmCa,KAAnC;AACD,OAjCD,EAiCGzD,EAjCH,CAiCM,OAjCN,EAiCe,UAACyD,KAAD,EAAW;AACxB,cAAI,CAACsX,YAAL;;AACA,cAAI,CAAC7sB,OAAL,CAAa0U,YAAb,CAA0B,OAA1B,EAAmCa,KAAnC;AACD,OApCD,EAoCGzD,EApCH,CAoCM,MApCN,EAoCc,UAACyD,KAAD,EAAW;AACvB,cAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,MAA1B,EAAkCa,KAAlC;AACD,OAtCD,EAsCGzD,EAtCH,CAsCM,WAtCN,EAsCmB,UAACyD,KAAD,EAAW;AAC5B,cAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,WAA1B,EAAuCa,KAAvC;AACD,OAxCD,EAwCGzD,EAxCH,CAwCM,SAxCN,EAwCiB,UAACyD,KAAD,EAAW;AAC1B,cAAI,CAACsX,YAAL;;AACA,cAAI,CAAChuB,OAAL,CAAawhB,UAAb;;AACA,cAAI,CAACrgB,OAAL,CAAa0U,YAAb,CAA0B,SAA1B,EAAqCa,KAArC;AACD,OA5CD,EA4CGzD,EA5CH,CA4CM,QA5CN,EA4CgB,UAACyD,KAAD,EAAW;AACzB,cAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoCa,KAApC;AACD,OA9CD,EA8CGzD,EA9CH,CA8CM,OA9CN,EA8Ce,UAACyD,KAAD,EAAW;AACxB,cAAI,CAACsX,YAAL;;AACA,cAAI,CAAC7sB,OAAL,CAAa0U,YAAb,CAA0B,OAA1B,EAAmCa,KAAnC;AACD,OAjDD,EAiDGzD,EAjDH,CAiDM,OAjDN,EAiDe,YAAM;AACnB;AACA,YAAI,MAAI,CAAC6a,SAAL,CAAe,CAAf,KAAqB,MAAI,CAACvM,QAA9B,EAAwC;AACtC,gBAAI,CAACvhB,OAAL,CAAayhB,aAAb,CAA2B,MAAI,CAACF,QAAhC;AACD;AACF,OAtDD;AAwDA,WAAKH,SAAL,CAAenL,IAAf,CAAoB,YAApB,EAAkC,KAAK9X,OAAL,CAAamyB,UAA/C;AAEA,WAAKlP,SAAL,CAAenL,IAAf,CAAoB,aAApB,EAAmC,KAAK9X,OAAL,CAAamyB,UAAhD;;AAEA,UAAI,KAAKnyB,OAAL,CAAaoyB,cAAjB,EAAiC;AAC/B,aAAKnP,SAAL,CAAenL,IAAf,CAAoB,YAApB,EAAkC,KAAlC;AACD,OAhEU,CAkEX;;;AACA,WAAKmL,SAAL,CAAerP,IAAf,CAAoBmC,QAAA,CAAS,KAAKE,KAAd,KAAwBF,aAA5C;AAEA,WAAKkN,SAAL,CAAenO,EAAf,CAAkBtK,kBAAlB,EAAsC3C,aAAA,CAAc,YAAM;AACxD,cAAI,CAAC7E,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoC,MAAI,CAACuL,SAAL,CAAerP,IAAf,EAApC,EAA2D,MAAI,CAACqP,SAAhE;AACD,OAFqC,EAEnC,EAFmC,CAAtC;AAIA,WAAKA,SAAL,CAAenO,EAAf,CAAkB,SAAlB,EAA6B,UAACyD,KAAD,EAAW;AACtC,cAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,SAA1B,EAAqCa,KAArC;AACD,OAFD,EAEGzD,EAFH,CAEM,UAFN,EAEkB,UAACyD,KAAD,EAAW;AAC3B,cAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,UAA1B,EAAsCa,KAAtC;AACD,OAJD;;AAMA,UAAI,KAAKvY,OAAL,CAAaqyB,OAAjB,EAA0B;AACxB,YAAI,KAAKryB,OAAL,CAAasyB,mBAAjB,EAAsC;AACpC,eAAKhE,OAAL,CAAaxZ,EAAb,CAAgB,aAAhB,EAA+B,UAACyD,KAAD,EAAW;AACxC,kBAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,aAA1B,EAAyCa,KAAzC;;AACA,mBAAO,KAAP;AACD,WAHD;AAID;AACF,OAPD,MAOO;AACL,YAAI,KAAKvY,OAAL,CAAaoD,KAAjB,EAAwB;AACtB,eAAKkrB,OAAL,CAAaiE,UAAb,CAAwB,KAAKvyB,OAAL,CAAaoD,KAArC;AACD;;AACD,YAAI,KAAKpD,OAAL,CAAa3D,MAAjB,EAAyB;AACvB,eAAK4mB,SAAL,CAAexO,WAAf,CAA2B,KAAKzU,OAAL,CAAa3D,MAAxC;AACD;;AACD,YAAI,KAAK2D,OAAL,CAAawyB,SAAjB,EAA4B;AAC1B,eAAKvP,SAAL,CAAeP,GAAf,CAAmB,YAAnB,EAAiC,KAAK1iB,OAAL,CAAawyB,SAA9C;AACD;;AACD,YAAI,KAAKxyB,OAAL,CAAayyB,SAAjB,EAA4B;AAC1B,eAAKxP,SAAL,CAAeP,GAAf,CAAmB,YAAnB,EAAiC,KAAK1iB,OAAL,CAAayyB,SAA9C;AACD;AACF;;AAED,WAAK5wB,OAAL,CAAawhB,UAAb;AACA,WAAKwM,YAAL;AACD;;;WAED,mBAAU;AACR,WAAK5M,SAAL,CAAejO,GAAf;AACD;;;WAED,sBAAauD,KAAb,EAAoB;AAClB,UAAMma,MAAM,GAAG,KAAK1yB,OAAL,CAAa0yB,MAAb,CAAoBloB,SAAA,GAAY,KAAZ,GAAoB,IAAxC,CAAf;AACA,UAAMoK,IAAI,GAAG,EAAb;;AAEA,UAAI2D,KAAK,CAACoa,OAAV,EAAmB;AAAE/d,QAAAA,IAAI,CAACzK,IAAL,CAAU,KAAV;AAAmB;;AACxC,UAAIoO,KAAK,CAACqa,OAAN,IAAiB,CAACra,KAAK,CAACsa,MAA5B,EAAoC;AAAEje,QAAAA,IAAI,CAACzK,IAAL,CAAU,MAAV;AAAoB;;AAC1D,UAAIoO,KAAK,CAACua,QAAV,EAAoB;AAAEle,QAAAA,IAAI,CAACzK,IAAL,CAAU,OAAV;AAAqB;;AAE3C,UAAM4oB,OAAO,GAAG/rB,gBAAA,CAAiBuR,KAAK,CAACiI,OAAvB,CAAhB;;AACA,UAAIuS,OAAJ,EAAa;AACXne,QAAAA,IAAI,CAACzK,IAAL,CAAU4oB,OAAV;AACD;;AAED,UAAMC,SAAS,GAAGN,MAAM,CAAC9d,IAAI,CAACjN,IAAL,CAAU,GAAV,CAAD,CAAxB;;AAEA,UAAIorB,OAAO,KAAK,KAAZ,IAAqB,CAAC,KAAK/yB,OAAL,CAAaizB,UAAvC,EAAmD;AACjD,aAAK7D,YAAL;AACD,OAFD,MAEO,IAAI4D,SAAJ,EAAe;AACpB,YAAI,KAAKhwB,OAAL,CAAa+C,MAAb,CAAoBitB,SAApB,MAAmC,KAAvC,EAA8C;AAC5Cza,UAAAA,KAAK,CAACE,cAAN,GAD4C,CAE5C;;AACA,iBAAO,IAAP;AACD;AACF,OANM,MAMA,IAAIzR,UAAA,CAAWuR,KAAK,CAACiI,OAAjB,CAAJ,EAA+B;AACpC,aAAK4O,YAAL;AACD;;AACD,aAAO,KAAP;AACD;;;WAED,yCAAgC7W,KAAhC,EAAuC;AACrC;AACA,UAAI,CAACA,KAAK,CAACqa,OAAN,IAAiBra,KAAK,CAACoa,OAAxB,KACF9yB,cAAA,CAAe,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,CAAf,EAA6B0Y,KAAK,CAACiI,OAAnC,CADF,EAC+C;AAC7CjI,QAAAA,KAAK,CAACE,cAAN;AACD;AACF;;;WAED,mBAAUya,GAAV,EAAe3a,KAAf,EAAsB;AACpB2a,MAAAA,GAAG,GAAGA,GAAG,IAAI,CAAb;;AAEA,UAAI,OAAO3a,KAAP,KAAiB,WAArB,EAAkC;AAChC,YAAIvR,UAAA,CAAWuR,KAAK,CAACiI,OAAjB,KACAxZ,gBAAA,CAAiBuR,KAAK,CAACiI,OAAvB,CADA,IAECjI,KAAK,CAACqa,OAAN,IAAiBra,KAAK,CAACoa,OAFxB,IAGA9yB,cAAA,CAAe,CAACmH,kBAAD,EAAqBA,eAArB,CAAf,EAAsDuR,KAAK,CAACiI,OAA5D,CAHJ,EAG0E;AACxE,iBAAO,KAAP;AACD;AACF;;AAED,UAAI,KAAKxgB,OAAL,CAAamzB,aAAb,GAA6B,CAAjC,EAAoC;AAClC,YAAK,KAAKlQ,SAAL,CAAenQ,IAAf,GAAsBnK,MAAtB,GAA+BuqB,GAAhC,GAAuC,KAAKlzB,OAAL,CAAamzB,aAAxD,EAAuE;AACrE,iBAAO,IAAP;AACD;AACF;;AACD,aAAO,KAAP;AACD;AAED;AACF;AACA;AACA;;;;WACE,uBAAc;AACZ,WAAKzZ,KAAL;AACA,WAAKmW,YAAL;AACA,aAAO,KAAKD,YAAL,EAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,6BAAoBwD,GAApB,EAAyB;AACvB,UAAMC,UAAU,GAAGxQ,0BAAA,CAA2BhjB,UAAA,CAAWuzB,GAAX,CAA3B,CAAnB;AACA,UAAMhiB,UAAU,GAAGiiB,UAAU,CAAChW,aAAX,EAAnB;AACA,UAAMiW,QAAQ,GAAGzQ,yBAAA,CAA0BhjB,UAAA,CAAWuzB,GAAX,CAA1B,CAAjB;AACA,UAAM/hB,QAAQ,GAAGiiB,QAAQ,CAACnW,WAAT,EAAjB;AAEA,aAAO0F,YAAA,CACLzR,UAAU,CAACtG,IADN,EAELsG,UAAU,CAAC9B,MAFN,EAGL+B,QAAQ,CAACvG,IAHJ,EAILuG,QAAQ,CAAC/B,MAJJ,CAAP;AAMD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,sBAAawO,GAAb,EAAkB;AAChB,UAAIA,GAAJ,EAAS;AACP,aAAKyQ,SAAL,GAAiBzQ,GAAjB;AACD,OAFD,MAEO;AACL,aAAKyQ,SAAL,GAAiB1L,YAAA,CAAa,KAAKhL,QAAlB,CAAjB;;AAEA,YAAIjc,yBAAC,CAAC,KAAK2yB,SAAL,CAAehT,EAAhB,CAAD,CAAqB3C,OAArB,CAA6B,gBAA7B,EAA+CjQ,MAA/C,KAA0D,CAA9D,EAAiE;AAC/D,eAAK4lB,SAAL,GAAiB1L,2BAAA,CAA4B,KAAKhL,QAAjC,CAAjB;AACD;AACF;AACF;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,wBAAe;AACb,UAAI,CAAC,KAAK0W,SAAV,EAAqB;AACnB,aAAKsB,YAAL;AACD;;AACD,aAAO,KAAKtB,SAAZ;AACD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,mBAAUgF,YAAV,EAAwB;AACtB,UAAIA,YAAJ,EAAkB;AAChB,aAAK3D,YAAL,GAAoBrV,QAApB,GAA+BtY,MAA/B;AACD;AACF;AAED;AACF;AACA;AACA;AACA;;;;WACE,wBAAe;AACb,UAAI,KAAKssB,SAAT,EAAoB;AAClB,aAAKA,SAAL,CAAetsB,MAAf;AACA,aAAKyX,KAAL;AACD;AACF;;;WAED,oBAAW5O,IAAX,EAAiB;AACf,WAAKmY,SAAL,CAAepK,IAAf,CAAoB,QAApB,EAA8B/N,IAA9B;AACD;;;WAED,uBAAc;AACZ,WAAKmY,SAAL,CAAerM,UAAf,CAA0B,QAA1B;AACD;;;WAED,yBAAgB;AACd,aAAO,KAAKqM,SAAL,CAAepK,IAAf,CAAoB,QAApB,CAAP;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,wBAAe;AACb,UAAIiF,GAAG,GAAG+E,YAAA,EAAV;;AACA,UAAI/E,GAAJ,EAAS;AACPA,QAAAA,GAAG,GAAGA,GAAG,CAACE,SAAJ,EAAN;AACD;;AACD,aAAOF,GAAG,GAAG,KAAK3e,KAAL,CAAWoP,OAAX,CAAmBuP,GAAnB,CAAH,GAA6B,KAAK3e,KAAL,CAAWslB,QAAX,CAAoB,KAAKxB,SAAzB,CAAvC;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,uBAAcxP,KAAd,EAAqB;AACnB,aAAO,KAAKtU,KAAL,CAAWslB,QAAX,CAAoBhR,KAApB,CAAP;AACD;AAED;AACF;AACA;;;;WACE,gBAAO;AACL,WAAKzQ,OAAL,CAAa0U,YAAb,CAA0B,gBAA1B,EAA4C,KAAKuL,SAAL,CAAerP,IAAf,EAA5C;AACA,WAAK/R,OAAL,CAAaC,IAAb;AACA,WAAKkB,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoC,KAAKuL,SAAL,CAAerP,IAAf,EAApC,EAA2D,KAAKqP,SAAhE;AACD;AAED;AACF;AACA;;;;WACE,kBAAS;AACP,WAAKjgB,OAAL,CAAa0U,YAAb,CAA0B,gBAA1B,EAA4C,KAAKuL,SAAL,CAAerP,IAAf,EAA5C;AACA,WAAK/R,OAAL,CAAa2xB,MAAb;AACA,WAAKxwB,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoC,KAAKuL,SAAL,CAAerP,IAAf,EAApC,EAA2D,KAAKqP,SAAhE;AACD;AAED;AACF;AACA;;;;WACE,gBAAO;AACL,WAAKjgB,OAAL,CAAa0U,YAAb,CAA0B,gBAA1B,EAA4C,KAAKuL,SAAL,CAAerP,IAAf,EAA5C;AACA,WAAK/R,OAAL,CAAaE,IAAb;AACA,WAAKiB,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoC,KAAKuL,SAAL,CAAerP,IAAf,EAApC,EAA2D,KAAKqP,SAAhE;AACD;AAED;AACF;AACA;;;;WACE,yBAAgB;AACd,WAAKjgB,OAAL,CAAa0U,YAAb,CAA0B,gBAA1B,EAA4C,KAAKuL,SAAL,CAAerP,IAAf,EAA5C,EADc,CAGd;;AACA9Q,MAAAA,QAAQ,CAACqsB,WAAT,CAAqB,cAArB,EAAqC,KAArC,EAA4C,KAAKnvB,OAAL,CAAayzB,YAAzD,EAJc,CAMd;;AACA,WAAK/Z,KAAL;AACD;AAED;AACF;AACA;AACA;;;;WACE,sBAAaga,gBAAb,EAA+B;AAC7B,WAAKC,gBAAL;AACA,WAAK9xB,OAAL,CAAawhB,UAAb;;AACA,UAAI,CAACqQ,gBAAL,EAAuB;AACrB,aAAK1wB,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoC,KAAKuL,SAAL,CAAerP,IAAf,EAApC,EAA2D,KAAKqP,SAAhE;AACD;AACF;AAED;AACF;AACA;;;;WACE,eAAM;AACJ,UAAMnF,GAAG,GAAG,KAAK8R,YAAL,EAAZ;;AACA,UAAI9R,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAC/B,QAAJ,EAAzB,EAAyC;AACvC,aAAKrd,KAAL,CAAWqoB,GAAX,CAAejJ,GAAf;AACD,OAFD,MAEO;AACL,YAAI,KAAK9d,OAAL,CAAa4zB,OAAb,KAAyB,CAA7B,EAAgC;AAC9B,iBAAO,KAAP;AACD;;AAED,YAAI,CAAC,KAAKjE,SAAL,CAAe,KAAK3vB,OAAL,CAAa4zB,OAA5B,CAAL,EAA2C;AACzC,eAAK1E,aAAL;AACA,eAAKV,MAAL,CAAYqF,SAAZ,CAAsB/V,GAAtB,EAA2B,KAAK9d,OAAL,CAAa4zB,OAAxC;AACA,eAAKxE,YAAL;AACD;AACF;AACF;AAED;AACF;AACA;;;;WACE,iBAAQ;AACN,UAAMtR,GAAG,GAAG,KAAK8R,YAAL,EAAZ;;AACA,UAAI9R,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAC/B,QAAJ,EAAzB,EAAyC;AACvC,aAAKrd,KAAL,CAAWqoB,GAAX,CAAejJ,GAAf,EAAoB,IAApB;AACD,OAFD,MAEO;AACL,YAAI,KAAK9d,OAAL,CAAa4zB,OAAb,KAAyB,CAA7B,EAAgC;AAC9B,iBAAO,KAAP;AACD;AACF;AACF;AAED;AACF;AACA;;;;WACE,qBAAYtqB,EAAZ,EAAgB;AACd,aAAO,YAAW;AAChB,aAAK4lB,aAAL;AACA5lB,QAAAA,EAAE,CAAC/D,KAAH,CAAS,IAAT,EAAeC,SAAf;AACA,aAAK4pB,YAAL;AACD,OAJD;AAKD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,qBAAY0E,GAAZ,EAAiBC,KAAjB,EAAwB;AAAA;;AACtB,aAAOzR,WAAW,CAACwR,GAAD,EAAMC,KAAN,CAAX,CAAwBC,IAAxB,CAA6B,UAACC,MAAD,EAAY;AAC9C,cAAI,CAAC/E,aAAL;;AAEA,YAAI,OAAO6E,KAAP,KAAiB,UAArB,EAAiC;AAC/BA,UAAAA,KAAK,CAACE,MAAD,CAAL;AACD,SAFD,MAEO;AACL,cAAI,OAAOF,KAAP,KAAiB,QAArB,EAA+B;AAC7BE,YAAAA,MAAM,CAACnc,IAAP,CAAY,eAAZ,EAA6Bic,KAA7B;AACD;;AACDE,UAAAA,MAAM,CAACvR,GAAP,CAAW,OAAX,EAAoB9F,IAAI,CAACsX,GAAL,CAAS,MAAI,CAACjR,SAAL,CAAe7f,KAAf,EAAT,EAAiC6wB,MAAM,CAAC7wB,KAAP,EAAjC,CAApB;AACD;;AAED6wB,QAAAA,MAAM,CAACE,IAAP;;AACA,cAAI,CAACvE,YAAL,GAAoBpR,UAApB,CAA+ByV,MAAM,CAAC,CAAD,CAArC;;AACA,cAAI,CAACpE,YAAL,CAAkBhN,yBAAA,CAA0BoR,MAAM,CAAC,CAAD,CAAhC,EAAqChyB,MAArC,EAAlB;;AACA,cAAI,CAACmtB,YAAL;AACD,OAhBM,EAgBJhqB,IAhBI,CAgBC,UAAC4Z,CAAD,EAAO;AACb,cAAI,CAAChc,OAAL,CAAa0U,YAAb,CAA0B,oBAA1B,EAAgDsH,CAAhD;AACD,OAlBM,CAAP;AAmBD;AAED;AACF;AACA;AACA;;;;WACE,+BAAsBoV,KAAtB,EAA6B;AAAA;;AAC3Bx4B,MAAAA,8BAAA,CAAOw4B,KAAP,EAAc,UAACnrB,GAAD,EAAMyY,IAAN,EAAe;AAC3B,YAAM2S,QAAQ,GAAG3S,IAAI,CAACplB,IAAtB;;AACA,YAAI,MAAI,CAAC0D,OAAL,CAAas0B,oBAAb,IAAqC,MAAI,CAACt0B,OAAL,CAAas0B,oBAAb,GAAoC5S,IAAI,CAAChlB,IAAlF,EAAwF;AACtF,gBAAI,CAACsG,OAAL,CAAa0U,YAAb,CAA0B,oBAA1B,EAAgD,MAAI,CAAC5b,IAAL,CAAUc,KAAV,CAAgBiB,oBAAhE;AACD,SAFD,MAEO;AACL4jB,UAAAA,iBAAiB,CAACC,IAAD,CAAjB,CAAwBsS,IAAxB,CAA6B,UAACjS,OAAD,EAAa;AACxC,mBAAO,MAAI,CAACwS,WAAL,CAAiBxS,OAAjB,EAA0BsS,QAA1B,CAAP;AACD,WAFD,EAEGjvB,IAFH,CAEQ,YAAM;AACZ,kBAAI,CAACpC,OAAL,CAAa0U,YAAb,CAA0B,oBAA1B;AACD,WAJD;AAKD;AACF,OAXD;AAYD;AAED;AACF;AACA;AACA;;;;WACE,gCAAuB0c,KAAvB,EAA8B;AAC5B,UAAMnc,SAAS,GAAG,KAAKjY,OAAL,CAAaiY,SAA/B,CAD4B,CAE5B;;AACA,UAAIA,SAAS,CAACuc,aAAd,EAA6B;AAC3B,aAAKxxB,OAAL,CAAa0U,YAAb,CAA0B,cAA1B,EAA0C0c,KAA1C,EAD2B,CAE3B;AACD,OAHD,MAGO;AACL,aAAKK,qBAAL,CAA2BL,KAA3B;AACD;AACF;AAED;AACF;AACA;AACA;;;;WACE,2BAAkB;AAChB,UAAItW,GAAG,GAAG,KAAK8R,YAAL,EAAV,CADgB,CAGhB;;AACA,UAAI9R,GAAG,CAAChC,UAAJ,EAAJ,EAAsB;AACpBgC,QAAAA,GAAG,GAAG+E,oBAAA,CAAqB9M,YAAA,CAAa+H,GAAG,CAACvC,EAAjB,EAAqBxF,YAArB,CAArB,CAAN;AACD;;AAED,aAAO+H,GAAG,CAACW,QAAJ,EAAP;AACD;;;WAED,uBAAcmJ,OAAd,EAAuBlP,OAAvB,EAAgC;AAC9B;AACA5V,MAAAA,QAAQ,CAACqsB,WAAT,CAAqB,aAArB,EAAoC,KAApC,EAA2C3kB,UAAA,GAAa,MAAMod,OAAN,GAAgB,GAA7B,GAAmCA,OAA9E,EAF8B,CAI9B;;AACA,UAAIlP,OAAO,IAAIA,OAAO,CAAC/P,MAAvB,EAA+B;AAC7B;AACA,YAAI+P,OAAO,CAAC,CAAD,CAAP,CAAWkP,OAAX,CAAmBlgB,WAAnB,OAAqCkgB,OAAO,CAAClgB,WAAR,EAAzC,EAAgE;AAC9DgR,UAAAA,OAAO,GAAGA,OAAO,CAAC3P,IAAR,CAAa6e,OAAb,CAAV;AACD;;AAED,YAAIlP,OAAO,IAAIA,OAAO,CAAC/P,MAAvB,EAA+B;AAC7B,cAAM+rB,YAAY,GAAG,KAAK9vB,WAAL,EAArB;AACA,cAAM+vB,OAAO,GAAG/4B,yBAAC,CAAC,CAAC84B,YAAY,CAACnZ,EAAd,EAAkBmZ,YAAY,CAACjZ,EAA/B,CAAD,CAAD,CAAsC7C,OAAtC,CAA8CgP,OAA9C,CAAhB,CAF6B,CAG7B;;AACA+M,UAAAA,OAAO,CAACC,WAAR;AACA,cAAMC,SAAS,GAAGnc,OAAO,CAAC,CAAD,CAAP,CAAWmc,SAAX,IAAwB,EAA1C;;AACA,cAAIA,SAAJ,EAAe;AACbF,YAAAA,OAAO,CAACxG,QAAR,CAAiB0G,SAAjB;AACD;AACF;AACF;AACF;;;WAED,sBAAa;AACX,WAAKnF,WAAL,CAAiB,GAAjB;AACD;;;WAED,qBAAY/W,MAAZ,EAAoBnF,KAApB,EAA2B;AACzB,UAAMsK,GAAG,GAAG,KAAK8R,YAAL,EAAZ;;AAEA,UAAI9R,GAAG,KAAK,EAAZ,EAAgB;AACd,YAAMgX,KAAK,GAAG,KAAK31B,KAAL,CAAW6xB,UAAX,CAAsBlT,GAAtB,CAAd;AACA,aAAKwQ,OAAL,CAAavlB,IAAb,CAAkB,qBAAlB,EAAyC6K,IAAzC,CAA8C,EAA9C;AACAhY,QAAAA,yBAAC,CAACk5B,KAAD,CAAD,CAASpS,GAAT,CAAa/J,MAAb,EAAqBnF,KAArB,EAHc,CAKd;AACA;;AACA,YAAIsK,GAAG,CAACV,WAAJ,EAAJ,EAAuB;AACrB,cAAM2X,SAAS,GAAGl1B,UAAA,CAAWi1B,KAAX,CAAlB;;AACA,cAAIC,SAAS,IAAI,CAAChf,cAAA,CAAegf,SAAf,CAAlB,EAA6C;AAC3CA,YAAAA,SAAS,CAACznB,SAAV,GAAsByI,wBAAtB;AACA8M,YAAAA,oBAAA,CAAqBkS,SAAS,CAACva,UAA/B,EAA2CvY,MAA3C;AACA,iBAAK4tB,YAAL;AACA,iBAAK5M,SAAL,CAAepK,IAAf,CAAoBuV,SAApB,EAA+B2G,SAA/B;AACD;AACF,SARD,MAQO;AACL,eAAKlF,YAAL,CACE,KAAKoB,mBAAL,CAAyB6D,KAAzB,EAAgC7yB,MAAhC,EADF;AAGD;AACF,OApBD,MAoBO;AACL,YAAM+yB,gBAAgB,GAAGp5B,6BAAA,EAAzB;AACA,aAAK0yB,OAAL,CAAavlB,IAAb,CAAkB,qBAAlB,EAAyC6K,IAAzC,CAA8C,iCAAiCohB,gBAAjC,GAAoD,6BAApD,GAAoF,KAAKl5B,IAAL,CAAUoG,MAAV,CAAiBC,WAArG,GAAmH,QAAjK;AACAkG,QAAAA,UAAU,CAAC,YAAW;AAAEzM,UAAAA,yBAAC,CAAC,yBAAyBo5B,gBAA1B,CAAD,CAA6Cj3B,MAA7C;AAAwD,SAAtE,EAAwE,IAAxE,CAAV;AACD;AACF;AAED;AACF;AACA;AACA;AACA;;;;WACE,kBAAS;AACP,UAAI+f,GAAG,GAAG,KAAK8R,YAAL,EAAV;;AACA,UAAI9R,GAAG,CAAChC,UAAJ,EAAJ,EAAsB;AACpB,YAAMkJ,MAAM,GAAGjP,YAAA,CAAa+H,GAAG,CAACvC,EAAjB,EAAqBxF,YAArB,CAAf;AACA+H,QAAAA,GAAG,GAAG+E,oBAAA,CAAqBmC,MAArB,CAAN;AACAlH,QAAAA,GAAG,CAAC7b,MAAJ;AACA,aAAK4tB,YAAL;AAEA,aAAKX,aAAL;AACApsB,QAAAA,QAAQ,CAACqsB,WAAT,CAAqB,QAArB;AACA,aAAKC,YAAL;AACD;AACF;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;WACE,uBAAc;AACZ,UAAMtR,GAAG,GAAG,KAAK8R,YAAL,GAAoBqF,MAApB,CAA2Blf,YAA3B,CAAZ,CADY,CAEZ;;AACA,UAAMmf,OAAO,GAAGt5B,yBAAC,CAACiE,UAAA,CAAWie,GAAG,CAAC5P,KAAJ,CAAU6H,YAAV,CAAX,CAAD,CAAjB;AACA,UAAMua,QAAQ,GAAG;AACfzN,QAAAA,KAAK,EAAE/E,GADQ;AAEfhL,QAAAA,IAAI,EAAEgL,GAAG,CAACW,QAAJ,EAFS;AAGf3gB,QAAAA,GAAG,EAAEo3B,OAAO,CAACvsB,MAAR,GAAiBusB,OAAO,CAACpd,IAAR,CAAa,MAAb,CAAjB,GAAwC;AAH9B,OAAjB,CAJY,CAUZ;;AACA,UAAIod,OAAO,CAACvsB,MAAZ,EAAoB;AAClB;AACA2nB,QAAAA,QAAQ,CAACG,WAAT,GAAuByE,OAAO,CAACpd,IAAR,CAAa,QAAb,MAA2B,QAAlD;AACD;;AAED,aAAOwY,QAAP;AACD;;;WAED,gBAAO5gB,QAAP,EAAiB;AACf,UAAMoO,GAAG,GAAG,KAAK8R,YAAL,CAAkB,KAAK3M,SAAvB,CAAZ;;AACA,UAAInF,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAC/B,QAAJ,EAAzB,EAAyC;AACvC,aAAKmT,aAAL;AACA,aAAKxwB,KAAL,CAAWy2B,MAAX,CAAkBrX,GAAlB,EAAuBpO,QAAvB;AACA,aAAK0f,YAAL;AACD;AACF;;;WAED,gBAAO1f,QAAP,EAAiB;AACf,UAAMoO,GAAG,GAAG,KAAK8R,YAAL,CAAkB,KAAK3M,SAAvB,CAAZ;;AACA,UAAInF,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAC/B,QAAJ,EAAzB,EAAyC;AACvC,aAAKmT,aAAL;AACA,aAAKxwB,KAAL,CAAW02B,MAAX,CAAkBtX,GAAlB,EAAuBpO,QAAvB;AACA,aAAK0f,YAAL;AACD;AACF;;;WAED,qBAAY;AACV,UAAMtR,GAAG,GAAG,KAAK8R,YAAL,CAAkB,KAAK3M,SAAvB,CAAZ;;AACA,UAAInF,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAC/B,QAAJ,EAAzB,EAAyC;AACvC,aAAKmT,aAAL;AACA,aAAKxwB,KAAL,CAAW22B,SAAX,CAAqBvX,GAArB;AACA,aAAKsR,YAAL;AACD;AACF;;;WAED,qBAAY;AACV,UAAMtR,GAAG,GAAG,KAAK8R,YAAL,CAAkB,KAAK3M,SAAvB,CAAZ;;AACA,UAAInF,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAC/B,QAAJ,EAAzB,EAAyC;AACvC,aAAKmT,aAAL;AACA,aAAKxwB,KAAL,CAAW42B,SAAX,CAAqBxX,GAArB;AACA,aAAKsR,YAAL;AACD;AACF;;;WAED,uBAAc;AACZ,UAAMtR,GAAG,GAAG,KAAK8R,YAAL,CAAkB,KAAK3M,SAAvB,CAAZ;;AACA,UAAInF,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAC/B,QAAJ,EAAzB,EAAyC;AACvC,aAAKmT,aAAL;AACA,aAAKxwB,KAAL,CAAW62B,WAAX,CAAuBzX,GAAvB;AACA,aAAKsR,YAAL;AACD;AACF;AAED;AACF;AACA;AACA;AACA;;;;WACE,kBAAS5a,GAAT,EAAckE,OAAd,EAAuB8c,UAAvB,EAAmC;AACjC,UAAIC,SAAJ;;AACA,UAAID,UAAJ,EAAgB;AACd,YAAME,QAAQ,GAAGlhB,GAAG,CAACmhB,CAAJ,GAAQnhB,GAAG,CAACohB,CAA7B;AACA,YAAMC,KAAK,GAAGnd,OAAO,CAACG,IAAR,CAAa,OAAb,CAAd;AACA4c,QAAAA,SAAS,GAAG;AACVryB,UAAAA,KAAK,EAAEyyB,KAAK,GAAGH,QAAR,GAAmBlhB,GAAG,CAACohB,CAAvB,GAA2BphB,GAAG,CAACmhB,CAAJ,GAAQE,KADhC;AAEVx5B,UAAAA,MAAM,EAAEw5B,KAAK,GAAGH,QAAR,GAAmBlhB,GAAG,CAACohB,CAAJ,GAAQC,KAA3B,GAAmCrhB,GAAG,CAACmhB;AAFrC,SAAZ;AAID,OAPD,MAOO;AACLF,QAAAA,SAAS,GAAG;AACVryB,UAAAA,KAAK,EAAEoR,GAAG,CAACohB,CADD;AAEVv5B,UAAAA,MAAM,EAAEmY,GAAG,CAACmhB;AAFF,SAAZ;AAID;;AAEDjd,MAAAA,OAAO,CAACgK,GAAR,CAAY+S,SAAZ;AACD;AAED;AACF;AACA;;;;WACE,oBAAW;AACT,aAAO,KAAKxS,SAAL,CAAe6S,EAAf,CAAkB,QAAlB,CAAP;AACD;AAED;AACF;AACA;;;;WACE,iBAAQ;AACN;AACA;AACA,UAAI,CAAC,KAAKC,QAAL,EAAL,EAAsB;AACpB,aAAK9S,SAAL,CAAevJ,KAAf;AACD;AACF;AAED;AACF;AACA;AACA;;;;WACE,mBAAU;AACR,aAAO3D,WAAA,CAAY,KAAKkN,SAAL,CAAe,CAAf,CAAZ,KAAkClN,aAAA,KAAkB,KAAKkN,SAAL,CAAerP,IAAf,EAA3D;AACD;AAED;AACF;AACA;;;;WACE,iBAAQ;AACN,WAAK5Q,OAAL,CAAa+C,MAAb,CAAoB,MAApB,EAA4BgQ,aAA5B;AACD;AAED;AACF;AACA;;;;WACE,4BAAmB;AACjB,WAAKkN,SAAL,CAAe,CAAf,EAAkBjF,SAAlB;AACD;;;;;;;;;;;;;;AC3+BH;;IAEqBgY;AACnB,qBAAYhzB,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKigB,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACD;;;;WAED,sBAAa;AACX,WAAKoL,SAAL,CAAenO,EAAf,CAAkB,OAAlB,EAA2B,KAAKmhB,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,CAA3B;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,sBAAa3d,KAAb,EAAoB;AAAA;;AAClB,UAAM4d,aAAa,GAAG5d,KAAK,CAAC6d,aAAN,CAAoBD,aAA1C;;AAEA,UAAIA,aAAa,IAAIA,aAAa,CAACE,KAA/B,IAAwCF,aAAa,CAACE,KAAd,CAAoB1tB,MAAhE,EAAwE;AACtE,YAAM/C,IAAI,GAAGuwB,aAAa,CAACE,KAAd,CAAoB1tB,MAApB,GAA6B,CAA7B,GAAiCwtB,aAAa,CAACE,KAAd,CAAoB,CAApB,CAAjC,GAA0Dx2B,UAAA,CAAWs2B,aAAa,CAACE,KAAzB,CAAvE;;AACA,YAAIzwB,IAAI,CAAC0wB,IAAL,KAAc,MAAd,IAAwB1wB,IAAI,CAACsT,IAAL,CAAU7U,OAAV,CAAkB,QAAlB,MAAgC,CAAC,CAA7D,EAAgE;AAC9D;AACA,eAAKrB,OAAL,CAAa+C,MAAb,CAAoB,+BAApB,EAAqD,CAACH,IAAI,CAAC2wB,SAAL,EAAD,CAArD;AACAhe,UAAAA,KAAK,CAACE,cAAN;AACD,SAJD,MAIO,IAAI7S,IAAI,CAAC0wB,IAAL,KAAc,QAAlB,EAA4B;AACjC;AACA,cAAI,KAAKtzB,OAAL,CAAa+C,MAAb,CAAoB,kBAApB,EAAwCowB,aAAa,CAACK,OAAd,CAAsB,MAAtB,EAA8B7tB,MAAtE,CAAJ,EAAmF;AACjF4P,YAAAA,KAAK,CAACE,cAAN;AACD;AACF;AACF,OAZD,MAYO,IAAI1U,MAAM,CAACoyB,aAAX,EAA0B;AAC/B;AACA,YAAIrjB,IAAI,GAAG/O,MAAM,CAACoyB,aAAP,CAAqBK,OAArB,CAA6B,MAA7B,CAAX;;AACA,YAAI,KAAKxzB,OAAL,CAAa+C,MAAb,CAAoB,kBAApB,EAAwC+M,IAAI,CAACnK,MAA7C,CAAJ,EAA0D;AACxD4P,UAAAA,KAAK,CAACE,cAAN;AACD;AACF,OArBiB,CAsBlB;;;AACApQ,MAAAA,UAAU,CAAC,YAAM;AACf,aAAI,CAACrF,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;AACD,OAFS,EAEP,EAFO,CAAV;AAGD;;;;;;;;;;;;;;AC3CH;;IAEqB0wB;AACnB,oBAAYzzB,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAK0zB,cAAL,GAAsB96B,yBAAC,CAACkH,QAAD,CAAvB;AACA,SAAKwrB,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAK8L,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAK7X,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AACA,SAAKsd,qBAAL,GAA6B,EAA7B;AAEA,SAAKC,SAAL,GAAiBh7B,yBAAC,CAAC,CACjB,6BADiB,EAEf,2CAFe,EAGjB,QAHiB,EAIjB+L,IAJiB,CAIZ,EAJY,CAAD,CAAD,CAILkvB,SAJK,CAIK,KAAKvI,OAJV,CAAjB;AAKD;AAED;AACF;AACA;;;;;WACE,sBAAa;AACX,UAAI,KAAKtuB,OAAL,CAAa82B,kBAAjB,EAAqC;AACnC;AACA,aAAKH,qBAAL,CAA2BI,MAA3B,GAAoC,UAAC/X,CAAD,EAAO;AACzCA,UAAAA,CAAC,CAACvG,cAAF;AACD,SAFD,CAFmC,CAKnC;;;AACA,aAAKie,cAAL,GAAsB,KAAKE,SAA3B;AACA,aAAKF,cAAL,CAAoB5hB,EAApB,CAAuB,MAAvB,EAA+B,KAAK6hB,qBAAL,CAA2BI,MAA1D;AACD,OARD,MAQO;AACL,aAAKC,sBAAL;AACD;AACF;AAED;AACF;AACA;;;;WACE,kCAAyB;AAAA;;AACvB,UAAIrtB,UAAU,GAAG/N,yBAAC,EAAlB;AACA,UAAMq7B,gBAAgB,GAAG,KAAKL,SAAL,CAAe7tB,IAAf,CAAoB,wBAApB,CAAzB;;AAEA,WAAK4tB,qBAAL,CAA2BO,WAA3B,GAAyC,UAAClY,CAAD,EAAO;AAC9C,YAAMmY,UAAU,GAAG,KAAI,CAACn0B,OAAL,CAAa+C,MAAb,CAAoB,sBAApB,CAAnB;;AACA,YAAMqxB,aAAa,GAAG,KAAI,CAAC9I,OAAL,CAAalrB,KAAb,KAAuB,CAAvB,IAA4B,KAAI,CAACkrB,OAAL,CAAajyB,MAAb,KAAwB,CAA1E;;AACA,YAAI,CAAC86B,UAAD,IAAe,CAACxtB,UAAU,CAAChB,MAA3B,IAAqCyuB,aAAzC,EAAwD;AACtD,eAAI,CAAC9I,OAAL,CAAaH,QAAb,CAAsB,UAAtB;;AACA,eAAI,CAACyI,SAAL,CAAexzB,KAAf,CAAqB,KAAI,CAACkrB,OAAL,CAAalrB,KAAb,EAArB;;AACA,eAAI,CAACwzB,SAAL,CAAev6B,MAAf,CAAsB,KAAI,CAACiyB,OAAL,CAAajyB,MAAb,EAAtB;;AACA46B,UAAAA,gBAAgB,CAACnkB,IAAjB,CAAsB,KAAI,CAAChX,IAAL,CAAUc,KAAV,CAAgBa,aAAtC;AACD;;AACDkM,QAAAA,UAAU,GAAGA,UAAU,CAAC0tB,GAAX,CAAerY,CAAC,CAACrG,MAAjB,CAAb;AACD,OAVD;;AAYA,WAAKge,qBAAL,CAA2BW,WAA3B,GAAyC,UAACtY,CAAD,EAAO;AAC9CrV,QAAAA,UAAU,GAAGA,UAAU,CAACtE,GAAX,CAAe2Z,CAAC,CAACrG,MAAjB,CAAb,CAD8C,CAG9C;;AACA,YAAI,CAAChP,UAAU,CAAChB,MAAZ,IAAsBqW,CAAC,CAACrG,MAAF,CAASzN,QAAT,KAAsB,MAAhD,EAAwD;AACtDvB,UAAAA,UAAU,GAAG/N,yBAAC,EAAd;;AACA,eAAI,CAAC0yB,OAAL,CAAasG,WAAb,CAAyB,UAAzB;AACD;AACF,OARD;;AAUA,WAAK+B,qBAAL,CAA2BI,MAA3B,GAAoC,YAAM;AACxCptB,QAAAA,UAAU,GAAG/N,yBAAC,EAAd;;AACA,aAAI,CAAC0yB,OAAL,CAAasG,WAAb,CAAyB,UAAzB;AACD,OAHD,CA1BuB,CA+BvB;AACA;;;AACA,WAAK8B,cAAL,CAAoB5hB,EAApB,CAAuB,WAAvB,EAAoC,KAAK6hB,qBAAL,CAA2BO,WAA/D,EACGpiB,EADH,CACM,WADN,EACmB,KAAK6hB,qBAAL,CAA2BW,WAD9C,EAEGxiB,EAFH,CAEM,MAFN,EAEc,KAAK6hB,qBAAL,CAA2BI,MAFzC,EAjCuB,CAqCvB;;AACA,WAAKH,SAAL,CAAe9hB,EAAf,CAAkB,WAAlB,EAA+B,YAAM;AACnC,aAAI,CAAC8hB,SAAL,CAAezI,QAAf,CAAwB,OAAxB;;AACA8I,QAAAA,gBAAgB,CAACnkB,IAAjB,CAAsB,KAAI,CAAChX,IAAL,CAAUc,KAAV,CAAgBc,SAAtC;AACD,OAHD,EAGGoX,EAHH,CAGM,WAHN,EAGmB,YAAM;AACvB,aAAI,CAAC8hB,SAAL,CAAehC,WAAf,CAA2B,OAA3B;;AACAqC,QAAAA,gBAAgB,CAACnkB,IAAjB,CAAsB,KAAI,CAAChX,IAAL,CAAUc,KAAV,CAAgBa,aAAtC;AACD,OAND,EAtCuB,CA8CvB;;AACA,WAAKm5B,SAAL,CAAe9hB,EAAf,CAAkB,MAAlB,EAA0B,UAACyD,KAAD,EAAW;AACnC,YAAMgf,YAAY,GAAGhf,KAAK,CAAC6d,aAAN,CAAoBmB,YAAzC,CADmC,CAGnC;;AACAhf,QAAAA,KAAK,CAACE,cAAN;;AAEA,YAAI8e,YAAY,IAAIA,YAAY,CAACnD,KAA7B,IAAsCmD,YAAY,CAACnD,KAAb,CAAmBzrB,MAA7D,EAAqE;AACnE,eAAI,CAACsa,SAAL,CAAevJ,KAAf;;AACA,eAAI,CAAC1W,OAAL,CAAa+C,MAAb,CAAoB,+BAApB,EAAqDwxB,YAAY,CAACnD,KAAlE;AACD,SAHD,MAGO;AACLx4B,UAAAA,8BAAA,CAAO27B,YAAY,CAACC,KAApB,EAA2B,UAACvuB,GAAD,EAAMiQ,IAAN,EAAe;AACxC;AACA,gBAAIA,IAAI,CAAC1W,WAAL,GAAmB6B,OAAnB,CAA2B,OAA3B,IAAsC,CAAC,CAA3C,EAA8C;AAC5C;AACD;;AACD,gBAAMozB,OAAO,GAAGF,YAAY,CAACf,OAAb,CAAqBtd,IAArB,CAAhB;;AAEA,gBAAIA,IAAI,CAAC1W,WAAL,GAAmB6B,OAAnB,CAA2B,MAA3B,IAAqC,CAAC,CAA1C,EAA6C;AAC3C,mBAAI,CAACrB,OAAL,CAAa+C,MAAb,CAAoB,kBAApB,EAAwC0xB,OAAxC;AACD,aAFD,MAEO;AACL77B,cAAAA,yBAAC,CAAC67B,OAAD,CAAD,CAAWvoB,IAAX,CAAgB,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AAC7B,qBAAI,CAAC5C,OAAL,CAAa+C,MAAb,CAAoB,mBAApB,EAAyCH,IAAzC;AACD,eAFD;AAGD;AACF,WAdD;AAeD;AACF,OA1BD,EA0BGkP,EA1BH,CA0BM,UA1BN,EA0BkB,KA1BlB,EA/CuB,CAyEG;AAC3B;;;WAED,mBAAU;AAAA;;AACR7N,MAAAA,MAAM,CAAC2N,IAAP,CAAY,KAAK+hB,qBAAjB,EAAwC9hB,OAAxC,CAAgD,UAAC7N,GAAD,EAAS;AACvD,cAAI,CAAC0vB,cAAL,CAAoB1hB,GAApB,CAAwBhO,GAAG,CAAC0wB,MAAJ,CAAW,CAAX,EAAcl1B,WAAd,EAAxB,EAAqD,MAAI,CAACm0B,qBAAL,CAA2B3vB,GAA3B,CAArD;AACD,OAFD;AAGA,WAAK2vB,qBAAL,GAA6B,EAA7B;AACD;;;;;;;;;;;;;;;;;;;;ACxHH;AACA;AAEA;AACA;AACA;;IACqBgB;AACnB,oBAAY30B,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKsrB,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAK8L,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAK+f,QAAL,GAAgB50B,OAAO,CAACoT,UAAR,CAAmBwB,OAAnC;AACA,SAAK5X,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAK63B,qBAAL,GAA6B9zB,MAAM,CAAC+zB,UAApC;;AAEA,QAAI,KAAK93B,OAAL,CAAa+3B,UAAb,CAAwBF,qBAA5B,EAAmD;AACjD,WAAKA,qBAAL,GAA6B,KAAK73B,OAAL,CAAa+3B,UAAb,CAAwBF,qBAArD;AACD;AACF;;;;WAED,cAAKjkB,IAAL,EAAW;AACT,UAAMujB,UAAU,GAAG,KAAKxf,WAAL,EAAnB;AACA,UAAMmgB,UAAU,GAAG,KAAKD,qBAAxB;;AAEA,UAAIV,UAAJ,EAAgB;AACd,YAAIvjB,IAAJ,EAAU;AACR,cAAIkkB,UAAJ,EAAgB;AACd,iBAAKF,QAAL,CAAc/e,IAAd,CAAmB,UAAnB,EAA+Bmf,MAA/B,GAAwCC,QAAxC,CAAiDrkB,IAAjD;AACD,WAFD,MAEO;AACL,iBAAKgkB,QAAL,CAAcjkB,GAAd,CAAkBC,IAAlB;AACD;AACF,SAND,MAMO;AACL,cAAIkkB,UAAJ,EAAgB;AACd,iBAAKF,QAAL,CAAc/e,IAAd,CAAmB,UAAnB,EAA+Bqf,IAA/B;AACD;AACF;AACF;AACF;;;WAED,sBAAa;AAAA;;AACX,WAAKN,QAAL,CAAc9iB,EAAd,CAAiB,OAAjB,EAA0B,UAACyD,KAAD,EAAW;AACnC,YAAIA,KAAK,CAACiI,OAAN,KAAkBxZ,eAAtB,EAAuC;AACrC,eAAI,CAACoxB,UAAL;AACD;AACF,OAJD;AAKD;AAED;AACF;AACA;;;;WACE,uBAAc;AACZ,aAAO,KAAK9J,OAAL,CAAavjB,QAAb,CAAsB,UAAtB,CAAP;AACD;AAED;AACF;AACA;;;;WACE,kBAAS;AACP,UAAI,KAAK4M,WAAL,EAAJ,EAAwB;AACtB,aAAKygB,UAAL;AACD,OAFD,MAEO;AACL,aAAKC,QAAL;AACD;;AACD,WAAKr1B,OAAL,CAAa0U,YAAb,CAA0B,kBAA1B;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,gBAAOlE,KAAP,EAAc;AACZ,UAAI,KAAKxT,OAAL,CAAas4B,cAAjB,EAAiC;AAC/B;AACA9kB,QAAAA,KAAK,GAAGA,KAAK,CAACJ,OAAN,CAAc,KAAKpT,OAAL,CAAau4B,mBAA3B,EAAgD,EAAhD,CAAR,CAF+B,CAG/B;;AACA,YAAI,KAAKv4B,OAAL,CAAaw4B,oBAAjB,EAAuC;AACrC,cAAMC,SAAS,GAAG,KAAKz4B,OAAL,CAAa04B,0BAAb,CAAwCxa,MAAxC,CAA+C,KAAKle,OAAL,CAAa24B,8BAA5D,CAAlB;AACAnlB,UAAAA,KAAK,GAAGA,KAAK,CAACJ,OAAN,CAAc,mCAAd,EAAmD,UAASwlB,GAAT,EAAc;AACvE;AACA,gBAAI,uDAAuDp1B,IAAvD,CAA4Do1B,GAA5D,CAAJ,EAAsE;AACpE,qBAAO,EAAP;AACD;;AAJsE,uDAKrDH,SALqD;AAAA;;AAAA;AAKvE,kEAA6B;AAAA,oBAAlB3E,GAAkB;;AAC3B;AACA,oBAAK,IAAI+E,MAAJ,CAAW,wBAAwB/E,GAAG,CAAC1gB,OAAJ,CAAY,wBAAZ,EAAsC,MAAtC,CAAxB,GAAwE,SAAnF,CAAD,CAAgG5P,IAAhG,CAAqGo1B,GAArG,CAAJ,EAA+G;AAC7G,yBAAOA,GAAP;AACD;AACF;AAVsE;AAAA;AAAA;AAAA;AAAA;;AAWvE,mBAAO,EAAP;AACD,WAZO,CAAR;AAaD;AACF;;AACD,aAAOplB,KAAP;AACD;AAED;AACF;AACA;;;;WACE,oBAAW;AAAA;;AACT,UAAMskB,UAAU,GAAG,KAAKD,qBAAxB;AACA,WAAKD,QAAL,CAAcjkB,GAAd,CAAkBoC,QAAA,CAAS,KAAKkN,SAAd,EAAyB,KAAKjjB,OAAL,CAAa84B,YAAtC,CAAlB;AACA,WAAKlB,QAAL,CAAcv7B,MAAd,CAAqB,KAAK4mB,SAAL,CAAe5mB,MAAf,EAArB;AAEA,WAAK2G,OAAL,CAAa+C,MAAb,CAAoB,wBAApB,EAA8C,IAA9C;AACA,WAAK/C,OAAL,CAAa+C,MAAb,CAAoB,2BAApB,EAAiD,IAAjD;AAEA,WAAKuoB,OAAL,CAAaH,QAAb,CAAsB,UAAtB;AACA,WAAKyJ,QAAL,CAAcle,KAAd,GATS,CAWT;;AACA,UAAIoe,UAAJ,EAAgB;AACd,YAAMiB,QAAQ,GAAGjB,UAAU,CAACkB,YAAX,CAAwB,KAAKpB,QAAL,CAAc,CAAd,CAAxB,EAA0C,KAAK53B,OAAL,CAAa+3B,UAAvD,CAAjB,CADc,CAGd;;AACA,YAAI,KAAK/3B,OAAL,CAAa+3B,UAAb,CAAwBkB,IAA5B,EAAkC;AAChC,cAAMC,MAAM,GAAG,IAAIpB,UAAU,CAACqB,UAAf,CAA0B,KAAKn5B,OAAL,CAAa+3B,UAAb,CAAwBkB,IAAlD,CAAf;AACAF,UAAAA,QAAQ,CAACK,UAAT,GAAsBF,MAAtB;AACAH,UAAAA,QAAQ,CAACjkB,EAAT,CAAY,gBAAZ,EAA8B,UAACukB,EAAD,EAAQ;AACpCH,YAAAA,MAAM,CAACI,cAAP,CAAsBD,EAAtB;AACD,WAFD;AAGD;;AAEDN,QAAAA,QAAQ,CAACjkB,EAAT,CAAY,MAAZ,EAAoB,UAACyD,KAAD,EAAW;AAC7B,gBAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,eAA1B,EAA2CqhB,QAAQ,CAACQ,QAAT,EAA3C,EAAgEhhB,KAAhE;AACD,SAFD;AAGAwgB,QAAAA,QAAQ,CAACjkB,EAAT,CAAY,QAAZ,EAAsB,YAAM;AAC1B,gBAAI,CAAC9R,OAAL,CAAa0U,YAAb,CAA0B,iBAA1B,EAA6CqhB,QAAQ,CAACQ,QAAT,EAA7C,EAAkER,QAAlE;AACD,SAFD,EAfc,CAmBd;;AACAA,QAAAA,QAAQ,CAACS,OAAT,CAAiB,IAAjB,EAAuB,KAAKvW,SAAL,CAAexO,WAAf,EAAvB;AACA,aAAKmjB,QAAL,CAAc/e,IAAd,CAAmB,UAAnB,EAA+BkgB,QAA/B;AACD,OAtBD,MAsBO;AACL,aAAKnB,QAAL,CAAc9iB,EAAd,CAAiB,MAAjB,EAAyB,UAACyD,KAAD,EAAW;AAClC,gBAAI,CAACvV,OAAL,CAAa0U,YAAb,CAA0B,eAA1B,EAA2C,MAAI,CAACkgB,QAAL,CAAcjkB,GAAd,EAA3C,EAAgE4E,KAAhE;AACD,SAFD;AAGA,aAAKqf,QAAL,CAAc9iB,EAAd,CAAiB,OAAjB,EAA0B,YAAM;AAC9B,gBAAI,CAAC9R,OAAL,CAAa0U,YAAb,CAA0B,iBAA1B,EAA6C,MAAI,CAACkgB,QAAL,CAAcjkB,GAAd,EAA7C,EAAkE,MAAI,CAACikB,QAAvE;AACD,SAFD;AAGD;AACF;AAED;AACF;AACA;;;;WACE,sBAAa;AACX,UAAME,UAAU,GAAG,KAAKD,qBAAxB,CADW,CAEX;;AACA,UAAIC,UAAJ,EAAgB;AACd,YAAMiB,QAAQ,GAAG,KAAKnB,QAAL,CAAc/e,IAAd,CAAmB,UAAnB,CAAjB;AACA,aAAK+e,QAAL,CAAcjkB,GAAd,CAAkBolB,QAAQ,CAACQ,QAAT,EAAlB;AACAR,QAAAA,QAAQ,CAACU,UAAT;AACD;;AAED,UAAMjmB,KAAK,GAAG,KAAKkmB,MAAL,CAAY3jB,SAAA,CAAU,KAAK6hB,QAAf,EAAyB,KAAK53B,OAAL,CAAa84B,YAAtC,KAAuD/iB,aAAnE,CAAd;AACA,UAAM4jB,QAAQ,GAAG,KAAK1W,SAAL,CAAerP,IAAf,OAA0BJ,KAA3C;AAEA,WAAKyP,SAAL,CAAerP,IAAf,CAAoBJ,KAApB;AACA,WAAKyP,SAAL,CAAe5mB,MAAf,CAAsB,KAAK2D,OAAL,CAAa3D,MAAb,GAAsB,KAAKu7B,QAAL,CAAcv7B,MAAd,EAAtB,GAA+C,MAArE;AACA,WAAKiyB,OAAL,CAAasG,WAAb,CAAyB,UAAzB;;AAEA,UAAI+E,QAAJ,EAAc;AACZ,aAAK32B,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoC,KAAKuL,SAAL,CAAerP,IAAf,EAApC,EAA2D,KAAKqP,SAAhE;AACD;;AAED,WAAKA,SAAL,CAAevJ,KAAf;AAEA,WAAK1W,OAAL,CAAa+C,MAAb,CAAoB,wBAApB,EAA8C,KAA9C;AACA,WAAK/C,OAAL,CAAa+C,MAAb,CAAoB,2BAApB,EAAiD,KAAjD;AACD;;;WAED,mBAAU;AACR,UAAI,KAAK4R,WAAL,EAAJ,EAAwB;AACtB,aAAKygB,UAAL;AACD;AACF;;;;;;;;;;;;;;AChLH;AACA,IAAMwB,gBAAgB,GAAG,EAAzB;;IAEqBC;AACnB,qBAAY72B,OAAZ,EAAqB;AAAA;;AACnB,SAAKyD,SAAL,GAAiB7K,yBAAC,CAACkH,QAAD,CAAlB;AACA,SAAKg3B,UAAL,GAAkB92B,OAAO,CAACoT,UAAR,CAAmB2jB,SAArC;AACA,SAAK9W,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAK+f,QAAL,GAAgB50B,OAAO,CAACoT,UAAR,CAAmBwB,OAAnC;AACA,SAAK5X,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACD;;;;WAED,sBAAa;AAAA;;AACX,UAAI,KAAKA,OAAL,CAAaqyB,OAAb,IAAwB,KAAKryB,OAAL,CAAag6B,mBAAzC,EAA8D;AAC5D,aAAK1hB,OAAL;AACA;AACD;;AAED,WAAKwhB,UAAL,CAAgBhlB,EAAhB,CAAmB,WAAnB,EAAgC,UAACyD,KAAD,EAAW;AACzCA,QAAAA,KAAK,CAACE,cAAN;AACAF,QAAAA,KAAK,CAAC0hB,eAAN;;AAEA,YAAMC,WAAW,GAAG,KAAI,CAACjX,SAAL,CAAe3T,MAAf,GAAwB5I,GAAxB,GAA8B,KAAI,CAACD,SAAL,CAAeE,SAAf,EAAlD;;AACA,YAAMwzB,eAAe,GAAG,KAAI,CAACvC,QAAL,CAActoB,MAAd,GAAuB5I,GAAvB,GAA6B,KAAI,CAACD,SAAL,CAAeE,SAAf,EAArD;;AAEA,YAAMyzB,WAAW,GAAG,SAAdA,WAAc,CAAC7hB,KAAD,EAAW;AAC7B,cAAIlc,MAAM,GAAGkc,KAAK,CAAC8hB,OAAN,IAAiBH,WAAW,GAAGN,gBAA/B,CAAb;AACA,cAAIU,UAAU,GAAG/hB,KAAK,CAAC8hB,OAAN,IAAiBF,eAAe,GAAGP,gBAAnC,CAAjB;AAEAv9B,UAAAA,MAAM,GAAI,KAAI,CAAC2D,OAAL,CAAau6B,SAAb,GAAyB,CAA1B,GAA+B3d,IAAI,CAAC4d,GAAL,CAASn+B,MAAT,EAAiB,KAAI,CAAC2D,OAAL,CAAau6B,SAA9B,CAA/B,GAA0El+B,MAAnF;AACAA,UAAAA,MAAM,GAAI,KAAI,CAAC2D,OAAL,CAAawyB,SAAb,GAAyB,CAA1B,GAA+B5V,IAAI,CAACsX,GAAL,CAAS73B,MAAT,EAAiB,KAAI,CAAC2D,OAAL,CAAawyB,SAA9B,CAA/B,GAA0En2B,MAAnF;AACAi+B,UAAAA,UAAU,GAAI,KAAI,CAACt6B,OAAL,CAAau6B,SAAb,GAAyB,CAA1B,GAA+B3d,IAAI,CAAC4d,GAAL,CAASF,UAAT,EAAqB,KAAI,CAACt6B,OAAL,CAAau6B,SAAlC,CAA/B,GAA8ED,UAA3F;AACAA,UAAAA,UAAU,GAAI,KAAI,CAACt6B,OAAL,CAAawyB,SAAb,GAAyB,CAA1B,GAA+B5V,IAAI,CAACsX,GAAL,CAASoG,UAAT,EAAqB,KAAI,CAACt6B,OAAL,CAAawyB,SAAlC,CAA/B,GAA8E8H,UAA3F;;AAGA,eAAI,CAACrX,SAAL,CAAe5mB,MAAf,CAAsBA,MAAtB;;AACA,eAAI,CAACu7B,QAAL,CAAcv7B,MAAd,CAAqBi+B,UAArB;AACD,SAZD;;AAcA,aAAI,CAAC7zB,SAAL,CAAeqO,EAAf,CAAkB,WAAlB,EAA+BslB,WAA/B,EAA4C5X,GAA5C,CAAgD,SAAhD,EAA2D,YAAM;AAC/D,eAAI,CAAC/b,SAAL,CAAeuO,GAAf,CAAmB,WAAnB,EAAgColB,WAAhC;AACD,SAFD;AAGD,OAxBD;AAyBD;;;WAED,mBAAU;AACR,WAAKN,UAAL,CAAgB9kB,GAAhB;AACA,WAAK8kB,UAAL,CAAgB3L,QAAhB,CAAyB,QAAzB;AACD;;;;;;;;;;;;;;AChDH;;IAEqBsM;AACnB,sBAAYz3B,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKsrB,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAKujB,QAAL,GAAgB13B,OAAO,CAACoT,UAAR,CAAmBukB,OAAnC;AACA,SAAK1X,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAK+f,QAAL,GAAgB50B,OAAO,CAACoT,UAAR,CAAmBwB,OAAnC;AAEA,SAAKgjB,OAAL,GAAeh/B,yBAAC,CAACmI,MAAD,CAAhB;AACA,SAAK82B,UAAL,GAAkBj/B,yBAAC,CAAC,YAAD,CAAnB;AACA,SAAKk/B,kBAAL,GAA0B,sBAA1B;;AAEA,SAAKC,QAAL,GAAgB,YAAM;AACpB,WAAI,CAACC,QAAL,CAAc;AACZC,QAAAA,CAAC,EAAE,KAAI,CAACL,OAAL,CAAav+B,MAAb,KAAwB,KAAI,CAACq+B,QAAL,CAAcjmB,WAAd;AADf,OAAd;AAGD,KAJD;AAKD;;;;WAED,kBAAS/X,IAAT,EAAe;AACb,WAAKumB,SAAL,CAAeP,GAAf,CAAmB,QAAnB,EAA6BhmB,IAAI,CAACu+B,CAAlC;AACA,WAAKrD,QAAL,CAAclV,GAAd,CAAkB,QAAlB,EAA4BhmB,IAAI,CAACu+B,CAAjC;;AACA,UAAI,KAAKrD,QAAL,CAAc/e,IAAd,CAAmB,UAAnB,CAAJ,EAAoC;AAClC,aAAK+e,QAAL,CAAc/e,IAAd,CAAmB,UAAnB,EAA+BqiB,OAA/B,CAAuC,IAAvC,EAA6Cx+B,IAAI,CAACu+B,CAAlD;AACD;AACF;AAED;AACF;AACA;;;;WACE,kBAAS;AACP,WAAK3M,OAAL,CAAasD,WAAb,CAAyB,YAAzB;AACA,UAAMuJ,YAAY,GAAG,KAAKA,YAAL,EAArB;AACA,WAAKN,UAAL,CAAgBjJ,WAAhB,CAA4B,KAAKkJ,kBAAjC,EAAqDK,YAArD;;AACA,UAAIA,YAAJ,EAAkB;AAChB,aAAKlY,SAAL,CAAepK,IAAf,CAAoB,WAApB,EAAiC,KAAKoK,SAAL,CAAeP,GAAf,CAAmB,QAAnB,CAAjC;AACA,aAAKO,SAAL,CAAepK,IAAf,CAAoB,cAApB,EAAoC,KAAKoK,SAAL,CAAeP,GAAf,CAAmB,WAAnB,CAApC;AACA,aAAKO,SAAL,CAAeP,GAAf,CAAmB,WAAnB,EAAgC,EAAhC;AACA,aAAKkY,OAAL,CAAa9lB,EAAb,CAAgB,QAAhB,EAA0B,KAAKimB,QAA/B,EAAyC7iB,OAAzC,CAAiD,QAAjD;AACD,OALD,MAKO;AACL,aAAK0iB,OAAL,CAAa5lB,GAAb,CAAiB,QAAjB,EAA2B,KAAK+lB,QAAhC;AACA,aAAKC,QAAL,CAAc;AAAEC,UAAAA,CAAC,EAAE,KAAKhY,SAAL,CAAepK,IAAf,CAAoB,WAApB;AAAL,SAAd;AACA,aAAKoK,SAAL,CAAeP,GAAf,CAAmB,WAAnB,EAAgC,KAAKO,SAAL,CAAeP,GAAf,CAAmB,cAAnB,CAAhC;AACD;;AAED,WAAK1f,OAAL,CAAa+C,MAAb,CAAoB,0BAApB,EAAgDo1B,YAAhD;AACD;;;WAED,wBAAe;AACb,aAAO,KAAK7M,OAAL,CAAavjB,QAAb,CAAsB,YAAtB,CAAP;AACD;;;WAED,mBAAU;AACR,WAAK8vB,UAAL,CAAgBjG,WAAhB,CAA4B,KAAKkG,kBAAjC;AACD;;;;;;;;;;;;;;ACzDH;AACA;;IAEqBM;AACnB,kBAAYp4B,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKyD,SAAL,GAAiB7K,yBAAC,CAACkH,QAAD,CAAlB;AACA,SAAKu4B,YAAL,GAAoBr4B,OAAO,CAACoT,UAAR,CAAmBklB,WAAvC;AACA,SAAKt7B,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AAEA,SAAK1E,MAAL,GAAc;AACZ,8BAAwB,6BAAC4mB,EAAD,EAAKvc,CAAL,EAAW;AACjC,YAAI,KAAI,CAACwc,MAAL,CAAYxc,CAAC,CAACrG,MAAd,EAAsBqG,CAAtB,CAAJ,EAA8B;AAC5BA,UAAAA,CAAC,CAACvG,cAAF;AACD;AACF,OALW;AAMZ,sFAAgF,gFAAM;AACpF,aAAI,CAAC+iB,MAAL;AACD,OARW;AASZ,4CAAsC,2CAAM;AAC1C,aAAI,CAAC9kB,IAAL;AACD,OAXW;AAYZ,qCAA+B,qCAAM;AACnC,aAAI,CAAC8kB,MAAL;AACD;AAdW,KAAd;AAgBD;;;;WAED,sBAAa;AAAA;;AACX,WAAKC,OAAL,GAAe7/B,yBAAC,CAAC,CACf,2BADe,EAEb,sCAFa,EAGX,+CAHW,EAIX,yDAJW,EAKX,yDALW,EAMX,yDANW,EAOX,cAPW,EAQR,KAAKoE,OAAL,CAAa07B,kBAAb,GAAkC,qBAAlC,GAA0D,qBARlD,EASX,0BATW,EAUV,KAAK17B,OAAL,CAAa07B,kBAAb,GAAkC,EAAlC,GAAuC,iDAV7B,EAWb,QAXa,EAYf,QAZe,EAaf/zB,IAbe,CAaV,EAbU,CAAD,CAAD,CAaHkvB,SAbG,CAaO,KAAKwE,YAbZ,CAAf;AAeA,WAAKI,OAAL,CAAa3mB,EAAb,CAAgB,WAAhB,EAA6B,UAACyD,KAAD,EAAW;AACtC,YAAIxC,mBAAA,CAAoBwC,KAAK,CAACI,MAA1B,CAAJ,EAAuC;AACrCJ,UAAAA,KAAK,CAACE,cAAN;AACAF,UAAAA,KAAK,CAAC0hB,eAAN;;AAEA,cAAMvhB,OAAO,GAAG,MAAI,CAAC+iB,OAAL,CAAa1yB,IAAb,CAAkB,yBAAlB,EAA6C8P,IAA7C,CAAkD,QAAlD,CAAhB;;AACA,cAAM8iB,QAAQ,GAAGjjB,OAAO,CAACpJ,MAAR,EAAjB;;AACA,cAAM3I,SAAS,GAAG,MAAI,CAACF,SAAL,CAAeE,SAAf,EAAlB;;AAEA,cAAMyzB,WAAW,GAAG,SAAdA,WAAc,CAAC7hB,KAAD,EAAW;AAC7B,kBAAI,CAACvV,OAAL,CAAa+C,MAAb,CAAoB,iBAApB,EAAuC;AACrC6vB,cAAAA,CAAC,EAAErd,KAAK,CAACqjB,OAAN,GAAgBD,QAAQ,CAACp7B,IADS;AAErCo1B,cAAAA,CAAC,EAAEpd,KAAK,CAAC8hB,OAAN,IAAiBsB,QAAQ,CAACj1B,GAAT,GAAeC,SAAhC;AAFkC,aAAvC,EAGG+R,OAHH,EAGY,CAACH,KAAK,CAACua,QAHnB;;AAKA,kBAAI,CAAC0I,MAAL,CAAY9iB,OAAO,CAAC,CAAD,CAAnB,EAAwBH,KAAxB;AACD,WAPD;;AASA,gBAAI,CAAC9R,SAAL,CACGqO,EADH,CACM,WADN,EACmBslB,WADnB,EAEG5X,GAFH,CAEO,SAFP,EAEkB,UAACxD,CAAD,EAAO;AACrBA,YAAAA,CAAC,CAACvG,cAAF;;AACA,kBAAI,CAAChS,SAAL,CAAeuO,GAAf,CAAmB,WAAnB,EAAgColB,WAAhC;;AACA,kBAAI,CAACp3B,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;AACD,WANH;;AAQA,cAAI,CAAC2S,OAAO,CAACG,IAAR,CAAa,OAAb,CAAL,EAA4B;AAAE;AAC5BH,YAAAA,OAAO,CAACG,IAAR,CAAa,OAAb,EAAsBH,OAAO,CAACrc,MAAR,KAAmBqc,OAAO,CAACtV,KAAR,EAAzC;AACD;AACF;AACF,OA9BD,EAhBW,CAgDX;;AACA,WAAKq4B,OAAL,CAAa3mB,EAAb,CAAgB,OAAhB,EAAyB,UAACkK,CAAD,EAAO;AAC9BA,QAAAA,CAAC,CAACvG,cAAF;;AACA,cAAI,CAAC+iB,MAAL;AACD,OAHD;AAID;;;WAED,mBAAU;AACR,WAAKC,OAAL,CAAa19B,MAAb;AACD;;;WAED,gBAAO4a,MAAP,EAAeJ,KAAf,EAAsB;AACpB,UAAI,KAAKvV,OAAL,CAAa+T,UAAb,EAAJ,EAA+B;AAC7B,eAAO,KAAP;AACD;;AAED,UAAM8kB,OAAO,GAAG9lB,SAAA,CAAU4C,MAAV,CAAhB;AACA,UAAMmjB,UAAU,GAAG,KAAKL,OAAL,CAAa1yB,IAAb,CAAkB,yBAAlB,CAAnB;AAEA,WAAK/F,OAAL,CAAa+C,MAAb,CAAoB,qBAApB,EAA2C4S,MAA3C,EAAmDJ,KAAnD;;AAEA,UAAIsjB,OAAJ,EAAa;AACX,YAAM5H,MAAM,GAAGr4B,yBAAC,CAAC+c,MAAD,CAAhB;AACA,YAAMjJ,QAAQ,GAAGukB,MAAM,CAACvkB,QAAP,EAAjB;AACA,YAAM8E,GAAG,GAAG;AACVjU,UAAAA,IAAI,EAAEmP,QAAQ,CAACnP,IAAT,GAAgB2jB,QAAQ,CAAC+P,MAAM,CAACvR,GAAP,CAAW,YAAX,CAAD,EAA2B,EAA3B,CADpB;AAEVhc,UAAAA,GAAG,EAAEgJ,QAAQ,CAAChJ,GAAT,GAAewd,QAAQ,CAAC+P,MAAM,CAACvR,GAAP,CAAW,WAAX,CAAD,EAA0B,EAA1B;AAFlB,SAAZ,CAHW,CAQX;;AACA,YAAM+S,SAAS,GAAG;AAChBsG,UAAAA,CAAC,EAAE9H,MAAM,CAAC1B,UAAP,CAAkB,KAAlB,CADa;AAEhB0I,UAAAA,CAAC,EAAEhH,MAAM,CAACxf,WAAP,CAAmB,KAAnB;AAFa,SAAlB;AAKAqnB,QAAAA,UAAU,CAACpZ,GAAX,CAAe;AACbC,UAAAA,OAAO,EAAE,OADI;AAEbpiB,UAAAA,IAAI,EAAEiU,GAAG,CAACjU,IAFG;AAGbmG,UAAAA,GAAG,EAAE8N,GAAG,CAAC9N,GAHI;AAIbtD,UAAAA,KAAK,EAAEqyB,SAAS,CAACsG,CAJJ;AAKb1/B,UAAAA,MAAM,EAAEo5B,SAAS,CAACwF;AALL,SAAf,EAMGpiB,IANH,CAMQ,QANR,EAMkBob,MANlB,EAdW,CAoBgB;;AAE3B,YAAM+H,YAAY,GAAG,IAAIC,KAAJ,EAArB;AACAD,QAAAA,YAAY,CAAClI,GAAb,GAAmBG,MAAM,CAACnc,IAAP,CAAY,KAAZ,CAAnB;AAEA,YAAMokB,UAAU,GAAGzG,SAAS,CAACsG,CAAV,GAAc,GAAd,GAAoBtG,SAAS,CAACwF,CAA9B,GAAkC,IAAlC,GAAyC,KAAKn/B,IAAL,CAAUc,KAAV,CAAgBoB,QAAzD,GAAoE,IAApE,GAA2Eg+B,YAAY,CAAC54B,KAAxF,GAAgG,GAAhG,GAAsG44B,YAAY,CAAC3/B,MAAnH,GAA4H,GAA/I;AACAy/B,QAAAA,UAAU,CAAC/yB,IAAX,CAAgB,8BAAhB,EAAgD+J,IAAhD,CAAqDopB,UAArD;AACA,aAAKl5B,OAAL,CAAa+C,MAAb,CAAoB,mBAApB,EAAyC4S,MAAzC;AACD,OA5BD,MA4BO;AACL,aAAKjC,IAAL;AACD;;AAED,aAAOmlB,OAAP;AACD;AAED;AACF;AACA;AACA;AACA;;;;WACE,gBAAO;AACL,WAAK74B,OAAL,CAAa+C,MAAb,CAAoB,oBAApB;AACA,WAAK01B,OAAL,CAAanV,QAAb,GAAwB5P,IAAxB;AACD;;;;;;;;;;;;;;AC7IH;AACA;AACA;AAEA,IAAMylB,aAAa,GAAG,SAAtB;AACA,IAAMC,WAAW,GAAG,qGAApB;;IAEqBC;AACnB,oBAAYr5B,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKhD,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAK2U,MAAL,GAAc;AACZ,0BAAoB,yBAAC4mB,EAAD,EAAKvc,CAAL,EAAW;AAC7B,YAAI,CAACA,CAAC,CAAC+S,kBAAF,EAAL,EAA6B;AAC3B,eAAI,CAACuK,WAAL,CAAiBtd,CAAjB;AACD;AACF,OALW;AAMZ,4BAAsB,2BAACuc,EAAD,EAAKvc,CAAL,EAAW;AAC/B,aAAI,CAACud,aAAL,CAAmBvd,CAAnB;AACD;AARW,KAAd;AAUD;;;;WAED,sBAAa;AACX,WAAKwd,aAAL,GAAqB,IAArB;AACD;;;WAED,mBAAU;AACR,WAAKA,aAAL,GAAqB,IAArB;AACD;;;WAED,mBAAU;AACR,UAAI,CAAC,KAAKA,aAAV,EAAyB;AACvB;AACD;;AAED,UAAMC,OAAO,GAAG,KAAKD,aAAL,CAAmB/d,QAAnB,EAAhB;AACA,UAAMzK,KAAK,GAAGyoB,OAAO,CAACzoB,KAAR,CAAcooB,WAAd,CAAd;;AAEA,UAAIpoB,KAAK,KAAKA,KAAK,CAAC,CAAD,CAAL,IAAYA,KAAK,CAAC,CAAD,CAAtB,CAAT,EAAqC;AACnC,YAAM5V,IAAI,GAAG4V,KAAK,CAAC,CAAD,CAAL,GAAWyoB,OAAX,GAAqBN,aAAa,GAAGM,OAAlD;AACA,YAAMC,OAAO,GAAG,KAAK18B,OAAL,CAAa28B,yBAAb,GACdF,OAAO,CAACrpB,OAAR,CAAgB,mEAAhB,EAAqF,EAArF,EAAyF7L,KAAzF,CAA+F,GAA/F,EAAoG,CAApG,CADc,GAEZk1B,OAFJ;AAGA,YAAM3xB,IAAI,GAAGlP,yBAAC,CAAC,SAAD,CAAD,CAAagY,IAAb,CAAkB8oB,OAAlB,EAA2B5kB,IAA3B,CAAgC,MAAhC,EAAwC1Z,IAAxC,EAA8C,CAA9C,CAAb;;AACA,YAAI,KAAK4E,OAAL,CAAahD,OAAb,CAAqB48B,eAAzB,EAA0C;AACxChhC,UAAAA,yBAAC,CAACkP,IAAD,CAAD,CAAQgN,IAAR,CAAa,QAAb,EAAuB,QAAvB;AACD;;AAED,aAAK0kB,aAAL,CAAmBhe,UAAnB,CAA8B1T,IAA9B;AACA,aAAK0xB,aAAL,GAAqB,IAArB;AACA,aAAKx5B,OAAL,CAAa+C,MAAb,CAAoB,cAApB;AACD;AACF;;;WAED,uBAAciZ,CAAd,EAAiB;AACf,UAAInf,cAAA,CAAe,CAACmH,cAAD,EAAiBA,cAAjB,CAAf,EAAiDgY,CAAC,CAACwB,OAAnD,CAAJ,EAAiE;AAC/D,YAAMqc,SAAS,GAAG,KAAK75B,OAAL,CAAa+C,MAAb,CAAoB,oBAApB,EAA0C+2B,YAA1C,EAAlB;AACA,aAAKN,aAAL,GAAqBK,SAArB;AACD;AACF;;;WAED,qBAAY7d,CAAZ,EAAe;AACb,UAAInf,cAAA,CAAe,CAACmH,cAAD,EAAiBA,cAAjB,CAAf,EAAiDgY,CAAC,CAACwB,OAAnD,CAAJ,EAAiE;AAC/D,aAAKpN,OAAL;AACD;AACF;;;;;;;;;;;;;;AClEH;AAEA;AACA;AACA;;IACqB2pB;AACnB,oBAAY/5B,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKiT,KAAL,GAAajT,OAAO,CAACoT,UAAR,CAAmBoD,IAAhC;AACA,SAAK7E,MAAL,GAAc;AACZ,2BAAqB,4BAAM;AACzB,aAAI,CAACsB,KAAL,CAAWtC,GAAX,CAAe3Q,OAAO,CAAC+C,MAAR,CAAe,MAAf,CAAf;AACD;AAHW,KAAd;AAKD;;;;WAED,4BAAmB;AACjB,aAAOgQ,cAAA,CAAe,KAAKE,KAAL,CAAW,CAAX,CAAf,CAAP;AACD;;;;;;;;;;;;;;ACjBH;AACA;AACA;;IAEqB+mB;AACnB,uBAAYh6B,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKhD,OAAL,GAAegD,OAAO,CAAChD,OAAR,CAAgBoT,OAAhB,IAA2B,EAA1C;AAEA,SAAKwB,IAAL,GAAY,CAAC5N,cAAD,EAAiBA,cAAjB,EAAiCA,eAAjC,EAAkDA,cAAlD,EAAkEA,kBAAlE,EAAsFA,cAAtF,CAAZ;AACA,SAAKq2B,mBAAL,GAA2B,IAA3B;AAEA,SAAK1oB,MAAL,GAAc;AACZ,0BAAoB,yBAAC4mB,EAAD,EAAKvc,CAAL,EAAW;AAC7B,YAAI,CAACA,CAAC,CAAC+S,kBAAF,EAAL,EAA6B;AAC3B,eAAI,CAACuK,WAAL,CAAiBtd,CAAjB;AACD;AACF,OALW;AAMZ,4BAAsB,2BAACuc,EAAD,EAAKvc,CAAL,EAAW;AAC/B,aAAI,CAACud,aAAL,CAAmBvd,CAAnB;AACD;AARW,KAAd;AAUD;;;;WAED,4BAAmB;AACjB,aAAO,CAAC,CAAC,KAAKhf,OAAL,CAAagU,KAAtB;AACD;;;WAED,sBAAa;AACX,WAAKspB,QAAL,GAAgB,IAAhB;AACD;;;WAED,mBAAU;AACR,WAAKA,QAAL,GAAgB,IAAhB;AACD;;;WAED,mBAAU;AACR,UAAI,CAAC,KAAKA,QAAV,EAAoB;AAClB;AACD;;AAED,UAAMz3B,IAAI,GAAG,IAAb;AACA,UAAM42B,OAAO,GAAG,KAAKa,QAAL,CAAc7e,QAAd,EAAhB;AACA,WAAKze,OAAL,CAAagU,KAAb,CAAmByoB,OAAnB,EAA4B,UAASzoB,KAAT,EAAgB;AAC1C,YAAIA,KAAJ,EAAW;AACT,cAAIlJ,IAAI,GAAG,EAAX;;AAEA,cAAI,OAAOkJ,KAAP,KAAiB,QAArB,EAA+B;AAC7BlJ,YAAAA,IAAI,GAAGiL,cAAA,CAAe/B,KAAf,CAAP;AACD,WAFD,MAEO,IAAIA,KAAK,YAAYupB,MAArB,EAA6B;AAClCzyB,YAAAA,IAAI,GAAGkJ,KAAK,CAAC,CAAD,CAAZ;AACD,WAFM,MAEA,IAAIA,KAAK,YAAYwpB,IAArB,EAA2B;AAChC1yB,YAAAA,IAAI,GAAGkJ,KAAP;AACD;;AAED,cAAI,CAAClJ,IAAL,EAAW;AACXjF,UAAAA,IAAI,CAACy3B,QAAL,CAAc9e,UAAd,CAAyB1T,IAAzB;AACAjF,UAAAA,IAAI,CAACy3B,QAAL,GAAgB,IAAhB;AACAz3B,UAAAA,IAAI,CAAC7C,OAAL,CAAa+C,MAAb,CAAoB,cAApB;AACD;AACF,OAjBD;AAkBD;;;WAED,uBAAciZ,CAAd,EAAiB;AACf;AACA;AACA,UAAI,KAAKqe,mBAAL,IAA4Bx9B,cAAA,CAAe,KAAK+U,IAApB,EAA0B,KAAKyoB,mBAA/B,CAAhC,EAAqF;AACnF,aAAKA,mBAAL,GAA2Bre,CAAC,CAACwB,OAA7B;AACA;AACD;;AAED,UAAI3gB,cAAA,CAAe,KAAK+U,IAApB,EAA0BoK,CAAC,CAACwB,OAA5B,CAAJ,EAA0C;AACxC,YAAMqc,SAAS,GAAG,KAAK75B,OAAL,CAAa+C,MAAb,CAAoB,oBAApB,EAA0C+2B,YAA1C,EAAlB;AACA,aAAKQ,QAAL,GAAgBT,SAAhB;AACD;;AACD,WAAKQ,mBAAL,GAA2Bre,CAAC,CAACwB,OAA7B;AACD;;;WAED,qBAAYxB,CAAZ,EAAe;AACb,UAAInf,cAAA,CAAe,KAAK+U,IAApB,EAA0BoK,CAAC,CAACwB,OAA5B,CAAJ,EAA0C;AACxC,aAAKpN,OAAL;AACD;AACF;;;;;;;;;;;;;;AClFH;;IACqBqqB;AACnB,uBAAYz6B,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKq4B,YAAL,GAAoBr4B,OAAO,CAACoT,UAAR,CAAmBklB,WAAvC;AACA,SAAKt7B,OAAL,GAAegD,OAAO,CAAChD,OAAvB;;AAEA,QAAI,KAAKA,OAAL,CAAa09B,kBAAb,KAAoC,IAAxC,EAA8C;AAC5C;AACA,WAAK19B,OAAL,CAAasU,WAAb,GAA2B,KAAKtR,OAAL,CAAaiT,KAAb,CAAmB6B,IAAnB,CAAwB,aAAxB,KAA0C,KAAK9X,OAAL,CAAasU,WAAlF;AACD;;AAED,SAAKK,MAAL,GAAc;AACZ,2CAAqC,0CAAM;AACzC,aAAI,CAAC6mB,MAAL;AACD,OAHW;AAIZ,qCAA+B,qCAAM;AACnC,aAAI,CAACA,MAAL;AACD;AANW,KAAd;AAQD;;;;WAED,4BAAmB;AACjB,aAAO,CAAC,CAAC,KAAKx7B,OAAL,CAAasU,WAAtB;AACD;;;WAED,sBAAa;AAAA;;AACX,WAAKC,YAAL,GAAoB3Y,yBAAC,CAAC,sCAAD,CAArB;AACA,WAAK2Y,YAAL,CAAkBO,EAAlB,CAAqB,OAArB,EAA8B,YAAM;AAClC,cAAI,CAAC9R,OAAL,CAAa+C,MAAb,CAAoB,OAApB;AACD,OAFD,EAEG6N,IAFH,CAEQ,KAAK5T,OAAL,CAAasU,WAFrB,EAEkCuiB,SAFlC,CAE4C,KAAKwE,YAFjD;AAIA,WAAKG,MAAL;AACD;;;WAED,mBAAU;AACR,WAAKjnB,YAAL,CAAkBxW,MAAlB;AACD;;;WAED,kBAAS;AACP,UAAM4/B,MAAM,GAAG,CAAC,KAAK36B,OAAL,CAAa+C,MAAb,CAAoB,sBAApB,CAAD,IAAgD,KAAK/C,OAAL,CAAa+C,MAAb,CAAoB,gBAApB,CAA/D;AACA,WAAKwO,YAAL,CAAkBqpB,MAAlB,CAAyBD,MAAzB;AACD;;;;;;;;;;;;;;AC3CH;AACA;AACA;AACA;;IAEqBE;AACnB,mBAAY76B,OAAZ,EAAqB;AAAA;;AACnB,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKoH,OAAL,GAAeA,OAAf;AACA,SAAK03B,QAAL,GAAgB13B,OAAO,CAACoT,UAAR,CAAmBukB,OAAnC;AACA,SAAK36B,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AACA,SAAKykB,cAAL,GAAsBj2B,iBAAA,CACpB,KAAK7H,OAAL,CAAa0yB,MAAb,CAAoBloB,SAAA,GAAY,KAAZ,GAAoB,IAAxC,CADoB,CAAtB;AAGD;;;;WAED,2BAAkBuzB,YAAlB,EAAgC;AAC9B,UAAI18B,QAAQ,GAAG,KAAKy8B,cAAL,CAAoBC,YAApB,CAAf;;AACA,UAAI,CAAC,KAAK/9B,OAAL,CAAasB,SAAd,IAA2B,CAACD,QAAhC,EAA0C;AACxC,eAAO,EAAP;AACD;;AAED,UAAImJ,SAAJ,EAAe;AACbnJ,QAAAA,QAAQ,GAAGA,QAAQ,CAAC+R,OAAT,CAAiB,KAAjB,EAAwB,GAAxB,EAA6BA,OAA7B,CAAqC,OAArC,EAA8C,GAA9C,CAAX;AACD;;AAED/R,MAAAA,QAAQ,GAAGA,QAAQ,CAAC+R,OAAT,CAAiB,WAAjB,EAA8B,IAA9B,EACRA,OADQ,CACA,OADA,EACS,GADT,EAERA,OAFQ,CAEA,aAFA,EAEe,GAFf,EAGRA,OAHQ,CAGA,cAHA,EAGgB,GAHhB,CAAX;AAKA,aAAO,OAAO/R,QAAP,GAAkB,GAAzB;AACD;;;WAED,gBAAO28B,CAAP,EAAU;AACR,UAAI,CAAC,KAAKh+B,OAAL,CAAauZ,OAAd,IAAyBykB,CAAC,CAACzkB,OAA/B,EAAwC;AACtC,eAAOykB,CAAC,CAACzkB,OAAT;AACD;;AACDykB,MAAAA,CAAC,CAACtrB,SAAF,GAAc,KAAK1S,OAAL,CAAa0S,SAA3B;AACA,aAAO,KAAK2D,EAAL,CAAQ4nB,MAAR,CAAeD,CAAf,CAAP;AACD;;;WAED,sBAAa;AACX,WAAKE,iBAAL;AACA,WAAKC,sBAAL;AACA,WAAKC,qBAAL;AACA,WAAKC,sBAAL;AACA,WAAKC,gBAAL,GAAwB,EAAxB;AACD;;;WAED,mBAAU;AACR,aAAO,KAAKA,gBAAZ;AACD;;;WAED,yBAAgBhiC,IAAhB,EAAsB;AACpB,UAAI,CAAC2K,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqC,KAAKk3B,gBAA1C,EAA4DhiC,IAA5D,CAAL,EAAwE;AACtE,aAAKgiC,gBAAL,CAAsBhiC,IAAtB,IAA8BkO,mBAAA,CAAoBlO,IAApB,KAC5BuD,cAAA,CAAe,KAAKG,OAAL,CAAau+B,oBAA5B,EAAkDjiC,IAAlD,CADF;AAED;;AACD,aAAO,KAAKgiC,gBAAL,CAAsBhiC,IAAtB,CAAP;AACD;;;WAED,6BAAoBA,IAApB,EAA0B;AACxBA,MAAAA,IAAI,GAAGA,IAAI,CAACkG,WAAL,EAAP;AACA,aAAQlG,IAAI,KAAK,EAAT,IAAe,KAAKmG,eAAL,CAAqBnG,IAArB,CAAf,IAA6CkO,+BAAA,CAAgClO,IAAhC,MAA0C,CAAC,CAAhG;AACD;;;WAED,sBAAau4B,SAAb,EAAwBtb,OAAxB,EAAiC6X,SAAjC,EAA4CD,SAA5C,EAAuD;AAAA;;AACrD,aAAO,KAAK9a,EAAL,CAAQmoB,WAAR,CAAoB;AACzB3J,QAAAA,SAAS,EAAE,gBAAgBA,SADF;AAEzBvO,QAAAA,QAAQ,EAAE,CACR,KAAK2X,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,2BADD;AAEV1R,UAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQooB,IAAR,CAAa,KAAKz+B,OAAL,CAAasZ,KAAb,CAAmBtd,IAAnB,GAA0B,oBAAvC,CAFA;AAGVud,UAAAA,OAAO,EAAEA,OAHC;AAIVmlB,UAAAA,KAAK,EAAE,eAAC1f,CAAD,EAAO;AACZ,gBAAM2f,OAAO,GAAG/iC,yBAAC,CAACojB,CAAC,CAAC4f,aAAH,CAAjB;;AACA,gBAAIxN,SAAS,IAAID,SAAjB,EAA4B;AAC1B,mBAAI,CAACnuB,OAAL,CAAa+C,MAAb,CAAoB,cAApB,EAAoC;AAClCqrB,gBAAAA,SAAS,EAAEuN,OAAO,CAAC7mB,IAAR,CAAa,gBAAb,CADuB;AAElCqZ,gBAAAA,SAAS,EAAEwN,OAAO,CAAC7mB,IAAR,CAAa,gBAAb;AAFuB,eAApC;AAID,aALD,MAKO,IAAIsZ,SAAJ,EAAe;AACpB,mBAAI,CAACpuB,OAAL,CAAa+C,MAAb,CAAoB,cAApB,EAAoC;AAClCqrB,gBAAAA,SAAS,EAAEuN,OAAO,CAAC7mB,IAAR,CAAa,gBAAb;AADuB,eAApC;AAGD,aAJM,MAIA,IAAIqZ,SAAJ,EAAe;AACpB,mBAAI,CAACnuB,OAAL,CAAa+C,MAAb,CAAoB,cAApB,EAAoC;AAClCorB,gBAAAA,SAAS,EAAEwN,OAAO,CAAC7mB,IAAR,CAAa,gBAAb;AADuB,eAApC;AAGD;AACF,WApBS;AAqBVE,UAAAA,QAAQ,EAAE,kBAAC2mB,OAAD,EAAa;AACrB,gBAAME,YAAY,GAAGF,OAAO,CAAC51B,IAAR,CAAa,oBAAb,CAArB;;AACA,gBAAIqoB,SAAJ,EAAe;AACbyN,cAAAA,YAAY,CAACnc,GAAb,CAAiB,kBAAjB,EAAqC,KAAI,CAAC1iB,OAAL,CAAa8+B,WAAb,CAAyB1N,SAA9D;AACAuN,cAAAA,OAAO,CAAC7mB,IAAR,CAAa,gBAAb,EAA+B,KAAI,CAAC9X,OAAL,CAAa8+B,WAAb,CAAyB1N,SAAxD;AACD;;AACD,gBAAID,SAAJ,EAAe;AACb0N,cAAAA,YAAY,CAACnc,GAAb,CAAiB,OAAjB,EAA0B,KAAI,CAAC1iB,OAAL,CAAa8+B,WAAb,CAAyB3N,SAAnD;AACAwN,cAAAA,OAAO,CAAC7mB,IAAR,CAAa,gBAAb,EAA+B,KAAI,CAAC9X,OAAL,CAAa8+B,WAAb,CAAyB3N,SAAxD;AACD,aAHD,MAGO;AACL0N,cAAAA,YAAY,CAACnc,GAAb,CAAiB,OAAjB,EAA0B,aAA1B;AACD;AACF;AAjCS,SAAZ,CADQ,EAoCR,KAAKub,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQ0oB,sBAAR,CAA+B,EAA/B,EAAmC,KAAK/+B,OAAxC,CAFA;AAGVuZ,UAAAA,OAAO,EAAE,KAAKzd,IAAL,CAAU6E,KAAV,CAAgBE,IAHf;AAIVgY,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AAJI,SAAZ,CApCQ,EA4CR,KAAKvnB,EAAL,CAAQ2oB,QAAR,CAAiB;AACf3I,UAAAA,KAAK,EAAE,CAACjF,SAAS,GAAG,CAClB,4BADkB,EAEhB,qCAAqC,KAAKt1B,IAAL,CAAU6E,KAAV,CAAgBG,UAArD,GAAkE,QAFlD,EAGhB,OAHgB,EAId,2HAJc,EAKZ,KAAKhF,IAAL,CAAU6E,KAAV,CAAgBK,WALJ,EAMd,WANc,EAOhB,QAPgB,EAQhB,4EARgB,EAShB,OATgB,EAUd,oIAAkI,KAAKhB,OAAL,CAAasG,EAA/I,GAAkJ,IAVpI,EAWZ,KAAKxK,IAAL,CAAU6E,KAAV,CAAgBS,QAXJ,EAYd,WAZc,EAad,6CAA2C,KAAKpB,OAAL,CAAasG,EAAxD,GAA2D,kDAA3D,GAAgH,KAAKtG,OAAL,CAAa8+B,WAAb,CAAyB1N,SAAzI,GAAqJ,iCAArJ,GAAuL,KAAKpxB,OAAL,CAAasG,EAApM,GAAuM,IAbzL,EAchB,QAdgB,EAehB,0DAAwD,KAAKtG,OAAL,CAAasG,EAArE,GAAwE,iCAfxD,EAgBlB,QAhBkB,EAiBlBqB,IAjBkB,CAiBb,EAjBa,CAAH,GAiBJ,EAjBN,KAkBNwpB,SAAS,GAAG,CACX,4BADW,EAET,qCAAqC,KAAKr1B,IAAL,CAAU6E,KAAV,CAAgBI,UAArD,GAAkE,QAFzD,EAGT,OAHS,EAIP,4HAJO,EAKL,KAAKjF,IAAL,CAAU6E,KAAV,CAAgBQ,cALX,EAMP,WANO,EAOT,QAPS,EAQT,4EARS,EAST,OATS,EAUP,oIAAkI,KAAKnB,OAAL,CAAasG,EAA/I,GAAkJ,IAV3I,EAWL,KAAKxK,IAAL,CAAU6E,KAAV,CAAgBS,QAXX,EAYP,WAZO,EAaP,6CAA2C,KAAKpB,OAAL,CAAasG,EAAxD,GAA2D,kDAA3D,GAAgH,KAAKtG,OAAL,CAAa8+B,WAAb,CAAyB3N,SAAzI,GAAqJ,iCAArJ,GAAuL,KAAKnxB,OAAL,CAAasG,EAApM,GAAuM,IAbhM,EAcT,QAdS,EAcC;AACV,oEAAwD,KAAKtG,OAAL,CAAasG,EAArE,GAAwE,iCAf/D,EAgBX,QAhBW,EAiBXqB,IAjBW,CAiBN,EAjBM,CAAH,GAiBG,EAnCN,CADQ;AAqCfqQ,UAAAA,QAAQ,EAAE,kBAACinB,SAAD,EAAe;AACvBA,YAAAA,SAAS,CAACl2B,IAAV,CAAe,cAAf,EAA+BmG,IAA/B,CAAoC,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AACjD,kBAAMs5B,OAAO,GAAGtjC,yBAAC,CAACgK,IAAD,CAAjB;AACAs5B,cAAAA,OAAO,CAAC/S,MAAR,CAAe,KAAI,CAAC9V,EAAL,CAAQ8oB,OAAR,CAAgB;AAC7BC,gBAAAA,MAAM,EAAE,KAAI,CAACp/B,OAAL,CAAao/B,MADQ;AAE7BC,gBAAAA,UAAU,EAAE,KAAI,CAACr/B,OAAL,CAAaq/B,UAFI;AAG7BrM,gBAAAA,SAAS,EAAEkM,OAAO,CAACrmB,IAAR,CAAa,OAAb,CAHkB;AAI7BnG,gBAAAA,SAAS,EAAE,KAAI,CAAC1S,OAAL,CAAa0S,SAJK;AAK7B6G,gBAAAA,OAAO,EAAE,KAAI,CAACvZ,OAAL,CAAauZ;AALO,eAAhB,EAMZ+lB,MANY,EAAf;AAOD,aATD;AAUA;;AACA,gBAAIC,YAAY,GAAG,CACjB,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CADiB,CAAnB;AAGAN,YAAAA,SAAS,CAACl2B,IAAV,CAAe,qBAAf,EAAsCmG,IAAtC,CAA2C,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AACxD,kBAAMs5B,OAAO,GAAGtjC,yBAAC,CAACgK,IAAD,CAAjB;AACAs5B,cAAAA,OAAO,CAAC/S,MAAR,CAAe,KAAI,CAAC9V,EAAL,CAAQ8oB,OAAR,CAAgB;AAC7BC,gBAAAA,MAAM,EAAEG,YADqB;AAE7BF,gBAAAA,UAAU,EAAEE,YAFiB;AAG7BvM,gBAAAA,SAAS,EAAEkM,OAAO,CAACrmB,IAAR,CAAa,OAAb,CAHkB;AAI7BnG,gBAAAA,SAAS,EAAE,KAAI,CAAC1S,OAAL,CAAa0S,SAJK;AAK7B6G,gBAAAA,OAAO,EAAE,KAAI,CAACvZ,OAAL,CAAauZ;AALO,eAAhB,EAMZ+lB,MANY,EAAf;AAOD,aATD;AAUAL,YAAAA,SAAS,CAACl2B,IAAV,CAAe,mBAAf,EAAoCmG,IAApC,CAAyC,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AACtDhK,cAAAA,yBAAC,CAACgK,IAAD,CAAD,CAAQ45B,MAAR,CAAe,YAAW;AACxB,oBAAMC,KAAK,GAAGR,SAAS,CAACl2B,IAAV,CAAe,MAAMnN,yBAAC,CAAC,IAAD,CAAD,CAAQid,IAAR,CAAa,OAAb,CAArB,EAA4C9P,IAA5C,CAAiD,iBAAjD,EAAoE0Q,KAApE,EAAd;AACA,oBAAM9Y,KAAK,GAAG,KAAK6S,KAAL,CAAW9L,WAAX,EAAd;AACA+3B,gBAAAA,KAAK,CAAC/c,GAAN,CAAU,kBAAV,EAA8B/hB,KAA9B,EACGmX,IADH,CACQ,YADR,EACsBnX,KADtB,EAEGmX,IAFH,CAEQ,YAFR,EAEsBnX,KAFtB,EAGGmX,IAHH,CAGQ,qBAHR,EAG+BnX,KAH/B;AAIA8+B,gBAAAA,KAAK,CAACf,KAAN;AACD,eARD;AASD,aAVD;AAWD,WAzEc;AA0EfA,UAAAA,KAAK,EAAE,eAACnmB,KAAD,EAAW;AAChBA,YAAAA,KAAK,CAAC0hB,eAAN;AAEA,gBAAMtF,OAAO,GAAG/4B,yBAAC,CAAC,MAAMi5B,SAAP,CAAD,CAAmB9rB,IAAnB,CAAwB,qBAAxB,CAAhB;AACA,gBAAM41B,OAAO,GAAG/iC,yBAAC,CAAC2c,KAAK,CAACI,MAAP,CAAjB;AACA,gBAAMqa,SAAS,GAAG2L,OAAO,CAAC9lB,IAAR,CAAa,OAAb,CAAlB;AACA,gBAAMrF,KAAK,GAAGmrB,OAAO,CAAC7mB,IAAR,CAAa,YAAb,CAAd;;AAEA,gBAAIkb,SAAS,KAAK,aAAlB,EAAiC;AAC/B,kBAAM0M,OAAO,GAAG/K,OAAO,CAAC5rB,IAAR,CAAa,MAAMyK,KAAnB,CAAhB;AACA,kBAAMmsB,QAAQ,GAAG/jC,yBAAC,CAAC+4B,OAAO,CAAC5rB,IAAR,CAAa,MAAM22B,OAAO,CAAC7mB,IAAR,CAAa,OAAb,CAAnB,EAA0C9P,IAA1C,CAA+C,iBAA/C,EAAkE,CAAlE,CAAD,CAAlB,CAF+B,CAI/B;;AACA,kBAAM02B,KAAK,GAAGE,QAAQ,CAAC52B,IAAT,CAAc,iBAAd,EAAiCL,IAAjC,GAAwC+Z,MAAxC,EAAd,CAL+B,CAO/B;;AACA,kBAAM9hB,KAAK,GAAG++B,OAAO,CAAC/rB,GAAR,EAAd;AACA8rB,cAAAA,KAAK,CAAC/c,GAAN,CAAU,kBAAV,EAA8B/hB,KAA9B,EACGmX,IADH,CACQ,YADR,EACsBnX,KADtB,EAEGmX,IAFH,CAEQ,YAFR,EAEsBnX,KAFtB,EAGGmX,IAHH,CAGQ,qBAHR,EAG+BnX,KAH/B;AAIAg/B,cAAAA,QAAQ,CAACC,OAAT,CAAiBH,KAAjB;AACAC,cAAAA,OAAO,CAAChB,KAAR;AACD,aAfD,MAeO;AACL,kBAAI7+B,cAAA,CAAe,CAAC,WAAD,EAAc,WAAd,CAAf,EAA2CmzB,SAA3C,CAAJ,EAA2D;AACzD,oBAAMhsB,GAAG,GAAGgsB,SAAS,KAAK,WAAd,GAA4B,kBAA5B,GAAiD,OAA7D;AACA,oBAAM6M,MAAM,GAAGlB,OAAO,CAAC/lB,OAAR,CAAgB,aAAhB,EAA+B7P,IAA/B,CAAoC,oBAApC,CAAf;AACA,oBAAM+2B,cAAc,GAAGnB,OAAO,CAAC/lB,OAAR,CAAgB,aAAhB,EAA+B7P,IAA/B,CAAoC,4BAApC,CAAvB;AAEA82B,gBAAAA,MAAM,CAACnd,GAAP,CAAW1b,GAAX,EAAgBwM,KAAhB;AACAssB,gBAAAA,cAAc,CAAChoB,IAAf,CAAoB,UAAUkb,SAA9B,EAAyCxf,KAAzC;AACD;;AACD,mBAAI,CAACxQ,OAAL,CAAa+C,MAAb,CAAoB,YAAYitB,SAAhC,EAA2Cxf,KAA3C;AACD;AACF;AA5Gc,SAAjB,CA5CQ;AAFe,OAApB,EA6JJ8rB,MA7JI,EAAP;AA8JD;;;WAED,6BAAoB;AAAA;;AAClB,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,cAAlB,EAAkC,YAAM;AACtC,eAAO,MAAI,CAAC6M,EAAL,CAAQmoB,WAAR,CAAoB,CACzB,MAAI,CAACP,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQ0oB,sBAAR,CACR,MAAI,CAAC1oB,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBymB,KAAhC,CADQ,EACgC,MAAI,CAAC//B,OADrC,CAFA;AAKVuZ,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUqD,KAAV,CAAgBA,KALf;AAMV0Z,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AANI,SAAZ,CADyB,EAWzB,MAAI,CAACvnB,EAAL,CAAQ2oB,QAAR,CAAiB;AACfnK,UAAAA,SAAS,EAAE,gBADI;AAEfwB,UAAAA,KAAK,EAAE,MAAI,CAACr2B,OAAL,CAAaggC,SAFL;AAGfC,UAAAA,KAAK,EAAE,MAAI,CAACnkC,IAAL,CAAUqD,KAAV,CAAgBA,KAHR;AAIf+gC,UAAAA,QAAQ,EAAE,kBAACt6B,IAAD,EAAU;AAClB;AACA,gBAAI,OAAOA,IAAP,KAAgB,QAApB,EAA8B;AAC5BA,cAAAA,IAAI,GAAG;AACLgzB,gBAAAA,GAAG,EAAEhzB,IADA;AAELq6B,gBAAAA,KAAK,EAAGh5B,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqC,MAAI,CAACtL,IAAL,CAAUqD,KAA/C,EAAsDyG,IAAtD,IAA8D,MAAI,CAAC9J,IAAL,CAAUqD,KAAV,CAAgByG,IAAhB,CAA9D,GAAsFA;AAFzF,eAAP;AAID;;AAED,gBAAMgzB,GAAG,GAAGhzB,IAAI,CAACgzB,GAAjB;AACA,gBAAMqH,KAAK,GAAGr6B,IAAI,CAACq6B,KAAnB;AACA,gBAAM9gC,KAAK,GAAGyG,IAAI,CAACzG,KAAL,GAAa,aAAayG,IAAI,CAACzG,KAAlB,GAA0B,IAAvC,GAA8C,EAA5D;AACA,gBAAM01B,SAAS,GAAGjvB,IAAI,CAACivB,SAAL,GAAiB,aAAajvB,IAAI,CAACivB,SAAlB,GAA8B,GAA/C,GAAqD,EAAvE;AAEA,mBAAO,MAAM+D,GAAN,GAAYz5B,KAAZ,GAAoB01B,SAApB,GAAgC,GAAhC,GAAsCoL,KAAtC,GAA8C,IAA9C,GAAqDrH,GAArD,GAA2D,GAAlE;AACD,WAnBc;AAoBf8F,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,oBAAjC;AApBQ,SAAjB,CAXyB,CAApB,EAiCJ8mB,MAjCI,EAAP;AAkCD,OAnCD;;AADkB,iCAsCTa,QAtCS,EAsCKC,QAtCL;AAuChB,YAAMx6B,IAAI,GAAG,MAAI,CAAC5F,OAAL,CAAaggC,SAAb,CAAuBG,QAAvB,CAAb;;AAEA,cAAI,CAACn9B,OAAL,CAAawG,IAAb,CAAkB,kBAAkB5D,IAApC,EAA0C,YAAM;AAC9C,iBAAO,MAAI,CAACq4B,MAAL,CAAY;AACjBpJ,YAAAA,SAAS,EAAE,oBAAoBjvB,IADd;AAEjBud,YAAAA,QAAQ,EAAE,sBAAsBvd,IAAtB,GAA6B,IAA7B,GAAoCA,IAAI,CAAC8B,WAAL,EAApC,GAAyD,QAFlD;AAGjB6R,YAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUqD,KAAV,CAAgByG,IAAhB,CAHQ;AAIjB84B,YAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,oBAAjC;AAJU,WAAZ,EAKJ8mB,MALI,EAAP;AAMD,SAPD;AAzCgB;;AAsClB,WAAK,IAAIa,QAAQ,GAAG,CAAf,EAAkBC,QAAQ,GAAG,KAAKpgC,OAAL,CAAaggC,SAAb,CAAuBr3B,MAAzD,EAAiEw3B,QAAQ,GAAGC,QAA5E,EAAsFD,QAAQ,EAA9F,EAAkG;AAAA,cAAzFA,QAAyF,EAA3EC,QAA2E;AAWjG;;AAED,WAAKp9B,OAAL,CAAawG,IAAb,CAAkB,aAAlB,EAAiC,YAAM;AACrC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,eADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBrd,IAAhC,CAFO;AAGjBsd,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeC,IAAf,GAAsB,MAAI,CAACokC,iBAAL,CAAuB,MAAvB,CAHd;AAIjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,aAA/C;AAJU,SAAZ,EAKJhB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,eAAlB,EAAmC,YAAM;AACvC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,iBADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBpd,MAAhC,CAFO;AAGjBqd,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeE,MAAf,GAAwB,MAAI,CAACmkC,iBAAL,CAAuB,QAAvB,CAHhB;AAIjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,eAA/C;AAJU,SAAZ,EAKJhB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,oBADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBnd,SAAhC,CAFO;AAGjBod,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeG,SAAf,GAA2B,MAAI,CAACkkC,iBAAL,CAAuB,WAAvB,CAHnB;AAIjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,kBAA/C;AAJU,SAAZ,EAKJhB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,cAAlB,EAAkC,YAAM;AACtC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBinB,MAAhC,CADO;AAEjBhnB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeI,KAAf,GAAuB,MAAI,CAACikC,iBAAL,CAAuB,cAAvB,CAFf;AAGjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,qBAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,sBAAlB,EAA0C,YAAM;AAC9C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,wBADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB/c,aAAhC,CAFO;AAGjBgd,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeO,aAAf,GAA+B,MAAI,CAAC8jC,iBAAL,CAAuB,eAAvB,CAHvB;AAIjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,sBAA/C;AAJU,SAAZ,EAKJhB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,oBAAlB,EAAwC,YAAM;AAC5C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,sBADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB7c,WAAhC,CAFO;AAGjB8c,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeS,WAHP;AAIjBiiC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,oBAA/C;AAJU,SAAZ,EAKJhB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,oBADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB9c,SAAhC,CAFO;AAGjB+c,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeQ,SAHP;AAIjBkiC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,kBAA/C;AAJU,SAAZ,EAKJhB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,iBAAlB,EAAqC,YAAM;AACzC,YAAMua,SAAS,GAAG,MAAI,CAAC/gB,OAAL,CAAa+C,MAAb,CAAoB,qBAApB,CAAlB;;AAEA,YAAI,MAAI,CAAC/F,OAAL,CAAawgC,eAAjB,EAAkC;AAChC;AACA5kC,UAAAA,8BAAA,CAAOmoB,SAAS,CAAC,aAAD,CAAT,CAAyBxc,KAAzB,CAA+B,GAA/B,CAAP,EAA4C,UAAC0B,GAAD,EAAMw3B,QAAN,EAAmB;AAC7DA,YAAAA,QAAQ,GAAGA,QAAQ,CAACrsB,IAAT,GAAgBhB,OAAhB,CAAwB,QAAxB,EAAkC,EAAlC,CAAX;;AACA,gBAAI,MAAI,CAACstB,mBAAL,CAAyBD,QAAzB,CAAJ,EAAwC;AACtC,kBAAI,MAAI,CAACzgC,OAAL,CAAa2gC,SAAb,CAAuBt8B,OAAvB,CAA+Bo8B,QAA/B,MAA6C,CAAC,CAAlD,EAAqD;AACnD,sBAAI,CAACzgC,OAAL,CAAa2gC,SAAb,CAAuBx2B,IAAvB,CAA4Bs2B,QAA5B;AACD;AACF;AACF,WAPD;AAQD;;AAED,eAAO,MAAI,CAACpqB,EAAL,CAAQmoB,WAAR,CAAoB,CACzB,MAAI,CAACP,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQ0oB,sBAAR,CACR,6CADQ,EACuC,MAAI,CAAC/+B,OAD5C,CAFA;AAKVuZ,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeM,IALd;AAMVuc,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AANI,SAAZ,CADyB,EAWzB,MAAI,CAACvnB,EAAL,CAAQuqB,aAAR,CAAsB;AACpB/L,UAAAA,SAAS,EAAE,mBADS;AAEpBgM,UAAAA,cAAc,EAAE,MAAI,CAAC7gC,OAAL,CAAasZ,KAAb,CAAmBwnB,SAFf;AAGpBzK,UAAAA,KAAK,EAAE,MAAI,CAACr2B,OAAL,CAAa2gC,SAAb,CAAuB7yB,MAAvB,CAA8B,MAAI,CAACrL,eAAL,CAAqByzB,IAArB,CAA0B,MAA1B,CAA9B,CAHa;AAIpB+J,UAAAA,KAAK,EAAE,MAAI,CAACnkC,IAAL,CAAUE,IAAV,CAAeM,IAJF;AAKpB4jC,UAAAA,QAAQ,EAAE,kBAACt6B,IAAD,EAAU;AAClB,mBAAO,+BAA+B4E,iBAAA,CAAkB5E,IAAlB,CAA/B,GAAyD,IAAzD,GAAgEA,IAAhE,GAAuE,SAA9E;AACD,WAPmB;AAQpB84B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,iBAA/C;AARa,SAAtB,CAXyB,CAApB,EAqBJhB,MArBI,EAAP;AAsBD,OArCD;AAuCA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,iBAAlB,EAAqC,YAAM;AACzC,eAAO,MAAI,CAAC6M,EAAL,CAAQmoB,WAAR,CAAoB,CACzB,MAAI,CAACP,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQ0oB,sBAAR,CAA+B,6CAA/B,EAA8E,MAAI,CAAC/+B,OAAnF,CAFA;AAGVuZ,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeU,IAHd;AAIVmc,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AAJI,SAAZ,CADyB,EASzB,MAAI,CAACvnB,EAAL,CAAQuqB,aAAR,CAAsB;AACpB/L,UAAAA,SAAS,EAAE,mBADS;AAEpBgM,UAAAA,cAAc,EAAE,MAAI,CAAC7gC,OAAL,CAAasZ,KAAb,CAAmBwnB,SAFf;AAGpBzK,UAAAA,KAAK,EAAE,MAAI,CAACr2B,OAAL,CAAa+gC,SAHA;AAIpBd,UAAAA,KAAK,EAAE,MAAI,CAACnkC,IAAL,CAAUE,IAAV,CAAeU,IAJF;AAKpBgiC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,iBAA/C;AALa,SAAtB,CATyB,CAApB,EAgBJhB,MAhBI,EAAP;AAiBD,OAlBD;AAoBA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,qBAAlB,EAAyC,YAAM;AAC7C,eAAO,MAAI,CAAC6M,EAAL,CAAQmoB,WAAR,CAAoB,CACzB,MAAI,CAACP,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQ0oB,sBAAR,CAA+B,iDAA/B,EAAkF,MAAI,CAAC/+B,OAAvF,CAFA;AAGVuZ,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeW,QAHd;AAIVkc,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AAJI,SAAZ,CADyB,EASzB,MAAI,CAACvnB,EAAL,CAAQuqB,aAAR,CAAsB;AACpB/L,UAAAA,SAAS,EAAE,uBADS;AAEpBgM,UAAAA,cAAc,EAAE,MAAI,CAAC7gC,OAAL,CAAasZ,KAAb,CAAmBwnB,SAFf;AAGpBzK,UAAAA,KAAK,EAAE,MAAI,CAACr2B,OAAL,CAAaghC,aAHA;AAIpBf,UAAAA,KAAK,EAAE,MAAI,CAACnkC,IAAL,CAAUE,IAAV,CAAeW,QAJF;AAKpB+hC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAas9B,iCAAb,CAA+C,qBAA/C;AALa,SAAtB,CATyB,CAApB,EAgBJhB,MAhBI,EAAP;AAiBD,OAlBD;AAoBA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,cAAlB,EAAkC,YAAM;AACtC,eAAO,MAAI,CAACy3B,YAAL,CAAkB,gBAAlB,EAAoC,MAAI,CAACnlC,IAAL,CAAU6E,KAAV,CAAgBC,MAApD,EAA4D,IAA5D,EAAkE,IAAlE,CAAP;AACD,OAFD;AAIA,WAAKoC,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy3B,YAAL,CAAkB,iBAAlB,EAAqC,MAAI,CAACnlC,IAAL,CAAU6E,KAAV,CAAgBI,UAArD,EAAiE,KAAjE,EAAwE,IAAxE,CAAP;AACD,OAFD;AAIA,WAAKiC,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy3B,YAAL,CAAkB,iBAAlB,EAAqC,MAAI,CAACnlC,IAAL,CAAU6E,KAAV,CAAgBG,UAArD,EAAiE,IAAjE,EAAuE,KAAvE,CAAP;AACD,OAFD;AAIA,WAAKkC,OAAL,CAAawG,IAAb,CAAkB,WAAlB,EAA+B,YAAM;AACnC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB4nB,aAAhC,CADO;AAEjB3nB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU+D,KAAV,CAAgBC,SAAhB,GAA4B,MAAI,CAACugC,iBAAL,CAAuB,qBAAvB,CAFpB;AAGjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,4BAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,WAAlB,EAA+B,YAAM;AACnC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB6nB,WAAhC,CADO;AAEjB5nB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU+D,KAAV,CAAgBE,OAAhB,GAA0B,MAAI,CAACsgC,iBAAL,CAAuB,mBAAvB,CAFlB;AAGjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,0BAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,UAAM8B,WAAW,GAAG,KAAKnD,MAAL,CAAY;AAC9B9a,QAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQooB,IAAR,CAAa,KAAKz+B,OAAL,CAAasZ,KAAb,CAAmB+nB,SAAhC,CADoB;AAE9B9nB,QAAAA,OAAO,EAAE,KAAKzd,IAAL,CAAUsE,SAAV,CAAoBG,IAApB,GAA2B,KAAK8/B,iBAAL,CAAuB,aAAvB,CAFN;AAG9B3B,QAAAA,KAAK,EAAE,KAAK17B,OAAL,CAAawV,mBAAb,CAAiC,oBAAjC;AAHuB,OAAZ,CAApB;AAMA,UAAM8oB,aAAa,GAAG,KAAKrD,MAAL,CAAY;AAChC9a,QAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQooB,IAAR,CAAa,KAAKz+B,OAAL,CAAasZ,KAAb,CAAmBioB,WAAhC,CADsB;AAEhChoB,QAAAA,OAAO,EAAE,KAAKzd,IAAL,CAAUsE,SAAV,CAAoBI,MAApB,GAA6B,KAAK6/B,iBAAL,CAAuB,eAAvB,CAFN;AAGhC3B,QAAAA,KAAK,EAAE,KAAK17B,OAAL,CAAawV,mBAAb,CAAiC,sBAAjC;AAHyB,OAAZ,CAAtB;AAMA,UAAMgpB,YAAY,GAAG,KAAKvD,MAAL,CAAY;AAC/B9a,QAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQooB,IAAR,CAAa,KAAKz+B,OAAL,CAAasZ,KAAb,CAAmBmoB,UAAhC,CADqB;AAE/BloB,QAAAA,OAAO,EAAE,KAAKzd,IAAL,CAAUsE,SAAV,CAAoBK,KAApB,GAA4B,KAAK4/B,iBAAL,CAAuB,cAAvB,CAFN;AAG/B3B,QAAAA,KAAK,EAAE,KAAK17B,OAAL,CAAawV,mBAAb,CAAiC,qBAAjC;AAHwB,OAAZ,CAArB;AAMA,UAAMkpB,WAAW,GAAG,KAAKzD,MAAL,CAAY;AAC9B9a,QAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQooB,IAAR,CAAa,KAAKz+B,OAAL,CAAasZ,KAAb,CAAmBqoB,YAAhC,CADoB;AAE9BpoB,QAAAA,OAAO,EAAE,KAAKzd,IAAL,CAAUsE,SAAV,CAAoBM,OAApB,GAA8B,KAAK2/B,iBAAL,CAAuB,aAAvB,CAFT;AAG9B3B,QAAAA,KAAK,EAAE,KAAK17B,OAAL,CAAawV,mBAAb,CAAiC,oBAAjC;AAHuB,OAAZ,CAApB;AAMA,UAAMnY,OAAO,GAAG,KAAK49B,MAAL,CAAY;AAC1B9a,QAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQooB,IAAR,CAAa,KAAKz+B,OAAL,CAAasZ,KAAb,CAAmBjZ,OAAhC,CADgB;AAE1BkZ,QAAAA,OAAO,EAAE,KAAKzd,IAAL,CAAUsE,SAAV,CAAoBC,OAApB,GAA8B,KAAKggC,iBAAL,CAAuB,SAAvB,CAFb;AAG1B3B,QAAAA,KAAK,EAAE,KAAK17B,OAAL,CAAawV,mBAAb,CAAiC,gBAAjC;AAHmB,OAAZ,CAAhB;AAMA,UAAMlY,MAAM,GAAG,KAAK29B,MAAL,CAAY;AACzB9a,QAAAA,QAAQ,EAAE,KAAK9M,EAAL,CAAQooB,IAAR,CAAa,KAAKz+B,OAAL,CAAasZ,KAAb,CAAmBhZ,MAAhC,CADe;AAEzBiZ,QAAAA,OAAO,EAAE,KAAKzd,IAAL,CAAUsE,SAAV,CAAoBE,MAApB,GAA6B,KAAK+/B,iBAAL,CAAuB,QAAvB,CAFb;AAGzB3B,QAAAA,KAAK,EAAE,KAAK17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC;AAHkB,OAAZ,CAAf;AAMA,WAAKxV,OAAL,CAAawG,IAAb,CAAkB,oBAAlB,EAAwC3B,WAAA,CAAYu5B,WAAZ,EAAyB,QAAzB,CAAxC;AACA,WAAKp+B,OAAL,CAAawG,IAAb,CAAkB,sBAAlB,EAA0C3B,WAAA,CAAYy5B,aAAZ,EAA2B,QAA3B,CAA1C;AACA,WAAKt+B,OAAL,CAAawG,IAAb,CAAkB,qBAAlB,EAAyC3B,WAAA,CAAY25B,YAAZ,EAA0B,QAA1B,CAAzC;AACA,WAAKx+B,OAAL,CAAawG,IAAb,CAAkB,oBAAlB,EAAwC3B,WAAA,CAAY65B,WAAZ,EAAyB,QAAzB,CAAxC;AACA,WAAK1+B,OAAL,CAAawG,IAAb,CAAkB,gBAAlB,EAAoC3B,WAAA,CAAYxH,OAAZ,EAAqB,QAArB,CAApC;AACA,WAAK2C,OAAL,CAAawG,IAAb,CAAkB,eAAlB,EAAmC3B,WAAA,CAAYvH,MAAZ,EAAoB,QAApB,CAAnC;AAEA,WAAK0C,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAAC6M,EAAL,CAAQmoB,WAAR,CAAoB,CACzB,MAAI,CAACP,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQ0oB,sBAAR,CAA+B,MAAI,CAAC1oB,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB+nB,SAAhC,CAA/B,EAA2E,MAAI,CAACrhC,OAAhF,CAFA;AAGVuZ,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUsE,SAAV,CAAoBA,SAHnB;AAIVyY,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AAJI,SAAZ,CADyB,EASzB,MAAI,CAACvnB,EAAL,CAAQ2oB,QAAR,CAAiB,CACf,MAAI,CAAC3oB,EAAL,CAAQmoB,WAAR,CAAoB;AAClB3J,UAAAA,SAAS,EAAE,YADO;AAElBvO,UAAAA,QAAQ,EAAE,CAAC8a,WAAD,EAAcE,aAAd,EAA6BE,YAA7B,EAA2CE,WAA3C;AAFQ,SAApB,CADe,EAKf,MAAI,CAACrrB,EAAL,CAAQmoB,WAAR,CAAoB;AAClB3J,UAAAA,SAAS,EAAE,WADO;AAElBvO,UAAAA,QAAQ,EAAE,CAACjmB,OAAD,EAAUC,MAAV;AAFQ,SAApB,CALe,CAAjB,CATyB,CAApB,EAmBJg/B,MAnBI,EAAP;AAoBD,OArBD;AAuBA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,eAAlB,EAAmC,YAAM;AACvC,eAAO,MAAI,CAAC6M,EAAL,CAAQmoB,WAAR,CAAoB,CACzB,MAAI,CAACP,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQ0oB,sBAAR,CAA+B,MAAI,CAAC1oB,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBsoB,UAAhC,CAA/B,EAA4E,MAAI,CAAC5hC,OAAjF,CAFA;AAGVuZ,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUE,IAAV,CAAeK,MAHd;AAIVwc,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AAJI,SAAZ,CADyB,EASzB,MAAI,CAACvnB,EAAL,CAAQuqB,aAAR,CAAsB;AACpBvK,UAAAA,KAAK,EAAE,MAAI,CAACr2B,OAAL,CAAa6hC,WADA;AAEpBhB,UAAAA,cAAc,EAAE,MAAI,CAAC7gC,OAAL,CAAasZ,KAAb,CAAmBwnB,SAFf;AAGpBjM,UAAAA,SAAS,EAAE,sBAHS;AAIpBoL,UAAAA,KAAK,EAAE,MAAI,CAACnkC,IAAL,CAAUE,IAAV,CAAeK,MAJF;AAKpBqiC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,mBAAjC;AALa,SAAtB,CATyB,CAApB,EAgBJ8mB,MAhBI,EAAP;AAiBD,OAlBD;AAoBA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,cAAlB,EAAkC,YAAM;AACtC,eAAO,MAAI,CAAC6M,EAAL,CAAQmoB,WAAR,CAAoB,CACzB,MAAI,CAACP,MAAL,CAAY;AACVpJ,UAAAA,SAAS,EAAE,iBADD;AAEV1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQ0oB,sBAAR,CAA+B,MAAI,CAAC1oB,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB5a,KAAhC,CAA/B,EAAuE,MAAI,CAACsB,OAA5E,CAFA;AAGVuZ,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBA,KAHf;AAIVma,UAAAA,IAAI,EAAE;AACJ+kB,YAAAA,MAAM,EAAE;AADJ;AAJI,SAAZ,CADyB,EASzB,MAAI,CAACvnB,EAAL,CAAQ2oB,QAAR,CAAiB;AACfiB,UAAAA,KAAK,EAAE,MAAI,CAACnkC,IAAL,CAAU4C,KAAV,CAAgBA,KADR;AAEfm2B,UAAAA,SAAS,EAAE,YAFI;AAGfwB,UAAAA,KAAK,EAAE,CACL,qCADK,EAEH,kGAFG,EAGH,uDAHG,EAIH,yDAJG,EAKL,QALK,EAML,iDANK,EAOL1uB,IAPK,CAOA,EAPA;AAHQ,SAAjB,CATyB,CAApB,EAqBJ;AACDqQ,UAAAA,QAAQ,EAAE,kBAACvE,KAAD,EAAW;AACnB,gBAAMquB,QAAQ,GAAGruB,KAAK,CAAC1K,IAAN,CAAW,qCAAX,CAAjB;AACA+4B,YAAAA,QAAQ,CAACpf,GAAT,CAAa;AACXtf,cAAAA,KAAK,EAAE,MAAI,CAACpD,OAAL,CAAa+hC,kBAAb,CAAgCC,GAAhC,GAAsC,IADlC;AAEX3lC,cAAAA,MAAM,EAAE,MAAI,CAAC2D,OAAL,CAAa+hC,kBAAb,CAAgC/Y,GAAhC,GAAsC;AAFnC,aAAb,EAGGiZ,OAHH,CAGW,MAAI,CAACj/B,OAAL,CAAawV,mBAAb,CAAiC,oBAAjC,CAHX,EAIG1D,EAJH,CAIM,WAJN,EAImB,MAAI,CAACotB,gBAAL,CAAsBhM,IAAtB,CAA2B,MAA3B,CAJnB;AAKD;AARA,SArBI,EA8BJoJ,MA9BI,EAAP;AA+BD,OAhCD;AAkCA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,aAAlB,EAAiC,YAAM;AACrC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBlb,IAAhC,CADO;AAEjBmb,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUsC,IAAV,CAAeA,IAAf,GAAsB,MAAI,CAACiiC,iBAAL,CAAuB,iBAAvB,CAFd;AAGjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,iBAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,gBAAlB,EAAoC,YAAM;AACxC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB6oB,OAAhC,CADO;AAEjB5oB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBA,KAFR;AAGjB8hC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,kBAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,cAAlB,EAAkC,YAAM;AACtC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBrb,KAAhC,CADO;AAEjBsb,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUmC,KAAV,CAAgBA,KAFR;AAGjBygC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,kBAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,WAAlB,EAA+B,YAAM;AACnC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB8oB,KAAhC,CADO;AAEjB7oB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUoD,EAAV,CAAarC,MAAb,GAAsB,MAAI,CAACwjC,iBAAL,CAAuB,sBAAvB,CAFd;AAGjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,6BAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,mBAAlB,EAAuC,YAAM;AAC3C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,mCADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmB+oB,SAAhC,CAFO;AAGjB9oB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUkE,OAAV,CAAkBE,UAHV;AAIjBw+B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,mBAAjC;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,iBAAlB,EAAqC,YAAM;AACzC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,iCADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBtC,IAAhC,CAFO;AAGjBuC,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUkE,OAAV,CAAkBG,QAHV;AAIjBu+B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,iBAAjC;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AASA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,aAAlB,EAAiC,YAAM;AACrC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBvX,IAAhC,CADO;AAEjBwX,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU+F,OAAV,CAAkBE,IAAlB,GAAyB,MAAI,CAACs+B,iBAAL,CAAuB,MAAvB,CAFjB;AAGjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,aAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,aAAlB,EAAiC,YAAM;AACrC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBxX,IAAhC,CADO;AAEjByX,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU+F,OAAV,CAAkBC,IAAlB,GAAyB,MAAI,CAACu+B,iBAAL,CAAuB,MAAvB,CAFjB;AAGjB3B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,aAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,aAAlB,EAAiC,YAAM;AACrC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBgpB,QAAhC,CADO;AAEjB/oB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUkE,OAAV,CAAkBC,IAFV;AAGjBy+B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,iBAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAOD;AAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,kCAAyB;AAAA;;AACvB;AACA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,mBAAlB,EAAuC,YAAM;AAC3C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,4CADO;AAEjB5J,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBE,UAFR;AAGjB4hC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,GAAlD;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAOA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,mBAAlB,EAAuC,YAAM;AAC3C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,2CADO;AAEjB5J,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBG,UAFR;AAGjB2hC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,KAAlD;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAOA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,sBAAlB,EAA0C,YAAM;AAC9C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,2CADO;AAEjB5J,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBI,aAFR;AAGjB0hC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,MAAlD;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAOA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,mBAAlB,EAAuC,YAAM;AAC3C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBipB,QAAhC,CADO;AAEjBhpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBK,UAFR;AAGjByhC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,GAAlD;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND,EAvBuB,CA+BvB;;AACA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBpc,SAAhC,CADO;AAEjBqc,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBM,SAFR;AAGjBwhC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,gBAAjC,EAAmD,MAAnD;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,mBAAlB,EAAuC,YAAM;AAC3C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBnc,UAAhC,CADO;AAEjBoc,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBO,UAFR;AAGjBuhC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,gBAAjC,EAAmD,OAAnD;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBipB,QAAhC,CADO;AAEjBhpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBQ,SAFR;AAGjBshC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,gBAAjC,EAAmD,MAAnD;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND,EAhDuB,CAwDvB;;AACA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,oBAAlB,EAAwC,YAAM;AAC5C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBkpB,KAAhC,CADO;AAEjBjpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUc,KAAV,CAAgBmB,MAFR;AAGjB2gC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,oBAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAOD;;;WAED,iCAAwB;AAAA;;AACtB,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,uBAAlB,EAA2C,YAAM;AAC/C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBlb,IAAhC,CADO;AAEjBmb,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUsC,IAAV,CAAeE,IAFP;AAGjBogC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,iBAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,eAAlB,EAAmC,YAAM;AACvC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjB9a,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBjb,MAAhC,CADO;AAEjBkb,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAUsC,IAAV,CAAeC,MAFP;AAGjBqgC,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC;AAHU,SAAZ,EAIJ8mB,MAJI,EAAP;AAKD,OAND;AAOD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,kCAAyB;AAAA;;AACvB,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,iBAAlB,EAAqC,YAAM;AACzC,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,QADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBmpB,QAAhC,CAFO;AAGjBlpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBC,WAHR;AAIjB+/B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,KAAlD;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,mBAAlB,EAAuC,YAAM;AAC3C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,QADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBopB,QAAhC,CAFO;AAGjBnpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBE,WAHR;AAIjB8/B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,QAAlD;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,mBAAlB,EAAuC,YAAM;AAC3C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,QADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBqpB,SAAhC,CAFO;AAGjBppB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBG,UAHR;AAIjB6/B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,MAAlD;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,oBAAlB,EAAwC,YAAM;AAC5C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,QADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBspB,QAAhC,CAFO;AAGjBrpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBI,WAHR;AAIjB4/B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,eAAjC,EAAkD,OAAlD;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,QADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBupB,SAAhC,CAFO;AAGjBtpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBK,MAHR;AAIjB2/B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,kBAAjC;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,kBAAlB,EAAsC,YAAM;AAC1C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,QADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBwpB,SAAhC,CAFO;AAGjBvpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBM,MAHR;AAIjB0/B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,kBAAjC;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AAQA,WAAKt8B,OAAL,CAAawG,IAAb,CAAkB,oBAAlB,EAAwC,YAAM;AAC5C,eAAO,MAAI,CAACy0B,MAAL,CAAY;AACjBpJ,UAAAA,SAAS,EAAE,QADM;AAEjB1R,UAAAA,QAAQ,EAAE,MAAI,CAAC9M,EAAL,CAAQooB,IAAR,CAAa,MAAI,CAACz+B,OAAL,CAAasZ,KAAb,CAAmBkpB,KAAhC,CAFO;AAGjBjpB,UAAAA,OAAO,EAAE,MAAI,CAACzd,IAAL,CAAU4C,KAAV,CAAgBO,QAHR;AAIjBy/B,UAAAA,KAAK,EAAE,MAAI,CAAC17B,OAAL,CAAawV,mBAAb,CAAiC,oBAAjC;AAJU,SAAZ,EAKJ8mB,MALI,EAAP;AAMD,OAPD;AAQD;;;WAED,eAAMyD,UAAN,EAAkBC,MAAlB,EAA0B;AACxB,WAAK,IAAIC,QAAQ,GAAG,CAAf,EAAkBC,QAAQ,GAAGF,MAAM,CAACr6B,MAAzC,EAAiDs6B,QAAQ,GAAGC,QAA5D,EAAsED,QAAQ,EAA9E,EAAkF;AAChF,YAAME,KAAK,GAAGH,MAAM,CAACC,QAAD,CAApB;AACA,YAAMG,SAAS,GAAGpc,KAAK,CAACqc,OAAN,CAAcF,KAAd,IAAuBA,KAAK,CAAC,CAAD,CAA5B,GAAkCA,KAApD;AACA,YAAM/rB,OAAO,GAAG4P,KAAK,CAACqc,OAAN,CAAcF,KAAd,IAAyBA,KAAK,CAACx6B,MAAN,KAAiB,CAAlB,GAAuB,CAACw6B,KAAK,CAAC,CAAD,CAAN,CAAvB,GAAoCA,KAAK,CAAC,CAAD,CAAjE,GAAwE,CAACA,KAAD,CAAxF;AAEA,YAAMG,MAAM,GAAG,KAAKjtB,EAAL,CAAQmoB,WAAR,CAAoB;AACjC3J,UAAAA,SAAS,EAAE,UAAUuO;AADY,SAApB,EAEZ9D,MAFY,EAAf;;AAIA,aAAK,IAAIr2B,GAAG,GAAG,CAAV,EAAaC,GAAG,GAAGkO,OAAO,CAACzO,MAAhC,EAAwCM,GAAG,GAAGC,GAA9C,EAAmDD,GAAG,EAAtD,EAA0D;AACxD,cAAMs6B,GAAG,GAAG,KAAKvgC,OAAL,CAAawG,IAAb,CAAkB,YAAY4N,OAAO,CAACnO,GAAD,CAArC,CAAZ;;AACA,cAAIs6B,GAAJ,EAAS;AACPD,YAAAA,MAAM,CAACnX,MAAP,CAAc,OAAOoX,GAAP,KAAe,UAAf,GAA4BA,GAAG,CAAC,KAAKvgC,OAAN,CAA/B,GAAgDugC,GAA9D;AACD;AACF;;AACDD,QAAAA,MAAM,CAAC1gB,QAAP,CAAgBmgB,UAAhB;AACD;AACF;AAED;AACF;AACA;;;;WACE,4BAAmBA,UAAnB,EAA+B;AAC7B,UAAMve,KAAK,GAAGue,UAAU,IAAI,KAAKrI,QAAjC;AAEA,UAAM3W,SAAS,GAAG,KAAK/gB,OAAL,CAAa+C,MAAb,CAAoB,qBAApB,CAAlB;AACA,WAAKy9B,eAAL,CAAqBhf,KAArB,EAA4B;AAC1B,0BAAkB,uBAAM;AACtB,iBAAOT,SAAS,CAAC,WAAD,CAAT,KAA2B,MAAlC;AACD,SAHyB;AAI1B,4BAAoB,yBAAM;AACxB,iBAAOA,SAAS,CAAC,aAAD,CAAT,KAA6B,QAApC;AACD,SANyB;AAO1B,+BAAuB,4BAAM;AAC3B,iBAAOA,SAAS,CAAC,gBAAD,CAAT,KAAgC,WAAvC;AACD,SATyB;AAU1B,+BAAuB,4BAAM;AAC3B,iBAAOA,SAAS,CAAC,gBAAD,CAAT,KAAgC,WAAvC;AACD,SAZyB;AAa1B,iCAAyB,8BAAM;AAC7B,iBAAOA,SAAS,CAAC,kBAAD,CAAT,KAAkC,aAAzC;AACD,SAfyB;AAgB1B,mCAA2B,gCAAM;AAC/B,iBAAOA,SAAS,CAAC,oBAAD,CAAT,KAAoC,eAA3C;AACD;AAlByB,OAA5B;;AAqBA,UAAIA,SAAS,CAAC,aAAD,CAAb,EAA8B;AAC5B,YAAM4c,SAAS,GAAG5c,SAAS,CAAC,aAAD,CAAT,CAAyBxc,KAAzB,CAA+B,GAA/B,EAAoCC,GAApC,CAAwC,UAAClL,IAAD,EAAU;AAClE,iBAAOA,IAAI,CAAC8W,OAAL,CAAa,SAAb,EAAwB,EAAxB,EACJA,OADI,CACI,MADJ,EACY,EADZ,EAEJA,OAFI,CAEI,MAFJ,EAEY,EAFZ,CAAP;AAGD,SAJiB,CAAlB;AAKA,YAAM9Q,QAAQ,GAAGzC,UAAA,CAAW8gC,SAAX,EAAsB,KAAKl+B,eAAL,CAAqByzB,IAArB,CAA0B,IAA1B,CAAtB,CAAjB;AAEA1R,QAAAA,KAAK,CAACzb,IAAN,CAAW,sBAAX,EAAmCmG,IAAnC,CAAwC,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AACrD,cAAM69B,KAAK,GAAG7nC,yBAAC,CAACgK,IAAD,CAAf,CADqD,CAErD;;AACA,cAAM89B,SAAS,GAAID,KAAK,CAAC5qB,IAAN,CAAW,OAAX,IAAsB,EAAvB,KAAgCvW,QAAQ,GAAG,EAA7D;AACAmhC,UAAAA,KAAK,CAAC7R,WAAN,CAAkB,SAAlB,EAA6B8R,SAA7B;AACD,SALD;AAMAlf,QAAAA,KAAK,CAACzb,IAAN,CAAW,wBAAX,EAAqC+J,IAArC,CAA0CxQ,QAA1C,EAAoDogB,GAApD,CAAwD,aAAxD,EAAuEpgB,QAAvE;AACD;;AAED,UAAIyhB,SAAS,CAAC,WAAD,CAAb,EAA4B;AAC1B,YAAME,QAAQ,GAAGF,SAAS,CAAC,WAAD,CAA1B;AACAS,QAAAA,KAAK,CAACzb,IAAN,CAAW,sBAAX,EAAmCmG,IAAnC,CAAwC,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AACrD,cAAM69B,KAAK,GAAG7nC,yBAAC,CAACgK,IAAD,CAAf,CADqD,CAErD;;AACA,cAAM89B,SAAS,GAAID,KAAK,CAAC5qB,IAAN,CAAW,OAAX,IAAsB,EAAvB,KAAgCoL,QAAQ,GAAG,EAA7D;AACAwf,UAAAA,KAAK,CAAC7R,WAAN,CAAkB,SAAlB,EAA6B8R,SAA7B;AACD,SALD;AAMAlf,QAAAA,KAAK,CAACzb,IAAN,CAAW,wBAAX,EAAqC+J,IAArC,CAA0CmR,QAA1C;AAEA,YAAMwL,YAAY,GAAG1L,SAAS,CAAC,gBAAD,CAA9B;AACAS,QAAAA,KAAK,CAACzb,IAAN,CAAW,0BAAX,EAAuCmG,IAAvC,CAA4C,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AACzD,cAAM69B,KAAK,GAAG7nC,yBAAC,CAACgK,IAAD,CAAf;AACA,cAAM89B,SAAS,GAAID,KAAK,CAAC5qB,IAAN,CAAW,OAAX,IAAsB,EAAvB,KAAgC4W,YAAY,GAAG,EAAjE;AACAgU,UAAAA,KAAK,CAAC7R,WAAN,CAAkB,SAAlB,EAA6B8R,SAA7B;AACD,SAJD;AAKAlf,QAAAA,KAAK,CAACzb,IAAN,CAAW,4BAAX,EAAyC+J,IAAzC,CAA8C2c,YAA9C;AACD;;AAED,UAAI1L,SAAS,CAAC,aAAD,CAAb,EAA8B;AAC5B,YAAMe,UAAU,GAAGf,SAAS,CAAC,aAAD,CAA5B;AACAS,QAAAA,KAAK,CAACzb,IAAN,CAAW,yBAAX,EAAsCmG,IAAtC,CAA2C,UAACjG,GAAD,EAAMrD,IAAN,EAAe;AACxD,cAAM69B,KAAK,GAAG7nC,yBAAC,CAACgK,IAAD,CAAf,CADwD,CAExD;;AACA,cAAM89B,SAAS,GAAI9nC,yBAAC,CAACgK,IAAD,CAAD,CAAQiT,IAAR,CAAa,OAAb,IAAwB,EAAzB,KAAkCiM,UAAU,GAAG,EAAjE;AACA2e,UAAAA,KAAK,CAAC7R,WAAN,CAAkB,SAAlB,EAA6B8R,SAA7B;AACD,SALD;AAMAlf,QAAAA,KAAK,CAACzb,IAAN,CAAW,2BAAX,EAAwC+J,IAAxC,CAA6CgS,UAA7C;AACD;AACF;;;WAED,yBAAgBie,UAAhB,EAA4BY,KAA5B,EAAmC;AAAA;;AACjC/nC,MAAAA,8BAAA,CAAO+nC,KAAP,EAAc,UAACC,QAAD,EAAW56B,IAAX,EAAoB;AAChC,cAAI,CAACqN,EAAL,CAAQwtB,eAAR,CAAwBd,UAAU,CAACh6B,IAAX,CAAgB66B,QAAhB,CAAxB,EAAmD56B,IAAI,EAAvD;AACD,OAFD;AAGD;;;WAED,0BAAiBuP,KAAjB,EAAwB;AACtB,UAAMurB,SAAS,GAAG,EAAlB;AACA,UAAMpE,OAAO,GAAG9jC,yBAAC,CAAC2c,KAAK,CAACI,MAAN,CAAanL,UAAd,CAAjB,CAFsB,CAEsB;;AAC5C,UAAMu2B,iBAAiB,GAAGrE,OAAO,CAACp1B,IAAR,EAA1B;AACA,UAAMw3B,QAAQ,GAAGpC,OAAO,CAAC32B,IAAR,CAAa,qCAAb,CAAjB;AACA,UAAMi7B,YAAY,GAAGtE,OAAO,CAAC32B,IAAR,CAAa,oCAAb,CAArB;AACA,UAAMk7B,cAAc,GAAGvE,OAAO,CAAC32B,IAAR,CAAa,sCAAb,CAAvB;AAEA,UAAIm7B,SAAJ,CARsB,CAStB;;AACA,UAAI3rB,KAAK,CAAC4rB,OAAN,KAAkB7zB,SAAtB,EAAiC;AAC/B,YAAM8zB,UAAU,GAAGxoC,yBAAC,CAAC2c,KAAK,CAACI,MAAP,CAAD,CAAgBrJ,MAAhB,EAAnB;AACA40B,QAAAA,SAAS,GAAG;AACVtO,UAAAA,CAAC,EAAErd,KAAK,CAAC8rB,KAAN,GAAcD,UAAU,CAAC7jC,IADlB;AAEVo1B,UAAAA,CAAC,EAAEpd,KAAK,CAAC+rB,KAAN,GAAcF,UAAU,CAAC19B;AAFlB,SAAZ;AAID,OAND,MAMO;AACLw9B,QAAAA,SAAS,GAAG;AACVtO,UAAAA,CAAC,EAAErd,KAAK,CAAC4rB,OADC;AAEVxO,UAAAA,CAAC,EAAEpd,KAAK,CAACgsB;AAFC,SAAZ;AAID;;AAED,UAAMjT,GAAG,GAAG;AACVkT,QAAAA,CAAC,EAAE5nB,IAAI,CAAC6nB,IAAL,CAAUP,SAAS,CAACtO,CAAV,GAAckO,SAAxB,KAAsC,CAD/B;AAEVY,QAAAA,CAAC,EAAE9nB,IAAI,CAAC6nB,IAAL,CAAUP,SAAS,CAACvO,CAAV,GAAcmO,SAAxB,KAAsC;AAF/B,OAAZ;AAKAE,MAAAA,YAAY,CAACthB,GAAb,CAAiB;AAAEtf,QAAAA,KAAK,EAAEkuB,GAAG,CAACkT,CAAJ,GAAQ,IAAjB;AAAuBnoC,QAAAA,MAAM,EAAEi1B,GAAG,CAACoT,CAAJ,GAAQ;AAAvC,OAAjB;AACA5C,MAAAA,QAAQ,CAACjpB,IAAT,CAAc,OAAd,EAAuByY,GAAG,CAACkT,CAAJ,GAAQ,GAAR,GAAclT,GAAG,CAACoT,CAAzC;;AAEA,UAAIpT,GAAG,CAACkT,CAAJ,GAAQ,CAAR,IAAalT,GAAG,CAACkT,CAAJ,GAAQ,KAAKxkC,OAAL,CAAa+hC,kBAAb,CAAgCC,GAAzD,EAA8D;AAC5DiC,QAAAA,cAAc,CAACvhB,GAAf,CAAmB;AAAEtf,UAAAA,KAAK,EAAEkuB,GAAG,CAACkT,CAAJ,GAAQ,CAAR,GAAY;AAArB,SAAnB;AACD;;AAED,UAAIlT,GAAG,CAACoT,CAAJ,GAAQ,CAAR,IAAapT,GAAG,CAACoT,CAAJ,GAAQ,KAAK1kC,OAAL,CAAa+hC,kBAAb,CAAgC/Y,GAAzD,EAA8D;AAC5Dib,QAAAA,cAAc,CAACvhB,GAAf,CAAmB;AAAErmB,UAAAA,MAAM,EAAEi1B,GAAG,CAACoT,CAAJ,GAAQ,CAAR,GAAY;AAAtB,SAAnB;AACD;;AAEDX,MAAAA,iBAAiB,CAACnwB,IAAlB,CAAuB0d,GAAG,CAACkT,CAAJ,GAAQ,KAAR,GAAgBlT,GAAG,CAACoT,CAA3C;AACD;;;;;;;;;;;;;;AC96BH;;IACqBC;AACnB,mBAAY3hC,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAK43B,OAAL,GAAeh/B,yBAAC,CAACmI,MAAD,CAAhB;AACA,SAAK0C,SAAL,GAAiB7K,yBAAC,CAACkH,QAAD,CAAlB;AAEA,SAAKuT,EAAL,GAAUza,yCAAV;AACA,SAAKqa,KAAL,GAAajT,OAAO,CAACoT,UAAR,CAAmBoD,IAAhC;AACA,SAAK8U,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAKujB,QAAL,GAAgB13B,OAAO,CAACoT,UAAR,CAAmBukB,OAAnC;AACA,SAAK1X,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAKiiB,UAAL,GAAkB92B,OAAO,CAACoT,UAAR,CAAmB2jB,SAArC;AACA,SAAK/5B,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AAEA,SAAK4kC,WAAL,GAAmB,KAAnB;AACA,SAAKC,YAAL,GAAoB,KAAKA,YAAL,CAAkB3O,IAAlB,CAAuB,IAAvB,CAApB;AACD;;;;WAED,4BAAmB;AACjB,aAAO,CAAC,KAAKl2B,OAAL,CAAaqyB,OAArB;AACD;;;WAED,sBAAa;AAAA;;AACX,WAAKryB,OAAL,CAAa26B,OAAb,GAAuB,KAAK36B,OAAL,CAAa26B,OAAb,IAAwB,EAA/C;;AAEA,UAAI,CAAC,KAAK36B,OAAL,CAAa26B,OAAb,CAAqBhyB,MAA1B,EAAkC;AAChC,aAAK+xB,QAAL,CAAchkB,IAAd;AACD,OAFD,MAEO;AACL,aAAK1T,OAAL,CAAa+C,MAAb,CAAoB,eAApB,EAAqC,KAAK20B,QAA1C,EAAoD,KAAK16B,OAAL,CAAa26B,OAAjE;AACD;;AAED,UAAI,KAAK36B,OAAL,CAAa8kC,gBAAjB,EAAmC;AACjC,aAAKpK,QAAL,CAAc9X,QAAd,CAAuB,KAAK5iB,OAAL,CAAa8kC,gBAApC;AACD;;AAED,WAAKC,eAAL,CAAqB,KAArB;AAEA,WAAK9uB,KAAL,CAAWnB,EAAX,CAAc,uDAAd,EAAuE,YAAM;AAC3E,aAAI,CAAC9R,OAAL,CAAa+C,MAAb,CAAoB,4BAApB;AACD,OAFD;AAIA,WAAK/C,OAAL,CAAa+C,MAAb,CAAoB,4BAApB;;AACA,UAAI,KAAK/F,OAAL,CAAaglC,gBAAjB,EAAmC;AACjC,aAAKpK,OAAL,CAAa9lB,EAAb,CAAgB,eAAhB,EAAiC,KAAK+vB,YAAtC;AACD;AACF;;;WAED,mBAAU;AACR,WAAKnK,QAAL,CAAcpU,QAAd,GAAyBvoB,MAAzB;;AAEA,UAAI,KAAKiC,OAAL,CAAaglC,gBAAjB,EAAmC;AACjC,aAAKpK,OAAL,CAAa5lB,GAAb,CAAiB,eAAjB,EAAkC,KAAK6vB,YAAvC;AACD;AACF;;;WAED,wBAAe;AACb,UAAI,KAAKvW,OAAL,CAAavjB,QAAb,CAAsB,YAAtB,CAAJ,EAAyC;AACvC,eAAO,KAAP;AACD;;AAED,UAAMk6B,YAAY,GAAG,KAAK3W,OAAL,CAAa7Z,WAAb,EAArB;AACA,UAAMywB,WAAW,GAAG,KAAK5W,OAAL,CAAalrB,KAAb,EAApB;AACA,UAAM+hC,aAAa,GAAG,KAAKzK,QAAL,CAAcr+B,MAAd,EAAtB;AACA,UAAM+oC,eAAe,GAAG,KAAKtL,UAAL,CAAgBz9B,MAAhB,EAAxB,CARa,CAUb;;AACA,UAAIgpC,cAAc,GAAG,CAArB;;AACA,UAAI,KAAKrlC,OAAL,CAAaslC,cAAjB,EAAiC;AAC/BD,QAAAA,cAAc,GAAGzpC,yBAAC,CAAC,KAAKoE,OAAL,CAAaslC,cAAd,CAAD,CAA+B7wB,WAA/B,EAAjB;AACD;;AAED,UAAM8wB,aAAa,GAAG,KAAK9+B,SAAL,CAAeE,SAAf,EAAtB;AACA,UAAM6+B,eAAe,GAAG,KAAKlX,OAAL,CAAahf,MAAb,GAAsB5I,GAA9C;AACA,UAAM++B,kBAAkB,GAAGD,eAAe,GAAGP,YAA7C;AACA,UAAMS,cAAc,GAAGF,eAAe,GAAGH,cAAzC;AACA,UAAMM,sBAAsB,GAAGF,kBAAkB,GAAGJ,cAArB,GAAsCF,aAAtC,GAAsDC,eAArF;;AAEA,UAAI,CAAC,KAAKR,WAAN,IACDW,aAAa,GAAGG,cADf,IACmCH,aAAa,GAAGI,sBAAsB,GAAGR,aADhF,EACgG;AAC9F,aAAKP,WAAL,GAAmB,IAAnB;AACA,aAAK3hB,SAAL,CAAeP,GAAf,CAAmB;AACjBkjB,UAAAA,SAAS,EAAE,KAAKlL,QAAL,CAAcjmB,WAAd;AADM,SAAnB;AAGA,aAAKimB,QAAL,CAAchY,GAAd,CAAkB;AAChBhT,UAAAA,QAAQ,EAAE,OADM;AAEhBhJ,UAAAA,GAAG,EAAE2+B,cAFW;AAGhBjiC,UAAAA,KAAK,EAAE8hC,WAHS;AAIhBW,UAAAA,MAAM,EAAE;AAJQ,SAAlB;AAMD,OAZD,MAYO,IAAI,KAAKjB,WAAL,KACPW,aAAa,GAAGG,cAAjB,IAAqCH,aAAa,GAAGI,sBAD7C,CAAJ,EAC2E;AAChF,aAAKf,WAAL,GAAmB,KAAnB;AACA,aAAKlK,QAAL,CAAchY,GAAd,CAAkB;AAChBhT,UAAAA,QAAQ,EAAE,UADM;AAEhBhJ,UAAAA,GAAG,EAAE,CAFW;AAGhBtD,UAAAA,KAAK,EAAE,MAHS;AAIhByiC,UAAAA,MAAM,EAAE;AAJQ,SAAlB;AAMA,aAAK5iB,SAAL,CAAeP,GAAf,CAAmB;AACjBkjB,UAAAA,SAAS,EAAE;AADM,SAAnB;AAGD;AACF;;;WAED,yBAAgBzK,YAAhB,EAA8B;AAC5B,UAAIA,YAAJ,EAAkB;AAChB,aAAKT,QAAL,CAAc7D,SAAd,CAAwB,KAAKvI,OAA7B;AACD,OAFD,MAEO;AACL,YAAI,KAAKtuB,OAAL,CAAa8kC,gBAAjB,EAAmC;AACjC,eAAKpK,QAAL,CAAc9X,QAAd,CAAuB,KAAK5iB,OAAL,CAAa8kC,gBAApC;AACD;AACF;;AACD,UAAI,KAAK9kC,OAAL,CAAaglC,gBAAjB,EAAmC;AACjC,aAAKH,YAAL;AACD;AACF;;;WAED,0BAAiB1J,YAAjB,EAA+B;AAC7B,WAAK9kB,EAAL,CAAQwtB,eAAR,CAAwB,KAAKnJ,QAAL,CAAc3xB,IAAd,CAAmB,iBAAnB,CAAxB,EAA+DoyB,YAA/D;AAEA,WAAK4J,eAAL,CAAqB5J,YAArB;AACD;;;WAED,wBAAehE,UAAf,EAA2B;AACzB,WAAK9gB,EAAL,CAAQwtB,eAAR,CAAwB,KAAKnJ,QAAL,CAAc3xB,IAAd,CAAmB,eAAnB,CAAxB,EAA6DouB,UAA7D;;AACA,UAAIA,UAAJ,EAAgB;AACd,aAAKiB,UAAL;AACD,OAFD,MAEO;AACL,aAAKC,QAAL;AACD;AACF;;;WAED,kBAASyN,iBAAT,EAA4B;AAC1B,UAAIC,IAAI,GAAG,KAAKrL,QAAL,CAAc3xB,IAAd,CAAmB,QAAnB,CAAX;;AACA,UAAI,CAAC+8B,iBAAL,EAAwB;AACtBC,QAAAA,IAAI,GAAGA,IAAI,CAAC1gC,GAAL,CAAS,qBAAT,CAAP;AACD;;AACD,WAAKgR,EAAL,CAAQ2vB,SAAR,CAAkBD,IAAlB,EAAwB,IAAxB;AACD;;;WAED,oBAAWD,iBAAX,EAA8B;AAC5B,UAAIC,IAAI,GAAG,KAAKrL,QAAL,CAAc3xB,IAAd,CAAmB,QAAnB,CAAX;;AACA,UAAI,CAAC+8B,iBAAL,EAAwB;AACtBC,QAAAA,IAAI,GAAGA,IAAI,CAAC1gC,GAAL,CAAS,qBAAT,CAAP;AACD;;AACD,WAAKgR,EAAL,CAAQ2vB,SAAR,CAAkBD,IAAlB,EAAwB,KAAxB;AACD;;;;;;;;;;;;;;ACpJH;AACA;AACA;AACA;;IAEqBE;AACnB,sBAAYjjC,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKsqC,KAAL,GAAatqC,yBAAC,CAACkH,QAAQ,CAACkX,IAAV,CAAd;AACA,SAAKsU,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAKnX,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AAEArW,IAAAA,OAAO,CAACwG,IAAR,CAAa,sBAAb,EAAqC,KAAKxJ,OAAL,CAAaqZ,QAAb,CAAsBpZ,IAAtB,CAA2B,iBAA3B,CAArC;AACD;;;;WAED,sBAAa;AACX,UAAM8iC,UAAU,GAAG,KAAK/iC,OAAL,CAAammC,aAAb,GAA6B,KAAKD,KAAlC,GAA0C,KAAKlmC,OAAL,CAAa0S,SAA1E;AACA,UAAMsH,IAAI,GAAG,CACX,0CADW,8CAE2B,KAAKha,OAAL,CAAasG,EAFxC,0CAEuE,KAAKxK,IAAL,CAAUsC,IAAV,CAAeG,aAFtF,0DAG0B,KAAKyB,OAAL,CAAasG,EAHvC,4FAIX,QAJW,EAKX,0CALW,8CAM2B,KAAKtG,OAAL,CAAasG,EANxC,0CAMuE,KAAKxK,IAAL,CAAUsC,IAAV,CAAeN,GANtF,0DAO0B,KAAKkC,OAAL,CAAasG,EAPvC,6GAQX,QARW,EASX,CAAC,KAAKtG,OAAL,CAAaomC,iBAAd,GACIxqC,yBAAC,CAAC,aAAD,CAAD,CAAiBuwB,MAAjB,CAAwB,KAAK9V,EAAL,CAAQgwB,QAAR,CAAiB;AACzCxR,QAAAA,SAAS,EAAE,gCAD8B;AAEzC/hB,QAAAA,IAAI,EAAE,KAAKhX,IAAL,CAAUsC,IAAV,CAAeI,eAFoB;AAGzC8nC,QAAAA,OAAO,EAAE;AAHgC,OAAjB,EAIvBhH,MAJuB,EAAxB,EAIW1rB,IAJX,EADJ,GAMI,EAfO,EAgBXhY,yBAAC,CAAC,aAAD,CAAD,CAAiBuwB,MAAjB,CAAwB,KAAK9V,EAAL,CAAQgwB,QAAR,CAAiB;AACvCxR,QAAAA,SAAS,EAAE,0BAD4B;AAEvC/hB,QAAAA,IAAI,EAAE,KAAKhX,IAAL,CAAUsC,IAAV,CAAeK,WAFkB;AAGvC6nC,QAAAA,OAAO,EAAE;AAH8B,OAAjB,EAIrBhH,MAJqB,EAAxB,EAIa1rB,IAJb,EAhBW,EAqBXjM,IArBW,CAqBN,EArBM,CAAb;AAuBA,UAAM4+B,WAAW,GAAG,yDAApB;AACA,UAAMC,MAAM,uDAA2CD,WAA3C,wBAAkE,KAAKzqC,IAAL,CAAUsC,IAAV,CAAevB,MAAjF,iBAAZ;AAEA,WAAK4pC,OAAL,GAAe,KAAKpwB,EAAL,CAAQqwB,MAAR,CAAe;AAC5B7R,QAAAA,SAAS,EAAE,aADiB;AAE5BoL,QAAAA,KAAK,EAAE,KAAKnkC,IAAL,CAAUsC,IAAV,CAAevB,MAFM;AAG5B8pC,QAAAA,IAAI,EAAE,KAAK3mC,OAAL,CAAa4mC,WAHS;AAI5B5sB,QAAAA,IAAI,EAAEA,IAJsB;AAK5BwsB,QAAAA,MAAM,EAAEA;AALoB,OAAf,EAMZlH,MANY,GAMH1c,QANG,CAMMmgB,UANN,CAAf;AAOD;;;WAED,mBAAU;AACR,WAAK1sB,EAAL,CAAQwwB,UAAR,CAAmB,KAAKJ,OAAxB;AACA,WAAKA,OAAL,CAAa1oC,MAAb;AACD;;;WAED,sBAAa+oC,MAAb,EAAqBf,IAArB,EAA2B;AACzBe,MAAAA,MAAM,CAAChyB,EAAP,CAAU,UAAV,EAAsB,UAACyD,KAAD,EAAW;AAC/B,YAAIA,KAAK,CAACiI,OAAN,KAAkBxZ,cAAtB,EAAsC;AACpCuR,UAAAA,KAAK,CAACE,cAAN;AACAstB,UAAAA,IAAI,CAAC7tB,OAAL,CAAa,OAAb;AACD;AACF,OALD;AAMD;AAED;AACF;AACA;;;;WACE,uBAAc6uB,QAAd,EAAwBC,SAAxB,EAAmCC,QAAnC,EAA6C;AAC3C,WAAK5wB,EAAL,CAAQ2vB,SAAR,CAAkBe,QAAlB,EAA4BC,SAAS,CAACrzB,GAAV,MAAmBszB,QAAQ,CAACtzB,GAAT,EAA/C;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,wBAAe2c,QAAf,EAAyB;AAAA;;AACvB,aAAO10B,kCAAA,CAAW,UAACgmB,QAAD,EAAc;AAC9B,YAAMolB,SAAS,GAAG,KAAI,CAACP,OAAL,CAAa19B,IAAb,CAAkB,iBAAlB,CAAlB;;AACA,YAAMk+B,QAAQ,GAAG,KAAI,CAACR,OAAL,CAAa19B,IAAb,CAAkB,gBAAlB,CAAjB;;AACA,YAAMg+B,QAAQ,GAAG,KAAI,CAACN,OAAL,CAAa19B,IAAb,CAAkB,gBAAlB,CAAjB;;AACA,YAAMm+B,gBAAgB,GAAG,KAAI,CAACT,OAAL,CACtB19B,IADsB,CACjB,sDADiB,CAAzB;;AAEA,YAAMo+B,YAAY,GAAG,KAAI,CAACV,OAAL,CAClB19B,IADkB,CACb,gDADa,CAArB;;AAGA,aAAI,CAACsN,EAAL,CAAQ+wB,aAAR,CAAsB,KAAI,CAACX,OAA3B,EAAoC,YAAM;AACxC,eAAI,CAACzjC,OAAL,CAAa0U,YAAb,CAA0B,cAA1B,EADwC,CAGxC;;;AACA,cAAI,CAAC4Y,QAAQ,CAACxyB,GAAV,IAAiB+J,eAAA,CAAgByoB,QAAQ,CAACxd,IAAzB,CAArB,EAAqD;AACnDwd,YAAAA,QAAQ,CAACxyB,GAAT,GAAewyB,QAAQ,CAACxd,IAAxB;AACD;;AAEDk0B,UAAAA,SAAS,CAAClyB,EAAV,CAAa,4BAAb,EAA2C,YAAM;AAC/C;AACA;AACAwb,YAAAA,QAAQ,CAACxd,IAAT,GAAgBk0B,SAAS,CAACrzB,GAAV,EAAhB;;AACA,iBAAI,CAAC0zB,aAAL,CAAmBN,QAAnB,EAA6BC,SAA7B,EAAwCC,QAAxC;AACD,WALD,EAKGtzB,GALH,CAKO2c,QAAQ,CAACxd,IALhB;AAOAm0B,UAAAA,QAAQ,CAACnyB,EAAT,CAAY,4BAAZ,EAA0C,YAAM;AAC9C;AACA;AACA,gBAAI,CAACwb,QAAQ,CAACxd,IAAd,EAAoB;AAClBk0B,cAAAA,SAAS,CAACrzB,GAAV,CAAcszB,QAAQ,CAACtzB,GAAT,EAAd;AACD;;AACD,iBAAI,CAAC0zB,aAAL,CAAmBN,QAAnB,EAA6BC,SAA7B,EAAwCC,QAAxC;AACD,WAPD,EAOGtzB,GAPH,CAOO2c,QAAQ,CAACxyB,GAPhB;;AASA,cAAI,CAAC0M,kBAAL,EAAyB;AACvBy8B,YAAAA,QAAQ,CAAC/uB,OAAT,CAAiB,OAAjB;AACD;;AAED,eAAI,CAACmvB,aAAL,CAAmBN,QAAnB,EAA6BC,SAA7B,EAAwCC,QAAxC;;AACA,eAAI,CAACK,YAAL,CAAkBL,QAAlB,EAA4BF,QAA5B;;AACA,eAAI,CAACO,YAAL,CAAkBN,SAAlB,EAA6BD,QAA7B;;AAEA,cAAMQ,kBAAkB,GAAGjX,QAAQ,CAACG,WAAT,KAAyBngB,SAAzB,GACvBggB,QAAQ,CAACG,WADc,GACA,KAAI,CAACztB,OAAL,CAAahD,OAAb,CAAqB48B,eADhD;AAGAsK,UAAAA,gBAAgB,CAACM,IAAjB,CAAsB,SAAtB,EAAiCD,kBAAjC;AAEA,cAAME,kBAAkB,GAAGnX,QAAQ,CAACxyB,GAAT,GACvB,KADuB,GACf,KAAI,CAACkF,OAAL,CAAahD,OAAb,CAAqBvB,WADjC;AAGA0oC,UAAAA,YAAY,CAACK,IAAb,CAAkB,SAAlB,EAA6BC,kBAA7B;AAEAV,UAAAA,QAAQ,CAACvkB,GAAT,CAAa,OAAb,EAAsB,UAACjK,KAAD,EAAW;AAC/BA,YAAAA,KAAK,CAACE,cAAN;AAEAmJ,YAAAA,QAAQ,CAACI,OAAT,CAAiB;AACfa,cAAAA,KAAK,EAAEyN,QAAQ,CAACzN,KADD;AAEf/kB,cAAAA,GAAG,EAAEmpC,QAAQ,CAACtzB,GAAT,EAFU;AAGfb,cAAAA,IAAI,EAAEk0B,SAAS,CAACrzB,GAAV,EAHS;AAIf8c,cAAAA,WAAW,EAAEyW,gBAAgB,CAACpR,EAAjB,CAAoB,UAApB,CAJE;AAKfpF,cAAAA,aAAa,EAAEyW,YAAY,CAACrR,EAAb,CAAgB,UAAhB;AALA,aAAjB;;AAOA,iBAAI,CAACzf,EAAL,CAAQwwB,UAAR,CAAmB,KAAI,CAACJ,OAAxB;AACD,WAXD;AAYD,SAtDD;;AAwDA,aAAI,CAACpwB,EAAL,CAAQqxB,cAAR,CAAuB,KAAI,CAACjB,OAA5B,EAAqC,YAAM;AACzC;AACAO,UAAAA,SAAS,CAAChyB,GAAV;AACAiyB,UAAAA,QAAQ,CAACjyB,GAAT;AACA+xB,UAAAA,QAAQ,CAAC/xB,GAAT;;AAEA,cAAI4M,QAAQ,CAAC+lB,KAAT,OAAqB,SAAzB,EAAoC;AAClC/lB,YAAAA,QAAQ,CAACO,MAAT;AACD;AACF,SATD;;AAWA,aAAI,CAAC9L,EAAL,CAAQuxB,UAAR,CAAmB,KAAI,CAACnB,OAAxB;AACD,OA7EM,EA6EJpkB,OA7EI,EAAP;AA8ED;AAED;AACF;AACA;;;;WACE,gBAAO;AAAA;;AACL,UAAMiO,QAAQ,GAAG,KAAKttB,OAAL,CAAa+C,MAAb,CAAoB,oBAApB,CAAjB;AAEA,WAAK/C,OAAL,CAAa+C,MAAb,CAAoB,kBAApB;AACA,WAAK8hC,cAAL,CAAoBvX,QAApB,EAA8B0D,IAA9B,CAAmC,UAAC1D,QAAD,EAAc;AAC/C,cAAI,CAACttB,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;;AACA,cAAI,CAAC/C,OAAL,CAAa+C,MAAb,CAAoB,mBAApB,EAAyCuqB,QAAzC;AACD,OAHD,EAGGlrB,IAHH,CAGQ,YAAM;AACZ,cAAI,CAACpC,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;AACD,OALD;AAMD;;;;;;;;;;;;;;AChLH;AACA;AACA;;IAEqB+hC;AACnB,uBAAY9kC,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKoE,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAK2U,MAAL,GAAc;AACZ,iFAA2E,4EAAM;AAC/E,aAAI,CAAC6mB,MAAL;AACD,OAHW;AAIZ,oDAA8C,kDAAM;AAClD,aAAI,CAAC9kB,IAAL;AACD,OANW;AAOZ,yBAAmB,wBAAC6kB,EAAD,EAAKvc,CAAL,EAAW;AAC5B,YAAIA,CAAC,CAACoX,aAAF,IAAmBpX,CAAC,CAACoX,aAAF,CAAgB2R,aAAvC,EAAsD;AACpD,cAAI,CAAC,KAAI,CAACC,QAAL,CAAc,CAAd,EAAiB5+B,QAAjB,CAA0B4V,CAAC,CAACoX,aAAF,CAAgB2R,aAA1C,CAAL,EAA+D;AAC7D,iBAAI,CAACrxB,IAAL;AACD;AACF,SAJD,MAIO;AACL,eAAI,CAACA,IAAL;AACD;AACF;AAfW,KAAd;AAiBD;;;;WAED,4BAAmB;AACjB,aAAO,CAAC7W,aAAA,CAAc,KAAKG,OAAL,CAAaioC,OAAb,CAAqB7pC,IAAnC,CAAR;AACD;;;WAED,sBAAa;AACX,WAAK4pC,QAAL,GAAgB,KAAK3xB,EAAL,CAAQ4xB,OAAR,CAAgB;AAC9BpT,QAAAA,SAAS,EAAE,mBADmB;AAE9B7c,QAAAA,QAAQ,EAAE,kBAACvE,KAAD,EAAW;AACnB,cAAMy0B,QAAQ,GAAGz0B,KAAK,CAAC1K,IAAN,CAAW,wCAAX,CAAjB;AACAm/B,UAAAA,QAAQ,CAACtI,OAAT,CAAiB,4CAAjB;AACD;AAL6B,OAAhB,EAMbN,MANa,GAMJ1c,QANI,CAMK,KAAK5iB,OAAL,CAAa0S,SANlB,CAAhB;AAOA,UAAMw1B,QAAQ,GAAG,KAAKF,QAAL,CAAcj/B,IAAd,CAAmB,wCAAnB,CAAjB;AAEA,WAAK/F,OAAL,CAAa+C,MAAb,CAAoB,eAApB,EAAqCmiC,QAArC,EAA+C,KAAKloC,OAAL,CAAaioC,OAAb,CAAqB7pC,IAApE;AAEA,WAAK4pC,QAAL,CAAclzB,EAAd,CAAiB,WAAjB,EAA8B,UAACkK,CAAD,EAAO;AAAEA,QAAAA,CAAC,CAACvG,cAAF;AAAqB,OAA5D;AACD;;;WAED,mBAAU;AACR,WAAKuvB,QAAL,CAAcjqC,MAAd;AACD;;;WAED,kBAAS;AACP;AACA,UAAI,CAAC,KAAKiF,OAAL,CAAa+C,MAAb,CAAoB,iBAApB,CAAL,EAA6C;AAC3C,aAAK2Q,IAAL;AACA;AACD;;AAED,UAAMoH,GAAG,GAAG,KAAK9a,OAAL,CAAa+C,MAAb,CAAoB,qBAApB,CAAZ;;AACA,UAAI+X,GAAG,CAACV,WAAJ,MAAqBU,GAAG,CAAChC,UAAJ,EAAzB,EAA2C;AACzC,YAAMkJ,MAAM,GAAGjP,YAAA,CAAa+H,GAAG,CAACvC,EAAjB,EAAqBxF,YAArB,CAAf;AACA,YAAMoyB,IAAI,GAAGvsC,yBAAC,CAACopB,MAAD,CAAD,CAAUlN,IAAV,CAAe,MAAf,CAAb;AACA,aAAKkwB,QAAL,CAAcj/B,IAAd,CAAmB,GAAnB,EAAwB+O,IAAxB,CAA6B,MAA7B,EAAqCqwB,IAArC,EAA2Cr1B,IAA3C,CAAgDq1B,IAAhD;AAEA,YAAM3zB,GAAG,GAAGuB,sBAAA,CAAuBiP,MAAvB,CAAZ;AACA,YAAMojB,eAAe,GAAGxsC,yBAAC,CAAC,KAAKoE,OAAL,CAAa0S,SAAd,CAAD,CAA0BpD,MAA1B,EAAxB;AACAkF,QAAAA,GAAG,CAAC9N,GAAJ,IAAW0hC,eAAe,CAAC1hC,GAA3B;AACA8N,QAAAA,GAAG,CAACjU,IAAJ,IAAY6nC,eAAe,CAAC7nC,IAA5B;AAEA,aAAKynC,QAAL,CAActlB,GAAd,CAAkB;AAChBC,UAAAA,OAAO,EAAE,OADO;AAEhBpiB,UAAAA,IAAI,EAAEiU,GAAG,CAACjU,IAFM;AAGhBmG,UAAAA,GAAG,EAAE8N,GAAG,CAAC9N;AAHO,SAAlB;AAKD,OAfD,MAeO;AACL,aAAKgQ,IAAL;AACD;AACF;;;WAED,gBAAO;AACL,WAAKsxB,QAAL,CAActxB,IAAd;AACD;;;;;;;;;;;;;;AClFH;AACA;AACA;;IAEqB2xB;AACnB,uBAAYrlC,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKsqC,KAAL,GAAatqC,yBAAC,CAACkH,QAAQ,CAACkX,IAAV,CAAd;AACA,SAAKsU,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAKnX,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AACD;;;;WAED,sBAAa;AACX,UAAIivB,eAAe,GAAG,EAAtB;;AACA,UAAI,KAAKtoC,OAAL,CAAas0B,oBAAjB,EAAuC;AACrC,YAAM/E,IAAI,GAAG3S,IAAI,CAAC2rB,KAAL,CAAW3rB,IAAI,CAAC4rB,GAAL,CAAS,KAAKxoC,OAAL,CAAas0B,oBAAtB,IAA8C1X,IAAI,CAAC4rB,GAAL,CAAS,IAAT,CAAzD,CAAb;AACA,YAAMC,YAAY,GAAG,CAAC,KAAKzoC,OAAL,CAAas0B,oBAAb,GAAoC1X,IAAI,CAAC8rB,GAAL,CAAS,IAAT,EAAenZ,IAAf,CAArC,EAA2DxK,OAA3D,CAAmE,CAAnE,IAAwE,CAAxE,GACF,GADE,GACI,SAASwK,IAAT,CADJ,GACqB,GAD1C;AAEA+Y,QAAAA,eAAe,oBAAa,KAAKxsC,IAAL,CAAUc,KAAV,CAAgBgB,eAAhB,GAAkC,KAAlC,GAA0C6qC,YAAvD,aAAf;AACD;;AAED,UAAM1F,UAAU,GAAG,KAAK/iC,OAAL,CAAammC,aAAb,GAA6B,KAAKD,KAAlC,GAA0C,KAAKlmC,OAAL,CAAa0S,SAA1E;AACA,UAAMsH,IAAI,GAAG,CACX,uEADW,EAET,wCAAwC,KAAKha,OAAL,CAAasG,EAArD,GAA0D,4BAA1D,GAAyF,KAAKxK,IAAL,CAAUc,KAAV,CAAgBe,eAAzG,GAA2H,UAFlH,EAGT,uCAAuC,KAAKqC,OAAL,CAAasG,EAApD,GAAyD,4EAHhD,EAIT,uCAAqC,KAAKtG,OAAL,CAAa2oC,oBAAlD,GAAuE,yBAJ9D,EAKTL,eALS,EAMX,QANW,EAOX,+CAPW,EAQT,uCAAuC,KAAKtoC,OAAL,CAAasG,EAApD,GAAyD,4BAAzD,GAAwF,KAAKxK,IAAL,CAAUc,KAAV,CAAgBkB,GAAxG,GAA8G,UARrG,EAST,sCAAsC,KAAKkC,OAAL,CAAasG,EAAnD,GAAwD,kFAT/C,EAUX,QAVW,EAWXqB,IAXW,CAWN,EAXM,CAAb;AAYA,UAAM4+B,WAAW,GAAG,0DAApB;AACA,UAAMC,MAAM,uDAA2CD,WAA3C,wBAAkE,KAAKzqC,IAAL,CAAUc,KAAV,CAAgBC,MAAlF,iBAAZ;AAEA,WAAK4pC,OAAL,GAAe,KAAKpwB,EAAL,CAAQqwB,MAAR,CAAe;AAC5BzG,QAAAA,KAAK,EAAE,KAAKnkC,IAAL,CAAUc,KAAV,CAAgBC,MADK;AAE5B8pC,QAAAA,IAAI,EAAE,KAAK3mC,OAAL,CAAa4mC,WAFS;AAG5B5sB,QAAAA,IAAI,EAAEA,IAHsB;AAI5BwsB,QAAAA,MAAM,EAAEA;AAJoB,OAAf,EAKZlH,MALY,GAKH1c,QALG,CAKMmgB,UALN,CAAf;AAMD;;;WAED,mBAAU;AACR,WAAK1sB,EAAL,CAAQwwB,UAAR,CAAmB,KAAKJ,OAAxB;AACA,WAAKA,OAAL,CAAa1oC,MAAb;AACD;;;WAED,sBAAa+oC,MAAb,EAAqBf,IAArB,EAA2B;AACzBe,MAAAA,MAAM,CAAChyB,EAAP,CAAU,UAAV,EAAsB,UAACyD,KAAD,EAAW;AAC/B,YAAIA,KAAK,CAACiI,OAAN,KAAkBxZ,cAAtB,EAAsC;AACpCuR,UAAAA,KAAK,CAACE,cAAN;AACAstB,UAAAA,IAAI,CAAC7tB,OAAL,CAAa,OAAb;AACD;AACF,OALD;AAMD;;;WAED,gBAAO;AAAA;;AACL,WAAKlV,OAAL,CAAa+C,MAAb,CAAoB,kBAApB;AACA,WAAK6iC,eAAL,GAAuB5U,IAAvB,CAA4B,UAACnb,IAAD,EAAU;AACpC;AACA,aAAI,CAACxC,EAAL,CAAQwwB,UAAR,CAAmB,KAAI,CAACJ,OAAxB;;AACA,aAAI,CAACzjC,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;;AAEA,YAAI,OAAO8S,IAAP,KAAgB,QAApB,EAA8B;AAAE;AAC9B;AACA,cAAI,KAAI,CAAC7Y,OAAL,CAAaiY,SAAb,CAAuB4wB,iBAA3B,EAA8C;AAC5C,iBAAI,CAAC7lC,OAAL,CAAa0U,YAAb,CAA0B,mBAA1B,EAA+CmB,IAA/C;AACD,WAFD,MAEO;AACL,iBAAI,CAAC7V,OAAL,CAAa+C,MAAb,CAAoB,oBAApB,EAA0C8S,IAA1C;AACD;AACF,SAPD,MAOO;AAAE;AACP,eAAI,CAAC7V,OAAL,CAAa+C,MAAb,CAAoB,+BAApB,EAAqD8S,IAArD;AACD;AACF,OAfD,EAeGzT,IAfH,CAeQ,YAAM;AACZ,aAAI,CAACpC,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;AACD,OAjBD;AAkBD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,2BAAkB;AAAA;;AAChB,aAAOnK,kCAAA,CAAW,UAACgmB,QAAD,EAAc;AAC9B,YAAMknB,WAAW,GAAG,MAAI,CAACrC,OAAL,CAAa19B,IAAb,CAAkB,mBAAlB,CAApB;;AACA,YAAMggC,SAAS,GAAG,MAAI,CAACtC,OAAL,CAAa19B,IAAb,CAAkB,iBAAlB,CAAlB;;AACA,YAAMigC,SAAS,GAAG,MAAI,CAACvC,OAAL,CAAa19B,IAAb,CAAkB,iBAAlB,CAAlB;;AAEA,cAAI,CAACsN,EAAL,CAAQ+wB,aAAR,CAAsB,MAAI,CAACX,OAA3B,EAAoC,YAAM;AACxC,gBAAI,CAACzjC,OAAL,CAAa0U,YAAb,CAA0B,cAA1B,EADwC,CAGxC;;;AACAoxB,UAAAA,WAAW,CAACG,WAAZ,CAAwBH,WAAW,CAAC32B,KAAZ,GAAoB2C,EAApB,CAAuB,QAAvB,EAAiC,UAACyD,KAAD,EAAW;AAClEqJ,YAAAA,QAAQ,CAACI,OAAT,CAAiBzJ,KAAK,CAACI,MAAN,CAAayb,KAAb,IAAsB7b,KAAK,CAACI,MAAN,CAAanF,KAApD;AACD,WAFuB,EAErBG,GAFqB,CAEjB,EAFiB,CAAxB;AAIAo1B,UAAAA,SAAS,CAACj0B,EAAV,CAAa,4BAAb,EAA2C,YAAM;AAC/C,kBAAI,CAACuB,EAAL,CAAQ2vB,SAAR,CAAkBgD,SAAlB,EAA6BD,SAAS,CAACp1B,GAAV,EAA7B;AACD,WAFD,EAEGA,GAFH,CAEO,EAFP;;AAIA,cAAI,CAACnJ,kBAAL,EAAyB;AACvBu+B,YAAAA,SAAS,CAAC7wB,OAAV,CAAkB,OAAlB;AACD;;AAED8wB,UAAAA,SAAS,CAACtK,KAAV,CAAgB,UAACnmB,KAAD,EAAW;AACzBA,YAAAA,KAAK,CAACE,cAAN;AACAmJ,YAAAA,QAAQ,CAACI,OAAT,CAAiB+mB,SAAS,CAACp1B,GAAV,EAAjB;AACD,WAHD;;AAKA,gBAAI,CAAC2zB,YAAL,CAAkByB,SAAlB,EAA6BC,SAA7B;AACD,SAtBD;;AAwBA,cAAI,CAAC3yB,EAAL,CAAQqxB,cAAR,CAAuB,MAAI,CAACjB,OAA5B,EAAqC,YAAM;AACzCqC,UAAAA,WAAW,CAAC9zB,GAAZ;AACA+zB,UAAAA,SAAS,CAAC/zB,GAAV;AACAg0B,UAAAA,SAAS,CAACh0B,GAAV;;AAEA,cAAI4M,QAAQ,CAAC+lB,KAAT,OAAqB,SAAzB,EAAoC;AAClC/lB,YAAAA,QAAQ,CAACO,MAAT;AACD;AACF,SARD;;AAUA,cAAI,CAAC9L,EAAL,CAAQuxB,UAAR,CAAmB,MAAI,CAACnB,OAAxB;AACD,OAxCM,CAAP;AAyCD;;;;;;;;;;;;;;ACnIH;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;IACqByC;AACnB,wBAAYlmC,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKqT,EAAL,GAAUza,yCAAV;AAEA,SAAKic,QAAL,GAAgB7U,OAAO,CAACoT,UAAR,CAAmByB,QAAnB,CAA4B,CAA5B,CAAhB;AACA,SAAK7X,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AAEA,SAAK2U,MAAL,GAAc;AACZ,oDAA8C,kDAAM;AAClD,aAAI,CAAC+B,IAAL;AACD,OAHW;AAIZ,yBAAmB,wBAAC6kB,EAAD,EAAKvc,CAAL,EAAW;AAC5B,YAAIA,CAAC,CAACoX,aAAF,IAAmBpX,CAAC,CAACoX,aAAF,CAAgB2R,aAAvC,EAAsD;AACpD,cAAI,CAAC,KAAI,CAACC,QAAL,CAAc,CAAd,EAAiB5+B,QAAjB,CAA0B4V,CAAC,CAACoX,aAAF,CAAgB2R,aAA1C,CAAL,EAA+D;AAC7D,iBAAI,CAACrxB,IAAL;AACD;AACF,SAJD,MAIO;AACL,eAAI,CAACA,IAAL;AACD;AACF;AAZW,KAAd;AAcD;;;;WAED,4BAAmB;AACjB,aAAO,CAAC7W,aAAA,CAAc,KAAKG,OAAL,CAAaioC,OAAb,CAAqBrrC,KAAnC,CAAR;AACD;;;WAED,sBAAa;AACX,WAAKorC,QAAL,GAAgB,KAAK3xB,EAAL,CAAQ4xB,OAAR,CAAgB;AAC9BpT,QAAAA,SAAS,EAAE;AADmB,OAAhB,EAEbyK,MAFa,GAEJ1c,QAFI,CAEK,KAAK5iB,OAAL,CAAa0S,SAFlB,CAAhB;AAGA,UAAMw1B,QAAQ,GAAG,KAAKF,QAAL,CAAcj/B,IAAd,CAAmB,wCAAnB,CAAjB;AACA,WAAK/F,OAAL,CAAa+C,MAAb,CAAoB,eAApB,EAAqCmiC,QAArC,EAA+C,KAAKloC,OAAL,CAAaioC,OAAb,CAAqBrrC,KAApE;AAEA,WAAKorC,QAAL,CAAclzB,EAAd,CAAiB,WAAjB,EAA8B,UAACkK,CAAD,EAAO;AAAEA,QAAAA,CAAC,CAACvG,cAAF;AAAqB,OAA5D;AACD;;;WAED,mBAAU;AACR,WAAKuvB,QAAL,CAAcjqC,MAAd;AACD;;;WAED,gBAAO4a,MAAP,EAAeJ,KAAf,EAAsB;AACpB,UAAIxC,SAAA,CAAU4C,MAAV,CAAJ,EAAuB;AACrB,YAAMjJ,QAAQ,GAAG9T,yBAAC,CAAC+c,MAAD,CAAD,CAAUrJ,MAAV,EAAjB;AACA,YAAM84B,eAAe,GAAGxsC,yBAAC,CAAC,KAAKoE,OAAL,CAAa0S,SAAd,CAAD,CAA0BpD,MAA1B,EAAxB;AACA,YAAIkF,GAAG,GAAG,EAAV;;AACA,YAAI,KAAKxU,OAAL,CAAampC,UAAjB,EAA6B;AAC3B30B,UAAAA,GAAG,CAACjU,IAAJ,GAAWgY,KAAK,CAAC8rB,KAAN,GAAc,EAAzB;AACA7vB,UAAAA,GAAG,CAAC9N,GAAJ,GAAU6R,KAAK,CAAC+rB,KAAhB;AACD,SAHD,MAGO;AACL9vB,UAAAA,GAAG,GAAG9E,QAAN;AACD;;AACD8E,QAAAA,GAAG,CAAC9N,GAAJ,IAAW0hC,eAAe,CAAC1hC,GAA3B;AACA8N,QAAAA,GAAG,CAACjU,IAAJ,IAAY6nC,eAAe,CAAC7nC,IAA5B;AAEA,aAAKynC,QAAL,CAActlB,GAAd,CAAkB;AAChBC,UAAAA,OAAO,EAAE,OADO;AAEhBpiB,UAAAA,IAAI,EAAEiU,GAAG,CAACjU,IAFM;AAGhBmG,UAAAA,GAAG,EAAE8N,GAAG,CAAC9N;AAHO,SAAlB;AAKD,OAlBD,MAkBO;AACL,aAAKgQ,IAAL;AACD;AACF;;;WAED,gBAAO;AACL,WAAKsxB,QAAL,CAActxB,IAAd;AACD;;;;;;;;;;;;;;AC7EH;AACA;AACA;AACA;;IAEqB0yB;AACnB,wBAAYpmC,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKoE,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAK2U,MAAL,GAAc;AACZ,8BAAwB,6BAAC4mB,EAAD,EAAKvc,CAAL,EAAW;AACjC,aAAI,CAACwc,MAAL,CAAYxc,CAAC,CAACrG,MAAd;AACD,OAHW;AAIZ,8DAAwD,2DAAM;AAC5D,aAAI,CAAC6iB,MAAL;AACD,OANW;AAOZ,oDAA8C,kDAAM;AAClD,aAAI,CAAC9kB,IAAL;AACD,OATW;AAUZ,yBAAmB,wBAAC6kB,EAAD,EAAKvc,CAAL,EAAW;AAC5B,YAAIA,CAAC,CAACoX,aAAF,IAAmBpX,CAAC,CAACoX,aAAF,CAAgB2R,aAAvC,EAAsD;AACpD,cAAI,CAAC,KAAI,CAACC,QAAL,CAAc,CAAd,EAAiB5+B,QAAjB,CAA0B4V,CAAC,CAACoX,aAAF,CAAgB2R,aAA1C,CAAL,EAA+D;AAC7D,iBAAI,CAACrxB,IAAL;AACD;AACF,SAJD,MAIO;AACL,eAAI,CAACA,IAAL;AACD;AACF;AAlBW,KAAd;AAoBD;;;;WAED,4BAAmB;AACjB,aAAO,CAAC7W,aAAA,CAAc,KAAKG,OAAL,CAAaioC,OAAb,CAAqBvpC,KAAnC,CAAR;AACD;;;WAED,sBAAa;AACX,WAAKspC,QAAL,GAAgB,KAAK3xB,EAAL,CAAQ4xB,OAAR,CAAgB;AAC9BpT,QAAAA,SAAS,EAAE;AADmB,OAAhB,EAEbyK,MAFa,GAEJ1c,QAFI,CAEK,KAAK5iB,OAAL,CAAa0S,SAFlB,CAAhB;AAGA,UAAMw1B,QAAQ,GAAG,KAAKF,QAAL,CAAcj/B,IAAd,CAAmB,wCAAnB,CAAjB;AAEA,WAAK/F,OAAL,CAAa+C,MAAb,CAAoB,eAApB,EAAqCmiC,QAArC,EAA+C,KAAKloC,OAAL,CAAaioC,OAAb,CAAqBvpC,KAApE,EANW,CAQX;;AACA,UAAI8L,QAAJ,EAAc;AACZ1H,QAAAA,QAAQ,CAACqsB,WAAT,CAAqB,0BAArB,EAAiD,KAAjD,EAAwD,KAAxD;AACD;;AAED,WAAK6Y,QAAL,CAAclzB,EAAd,CAAiB,WAAjB,EAA8B,UAACkK,CAAD,EAAO;AAAEA,QAAAA,CAAC,CAACvG,cAAF;AAAqB,OAA5D;AACD;;;WAED,mBAAU;AACR,WAAKuvB,QAAL,CAAcjqC,MAAd;AACD;;;WAED,gBAAO4a,MAAP,EAAe;AACb,UAAI,KAAK3V,OAAL,CAAa+T,UAAb,EAAJ,EAA+B;AAC7B,eAAO,KAAP;AACD;;AAED,UAAM5K,MAAM,GAAG4J,UAAA,CAAW4C,MAAX,KAAsB5C,UAAA,CAAW4C,MAAX,aAAWA,MAAX,uBAAWA,MAAM,CAAEmB,aAAnB,CAArC;;AAEA,UAAI3N,MAAJ,EAAY;AACV,YAAMqI,GAAG,GAAGuB,sBAAA,CAAuB4C,MAAvB,CAAZ;AACA,YAAMyvB,eAAe,GAAGxsC,yBAAC,CAAC,KAAKoE,OAAL,CAAa0S,SAAd,CAAD,CAA0BpD,MAA1B,EAAxB;AACAkF,QAAAA,GAAG,CAAC9N,GAAJ,IAAW0hC,eAAe,CAAC1hC,GAA3B;AACA8N,QAAAA,GAAG,CAACjU,IAAJ,IAAY6nC,eAAe,CAAC7nC,IAA5B;AAEA,aAAKynC,QAAL,CAActlB,GAAd,CAAkB;AAChBC,UAAAA,OAAO,EAAE,OADO;AAEhBpiB,UAAAA,IAAI,EAAEiU,GAAG,CAACjU,IAFM;AAGhBmG,UAAAA,GAAG,EAAE8N,GAAG,CAAC9N;AAHO,SAAlB;AAKD,OAXD,MAWO;AACL,aAAKgQ,IAAL;AACD;;AAED,aAAOvK,MAAP;AACD;;;WAED,gBAAO;AACL,WAAK67B,QAAL,CAActxB,IAAd;AACD;;;;;;;;;;;;;;ACpFH;AACA;AACA;;IAEqB2yB;AACnB,uBAAYrmC,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKsqC,KAAL,GAAatqC,yBAAC,CAACkH,QAAQ,CAACkX,IAAV,CAAd;AACA,SAAKsU,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAKnX,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AACD;;;;WAED,sBAAa;AACX,UAAM0pB,UAAU,GAAG,KAAK/iC,OAAL,CAAammC,aAAb,GAA6B,KAAKD,KAAlC,GAA0C,KAAKlmC,OAAL,CAAa0S,SAA1E;AACA,UAAMsH,IAAI,GAAG,CACX,oDADW,+CAE4B,KAAKha,OAAL,CAAasG,EAFzC,0CAEwE,KAAKxK,IAAL,CAAUmC,KAAV,CAAgBH,GAFxF,0CAEyH,KAAKhC,IAAL,CAAUmC,KAAV,CAAgBE,SAFzI,mEAG2B,KAAK6B,OAAL,CAAasG,EAHxC,4FAIX,QAJW,EAKXqB,IALW,CAKN,EALM,CAAb;AAMA,UAAM4+B,WAAW,GAAG,0DAApB;AACA,UAAMC,MAAM,uDAA2CD,WAA3C,wBAAkE,KAAKzqC,IAAL,CAAUmC,KAAV,CAAgBpB,MAAlF,iBAAZ;AAEA,WAAK4pC,OAAL,GAAe,KAAKpwB,EAAL,CAAQqwB,MAAR,CAAe;AAC5BzG,QAAAA,KAAK,EAAE,KAAKnkC,IAAL,CAAUmC,KAAV,CAAgBpB,MADK;AAE5B8pC,QAAAA,IAAI,EAAE,KAAK3mC,OAAL,CAAa4mC,WAFS;AAG5B5sB,QAAAA,IAAI,EAAEA,IAHsB;AAI5BwsB,QAAAA,MAAM,EAAEA;AAJoB,OAAf,EAKZlH,MALY,GAKH1c,QALG,CAKMmgB,UALN,CAAf;AAMD;;;WAED,mBAAU;AACR,WAAK1sB,EAAL,CAAQwwB,UAAR,CAAmB,KAAKJ,OAAxB;AACA,WAAKA,OAAL,CAAa1oC,MAAb;AACD;;;WAED,sBAAa+oC,MAAb,EAAqBf,IAArB,EAA2B;AACzBe,MAAAA,MAAM,CAAChyB,EAAP,CAAU,UAAV,EAAsB,UAACyD,KAAD,EAAW;AAC/B,YAAIA,KAAK,CAACiI,OAAN,KAAkBxZ,cAAtB,EAAsC;AACpCuR,UAAAA,KAAK,CAACE,cAAN;AACAstB,UAAAA,IAAI,CAAC7tB,OAAL,CAAa,OAAb;AACD;AACF,OALD;AAMD;;;WAED,yBAAgBpa,GAAhB,EAAqB;AACnB;AACA,UAAMwrC,QAAQ,GAAG,4HAAjB;AACA,UAAMC,gBAAgB,GAAG,qCAAzB;AACA,UAAMC,OAAO,GAAG1rC,GAAG,CAACkW,KAAJ,CAAUs1B,QAAV,CAAhB;AAEA,UAAMG,QAAQ,GAAG,iEAAjB;AACA,UAAMC,OAAO,GAAG5rC,GAAG,CAACkW,KAAJ,CAAUy1B,QAAV,CAAhB;AAEA,UAAME,QAAQ,GAAG,oDAAjB;AACA,UAAMC,OAAO,GAAG9rC,GAAG,CAACkW,KAAJ,CAAU21B,QAAV,CAAhB;AAEA,UAAME,OAAO,GAAG,iCAAhB;AACA,UAAMC,MAAM,GAAGhsC,GAAG,CAACkW,KAAJ,CAAU61B,OAAV,CAAf;AAEA,UAAME,SAAS,GAAG,mDAAlB;AACA,UAAMC,QAAQ,GAAGlsC,GAAG,CAACkW,KAAJ,CAAU+1B,SAAV,CAAjB;AAEA,UAAME,QAAQ,GAAG,gEAAjB;AACA,UAAMC,OAAO,GAAGpsC,GAAG,CAACkW,KAAJ,CAAUi2B,QAAV,CAAhB;AAEA,UAAME,WAAW,GAAG,6CAApB;AACA,UAAMC,UAAU,GAAGtsC,GAAG,CAACkW,KAAJ,CAAUm2B,WAAV,CAAnB;AAEA,UAAME,cAAc,GAAE,iIAAtB;AACA,UAAMC,aAAa,GAAGxsC,GAAG,CAACkW,KAAJ,CAAUq2B,cAAV,CAAtB;AAEA,UAAME,QAAQ,GAAG,2BAAjB;AACA,UAAMC,OAAO,GAAG1sC,GAAG,CAACkW,KAAJ,CAAUu2B,QAAV,CAAhB;AAEA,UAAME,SAAS,GAAG,2DAAlB;AACA,UAAMC,QAAQ,GAAG5sC,GAAG,CAACkW,KAAJ,CAAUy2B,SAAV,CAAjB;AAEA,UAAME,SAAS,GAAG,gBAAlB;AACA,UAAMC,QAAQ,GAAG9sC,GAAG,CAACkW,KAAJ,CAAU22B,SAAV,CAAjB;AAEA,UAAME,SAAS,GAAG,gBAAlB;AACA,UAAMC,QAAQ,GAAGhtC,GAAG,CAACkW,KAAJ,CAAU62B,SAAV,CAAjB;AAEA,UAAME,UAAU,GAAG,aAAnB;AACA,UAAMC,SAAS,GAAGltC,GAAG,CAACkW,KAAJ,CAAU+2B,UAAV,CAAlB;AAEA,UAAME,QAAQ,GAAG,yDAAjB;AACA,UAAMC,OAAO,GAAGptC,GAAG,CAACkW,KAAJ,CAAUi3B,QAAV,CAAhB;AAEA,UAAIE,MAAJ;;AACA,UAAI3B,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAP,CAAW7gC,MAAX,KAAsB,EAArC,EAAyC;AACvC,YAAMyiC,SAAS,GAAG5B,OAAO,CAAC,CAAD,CAAzB;AACA,YAAI6B,KAAK,GAAG,CAAZ;;AACA,YAAI,OAAO7B,OAAO,CAAC,CAAD,CAAd,KAAsB,WAA1B,EAAuC;AACrC,cAAM8B,eAAe,GAAG9B,OAAO,CAAC,CAAD,CAAP,CAAWx1B,KAAX,CAAiBu1B,gBAAjB,CAAxB;;AACA,cAAI+B,eAAJ,EAAqB;AACnB,iBAAK,IAAIt9B,CAAC,GAAG,CAAC,IAAD,EAAO,EAAP,EAAW,CAAX,CAAR,EAAuB4D,CAAC,GAAG,CAA3B,EAA8B8yB,CAAC,GAAG12B,CAAC,CAACrF,MAAzC,EAAiDiJ,CAAC,GAAG8yB,CAArD,EAAwD9yB,CAAC,EAAzD,EAA6D;AAC3Dy5B,cAAAA,KAAK,IAAK,OAAOC,eAAe,CAAC15B,CAAC,GAAG,CAAL,CAAtB,KAAkC,WAAlC,GAAgD5D,CAAC,CAAC4D,CAAD,CAAD,GAAOsS,QAAQ,CAAConB,eAAe,CAAC15B,CAAC,GAAG,CAAL,CAAhB,EAAyB,EAAzB,CAA/D,GAA8F,CAAxG;AACD;AACF;AACF;;AACDu5B,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,UAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEM,6BAA6BszB,SAA7B,IAA0CC,KAAK,GAAG,CAAR,GAAY,YAAYA,KAAxB,GAAgC,EAA1E,CAFN,EAGNvzB,IAHM,CAGD,OAHC,EAGQ,KAHR,EAGeA,IAHf,CAGoB,QAHpB,EAG8B,KAH9B,CAAT;AAID,OAfD,MAeO,IAAI4xB,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAP,CAAW/gC,MAA1B,EAAkC;AACvCwiC,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,UAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEM,qCAAqC4xB,OAAO,CAAC,CAAD,CAA5C,GAAkD,UAFxD,EAGN5xB,IAHM,CAGD,OAHC,EAGQ,KAHR,EAGeA,IAHf,CAGoB,QAHpB,EAG8B,KAH9B,CAAT;AAID,OALM,MAKA,IAAI8xB,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAP,CAAWjhC,MAA1B,EAAkC;AACvCwiC,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,UAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEM,6BAA6B8xB,OAAO,CAAC,CAAD,CAApC,GAA0C,SAFhD,EAGN9xB,IAHM,CAGD,OAHC,EAGQ,KAHR,EAGeA,IAHf,CAGoB,QAHpB,EAG8B,KAH9B,EAINA,IAJM,CAID,WAJC,EAIY,IAJZ,EAKNA,IALM,CAKD,mBALC,EAKoB,MALpB,CAAT;AAMD,OAPM,MAOA,IAAIgyB,MAAM,IAAIA,MAAM,CAAC,CAAD,CAAN,CAAUnhC,MAAxB,EAAgC;AACrCwiC,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,UAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEMgyB,MAAM,CAAC,CAAD,CAAN,GAAY,eAFlB,EAGNhyB,IAHM,CAGD,OAHC,EAGQ,KAHR,EAGeA,IAHf,CAGoB,QAHpB,EAG8B,KAH9B,EAINA,IAJM,CAID,OAJC,EAIQ,YAJR,CAAT;AAKD,OANM,MAMA,IAAIkyB,QAAQ,IAAIA,QAAQ,CAAC,CAAD,CAAR,CAAYrhC,MAA5B,EAAoC;AACzCwiC,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,mEAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEM,8BAA8BkyB,QAAQ,CAAC,CAAD,CAF5C,EAGNlyB,IAHM,CAGD,OAHC,EAGQ,KAHR,EAGeA,IAHf,CAGoB,QAHpB,EAG8B,KAH9B,CAAT;AAID,OALM,MAKA,IAAIoyB,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAP,CAAWvhC,MAA1B,EAAkC;AACvCwiC,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,UAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEM,uCAAuCoyB,OAAO,CAAC,CAAD,CAFpD,EAGNpyB,IAHM,CAGD,OAHC,EAGQ,KAHR,EAGeA,IAHf,CAGoB,QAHpB,EAG8B,KAH9B,CAAT;AAID,OALM,MAKA,IAAIsyB,UAAU,IAAIA,UAAU,CAAC,CAAD,CAAV,CAAczhC,MAAhC,EAAwC;AAC7CwiC,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,mEAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,QAFC,EAES,KAFT,EAGNA,IAHM,CAGD,OAHC,EAGQ,KAHR,EAINA,IAJM,CAID,KAJC,EAIM,8BAA8BsyB,UAAU,CAAC,CAAD,CAJ9C,CAAT;AAKD,OANM,MAMA,IAAIE,aAAa,IAAIA,aAAa,CAAC,CAAD,CAAb,CAAiB3hC,MAAtC,EAA6C;AAClD,YAAI4iC,KAAK,GAAG,CAAZ;AACA,YAAIjB,aAAa,CAAC,CAAD,CAAb,KAAqB,WAAzB,EAAsCiB,KAAK,GAAGjB,aAAa,CAAC,CAAD,CAArB;AACtC,YAAIkB,GAAG,GAAE,CAAT;AACA,YAAIlB,aAAa,CAAC,CAAD,CAAb,KAAqB,WAAzB,EAAsCkB,GAAG,GAAGlB,aAAa,CAAC,CAAD,CAAnB;AACtC,YAAImB,IAAI,GAAG,CAAX;AACA,YAAInB,aAAa,CAAC,CAAD,CAAb,KAAqB,WAAzB,EAAsCmB,IAAI,GAAGnB,aAAa,CAAC,CAAD,CAApB;AACtC,YAAIoB,QAAQ,GAAG,CAAf;AACA,YAAIpB,aAAa,CAAC,CAAD,CAAb,KAAqB,WAAzB,EAAsCoB,QAAQ,GAAGpB,aAAa,CAAC,CAAD,CAAxB;AACtC,YAAIqB,KAAK,GAAG,CAAZ;AACA,YAAIrB,aAAa,CAAC,CAAD,CAAb,KAAqB,WAAzB,EAAsCqB,KAAK,GAAGrB,aAAa,CAAC,CAAD,CAArB;AACtCa,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,iFAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEM,OAAMwyB,aAAa,CAAC,CAAD,CAAnB,GAAwB,gBAAxB,GAA2CA,aAAa,CAAC,CAAD,CAAxD,GAA4D,QAA5D,GAAqEmB,IAArE,GACd,YADc,GACDC,QADC,GACQ,SADR,GACkBC,KADlB,IAC0BJ,KAAK,GAAG,CAAR,GAAY,YAAYA,KAAxB,GAAgC,EAD1D,KAC+DC,GAAG,GAAG,CAAN,GAAU,UAAUH,KAApB,GAA4B,EAD3F,CAFN,EAINvzB,IAJM,CAID,OAJC,EAIQ,KAJR,EAKNA,IALM,CAKD,QALC,EAKS,KALT,CAAT;AAMD,OAjBM,MAiBD,IAAK0yB,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAP,CAAW7hC,MAAvB,IAAmC+hC,QAAQ,IAAIA,QAAQ,CAAC,CAAD,CAAR,CAAY/hC,MAA/D,EAAwE;AAC5E,YAAMijC,GAAG,GAAKpB,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAP,CAAW7hC,MAAvB,GAAiC6hC,OAAO,CAAC,CAAD,CAAxC,GAA8CE,QAAQ,CAAC,CAAD,CAAnE;AACAS,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,mEAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,QAFC,EAES,KAFT,EAGNA,IAHM,CAGD,OAHC,EAGQ,KAHR,EAINA,IAJM,CAID,KAJC,EAIM,iDAAiD8zB,GAAjD,GAAuD,aAJ7D,CAAT;AAKD,OAPK,MAOC,IAAIhB,QAAQ,IAAIE,QAAZ,IAAwBE,SAA5B,EAAuC;AAC5CG,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,kBAAD,CAAD,CACNkc,IADM,CACD,KADC,EACMha,GADN,EAENga,IAFM,CAED,OAFC,EAEQ,KAFR,EAEeA,IAFf,CAEoB,QAFpB,EAE8B,KAF9B,CAAT;AAGD,OAJM,MAIA,IAAIozB,OAAO,IAAIA,OAAO,CAAC,CAAD,CAAP,CAAWviC,MAA1B,EAAkC;AACvCwiC,QAAAA,MAAM,GAAGvvC,yBAAC,CAAC,UAAD,CAAD,CACNkc,IADM,CACD,aADC,EACc,CADd,EAENA,IAFM,CAED,KAFC,EAEM,qDAAqD+zB,kBAAkB,CAACX,OAAO,CAAC,CAAD,CAAR,CAAvE,GAAsF,wBAF5F,EAGNpzB,IAHM,CAGD,OAHC,EAGQ,KAHR,EAGeA,IAHf,CAGoB,QAHpB,EAG8B,KAH9B,EAINA,IAJM,CAID,WAJC,EAIY,IAJZ,EAKNA,IALM,CAKD,mBALC,EAKoB,MALpB,CAAT;AAMD,OAPM,MAOA;AACL;AACA,eAAO,KAAP;AACD;;AAEDqzB,MAAAA,MAAM,CAAChd,QAAP,CAAgB,iBAAhB;AAEA,aAAOgd,MAAM,CAAC,CAAD,CAAb;AACD;;;WAED,gBAAO;AAAA;;AACL,UAAMr4B,IAAI,GAAG,KAAK9P,OAAL,CAAa+C,MAAb,CAAoB,wBAApB,CAAb;AACA,WAAK/C,OAAL,CAAa+C,MAAb,CAAoB,kBAApB;AACA,WAAK+lC,eAAL,CAAqBh5B,IAArB,EAA2BkhB,IAA3B,CAAgC,UAACl2B,GAAD,EAAS;AACvC;AACA,aAAI,CAACuY,EAAL,CAAQwwB,UAAR,CAAmB,KAAI,CAACJ,OAAxB;;AACA,aAAI,CAACzjC,OAAL,CAAa+C,MAAb,CAAoB,qBAApB,EAHuC,CAKvC;;;AACA,YAAM0N,KAAK,GAAG,KAAI,CAACs4B,eAAL,CAAqBjuC,GAArB,CAAd;;AAEA,YAAI2V,KAAJ,EAAW;AACT;AACA,eAAI,CAACzQ,OAAL,CAAa+C,MAAb,CAAoB,mBAApB,EAAyC0N,KAAzC;AACD;AACF,OAZD,EAYGrO,IAZH,CAYQ,YAAM;AACZ,aAAI,CAACpC,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;AACD,OAdD;AAeD;AAED;AACF;AACA;AACA;AACA;AACA;;;;WACE,2BAA4B;AAAA;;AAC1B,aAAOnK,kCAAA,CAAW,UAACgmB,QAAD,EAAc;AAC9B,YAAMoqB,SAAS,GAAG,MAAI,CAACvF,OAAL,CAAa19B,IAAb,CAAkB,iBAAlB,CAAlB;;AACA,YAAMkjC,SAAS,GAAG,MAAI,CAACxF,OAAL,CAAa19B,IAAb,CAAkB,iBAAlB,CAAlB;;AAEA,cAAI,CAACsN,EAAL,CAAQ+wB,aAAR,CAAsB,MAAI,CAACX,OAA3B,EAAoC,YAAM;AACxC,gBAAI,CAACzjC,OAAL,CAAa0U,YAAb,CAA0B,cAA1B;;AAEAs0B,UAAAA,SAAS,CAACl3B,EAAV,CAAa,4BAAb,EAA2C,YAAM;AAC/C,kBAAI,CAACuB,EAAL,CAAQ2vB,SAAR,CAAkBiG,SAAlB,EAA6BD,SAAS,CAACr4B,GAAV,EAA7B;AACD,WAFD;;AAIA,cAAI,CAACnJ,kBAAL,EAAyB;AACvBwhC,YAAAA,SAAS,CAAC9zB,OAAV,CAAkB,OAAlB;AACD;;AAED+zB,UAAAA,SAAS,CAACvN,KAAV,CAAgB,UAACnmB,KAAD,EAAW;AACzBA,YAAAA,KAAK,CAACE,cAAN;AACAmJ,YAAAA,QAAQ,CAACI,OAAT,CAAiBgqB,SAAS,CAACr4B,GAAV,EAAjB;AACD,WAHD;;AAKA,gBAAI,CAAC2zB,YAAL,CAAkB0E,SAAlB,EAA6BC,SAA7B;AACD,SAjBD;;AAmBA,cAAI,CAAC51B,EAAL,CAAQqxB,cAAR,CAAuB,MAAI,CAACjB,OAA5B,EAAqC,YAAM;AACzCuF,UAAAA,SAAS,CAACh3B,GAAV;AACAi3B,UAAAA,SAAS,CAACj3B,GAAV;;AAEA,cAAI4M,QAAQ,CAAC+lB,KAAT,OAAqB,SAAzB,EAAoC;AAClC/lB,YAAAA,QAAQ,CAACO,MAAT;AACD;AACF,SAPD;;AASA,cAAI,CAAC9L,EAAL,CAAQuxB,UAAR,CAAmB,MAAI,CAACnB,OAAxB;AACD,OAjCM,CAAP;AAkCD;;;;;;;;;;;;;;ACzPH;AACA;;IAEqByF;AACnB,sBAAYlpC,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKsqC,KAAL,GAAatqC,yBAAC,CAACkH,QAAQ,CAACkX,IAAV,CAAd;AACA,SAAKsU,OAAL,GAAetrB,OAAO,CAACoT,UAAR,CAAmBe,MAAlC;AACA,SAAKnX,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKlE,IAAL,GAAY,KAAKkE,OAAL,CAAaqZ,QAAzB;AACD;;;;WAED,sBAAa;AACX,UAAM0pB,UAAU,GAAG,KAAK/iC,OAAL,CAAammC,aAAb,GAA6B,KAAKD,KAAlC,GAA0C,KAAKlmC,OAAL,CAAa0S,SAA1E;AACA,UAAMsH,IAAI,GAAG,CACX,yBADW,EAET,0GAFS,EAGT,6GAHS,EAIT,gHAJS,EAKX,MALW,EAMXrS,IANW;AAQb,WAAK8+B,OAAL,GAAe,KAAKpwB,EAAL,CAAQqwB,MAAR,CAAe;AAC5BzG,QAAAA,KAAK,EAAE,KAAKnkC,IAAL,CAAUkE,OAAV,CAAkBC,IADG;AAE5B0mC,QAAAA,IAAI,EAAE,KAAK3mC,OAAL,CAAa4mC,WAFS;AAG5B5sB,QAAAA,IAAI,EAAE,KAAKmyB,kBAAL,EAHsB;AAI5B3F,QAAAA,MAAM,EAAExsB,IAJoB;AAK5BhC,QAAAA,QAAQ,EAAE,kBAACvE,KAAD,EAAW;AACnBA,UAAAA,KAAK,CAAC1K,IAAN,CAAW,8BAAX,EAA2C2Z,GAA3C,CAA+C;AAC7C,0BAAc,GAD+B;AAE7C,wBAAY;AAFiC,WAA/C;AAID;AAV2B,OAAf,EAWZ4c,MAXY,GAWH1c,QAXG,CAWMmgB,UAXN,CAAf;AAYD;;;WAED,mBAAU;AACR,WAAK1sB,EAAL,CAAQwwB,UAAR,CAAmB,KAAKJ,OAAxB;AACA,WAAKA,OAAL,CAAa1oC,MAAb;AACD;;;WAED,8BAAqB;AAAA;;AACnB,UAAM20B,MAAM,GAAG,KAAK1yB,OAAL,CAAa0yB,MAAb,CAAoBloB,SAAA,GAAY,KAAZ,GAAoB,IAAxC,CAAf;AACA,aAAOvD,MAAM,CAAC2N,IAAP,CAAY8d,MAAZ,EAAoBlrB,GAApB,CAAwB,UAACR,GAAD,EAAS;AACtC,YAAMolC,OAAO,GAAG1Z,MAAM,CAAC1rB,GAAD,CAAtB;AACA,YAAMqlC,IAAI,GAAGzwC,yBAAC,CAAC,+CAAD,CAAd;AACAywC,QAAAA,IAAI,CAAClgB,MAAL,CAAYvwB,yBAAC,CAAC,iBAAiBoL,GAAjB,GAAuB,gBAAxB,CAAD,CAA2C0b,GAA3C,CAA+C;AACzD,mBAAS,GADgD;AAEzD,0BAAgB;AAFyC,SAA/C,CAAZ,EAGIyJ,MAHJ,CAGWvwB,yBAAC,CAAC,eAAD,CAAD,CAAmBgY,IAAnB,CAAwB,KAAI,CAAC5Q,OAAL,CAAawG,IAAb,CAAkB,UAAU4iC,OAA5B,KAAwCA,OAAhE,CAHX;AAIA,eAAOC,IAAI,CAACz4B,IAAL,EAAP;AACD,OARM,EAQJjM,IARI,CAQC,EARD,CAAP;AASD;AAED;AACF;AACA;AACA;AACA;;;;WACE,0BAAiB;AAAA;;AACf,aAAO/L,kCAAA,CAAW,UAACgmB,QAAD,EAAc;AAC9B,cAAI,CAACvL,EAAL,CAAQ+wB,aAAR,CAAsB,MAAI,CAACX,OAA3B,EAAoC,YAAM;AACxC,gBAAI,CAACzjC,OAAL,CAAa0U,YAAb,CAA0B,cAA1B;;AACAkK,UAAAA,QAAQ,CAACI,OAAT;AACD,SAHD;;AAIA,cAAI,CAAC3L,EAAL,CAAQuxB,UAAR,CAAmB,MAAI,CAACnB,OAAxB;AACD,OANM,EAMJpkB,OANI,EAAP;AAOD;;;WAED,gBAAO;AAAA;;AACL,WAAKrf,OAAL,CAAa+C,MAAb,CAAoB,kBAApB;AACA,WAAKumC,cAAL,GAAsBtY,IAAtB,CAA2B,YAAM;AAC/B,cAAI,CAAChxB,OAAL,CAAa+C,MAAb,CAAoB,qBAApB;AACD,OAFD;AAGD;;;;;;;;;;;;;;AC5EH;AACA;AAEA,IAAMwmC,wBAAwB,GAAG,CAAC,CAAlC;AACA,IAAMC,wBAAwB,GAAG,CAAjC;;IAEqBC;AACnB,sBAAYzpC,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKoE,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AAEA,SAAK0sC,OAAL,GAAe,IAAf;AACA,SAAKC,aAAL,GAAqB,KAArB;AACA,SAAKtI,KAAL,GAAa,IAAb;AACA,SAAKC,KAAL,GAAa,IAAb;AAEA,SAAK3vB,MAAL,GAAc;AACZ,gCAA0B,+BAACqK,CAAD,EAAO;AAC/B,YAAI,KAAI,CAAChf,OAAL,CAAa+X,OAAjB,EAA0B;AACxBiH,UAAAA,CAAC,CAACvG,cAAF;AACAuG,UAAAA,CAAC,CAACib,eAAF;AACA,eAAI,CAAC0S,aAAL,GAAqB,IAArB;;AACA,eAAI,CAACnR,MAAL,CAAY,IAAZ;AACD;AACF,OARW;AASZ,8BAAwB,6BAACD,EAAD,EAAKvc,CAAL,EAAW;AACjC,aAAI,CAACqlB,KAAL,GAAarlB,CAAC,CAACqlB,KAAf;AACA,aAAI,CAACC,KAAL,GAAatlB,CAAC,CAACslB,KAAf;AACD,OAZW;AAaZ,+DAAyD,0DAAC/I,EAAD,EAAKvc,CAAL,EAAW;AAClE,YAAI,KAAI,CAAChf,OAAL,CAAa+X,OAAb,IAAwB,CAAC,KAAI,CAAC40B,aAAlC,EAAiD;AAC/C,eAAI,CAACtI,KAAL,GAAarlB,CAAC,CAACqlB,KAAf;AACA,eAAI,CAACC,KAAL,GAAatlB,CAAC,CAACslB,KAAf;;AACA,eAAI,CAAC9I,MAAL;AACD;;AACD,aAAI,CAACmR,aAAL,GAAqB,KAArB;AACD,OApBW;AAqBZ,sFAAgF,gFAAM;AACpF,aAAI,CAACj2B,IAAL;AACD,OAvBW;AAwBZ,6BAAuB,8BAAM;AAC3B,YAAI,CAAC,KAAI,CAACsxB,QAAL,CAAclS,EAAd,CAAiB,gBAAjB,CAAL,EAAyC;AACvC,eAAI,CAACpf,IAAL;AACD;AACF;AA5BW,KAAd;AA8BD;;;;WAED,4BAAmB;AACjB,aAAO,KAAK1W,OAAL,CAAaqyB,OAAb,IAAwB,CAACxyB,aAAA,CAAc,KAAKG,OAAL,CAAaioC,OAAb,CAAqB2E,GAAnC,CAAhC;AACD;;;WAED,sBAAa;AAAA;;AACX,WAAK5E,QAAL,GAAgB,KAAK3xB,EAAL,CAAQ4xB,OAAR,CAAgB;AAC9BpT,QAAAA,SAAS,EAAE;AADmB,OAAhB,EAEbyK,MAFa,GAEJ1c,QAFI,CAEK,KAAK5iB,OAAL,CAAa0S,SAFlB,CAAhB;AAGA,UAAMw1B,QAAQ,GAAG,KAAKF,QAAL,CAAcj/B,IAAd,CAAmB,kBAAnB,CAAjB;AAEA,WAAK/F,OAAL,CAAa+C,MAAb,CAAoB,eAApB,EAAqCmiC,QAArC,EAA+C,KAAKloC,OAAL,CAAaioC,OAAb,CAAqB2E,GAApE,EANW,CAQX;;AACA,WAAK5E,QAAL,CAAclzB,EAAd,CAAiB,WAAjB,EAA8B,YAAM;AAAE,cAAI,CAAC43B,OAAL,GAAe,KAAf;AAAuB,OAA7D,EATW,CAUX;;AACA,WAAK1E,QAAL,CAAclzB,EAAd,CAAiB,SAAjB,EAA4B,YAAM;AAAE,cAAI,CAAC43B,OAAL,GAAe,IAAf;AAAsB,OAA1D;AACD;;;WAED,mBAAU;AACR,WAAK1E,QAAL,CAAcjqC,MAAd;AACD;;;WAED,gBAAO8uC,WAAP,EAAoB;AAClB,UAAM9oB,SAAS,GAAG,KAAK/gB,OAAL,CAAa+C,MAAb,CAAoB,qBAApB,CAAlB;;AACA,UAAIge,SAAS,CAAClB,KAAV,KAAoB,CAACkB,SAAS,CAAClB,KAAV,CAAgBzF,WAAhB,EAAD,IAAkCyvB,WAAtD,CAAJ,EAAwE;AACtE,YAAIrmC,IAAI,GAAG;AACTjG,UAAAA,IAAI,EAAE,KAAK8jC,KADF;AAET39B,UAAAA,GAAG,EAAE,KAAK49B;AAFD,SAAX;AAKA,YAAM8D,eAAe,GAAGxsC,yBAAC,CAAC,KAAKoE,OAAL,CAAa0S,SAAd,CAAD,CAA0BpD,MAA1B,EAAxB;AACA9I,QAAAA,IAAI,CAACE,GAAL,IAAY0hC,eAAe,CAAC1hC,GAA5B;AACAF,QAAAA,IAAI,CAACjG,IAAL,IAAa6nC,eAAe,CAAC7nC,IAA7B;AAEA,aAAKynC,QAAL,CAActlB,GAAd,CAAkB;AAChBC,UAAAA,OAAO,EAAE,OADO;AAEhBpiB,UAAAA,IAAI,EAAEqc,IAAI,CAAC4d,GAAL,CAASh0B,IAAI,CAACjG,IAAd,EAAoB,CAApB,IAAyBgsC,wBAFf;AAGhB7lC,UAAAA,GAAG,EAAEF,IAAI,CAACE,GAAL,GAAW8lC;AAHA,SAAlB;AAKA,aAAKxpC,OAAL,CAAa+C,MAAb,CAAoB,4BAApB,EAAkD,KAAKiiC,QAAvD;AACD,OAhBD,MAgBO;AACL,aAAKtxB,IAAL;AACD;AACF;;;WAED,wBAAeygB,UAAf,EAA2B;AACzB,WAAK9gB,EAAL,CAAQwtB,eAAR,CAAwB,KAAKmE,QAAL,CAAcj/B,IAAd,CAAmB,eAAnB,CAAxB,EAA6DouB,UAA7D;;AACA,UAAIA,UAAJ,EAAgB;AACd,aAAKzgB,IAAL;AACD;AACF;;;WAED,gBAAO;AACL,UAAI,KAAKg2B,OAAT,EAAkB;AAChB,aAAK1E,QAAL,CAActxB,IAAd;AACD;AACF;;;;;;;;;;;;;;ACzGH;AACA;AACA;AACA;AACA;AACA;AAEA,IAAMo2B,YAAY,GAAG,CAArB;;IAEqBC;AACnB,uBAAY/pC,OAAZ,EAAqB;AAAA;;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AAEA,SAAKqT,EAAL,GAAUza,yCAAV;AACA,SAAKqnB,SAAL,GAAiBjgB,OAAO,CAACoT,UAAR,CAAmByB,QAApC;AACA,SAAK7X,OAAL,GAAegD,OAAO,CAAChD,OAAvB;AACA,SAAKgtC,IAAL,GAAY,KAAKhtC,OAAL,CAAagtC,IAAb,IAAqB,EAAjC;AACA,SAAKC,SAAL,GAAiB,KAAKjtC,OAAL,CAAaktC,aAAb,IAA8B,QAA/C;AACA,SAAKC,KAAL,GAAanmB,KAAK,CAACqc,OAAN,CAAc,KAAK2J,IAAnB,IAA2B,KAAKA,IAAhC,GAAuC,CAAC,KAAKA,IAAN,CAApD;AAEA,SAAKr4B,MAAL,GAAc;AACZ,0BAAoB,yBAAC4mB,EAAD,EAAKvc,CAAL,EAAW;AAC7B,YAAI,CAACA,CAAC,CAAC+S,kBAAF,EAAL,EAA6B;AAC3B,eAAI,CAACuK,WAAL,CAAiBtd,CAAjB;AACD;AACF,OALW;AAMZ,4BAAsB,2BAACuc,EAAD,EAAKvc,CAAL,EAAW;AAC/B,aAAI,CAACud,aAAL,CAAmBvd,CAAnB;AACD,OARW;AASZ,oEAA8D,gEAAM;AAClE,aAAI,CAACtI,IAAL;AACD;AAXW,KAAd;AAaD;;;;WAED,4BAAmB;AACjB,aAAO,KAAKy2B,KAAL,CAAWxkC,MAAX,GAAoB,CAA3B;AACD;;;WAED,sBAAa;AAAA;;AACX,WAAK6zB,aAAL,GAAqB,IAArB;AACA,WAAK4Q,YAAL,GAAoB,IAApB;AACA,WAAKpF,QAAL,GAAgB,KAAK3xB,EAAL,CAAQ4xB,OAAR,CAAgB;AAC9BpT,QAAAA,SAAS,EAAE,mBADmB;AAE9BwY,QAAAA,SAAS,EAAE,IAFmB;AAG9BJ,QAAAA,SAAS,EAAE;AAHmB,OAAhB,EAIb3N,MAJa,GAIJ1c,QAJI,CAIK,KAAK5iB,OAAL,CAAa0S,SAJlB,CAAhB;AAMA,WAAKs1B,QAAL,CAActxB,IAAd;AACA,WAAKwxB,QAAL,GAAgB,KAAKF,QAAL,CAAcj/B,IAAd,CAAmB,wCAAnB,CAAhB;AACA,WAAKm/B,QAAL,CAAcpzB,EAAd,CAAiB,OAAjB,EAA0B,iBAA1B,EAA6C,UAACkK,CAAD,EAAO;AAClD,cAAI,CAACkpB,QAAL,CAAcn/B,IAAd,CAAmB,SAAnB,EAA8B6rB,WAA9B,CAA0C,QAA1C;;AACAh5B,QAAAA,yBAAC,CAACojB,CAAC,CAAC4f,aAAH,CAAD,CAAmBzQ,QAAnB,CAA4B,QAA5B;;AACA,cAAI,CAAC/a,OAAL;AACD,OAJD;AAMA,WAAK40B,QAAL,CAAclzB,EAAd,CAAiB,WAAjB,EAA8B,UAACkK,CAAD,EAAO;AAAEA,QAAAA,CAAC,CAACvG,cAAF;AAAqB,OAA5D;AACD;;;WAED,mBAAU;AACR,WAAKuvB,QAAL,CAAcjqC,MAAd;AACD;;;WAED,oBAAW0lC,KAAX,EAAkB;AAChB,WAAKyE,QAAL,CAAcn/B,IAAd,CAAmB,SAAnB,EAA8B6rB,WAA9B,CAA0C,QAA1C;AACA6O,MAAAA,KAAK,CAACtV,QAAN,CAAe,QAAf;AAEA,WAAK+Z,QAAL,CAAc,CAAd,EAAiBvhC,SAAjB,GAA6B88B,KAAK,CAAC,CAAD,CAAL,CAAS9mB,SAAT,GAAsB,KAAKurB,QAAL,CAAcoF,WAAd,KAA8B,CAAjF;AACD;;;WAED,oBAAW;AACT,UAAMC,QAAQ,GAAG,KAAKrF,QAAL,CAAcn/B,IAAd,CAAmB,wBAAnB,CAAjB;AACA,UAAMykC,KAAK,GAAGD,QAAQ,CAACjjC,IAAT,EAAd;;AAEA,UAAIkjC,KAAK,CAAC7kC,MAAV,EAAkB;AAChB,aAAK8kC,UAAL,CAAgBD,KAAhB;AACD,OAFD,MAEO;AACL,YAAIE,UAAU,GAAGH,QAAQ,CAAC7+B,MAAT,GAAkBpE,IAAlB,EAAjB;;AAEA,YAAI,CAACojC,UAAU,CAAC/kC,MAAhB,EAAwB;AACtB+kC,UAAAA,UAAU,GAAG,KAAKxF,QAAL,CAAcn/B,IAAd,CAAmB,kBAAnB,EAAuC0Q,KAAvC,EAAb;AACD;;AAED,aAAKg0B,UAAL,CAAgBC,UAAU,CAAC3kC,IAAX,CAAgB,iBAAhB,EAAmC0Q,KAAnC,EAAhB;AACD;AACF;;;WAED,kBAAS;AACP,UAAM8zB,QAAQ,GAAG,KAAKrF,QAAL,CAAcn/B,IAAd,CAAmB,wBAAnB,CAAjB;AACA,UAAM4kC,KAAK,GAAGJ,QAAQ,CAAChjC,IAAT,EAAd;;AAEA,UAAIojC,KAAK,CAAChlC,MAAV,EAAkB;AAChB,aAAK8kC,UAAL,CAAgBE,KAAhB;AACD,OAFD,MAEO;AACL,YAAIC,UAAU,GAAGL,QAAQ,CAAC7+B,MAAT,GAAkBnE,IAAlB,EAAjB;;AAEA,YAAI,CAACqjC,UAAU,CAACjlC,MAAhB,EAAwB;AACtBilC,UAAAA,UAAU,GAAG,KAAK1F,QAAL,CAAcn/B,IAAd,CAAmB,kBAAnB,EAAuCL,IAAvC,EAAb;AACD;;AAED,aAAK+kC,UAAL,CAAgBG,UAAU,CAAC7kC,IAAX,CAAgB,iBAAhB,EAAmCL,IAAnC,EAAhB;AACD;AACF;;;WAED,mBAAU;AACR,UAAM+6B,KAAK,GAAG,KAAKyE,QAAL,CAAcn/B,IAAd,CAAmB,wBAAnB,CAAd;;AAEA,UAAI06B,KAAK,CAAC96B,MAAV,EAAkB;AAChB,YAAImC,IAAI,GAAG,KAAK+iC,YAAL,CAAkBpK,KAAlB,CAAX,CADgB,CAEhB;;AACA,YAAI,KAAK2J,YAAL,KAAsB,IAAtB,IAA8B,KAAKA,YAAL,CAAkBzkC,MAAlB,KAA6B,CAA/D,EAAkE;AAChE,eAAK6zB,aAAL,CAAmBhhB,EAAnB,GAAwB,KAAKghB,aAAL,CAAmB9gB,EAA3C,CADgE,CAElE;AACC,SAHD,MAGO,IAAI,KAAK0xB,YAAL,KAAsB,IAAtB,IAA8B,KAAKA,YAAL,CAAkBzkC,MAAlB,GAA2B,CAAzD,IAA8D,CAAC,KAAK6zB,aAAL,CAAmBpf,WAAnB,EAAnE,EAAqG;AAC1G,cAAI0wB,YAAY,GAAG,KAAKtR,aAAL,CAAmB9gB,EAAnB,GAAwB,KAAK8gB,aAAL,CAAmBhhB,EAA3C,GAAgD,KAAK4xB,YAAL,CAAkBzkC,MAArF;;AACA,cAAImlC,YAAY,GAAG,CAAnB,EAAsB;AACpB,iBAAKtR,aAAL,CAAmBhhB,EAAnB,IAAyBsyB,YAAzB;AACD;AACF;;AACD,aAAKtR,aAAL,CAAmBhe,UAAnB,CAA8B1T,IAA9B;;AAEA,YAAI,KAAK9K,OAAL,CAAa+tC,UAAb,KAA4B,MAAhC,EAAwC;AACtC,cAAI54B,KAAK,GAAGrS,QAAQ,CAACiQ,cAAT,CAAwB,EAAxB,CAAZ;AACAnX,UAAAA,yBAAC,CAACkP,IAAD,CAAD,CAAQ6hB,KAAR,CAAcxX,KAAd;AACA0N,UAAAA,0BAAA,CAA2B1N,KAA3B,EAAkClT,MAAlC;AACD,SAJD,MAIO;AACL4gB,UAAAA,yBAAA,CAA0B/X,IAA1B,EAAgC7I,MAAhC;AACD;;AAED,aAAKu6B,aAAL,GAAqB,IAArB;AACA,aAAK9lB,IAAL;AACA,aAAK1T,OAAL,CAAa+C,MAAb,CAAoB,cAApB;AACA,aAAK/C,OAAL,CAAa0U,YAAb,CAA0B,QAA1B,EAAoC,KAAKuL,SAAL,CAAerP,IAAf,EAApC,EAA2D,KAAKqP,SAAhE;AACD;AACF;;;WAED,sBAAawgB,KAAb,EAAoB;AAClB,UAAMuJ,IAAI,GAAG,KAAKG,KAAL,CAAW1J,KAAK,CAAC5qB,IAAN,CAAW,OAAX,CAAX,CAAb;AACA,UAAMjT,IAAI,GAAG69B,KAAK,CAAC5qB,IAAN,CAAW,MAAX,CAAb;AACA,UAAI/N,IAAI,GAAGkiC,IAAI,CAACvV,OAAL,GAAeuV,IAAI,CAACvV,OAAL,CAAa7xB,IAAb,CAAf,GAAoCA,IAA/C;;AACA,UAAI,OAAOkF,IAAP,KAAgB,QAApB,EAA8B;AAC5BA,QAAAA,IAAI,GAAGiL,cAAA,CAAejL,IAAf,CAAP;AACD;;AACD,aAAOA,IAAP;AACD;;;WAED,6BAAoBkjC,OAApB,EAA6B3X,KAA7B,EAAoC;AAClC,UAAM2W,IAAI,GAAG,KAAKG,KAAL,CAAWa,OAAX,CAAb;AACA,aAAO3X,KAAK,CAAC7uB,GAAN,CAAU,UAAC5B;AAAK;AAAN,QAAqB;AACpC,YAAM69B,KAAK,GAAG7nC,yBAAC,CAAC,oCAAD,CAAf;AACA6nC,QAAAA,KAAK,CAACtX,MAAN,CAAa6gB,IAAI,CAAC9M,QAAL,GAAgB8M,IAAI,CAAC9M,QAAL,CAAct6B,IAAd,CAAhB,GAAsCA,IAAI,GAAG,EAA1D;AACA69B,QAAAA,KAAK,CAAC5qB,IAAN,CAAW;AACT,mBAASm1B,OADA;AAET,kBAAQpoC;AAFC,SAAX;AAIA,eAAO69B,KAAP;AACD,OARM,CAAP;AASD;;;WAED,uBAAczkB,CAAd,EAAiB;AACf,UAAI,CAAC,KAAKgpB,QAAL,CAAclS,EAAd,CAAiB,UAAjB,CAAL,EAAmC;AACjC;AACD;;AAED,UAAI9W,CAAC,CAACwB,OAAF,KAAcxZ,cAAlB,EAAkC;AAChCgY,QAAAA,CAAC,CAACvG,cAAF;AACA,aAAKrF,OAAL;AACD,OAHD,MAGO,IAAI4L,CAAC,CAACwB,OAAF,KAAcxZ,WAAlB,EAA+B;AACpCgY,QAAAA,CAAC,CAACvG,cAAF;AACA,aAAKw1B,MAAL;AACD,OAHM,MAGA,IAAIjvB,CAAC,CAACwB,OAAF,KAAcxZ,aAAlB,EAAiC;AACtCgY,QAAAA,CAAC,CAACvG,cAAF;AACA,aAAKy1B,QAAL;AACD;AACF;;;WAED,uBAAcrvB,KAAd,EAAqB4d,OAArB,EAA8BzkB,QAA9B,EAAwC;AACtC,UAAMg1B,IAAI,GAAG,KAAKG,KAAL,CAAWtuB,KAAX,CAAb;;AACA,UAAImuB,IAAI,IAAIA,IAAI,CAACh5B,KAAL,CAAWxQ,IAAX,CAAgBi5B,OAAhB,CAAR,IAAoCuQ,IAAI,CAACmB,MAA7C,EAAqD;AACnD,YAAMzqC,OAAO,GAAGspC,IAAI,CAACh5B,KAAL,CAAWrQ,IAAX,CAAgB84B,OAAhB,CAAhB;AACA,aAAK2Q,YAAL,GAAoB1pC,OAAO,CAAC,CAAD,CAA3B;AACAspC,QAAAA,IAAI,CAACmB,MAAL,CAAYzqC,OAAO,CAAC,CAAD,CAAnB,EAAwBsU,QAAxB;AACD,OAJD,MAIO;AACLA,QAAAA,QAAQ;AACT;AACF;;;WAED,qBAAY/O,GAAZ,EAAiBwzB,OAAjB,EAA0B;AAAA;;AACxB,UAAM6G,MAAM,GAAG1nC,yBAAC,CAAC,iDAAiDqN,GAAjD,GAAuD,UAAxD,CAAhB;AACA,WAAKmlC,aAAL,CAAmBnlC,GAAnB,EAAwBwzB,OAAxB,EAAiC,UAACpG,KAAD,EAAW;AAC1CA,QAAAA,KAAK,GAAGA,KAAK,IAAI,EAAjB;;AACA,YAAIA,KAAK,CAAC1tB,MAAV,EAAkB;AAChB26B,UAAAA,MAAM,CAAC1vB,IAAP,CAAY,MAAI,CAACy6B,mBAAL,CAAyBplC,GAAzB,EAA8BotB,KAA9B,CAAZ;;AACA,gBAAI,CAAClC,IAAL;AACD;AACF,OAND;AAQA,aAAOmP,MAAP;AACD;;;WAED,qBAAYtkB,CAAZ,EAAe;AAAA;;AACb,UAAI,CAACnf,cAAA,CAAe,CAACmH,cAAD,EAAiBA,WAAjB,EAA8BA,aAA9B,CAAf,EAA6DgY,CAAC,CAACwB,OAA/D,CAAL,EAA8E;AAC5E,YAAIqC,MAAK,GAAG,KAAK7f,OAAL,CAAa+C,MAAb,CAAoB,qBAApB,CAAZ;;AACA,YAAI82B,SAAJ,EAAeJ,OAAf;;AACA,YAAI,KAAKz8B,OAAL,CAAasuC,QAAb,KAA0B,OAA9B,EAAuC;AACrCzR,UAAAA,SAAS,GAAGha,MAAK,CAAC0rB,aAAN,CAAoB1rB,MAApB,CAAZ;AACA4Z,UAAAA,OAAO,GAAGI,SAAS,CAACpe,QAAV,EAAV;AAEA,eAAK0uB,KAAL,CAAWt4B,OAAX,CAAmB,UAACm4B,IAAD,EAAU;AAC3B,gBAAIA,IAAI,CAACh5B,KAAL,CAAWxQ,IAAX,CAAgBi5B,OAAhB,CAAJ,EAA8B;AAC5BI,cAAAA,SAAS,GAAGha,MAAK,CAAC2rB,kBAAN,CAAyBxB,IAAI,CAACh5B,KAA9B,CAAZ;AACA,qBAAO,KAAP;AACD;AACF,WALD;;AAOA,cAAI,CAAC6oB,SAAL,EAAgB;AACd,iBAAKnmB,IAAL;AACA;AACD;;AAED+lB,UAAAA,OAAO,GAAGI,SAAS,CAACpe,QAAV,EAAV;AACD,SAjBD,MAiBO;AACLoe,UAAAA,SAAS,GAAGha,MAAK,CAACia,YAAN,EAAZ;AACAL,UAAAA,OAAO,GAAGI,SAAS,CAACpe,QAAV,EAAV;AACD;;AAED,YAAI,KAAK0uB,KAAL,CAAWxkC,MAAX,IAAqB8zB,OAAzB,EAAkC;AAChC,eAAKyL,QAAL,CAAcuG,KAAd;AAEA,cAAMC,GAAG,GAAG7mC,aAAA,CAAchI,UAAA,CAAWg9B,SAAS,CAAC3d,cAAV,EAAX,CAAd,CAAZ;AACA,cAAMkpB,eAAe,GAAGxsC,yBAAC,CAAC,KAAKoE,OAAL,CAAa0S,SAAd,CAAD,CAA0BpD,MAA1B,EAAxB;;AACA,cAAIo/B,GAAJ,EAAS;AACPA,YAAAA,GAAG,CAAChoC,GAAJ,IAAW0hC,eAAe,CAAC1hC,GAA3B;AACAgoC,YAAAA,GAAG,CAACnuC,IAAJ,IAAY6nC,eAAe,CAAC7nC,IAA5B;AAEA,iBAAKynC,QAAL,CAActxB,IAAd;AACA,iBAAK8lB,aAAL,GAAqBK,SAArB;AACA,iBAAKsQ,KAAL,CAAWt4B,OAAX,CAAmB,UAACm4B,IAAD,EAAO/jC,GAAP,EAAe;AAChC,kBAAI+jC,IAAI,CAACh5B,KAAL,CAAWxQ,IAAX,CAAgBi5B,OAAhB,CAAJ,EAA8B;AAC5B,sBAAI,CAACkS,WAAL,CAAiB1lC,GAAjB,EAAsBwzB,OAAtB,EAA+B7Z,QAA/B,CAAwC,MAAI,CAACslB,QAA7C;AACD;AACF,aAJD,EANO,CAWP;;AACA,iBAAKA,QAAL,CAAcn/B,IAAd,CAAmB,uBAAnB,EAA4ColB,QAA5C,CAAqD,QAArD,EAZO,CAcP;;AACA,gBAAI,KAAK8e,SAAL,KAAmB,KAAvB,EAA8B;AAC5B,mBAAKjF,QAAL,CAActlB,GAAd,CAAkB;AAChBniB,gBAAAA,IAAI,EAAEmuC,GAAG,CAACnuC,IADM;AAEhBmG,gBAAAA,GAAG,EAAEgoC,GAAG,CAAChoC,GAAJ,GAAU,KAAKshC,QAAL,CAAcvzB,WAAd,EAAV,GAAwCq4B;AAF7B,eAAlB;AAID,aALD,MAKO;AACL,mBAAK9E,QAAL,CAActlB,GAAd,CAAkB;AAChBniB,gBAAAA,IAAI,EAAEmuC,GAAG,CAACnuC,IADM;AAEhBmG,gBAAAA,GAAG,EAAEgoC,GAAG,CAAChoC,GAAJ,GAAUgoC,GAAG,CAACryC,MAAd,GAAuBywC;AAFZ,eAAlB;AAID;AACF;AACF,SAhCD,MAgCO;AACL,eAAKp2B,IAAL;AACD;AACF;AACF;;;WAED,gBAAO;AACL,WAAKsxB,QAAL,CAAc7T,IAAd;AACD;;;WAED,gBAAO;AACL,WAAK6T,QAAL,CAActxB,IAAd;AACD;;;;;;;;AC9QH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA9a,sCAAA,GAAeA,gCAAA,CAASA,sCAAT,EAAuB;AACpCizC,EAAAA,OAAO,EAAE;AACTx3B,EAAAA,OAAO,EAAE,EAF2B;AAIpCtB,EAAAA,GAAG,EAAEA,GAJ+B;AAKpC8M,EAAAA,KAAK,EAAEA,KAL6B;AAMpChjB,EAAAA,KAAK,EAAEA,KAN6B;AAQpCG,EAAAA,OAAO,EAAE;AACPqZ,IAAAA,QAAQ,EAAEzd,oDADH;AAEPmc,IAAAA,OAAO,EAAE,IAFF;AAGP5B,IAAAA,OAAO,EAAE;AACP,gBAAUkY,MADH;AAEP,mBAAa2H,SAFN;AAGP,kBAAYS,QAHL;AAIP,kBAAYmY,QAJL;AAKP,mBAAa/U,SALN;AAMP,oBAAcY,UANP;AAOP,gBAAUW,MAPH;AAQP;AACA;AACA,qBAAe2R,WAVR;AAWP,kBAAY1Q,QAXL;AAYP,kBAAYU,QAZL;AAaP,qBAAeC,WAbR;AAcP,qBAAeS,WAdR;AAeP,iBAAWI,OAfJ;AAgBP,iBAAW8G,OAhBJ;AAiBP,oBAAcsB,UAjBP;AAkBP,qBAAe6B,WAlBR;AAmBP,qBAAeO,WAnBR;AAoBP,sBAAgBa,YApBT;AAqBP,sBAAgBE,YArBT;AAsBP,qBAAeC,WAtBR;AAuBP,oBAAc6C,UAvBP;AAwBP,oBAAcO,UAAUA;AAxBjB,KAHF;AA8BPr1B,IAAAA,OAAO,EAAE,EA9BF;AAgCPtb,IAAAA,IAAI,EAAE,OAhCC;AAkCPkpC,IAAAA,gBAAgB,EAAE,KAlCX;AAmCP8J,IAAAA,eAAe,EAAE,KAnCV;AAoCPxJ,IAAAA,cAAc,EAAE,EApCT;AAsCP;AACAyJ,IAAAA,kBAAkB,EAAE,KAvCb;AAwCPpU,IAAAA,OAAO,EAAE,CACP,CAAC,OAAD,EAAU,CAAC,OAAD,CAAV,CADO,EAEP,CAAC,MAAD,EAAS,CAAC,MAAD,EAAS,WAAT,EAAsB,OAAtB,CAAT,CAFO,EAGP,CAAC,UAAD,EAAa,CAAC,UAAD,CAAb,CAHO,EAIP,CAAC,OAAD,EAAU,CAAC,OAAD,CAAV,CAJO,EAKP,CAAC,MAAD,EAAS,CAAC,IAAD,EAAO,IAAP,EAAa,WAAb,CAAT,CALO,EAMP,CAAC,OAAD,EAAU,CAAC,OAAD,CAAV,CANO,EAOP,CAAC,QAAD,EAAW,CAAC,MAAD,EAAS,SAAT,EAAoB,OAApB,CAAX,CAPO,EAQP,CAAC,MAAD,EAAS,CAAC,YAAD,EAAe,UAAf,EAA2B,MAA3B,CAAT,CARO,CAxCF;AAmDP;AACAwO,IAAAA,UAAU,EAAE,IApDL;AAqDPlB,IAAAA,OAAO,EAAE;AACPrrC,MAAAA,KAAK,EAAE,CACL,CAAC,QAAD,EAAW,CAAC,YAAD,EAAe,YAAf,EAA6B,eAA7B,EAA8C,YAA9C,CAAX,CADK,EAEL,CAAC,OAAD,EAAU,CAAC,WAAD,EAAc,YAAd,EAA4B,WAA5B,CAAV,CAFK,EAGL,CAAC,QAAD,EAAW,CAAC,aAAD,CAAX,CAHK,CADA;AAMPwB,MAAAA,IAAI,EAAE,CACJ,CAAC,MAAD,EAAS,CAAC,gBAAD,EAAmB,QAAnB,CAAT,CADI,CANC;AASPM,MAAAA,KAAK,EAAE,CACL,CAAC,KAAD,EAAQ,CAAC,YAAD,EAAe,UAAf,EAA2B,YAA3B,EAAyC,aAAzC,CAAR,CADK,EAEL,CAAC,QAAD,EAAW,CAAC,WAAD,EAAc,WAAd,EAA2B,aAA3B,CAAX,CAFK,CATA;AAaPkuC,MAAAA,GAAG,EAAE,CACH,CAAC,OAAD,EAAU,CAAC,OAAD,CAAV,CADG,EAEH,CAAC,MAAD,EAAS,CAAC,MAAD,EAAS,WAAT,EAAsB,OAAtB,CAAT,CAFG,EAGH,CAAC,MAAD,EAAS,CAAC,IAAD,EAAO,WAAP,CAAT,CAHG,EAIH,CAAC,OAAD,EAAU,CAAC,OAAD,CAAV,CAJG,EAKH,CAAC,QAAD,EAAW,CAAC,MAAD,EAAS,SAAT,CAAX,CALG,EAMH,CAAC,MAAD,EAAS,CAAC,YAAD,EAAe,UAAf,CAAT,CANG;AAbE,KArDF;AA4EP;AACAva,IAAAA,OAAO,EAAE,KA7EF;AA8EPC,IAAAA,mBAAmB,EAAE,KA9Ed;AA8EqB;AAE5BlvB,IAAAA,KAAK,EAAE,IAhFA;AAiFP/G,IAAAA,MAAM,EAAE,IAjFD;AAkFPugC,IAAAA,eAAe,EAAE,IAlFV;AAmFPn+B,IAAAA,WAAW,EAAE,IAnFN;AAoFPqyB,IAAAA,eAAe,EAAE,SApFV;AAsFPpX,IAAAA,KAAK,EAAE,KAtFA;AAuFPs1B,IAAAA,WAAW,EAAE,KAvFN;AAwFPpb,IAAAA,OAAO,EAAE,CAxFF;AAyFPH,IAAAA,YAAY,EAAE,KAzFP;AA0FPnyB,IAAAA,SAAS,EAAE,IA1FJ;AA2FP2tC,IAAAA,gBAAgB,EAAE,IA3FX;AA4FP11B,IAAAA,OAAO,EAAE,MA5FF;AA6FP7G,IAAAA,SAAS,EAAE,IA7FJ;AA8FPygB,IAAAA,aAAa,EAAE,CA9FR;AA+FPjM,IAAAA,uBAAuB,EAAE,CA/FlB;AAgGPiL,IAAAA,UAAU,EAAE,IAhGL;AAiGPC,IAAAA,cAAc,EAAE,KAjGT;AAkGP9d,IAAAA,WAAW,EAAE,IAlGN;AAmGPopB,IAAAA,kBAAkB,EAAE,KAnGb;AAoGP;AACAxL,IAAAA,oBAAoB,EAAE,KArGf;AAsGP1O,IAAAA,YAAY,EAAE,GAtGP;AAwGP;AACAmZ,IAAAA,yBAAyB,EAAE,KAzGpB;AA2GP;AACA2R,IAAAA,QAAQ,EAAE,MA5GH;AA6GPP,IAAAA,UAAU,EAAE,OA7GL;AA8GPb,IAAAA,aAAa,EAAE,QA9GR;AAgHPlN,IAAAA,SAAS,EAAE,CAAC,GAAD,EAAM,YAAN,EAAoB,KAApB,EAA2B,IAA3B,EAAiC,IAAjC,EAAuC,IAAvC,EAA6C,IAA7C,EAAmD,IAAnD,EAAyD,IAAzD,CAhHJ;AAkHPW,IAAAA,SAAS,EAAE,CACT,OADS,EACA,aADA,EACe,eADf,EACgC,aADhC,EAET,gBAFS,EAES,WAFT,EAEsB,QAFtB,EAEgC,eAFhC,EAGT,QAHS,EAGC,iBAHD,EAGoB,SAHpB,CAlHJ;AAuHPpC,IAAAA,oBAAoB,EAAE,EAvHf;AAwHPiC,IAAAA,eAAe,EAAE,IAxHV;AA0HPO,IAAAA,SAAS,EAAE,CAAC,GAAD,EAAM,GAAN,EAAW,IAAX,EAAiB,IAAjB,EAAuB,IAAvB,EAA6B,IAA7B,EAAmC,IAAnC,EAAyC,IAAzC,EAA+C,IAA/C,CA1HJ;AA4HPC,IAAAA,aAAa,EAAE,CAAC,IAAD,EAAO,IAAP,CA5HR;AA8HP;AACA5B,IAAAA,MAAM,EAAE,CACN,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CADM,EAEN,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CAFM,EAGN,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CAHM,EAIN,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CAJM,EAKN,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CALM,EAMN,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CANM,EAON,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CAPM,EAQN,CAAC,SAAD,EAAY,SAAZ,EAAuB,SAAvB,EAAkC,SAAlC,EAA6C,SAA7C,EAAwD,SAAxD,EAAmE,SAAnE,EAA8E,SAA9E,CARM,CA/HD;AA0IP;AACAC,IAAAA,UAAU,EAAE,CACV,CAAC,OAAD,EAAU,SAAV,EAAqB,WAArB,EAAkC,WAAlC,EAA+C,YAA/C,EAA6D,SAA7D,EAAwE,WAAxE,EAAqF,OAArF,CADU,EAEV,CAAC,KAAD,EAAQ,aAAR,EAAuB,QAAvB,EAAiC,OAAjC,EAA0C,MAA1C,EAAkD,MAAlD,EAA0D,iBAA1D,EAA6E,SAA7E,CAFU,EAGV,CAAC,QAAD,EAAW,OAAX,EAAoB,WAApB,EAAiC,OAAjC,EAA0C,YAA1C,EAAwD,eAAxD,EAAyE,SAAzE,EAAoF,UAApF,CAHU,EAIV,CAAC,YAAD,EAAe,cAAf,EAA+B,cAA/B,EAA+C,QAA/C,EAAyD,QAAzD,EAAmE,QAAnE,EAA6E,aAA7E,EAA4F,aAA5F,CAJU,EAKV,CAAC,OAAD,EAAU,OAAV,EAAmB,WAAnB,EAAgC,SAAhC,EAA2C,aAA3C,EAA0D,QAA1D,EAAoE,iBAApE,EAAuF,MAAvF,CALU,EAMV,CAAC,eAAD,EAAkB,WAAlB,EAA+B,cAA/B,EAA+C,kBAA/C,EAAmE,YAAnE,EAAiF,aAAjF,EAAgG,gBAAhG,EAAkH,UAAlH,CANU,EAOV,CAAC,SAAD,EAAY,SAAZ,EAAuB,aAAvB,EAAsC,cAAtC,EAAsD,MAAtD,EAA8D,aAA9D,EAA6E,WAA7E,EAA0F,QAA1F,CAPU,EAQV,CAAC,UAAD,EAAa,UAAb,EAAyB,OAAzB,EAAkC,SAAlC,EAA6C,OAA7C,EAAsD,eAAtD,EAAuE,WAAvE,EAAoF,QAApF,CARU,CA3IL;AAsJPP,IAAAA,WAAW,EAAE;AACX3N,MAAAA,SAAS,EAAE,SADA;AAEXC,MAAAA,SAAS,EAAE;AAFA,KAtJN;AA2JPyQ,IAAAA,WAAW,EAAE,CAAC,KAAD,EAAQ,KAAR,EAAe,KAAf,EAAsB,KAAtB,EAA6B,KAA7B,EAAoC,KAApC,EAA2C,KAA3C,EAAkD,KAAlD,CA3JN;AA6JP3T,IAAAA,cAAc,EAAE,sBA7JT;AA+JP6T,IAAAA,kBAAkB,EAAE;AAClBC,MAAAA,GAAG,EAAE,EADa;AAElBhZ,MAAAA,GAAG,EAAE;AAFa,KA/Jb;AAoKP;AACAmd,IAAAA,aAAa,EAAE,KArKR;AAsKPS,IAAAA,WAAW,EAAE,KAtKN;AAwKPtS,IAAAA,oBAAoB,EAAE,IAxKf;AAyKPqU,IAAAA,oBAAoB,EAAE,SAzKf;AA2KP1wB,IAAAA,SAAS,EAAE;AACTi3B,MAAAA,eAAe,EAAE,IADR;AAETC,MAAAA,MAAM,EAAE,IAFC;AAGTC,MAAAA,cAAc,EAAE,IAHP;AAITC,MAAAA,QAAQ,EAAE,IAJD;AAKTC,MAAAA,gBAAgB,EAAE,IALT;AAMTlI,MAAAA,aAAa,EAAE,IANN;AAOTmI,MAAAA,OAAO,EAAE,IAPA;AAQTC,MAAAA,OAAO,EAAE,IARA;AAST3G,MAAAA,iBAAiB,EAAE,IATV;AAUTrU,MAAAA,aAAa,EAAE,IAVN;AAWTib,MAAAA,kBAAkB,EAAE,IAXX;AAYTC,MAAAA,MAAM,EAAE,IAZC;AAaTC,MAAAA,SAAS,EAAE,IAbF;AAcTC,MAAAA,OAAO,EAAE,IAdA;AAeTC,MAAAA,WAAW,EAAE,IAfJ;AAgBTC,MAAAA,SAAS,EAAE,IAhBF;AAiBTC,MAAAA,OAAO,EAAE,IAjBA;AAkBTC,MAAAA,QAAQ,EAAE;AAlBD,KA3KJ;AAgMPjY,IAAAA,UAAU,EAAE;AACVkY,MAAAA,IAAI,EAAE,WADI;AAEVC,MAAAA,QAAQ,EAAE,IAFA;AAGVC,MAAAA,WAAW,EAAE;AAHH,KAhML;AAsMP7X,IAAAA,cAAc,EAAE,IAtMT;AAuMPC,IAAAA,mBAAmB,EAAE,yIAvMd;AAwMPC,IAAAA,oBAAoB,EAAE,IAxMf;AAyMPE,IAAAA,0BAA0B,EAAE,EAzMrB;AA0MPC,IAAAA,8BAA8B,EAAE,CAC9B,iBAD8B,EAE9B,0BAF8B,EAG9B,kBAH8B,EAI9B,SAJ8B,EAK9B,eAL8B,EAM9B,kBAN8B,EAO9B,qBAP8B,EAQ9B,kBAR8B,EAS9B,gBAT8B,EAU9B,UAV8B,CA1MzB;AAuNPjG,IAAAA,MAAM,EAAE;AACN0d,MAAAA,EAAE,EAAE;AACF,eAAO,QADL;AAEF,iBAAS,iBAFP;AAGF,kBAAU,MAHR;AAIF,kBAAU,MAJR;AAKF,eAAO,KALL;AAMF,qBAAa,OANX;AAOF,kBAAU,MAPR;AAQF,kBAAU,QARR;AASF,kBAAU,WATR;AAUF,wBAAgB,eAVd;AAWF,0BAAkB,cAXhB;AAYF,wBAAgB,aAZd;AAaF,wBAAgB,eAbd;AAcF,wBAAgB,cAdd;AAeF,wBAAgB,aAfd;AAgBF,2BAAmB,qBAhBjB;AAiBF,2BAAmB,mBAjBjB;AAkBF,4BAAoB,SAlBlB;AAmBF,6BAAqB,QAnBnB;AAoBF,qBAAa,YApBX;AAqBF,qBAAa,UArBX;AAsBF,qBAAa,UAtBX;AAuBF,qBAAa,UAvBX;AAwBF,qBAAa,UAxBX;AAyBF,qBAAa,UAzBX;AA0BF,qBAAa,UA1BX;AA2BF,sBAAc,sBA3BZ;AA4BF,kBAAU;AA5BR,OADE;AAgCNC,MAAAA,GAAG,EAAE;AACH,eAAO,QADJ;AAEH,iBAAS,iBAFN;AAGH,iBAAS,MAHN;AAIH,uBAAe,MAJZ;AAKH,eAAO,KALJ;AAMH,qBAAa,OANV;AAOH,iBAAS,MAPN;AAQH,iBAAS,QARN;AASH,iBAAS,WATN;AAUH,uBAAe,eAVZ;AAWH,yBAAiB,cAXd;AAYH,uBAAe,aAZZ;AAaH,uBAAe,eAbZ;AAcH,uBAAe,cAdZ;AAeH,uBAAe,aAfZ;AAgBH,0BAAkB,qBAhBf;AAiBH,0BAAkB,mBAjBf;AAkBH,2BAAmB,SAlBhB;AAmBH,4BAAoB,QAnBjB;AAoBH,oBAAY,YApBT;AAqBH,oBAAY,UArBT;AAsBH,oBAAY,UAtBT;AAuBH,oBAAY,UAvBT;AAwBH,oBAAY,UAxBT;AAyBH,oBAAY,UAzBT;AA0BH,oBAAY,UA1BT;AA2BH,qBAAa,sBA3BV;AA4BH,iBAAS;AA5BN;AAhCC,KAvND;AAsRP/2B,IAAAA,KAAK,EAAE;AACL,eAAS,iBADJ;AAEL,qBAAe,wBAFV;AAGL,sBAAgB,yBAHX;AAIL,mBAAa,sBAJR;AAKL,oBAAc,uBALT;AAML,kBAAY,qBANP;AAOL,mBAAa,sBAPR;AAQL,kBAAY,qBARP;AASL,kBAAY,qBATP;AAUL,mBAAa,sBAVR;AAWL,mBAAa,sBAXR;AAYL,gBAAU,wBAZL;AAaL,iBAAW,yBAbN;AAcL,mBAAa,sBAdR;AAeL,cAAQ,gBAfH;AAgBL,eAAS,iBAhBJ;AAiBL,gBAAU,kBAjBL;AAkBL,eAAS,iBAlBJ;AAmBL,cAAQ,gBAnBH;AAoBL,gBAAU,kBApBL;AAqBL,mBAAa,sBArBR;AAsBL,oBAAc,uBAtBT;AAuBL,cAAQ,gBAvBH;AAwBL,eAAS,iBAxBJ;AAyBL,gBAAU,kBAzBL;AA0BL,cAAQ,gBA1BH;AA2BL,gBAAU,wBA3BL;AA4BL,eAAS,iBA5BJ;AA6BL,mBAAa,sBA7BR;AA8BL,eAAS,iBA9BJ;AA+BL,qBAAe,uBA/BV;AAgCL,gBAAU,kBAhCL;AAiCL,iBAAW,mBAjCN;AAkCL,kBAAY,oBAlCP;AAmCL,cAAQ,gBAnCH;AAoCL,kBAAY,oBApCP;AAqCL,gBAAU,kBArCL;AAsCL,uBAAiB,yBAtCZ;AAuCL,mBAAa,qBAvCR;AAwCL,qBAAe,uBAxCV;AAyCL,eAAS,iBAzCJ;AA0CL,oBAAc,uBA1CT;AA2CL,eAAS,iBA3CJ;AA4CL,mBAAa,qBA5CR;AA6CL,cAAQ,gBA7CH;AA8CL,uBAAiB,yBA9CZ;AA+CL,eAAS;AA/CJ;AAtRA;AAR2B,CAAvB,CAAf;;;;;;;;;;AC7BA;;IAEMg3B;AACJ,oBAAYx8B,MAAZ,EAAoBwS,QAApB,EAA8BtmB,OAA9B,EAAuCgY,QAAvC,EAAiD;AAAA;;AAC/C,SAAKlE,MAAL,GAAcA,MAAd;AACA,SAAKwS,QAAL,GAAgBA,QAAhB;AACA,SAAKtmB,OAAL,GAAeA,OAAf;AACA,SAAKgY,QAAL,GAAgBA,QAAhB;AACD;;;;WAED,gBAAO2c,OAAP,EAAgB;AACd,UAAMlhB,KAAK,GAAG7X,yBAAC,CAAC,KAAKkY,MAAN,CAAf;;AAEA,UAAI,KAAK9T,OAAL,IAAgB,KAAKA,OAAL,CAAamjB,QAAjC,EAA2C;AACzC1P,QAAAA,KAAK,CAACG,IAAN,CAAW,KAAK5T,OAAL,CAAamjB,QAAxB;AACD;;AAED,UAAI,KAAKnjB,OAAL,IAAgB,KAAKA,OAAL,CAAa60B,SAAjC,EAA4C;AAC1CphB,QAAAA,KAAK,CAAC0a,QAAN,CAAe,KAAKnuB,OAAL,CAAa60B,SAA5B;AACD;;AAED,UAAI,KAAK70B,OAAL,IAAgB,KAAKA,OAAL,CAAa6Y,IAAjC,EAAuC;AACrCjd,QAAAA,8BAAA,CAAO,KAAKoE,OAAL,CAAa6Y,IAApB,EAA0B,UAAC03B,CAAD,EAAI9mC,CAAJ,EAAU;AAClCgK,UAAAA,KAAK,CAACqE,IAAN,CAAW,UAAUy4B,CAArB,EAAwB9mC,CAAxB;AACD,SAFD;AAGD;;AAED,UAAI,KAAKzJ,OAAL,IAAgB,KAAKA,OAAL,CAAa0+B,KAAjC,EAAwC;AACtCjrB,QAAAA,KAAK,CAACqB,EAAN,CAAS,OAAT,EAAkB,KAAK9U,OAAL,CAAa0+B,KAA/B;AACD;;AAED,UAAI,KAAKpY,QAAT,EAAmB;AACjB,YAAMyc,UAAU,GAAGtvB,KAAK,CAAC1K,IAAN,CAAW,0BAAX,CAAnB;AACA,aAAKud,QAAL,CAAczR,OAAd,CAAsB,UAAC1F,KAAD,EAAW;AAC/BA,UAAAA,KAAK,CAACmwB,MAAN,CAAayD,UAAU,CAACp6B,MAAX,GAAoBo6B,UAApB,GAAiCtvB,KAA9C;AACD,SAFD;AAGD;;AAED,UAAI,KAAKuE,QAAT,EAAmB;AACjB,aAAKA,QAAL,CAAcvE,KAAd,EAAqB,KAAKzT,OAA1B;AACD;;AAED,UAAI,KAAKA,OAAL,IAAgB,KAAKA,OAAL,CAAagY,QAAjC,EAA2C;AACzC,aAAKhY,OAAL,CAAagY,QAAb,CAAsBvE,KAAtB;AACD;;AAED,UAAIkhB,OAAJ,EAAa;AACXA,QAAAA,OAAO,CAACxI,MAAR,CAAe1Y,KAAf;AACD;;AAED,aAAOA,KAAP;AACD;;;;;;AAGH,+CAAe;AACbb,EAAAA,MAAM,EAAE,gBAACkB,MAAD,EAASkE,QAAT,EAAsB;AAC5B,WAAO,YAAW;AAChB,UAAMhY,OAAO,GAAG,QAAOwF,SAAS,CAAC,CAAD,CAAhB,MAAwB,QAAxB,GAAmCA,SAAS,CAAC,CAAD,CAA5C,GAAkDA,SAAS,CAAC,CAAD,CAA3E;AACA,UAAI8gB,QAAQ,GAAGU,KAAK,CAACqc,OAAN,CAAc79B,SAAS,CAAC,CAAD,CAAvB,IAA8BA,SAAS,CAAC,CAAD,CAAvC,GAA6C,EAA5D;;AACA,UAAIxF,OAAO,IAAIA,OAAO,CAACsmB,QAAvB,EAAiC;AAC/BA,QAAAA,QAAQ,GAAGtmB,OAAO,CAACsmB,QAAnB;AACD;;AACD,aAAO,IAAIgqB,QAAJ,CAAax8B,MAAb,EAAqBwS,QAArB,EAA+BtmB,OAA/B,EAAwCgY,QAAxC,CAAP;AACD,KAPD;AAQD;AAVY,CAAf;;;;;;;;ACtDA;;IAEMw4B;AACJ,qBAAY/8B,KAAZ,EAAmBzT,OAAnB,EAA4B;AAAA;;AAC1B,SAAKyT,KAAL,GAAaA,KAAb;AACA,SAAKzT,OAAL,GAAepE,gCAAA,CAAS,EAAT,EAAa;AAC1BqkC,MAAAA,KAAK,EAAE,EADmB;AAE1BtnB,MAAAA,MAAM,EAAE3Y,OAAO,CAAC0S,SAFU;AAG1BwF,MAAAA,OAAO,EAAE,aAHiB;AAI1Bu4B,MAAAA,SAAS,EAAE;AAJe,KAAb,EAKZzwC,OALY,CAAf,CAF0B,CAS1B;;AACA,SAAK0wC,QAAL,GAAgB90C,yBAAC,CAAC,CAChB,4BADgB,EAEd,wCAFc,EAGd,0CAHc,EAIhB,QAJgB,EAKhB+L,IALgB,CAKX,EALW,CAAD,CAAjB,CAV0B,CAiB1B;;AACA,QAAI,KAAK3H,OAAL,CAAakY,OAAb,KAAyB,QAA7B,EAAuC;AACrC,UAAMy4B,YAAY,GAAG,KAAKxc,IAAL,CAAU+B,IAAV,CAAe,IAAf,CAArB;AACA,UAAM0a,YAAY,GAAG,KAAKl6B,IAAL,CAAUwf,IAAV,CAAe,IAAf,CAArB;AACA,UAAM2a,cAAc,GAAG,KAAKjT,MAAL,CAAY1H,IAAZ,CAAiB,IAAjB,CAAvB;AAEA,WAAKl2B,OAAL,CAAakY,OAAb,CAAqB3Q,KAArB,CAA2B,GAA3B,EAAgCsN,OAAhC,CAAwC,UAASme,SAAT,EAAoB;AAC1D,YAAIA,SAAS,KAAK,OAAlB,EAA2B;AACzBvf,UAAAA,KAAK,CAACuB,GAAN,CAAU,uBAAV;AACAvB,UAAAA,KAAK,CAACqB,EAAN,CAAS,YAAT,EAAuB67B,YAAvB,EAAqC77B,EAArC,CAAwC,YAAxC,EAAsD87B,YAAtD;AACD,SAHD,MAGO,IAAI5d,SAAS,KAAK,OAAlB,EAA2B;AAChCvf,UAAAA,KAAK,CAACqB,EAAN,CAAS,OAAT,EAAkB+7B,cAAlB;AACD,SAFM,MAEA,IAAI7d,SAAS,KAAK,OAAlB,EAA2B;AAChCvf,UAAAA,KAAK,CAACqB,EAAN,CAAS,OAAT,EAAkB67B,YAAlB,EAAgC77B,EAAhC,CAAmC,MAAnC,EAA2C87B,YAA3C;AACD;AACF,OATD;AAUD;AACF;;;;WAED,gBAAO;AACL,UAAMn9B,KAAK,GAAG,KAAKA,KAAnB;AACA,UAAMnE,MAAM,GAAGmE,KAAK,CAACnE,MAAN,EAAf;AACA,UAAMwhC,YAAY,GAAGl1C,yBAAC,CAAC,KAAKoE,OAAL,CAAa2Y,MAAd,CAAD,CAAuBrJ,MAAvB,EAArB;AACAA,MAAAA,MAAM,CAAC5I,GAAP,IAAcoqC,YAAY,CAACpqC,GAA3B;AACA4I,MAAAA,MAAM,CAAC/O,IAAP,IAAeuwC,YAAY,CAACvwC,IAA5B;AAEA,UAAMmwC,QAAQ,GAAG,KAAKA,QAAtB;AACA,UAAMzQ,KAAK,GAAG,KAAKjgC,OAAL,CAAaigC,KAAb,IAAsBxsB,KAAK,CAACqE,IAAN,CAAW,OAAX,CAAtB,IAA6CrE,KAAK,CAACoF,IAAN,CAAW,OAAX,CAA3D;AACA,UAAM43B,SAAS,GAAG,KAAKzwC,OAAL,CAAaywC,SAAb,IAA0Bh9B,KAAK,CAACoF,IAAN,CAAW,WAAX,CAA5C;AAEA63B,MAAAA,QAAQ,CAACviB,QAAT,CAAkBsiB,SAAlB;AACAC,MAAAA,QAAQ,CAAC3nC,IAAT,CAAc,uBAAd,EAAuC+J,IAAvC,CAA4CmtB,KAA5C;AACAyQ,MAAAA,QAAQ,CAAC9tB,QAAT,CAAkB,KAAK5iB,OAAL,CAAa2Y,MAA/B;AAEA,UAAMo4B,SAAS,GAAGt9B,KAAK,CAAC8e,UAAN,EAAlB;AACA,UAAMye,UAAU,GAAGv9B,KAAK,CAACgB,WAAN,EAAnB;AACA,UAAMw8B,YAAY,GAAGP,QAAQ,CAACne,UAAT,EAArB;AACA,UAAM2e,aAAa,GAAGR,QAAQ,CAACj8B,WAAT,EAAtB;;AAEA,UAAIg8B,SAAS,KAAK,QAAlB,EAA4B;AAC1BC,QAAAA,QAAQ,CAAChuB,GAAT,CAAa;AACXhc,UAAAA,GAAG,EAAE4I,MAAM,CAAC5I,GAAP,GAAasqC,UADP;AAEXzwC,UAAAA,IAAI,EAAE+O,MAAM,CAAC/O,IAAP,IAAewwC,SAAS,GAAG,CAAZ,GAAgBE,YAAY,GAAG,CAA9C;AAFK,SAAb;AAID,OALD,MAKO,IAAIR,SAAS,KAAK,KAAlB,EAAyB;AAC9BC,QAAAA,QAAQ,CAAChuB,GAAT,CAAa;AACXhc,UAAAA,GAAG,EAAE4I,MAAM,CAAC5I,GAAP,GAAawqC,aADP;AAEX3wC,UAAAA,IAAI,EAAE+O,MAAM,CAAC/O,IAAP,IAAewwC,SAAS,GAAG,CAAZ,GAAgBE,YAAY,GAAG,CAA9C;AAFK,SAAb;AAID,OALM,MAKA,IAAIR,SAAS,KAAK,MAAlB,EAA0B;AAC/BC,QAAAA,QAAQ,CAAChuB,GAAT,CAAa;AACXhc,UAAAA,GAAG,EAAE4I,MAAM,CAAC5I,GAAP,IAAcsqC,UAAU,GAAG,CAAb,GAAiBE,aAAa,GAAG,CAA/C,CADM;AAEX3wC,UAAAA,IAAI,EAAE+O,MAAM,CAAC/O,IAAP,GAAc0wC;AAFT,SAAb;AAID,OALM,MAKA,IAAIR,SAAS,KAAK,OAAlB,EAA2B;AAChCC,QAAAA,QAAQ,CAAChuB,GAAT,CAAa;AACXhc,UAAAA,GAAG,EAAE4I,MAAM,CAAC5I,GAAP,IAAcsqC,UAAU,GAAG,CAAb,GAAiBE,aAAa,GAAG,CAA/C,CADM;AAEX3wC,UAAAA,IAAI,EAAE+O,MAAM,CAAC/O,IAAP,GAAcwwC;AAFT,SAAb;AAID;;AAEDL,MAAAA,QAAQ,CAACviB,QAAT,CAAkB,IAAlB;AACD;;;WAED,gBAAO;AAAA;;AACL,WAAKuiB,QAAL,CAAc9b,WAAd,CAA0B,IAA1B;AACAvsB,MAAAA,UAAU,CAAC,YAAM;AACf,aAAI,CAACqoC,QAAL,CAAc3yC,MAAd;AACD,OAFS,EAEP,GAFO,CAAV;AAGD;;;WAED,kBAAS;AACP,UAAI,KAAK2yC,QAAL,CAAc3lC,QAAd,CAAuB,IAAvB,CAAJ,EAAkC;AAChC,aAAK2L,IAAL;AACD,OAFD,MAEO;AACL,aAAKyd,IAAL;AACD;AACF;;;;;;AAGH,mDAAeqc,SAAf;;;;;;;;ACpGA;;IAEMW;AACJ,sBAAY19B,KAAZ,EAAmBzT,OAAnB,EAA4B;AAAA;;AAC1B,SAAK2+B,OAAL,GAAelrB,KAAf;AACA,SAAKzT,OAAL,GAAepE,gCAAA,CAAS,EAAT,EAAa;AAC1B+c,MAAAA,MAAM,EAAE3Y,OAAO,CAAC0S;AADU,KAAb,EAEZ1S,OAFY,CAAf;AAGA,SAAKoxC,QAAL;AACD;;;;WAED,oBAAW;AAAA;;AACT,WAAKzS,OAAL,CAAa7pB,EAAb,CAAgB,OAAhB,EAAyB,UAACkK,CAAD,EAAO;AAC9B,aAAI,CAAC4e,MAAL;;AACA5e,QAAAA,CAAC,CAACqyB,wBAAF;AACD,OAHD;AAID;;;WAED,iBAAQ;AACN,UAAI1c,OAAO,GAAG/4B,yBAAC,CAAC,sBAAD,CAAf;AACA+4B,MAAAA,OAAO,CAAC5rB,IAAR,CAAa,kBAAb,EAAiC6rB,WAAjC,CAA6C,QAA7C;AACAD,MAAAA,OAAO,CAACC,WAAR,CAAoB,MAApB;AACD;;;WAED,gBAAO;AACL,WAAK+J,OAAL,CAAaxQ,QAAb,CAAsB,QAAtB;AACA,WAAKwQ,OAAL,CAAajwB,MAAb,GAAsByf,QAAtB,CAA+B,MAA/B;AAEA,UAAI8Q,SAAS,GAAG,KAAKN,OAAL,CAAar0B,IAAb,EAAhB;AACA,UAAIgF,MAAM,GAAG2vB,SAAS,CAAC3vB,MAAV,EAAb;AACA,UAAIlM,KAAK,GAAG67B,SAAS,CAAC1M,UAAV,EAAZ;AACA,UAAI+e,WAAW,GAAG11C,yBAAC,CAACmI,MAAD,CAAD,CAAUX,KAAV,EAAlB;AACA,UAAImuC,iBAAiB,GAAG3tC,UAAU,CAAChI,yBAAC,CAAC,KAAKoE,OAAL,CAAa2Y,MAAd,CAAD,CAAuB+J,GAAvB,CAA2B,cAA3B,CAAD,CAAlC;;AAEA,UAAIpT,MAAM,CAAC/O,IAAP,GAAc6C,KAAd,GAAsBkuC,WAAW,GAAGC,iBAAxC,EAA2D;AACzDtS,QAAAA,SAAS,CAACvc,GAAV,CAAc,aAAd,EAA6B4uB,WAAW,GAAGC,iBAAd,IAAmCjiC,MAAM,CAAC/O,IAAP,GAAc6C,KAAjD,CAA7B;AACD,OAFD,MAEO;AACL67B,QAAAA,SAAS,CAACvc,GAAV,CAAc,aAAd,EAA6B,EAA7B;AACD;AACF;;;WAED,gBAAO;AACL,WAAKic,OAAL,CAAa/J,WAAb,CAAyB,QAAzB;AACA,WAAK+J,OAAL,CAAajwB,MAAb,GAAsBkmB,WAAtB,CAAkC,MAAlC;AACD;;;WAED,kBAAS;AACP,UAAI4c,QAAQ,GAAG,KAAK7S,OAAL,CAAajwB,MAAb,GAAsB3D,QAAtB,CAA+B,MAA/B,CAAf;AAEA,WAAK3O,KAAL;;AAEA,UAAIo1C,QAAJ,EAAc;AACZ,aAAK96B,IAAL;AACD,OAFD,MAEO;AACL,aAAKyd,IAAL;AACD;AACF;;;;;;AAGHv4B,yBAAC,CAACkH,QAAD,CAAD,CAAYgS,EAAZ,CAAe,OAAf,EAAwB,UAASkK,CAAT,EAAY;AAClC,MAAI,CAACpjB,yBAAC,CAACojB,CAAC,CAACrG,MAAH,CAAD,CAAYC,OAAZ,CAAoB,iBAApB,EAAuCjQ,MAA5C,EAAoD;AAClD/M,IAAAA,yBAAC,CAAC,sBAAD,CAAD,CAA0Bg5B,WAA1B,CAAsC,MAAtC;AACAh5B,IAAAA,yBAAC,CAAC,kCAAD,CAAD,CAAsCg5B,WAAtC,CAAkD,QAAlD;AACD;AACF,CALD;AAOAh5B,yBAAC,CAACkH,QAAD,CAAD,CAAYgS,EAAZ,CAAe,0BAAf,EAA2C,UAASkK,CAAT,EAAY;AACrDpjB,EAAAA,yBAAC,CAACojB,CAAC,CAACrG,MAAH,CAAD,CAAYC,OAAZ,CAAoB,qBAApB,EAA2ClK,MAA3C,GAAoDkmB,WAApD,CAAgE,MAAhE;AACAh5B,EAAAA,yBAAC,CAACojB,CAAC,CAACrG,MAAH,CAAD,CAAYC,OAAZ,CAAoB,qBAApB,EAA2ClK,MAA3C,GAAoD3F,IAApD,CAAyD,kBAAzD,EAA6E6rB,WAA7E,CAAyF,QAAzF;AACD,CAHD;AAKA,oDAAeuc,UAAf;;;;;;;;ACvEA;;IAEMM;AACJ,mBAAYh+B;AAAM;AAAlB,IAAkC;AAAA;;AAChC,SAAKi+B,MAAL,GAAcj+B,KAAd;AACA,SAAKk+B,SAAL,GAAiB/1C,yBAAC,CAAC,yCAAD,CAAlB;AACD;;;;WAED,gBAAO;AAAA;;AACL,WAAK+1C,SAAL,CAAe/uB,QAAf,CAAwB9f,QAAQ,CAACkX,IAAjC,EAAuCma,IAAvC;AACA,WAAKud,MAAL,CAAYvjB,QAAZ,CAAqB,MAArB,EAA6BgG,IAA7B;AACA,WAAKud,MAAL,CAAYx5B,OAAZ,CAAoB,iBAApB;AACA,WAAKw5B,MAAL,CAAY18B,GAAZ,CAAgB,OAAhB,EAAyB,QAAzB,EAAmCF,EAAnC,CAAsC,OAAtC,EAA+C,QAA/C,EAAyD,KAAK4B,IAAL,CAAUwf,IAAV,CAAe,IAAf,CAAzD;AACA,WAAKwb,MAAL,CAAY58B,EAAZ,CAAe,SAAf,EAA0B,UAACyD,KAAD,EAAW;AACnC,YAAIA,KAAK,CAACq5B,KAAN,KAAgB,EAApB,EAAwB;AACtBr5B,UAAAA,KAAK,CAACE,cAAN;;AACA,eAAI,CAAC/B,IAAL;AACD;AACF,OALD;AAMD;;;WAED,gBAAO;AACL,WAAKg7B,MAAL,CAAY9c,WAAZ,CAAwB,MAAxB,EAAgCle,IAAhC;AACA,WAAKi7B,SAAL,CAAej7B,IAAf;AACA,WAAKg7B,MAAL,CAAYx5B,OAAZ,CAAoB,iBAApB;AACA,WAAKw5B,MAAL,CAAY18B,GAAZ,CAAgB,SAAhB;AACD;;;;;;AAGH,iDAAey8B,OAAf;;AC7BA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA,IAAMt6B,MAAM,GAAG06B,eAAA,CAAgB,4CAAhB,CAAf;AACA,IAAMlX,OAAO,GAAGkX,eAAA,CAAgB,iDAAhB,CAAhB;AACA,IAAMvW,WAAW,GAAGuW,eAAA,CAAgB,uCAAhB,CAApB;AACA,IAAMj6B,OAAO,GAAGi6B,eAAA,CAAgB,kEAAhB,CAAhB;AACA,IAAMh6B,QAAQ,GAAGg6B,eAAA,CAAgB,+FAAhB,CAAjB;AACA,IAAM9X,SAAS,GAAG8X,eAAA,CAAgB,CAChC,+EADgC,EAEhC,4CAFgC,EAG9B,kDAH8B,EAI5B,mCAJ4B,EAK5B,mCAL4B,EAM5B,mCAN4B,EAO9B,QAP8B,EAQhC,QARgC,EAShClqC,IATgC,CAS3B,EAT2B,CAAhB,CAAlB;AAWA,IAAMmqC,SAAS,GAAGD,eAAA,CAAgB,+CAAhB,CAAlB;AACA,IAAME,WAAW,GAAGF,eAAA,CAAgB,CAClC,+FADkC,EAElC,+EAFkC,EAGlClqC,IAHkC,CAG7B,EAH6B,CAAhB,CAApB;AAKA,IAAM62B,WAAW,GAAGqT,eAAA,CAAgB,oCAAhB,CAApB;AACA,IAAM5T,sBAAM,GAAG4T,eAAA,CAAgB,gEAAhB,EAAkF,UAASp+B,KAAT,EAAgBzT,OAAhB,EAAyB;AACxH;AACA,MAAIA,OAAO,IAAIA,OAAO,CAACuZ,OAAvB,EAAgC;AAC9B9F,IAAAA,KAAK,CAACqE,IAAN,CAAW;AACT,oBAAc9X,OAAO,CAACuZ;AADb,KAAX;AAGA9F,IAAAA,KAAK,CAACoF,IAAN,CAAW,eAAX,EAA4B,IAAI23B,YAAJ,CAAc/8B,KAAd,EAAqB;AAC/CwsB,MAAAA,KAAK,EAAEjgC,OAAO,CAACuZ,OADgC;AAE/C7G,MAAAA,SAAS,EAAE1S,OAAO,CAAC0S;AAF4B,KAArB,CAA5B,EAGIoC,EAHJ,CAGO,OAHP,EAGgB,UAACkK,CAAD,EAAO;AACrBpjB,MAAAA,yBAAC,CAACojB,CAAC,CAAC4f,aAAH,CAAD,CAAmB/lB,IAAnB,CAAwB,eAAxB,EAAyCnC,IAAzC;AACD,KALD;AAMD;;AACD,MAAI1W,OAAO,CAACmjB,QAAZ,EAAsB;AACpB1P,IAAAA,KAAK,CAACG,IAAN,CAAW5T,OAAO,CAACmjB,QAAnB;AACD;;AAED,MAAInjB,OAAO,IAAIA,OAAO,CAAC6Y,IAAnB,IAA2B7Y,OAAO,CAAC6Y,IAAR,CAAa+kB,MAAb,KAAwB,UAAvD,EAAmE;AACjEnqB,IAAAA,KAAK,CAACoF,IAAN,CAAW,gBAAX,EAA6B,IAAIs4B,aAAJ,CAAe19B,KAAf,EAAsB;AACjDf,MAAAA,SAAS,EAAE1S,OAAO,CAAC0S;AAD8B,KAAtB,CAA7B;AAGD;;AAED,MAAI1S,OAAO,IAAIA,OAAO,CAAC+uC,kBAAvB,EAA2C;AACzCt7B,IAAAA,KAAK,CAAC0a,QAAN,CAAe,oBAAf;AACD;AACF,CA1Bc,CAAf;AA4BA,IAAM6Q,QAAQ,GAAG6S,eAAA,CAAgB,oDAAhB,EAAsE,UAASp+B,KAAT,EAAgBzT,OAAhB,EAAyB;AAC9G,MAAM8T,MAAM,GAAGkT,KAAK,CAACqc,OAAN,CAAcrjC,OAAO,CAACq2B,KAAtB,IAA+Br2B,OAAO,CAACq2B,KAAR,CAAc7uB,GAAd,CAAkB,UAAS5B,IAAT,EAAe;AAC7E,QAAM4N,KAAK,GAAI,OAAO5N,IAAP,KAAgB,QAAjB,GAA6BA,IAA7B,GAAqCA,IAAI,CAAC4N,KAAL,IAAc,EAAjE;AACA,QAAMikB,OAAO,GAAGz3B,OAAO,CAACkgC,QAAR,GAAmBlgC,OAAO,CAACkgC,QAAR,CAAiBt6B,IAAjB,CAAnB,GAA4CA,IAA5D;AACA,QAAMosC,KAAK,GAAGp2C,yBAAC,CAAC,wDAAwD4X,KAAxD,GAAgE,gCAAhE,GAAmGA,KAAnG,GAA2G,QAA5G,CAAf;AAEAw+B,IAAAA,KAAK,CAACp+B,IAAN,CAAW6jB,OAAX,EAAoB5e,IAApB,CAAyB,MAAzB,EAAiCjT,IAAjC;AAEA,WAAOosC,KAAP;AACD,GAR6C,CAA/B,GAQVhyC,OAAO,CAACq2B,KARb;AAUA5iB,EAAAA,KAAK,CAACG,IAAN,CAAWE,MAAX,EAAmBgE,IAAnB,CAAwB;AAAE,kBAAc9X,OAAO,CAACigC;AAAxB,GAAxB;AAEAxsB,EAAAA,KAAK,CAACqB,EAAN,CAAS,OAAT,EAAkB,uBAAlB,EAA2C,UAASkK,CAAT,EAAY;AACrD,QAAMizB,EAAE,GAAGr2C,yBAAC,CAAC,IAAD,CAAZ;AAEA,QAAMgK,IAAI,GAAGqsC,EAAE,CAACp5B,IAAH,CAAQ,MAAR,CAAb;AACA,QAAMrF,KAAK,GAAGy+B,EAAE,CAACp5B,IAAH,CAAQ,OAAR,CAAd;;AAEA,QAAIjT,IAAI,CAAC84B,KAAT,EAAgB;AACd94B,MAAAA,IAAI,CAAC84B,KAAL,CAAWuT,EAAX;AACD,KAFD,MAEO,IAAIjyC,OAAO,CAACkyC,SAAZ,EAAuB;AAC5BlyC,MAAAA,OAAO,CAACkyC,SAAR,CAAkBlzB,CAAlB,EAAqBpZ,IAArB,EAA2B4N,KAA3B;AACD;AACF,GAXD;;AAYA,MAAIxT,OAAO,IAAIA,OAAO,CAAC+uC,kBAAvB,EAA2C;AACzCt7B,IAAAA,KAAK,CAAC0a,QAAN,CAAe,oBAAf;AACD;AACF,CA5BgB,CAAjB;AA8BA,IAAMyS,aAAa,GAAGiR,eAAA,CAAgB,+DAAhB,EAAiF,UAASp+B,KAAT,EAAgBzT,OAAhB,EAAyB;AAC9H,MAAM8T,MAAM,GAAGkT,KAAK,CAACqc,OAAN,CAAcrjC,OAAO,CAACq2B,KAAtB,IAA+Br2B,OAAO,CAACq2B,KAAR,CAAc7uB,GAAd,CAAkB,UAAS5B,IAAT,EAAe;AAC7E,QAAM4N,KAAK,GAAI,OAAO5N,IAAP,KAAgB,QAAjB,GAA6BA,IAA7B,GAAqCA,IAAI,CAAC4N,KAAL,IAAc,EAAjE;AACA,QAAMikB,OAAO,GAAGz3B,OAAO,CAACkgC,QAAR,GAAmBlgC,OAAO,CAACkgC,QAAR,CAAiBt6B,IAAjB,CAAnB,GAA4CA,IAA5D;AAEA,QAAMosC,KAAK,GAAGp2C,yBAAC,CAAC,wDAAwD4X,KAAxD,GAAgE,gCAAhE,GAAmG5N,IAAnG,GAA0G,QAA3G,CAAf;AACAosC,IAAAA,KAAK,CAACp+B,IAAN,CAAW,CAAC6qB,IAAI,CAACz+B,OAAO,CAAC6gC,cAAT,CAAL,EAA+B,GAA/B,EAAoCpJ,OAApC,CAAX,EAAyD5e,IAAzD,CAA8D,MAA9D,EAAsEjT,IAAtE;AACA,WAAOosC,KAAP;AACD,GAP6C,CAA/B,GAOVhyC,OAAO,CAACq2B,KAPb;AASA5iB,EAAAA,KAAK,CAACG,IAAN,CAAWE,MAAX,EAAmBgE,IAAnB,CAAwB;AAAE,kBAAc9X,OAAO,CAACigC;AAAxB,GAAxB;AAEAxsB,EAAAA,KAAK,CAACqB,EAAN,CAAS,OAAT,EAAkB,uBAAlB,EAA2C,UAASkK,CAAT,EAAY;AACrD,QAAMizB,EAAE,GAAGr2C,yBAAC,CAAC,IAAD,CAAZ;AAEA,QAAMgK,IAAI,GAAGqsC,EAAE,CAACp5B,IAAH,CAAQ,MAAR,CAAb;AACA,QAAMrF,KAAK,GAAGy+B,EAAE,CAACp5B,IAAH,CAAQ,OAAR,CAAd;;AAEA,QAAIjT,IAAI,CAAC84B,KAAT,EAAgB;AACd94B,MAAAA,IAAI,CAAC84B,KAAL,CAAWuT,EAAX;AACD,KAFD,MAEO,IAAIjyC,OAAO,CAACkyC,SAAZ,EAAuB;AAC5BlyC,MAAAA,OAAO,CAACkyC,SAAR,CAAkBlzB,CAAlB,EAAqBpZ,IAArB,EAA2B4N,KAA3B;AACD;AACF,GAXD;;AAYA,MAAIxT,OAAO,IAAIA,OAAO,CAAC+uC,kBAAvB,EAA2C;AACzCt7B,IAAAA,KAAK,CAAC0a,QAAN,CAAe,oBAAf;AACD;AACF,CA3BqB,CAAtB;;AA6BA,IAAM4Q,sBAAsB,GAAG,SAAzBA,sBAAyB,CAAS5b,QAAT,EAAmBnjB,OAAnB,EAA4B;AACzD,SAAOmjB,QAAQ,GAAG,GAAX,GAAiBsb,IAAI,CAACz+B,OAAO,CAACsZ,KAAR,CAAc64B,KAAf,EAAsB,MAAtB,CAA5B;AACD,CAFD;;AAIA,IAAMC,cAAc,GAAG,SAAjBA,cAAiB,CAASC,GAAT,EAAcr6B,QAAd,EAAwB;AAC7C,SAAOwmB,WAAW,CAAC,CACjBP,sBAAM,CAAC;AACLpJ,IAAAA,SAAS,EAAE,iBADN;AAEL1R,IAAAA,QAAQ,EAAEkvB,GAAG,CAACpS,KAAJ,GAAY,GAAZ,GAAkBxB,IAAI,CAAC,iBAAD,CAF3B;AAGLllB,IAAAA,OAAO,EAAE84B,GAAG,CAAC94B,OAHR;AAILV,IAAAA,IAAI,EAAE;AACJ+kB,MAAAA,MAAM,EAAE;AADJ;AAJD,GAAD,CADW,EASjBoB,QAAQ,CAAC;AACPnK,IAAAA,SAAS,EAAEwd,GAAG,CAACxd,SADR;AAEPwB,IAAAA,KAAK,EAAEgc,GAAG,CAAChc,KAFJ;AAGP6J,IAAAA,QAAQ,EAAEmS,GAAG,CAACnS,QAHP;AAIPgS,IAAAA,SAAS,EAAEG,GAAG,CAACH;AAJR,GAAD,CATS,CAAD,EAef;AAAEl6B,IAAAA,QAAQ,EAAEA;AAAZ,GAfe,CAAX,CAeoBsnB,MAfpB,EAAP;AAgBD,CAjBD;;AAmBA,IAAMgT,mBAAmB,GAAG,SAAtBA,mBAAsB,CAASD,GAAT,EAAcr6B,QAAd,EAAwB;AAClD,SAAOwmB,WAAW,CAAC,CACjBP,sBAAM,CAAC;AACLpJ,IAAAA,SAAS,EAAE,iBADN;AAEL1R,IAAAA,QAAQ,EAAEkvB,GAAG,CAACpS,KAAJ,GAAY,GAAZ,GAAkBxB,IAAI,CAAC,iBAAD,CAF3B;AAGLllB,IAAAA,OAAO,EAAE84B,GAAG,CAAC94B,OAHR;AAILV,IAAAA,IAAI,EAAE;AACJ+kB,MAAAA,MAAM,EAAE;AADJ;AAJD,GAAD,CADW,EASjBgD,aAAa,CAAC;AACZ/L,IAAAA,SAAS,EAAEwd,GAAG,CAACxd,SADH;AAEZgM,IAAAA,cAAc,EAAEwR,GAAG,CAACxR,cAFR;AAGZxK,IAAAA,KAAK,EAAEgc,GAAG,CAAChc,KAHC;AAIZ6J,IAAAA,QAAQ,EAAEmS,GAAG,CAACnS,QAJF;AAKZgS,IAAAA,SAAS,EAAEG,GAAG,CAACH;AALH,GAAD,CATI,CAAD,EAgBf;AAAEl6B,IAAAA,QAAQ,EAAEA;AAAZ,GAhBe,CAAX,CAgBoBsnB,MAhBpB,EAAP;AAiBD,CAlBD;;AAoBA,IAAMiT,uBAAuB,GAAG,SAA1BA,uBAA0B,CAASF,GAAT,EAAc;AAC5C,SAAO7T,WAAW,CAAC,CACjBP,sBAAM,CAAC;AACLpJ,IAAAA,SAAS,EAAE,iBADN;AAEL1R,IAAAA,QAAQ,EAAEkvB,GAAG,CAACpS,KAAJ,GAAY,GAAZ,GAAkBxB,IAAI,CAAC,iBAAD,CAF3B;AAGLllB,IAAAA,OAAO,EAAE84B,GAAG,CAAC94B,OAHR;AAILV,IAAAA,IAAI,EAAE;AACJ+kB,MAAAA,MAAM,EAAE;AADJ;AAJD,GAAD,CADW,EASjBoB,QAAQ,CAAC,CACPR,WAAW,CAAC;AACV3J,IAAAA,SAAS,EAAE,YADD;AAEVvO,IAAAA,QAAQ,EAAE+rB,GAAG,CAAChc,KAAJ,CAAU,CAAV;AAFA,GAAD,CADJ,EAKPmI,WAAW,CAAC;AACV3J,IAAAA,SAAS,EAAE,WADD;AAEVvO,IAAAA,QAAQ,EAAE+rB,GAAG,CAAChc,KAAJ,CAAU,CAAV;AAFA,GAAD,CALJ,CAAD,CATS,CAAD,CAAX,CAmBJiJ,MAnBI,EAAP;AAoBD,CArBD;;AAuBA,IAAM4C,gBAAgB,GAAG,SAAnBA,gBAAmB,CAAS3pB,KAAT,EAAgBypB,GAAhB,EAAqBhZ,GAArB,EAA0B;AACjD,MAAM8a,SAAS,GAAG,EAAlB;AACA,MAAMpE,OAAO,GAAG9jC,yBAAC,CAAC2c,KAAK,CAACI,MAAN,CAAanL,UAAd,CAAjB,CAFiD,CAEL;;AAC5C,MAAMu2B,iBAAiB,GAAGrE,OAAO,CAACp1B,IAAR,EAA1B;AACA,MAAMw3B,QAAQ,GAAGpC,OAAO,CAAC32B,IAAR,CAAa,qCAAb,CAAjB;AACA,MAAMi7B,YAAY,GAAGtE,OAAO,CAAC32B,IAAR,CAAa,oCAAb,CAArB;AACA,MAAMk7B,cAAc,GAAGvE,OAAO,CAAC32B,IAAR,CAAa,sCAAb,CAAvB;AAEA,MAAIm7B,SAAJ,CARiD,CASjD;;AACA,MAAI3rB,KAAK,CAAC4rB,OAAN,KAAkB7zB,SAAtB,EAAiC;AAC/B,QAAM8zB,UAAU,GAAGxoC,yBAAC,CAAC2c,KAAK,CAACI,MAAP,CAAD,CAAgBrJ,MAAhB,EAAnB;AACA40B,IAAAA,SAAS,GAAG;AACVtO,MAAAA,CAAC,EAAErd,KAAK,CAAC8rB,KAAN,GAAcD,UAAU,CAAC7jC,IADlB;AAEVo1B,MAAAA,CAAC,EAAEpd,KAAK,CAAC+rB,KAAN,GAAcF,UAAU,CAAC19B;AAFlB,KAAZ;AAID,GAND,MAMO;AACLw9B,IAAAA,SAAS,GAAG;AACVtO,MAAAA,CAAC,EAAErd,KAAK,CAAC4rB,OADC;AAEVxO,MAAAA,CAAC,EAAEpd,KAAK,CAACgsB;AAFC,KAAZ;AAID;;AAED,MAAMjT,GAAG,GAAG;AACVkT,IAAAA,CAAC,EAAE5nB,IAAI,CAAC6nB,IAAL,CAAUP,SAAS,CAACtO,CAAV,GAAckO,SAAxB,KAAsC,CAD/B;AAEVY,IAAAA,CAAC,EAAE9nB,IAAI,CAAC6nB,IAAL,CAAUP,SAAS,CAACvO,CAAV,GAAcmO,SAAxB,KAAsC;AAF/B,GAAZ;AAKAE,EAAAA,YAAY,CAACthB,GAAb,CAAiB;AAAEtf,IAAAA,KAAK,EAAEkuB,GAAG,CAACkT,CAAJ,GAAQ,IAAjB;AAAuBnoC,IAAAA,MAAM,EAAEi1B,GAAG,CAACoT,CAAJ,GAAQ;AAAvC,GAAjB;AACA5C,EAAAA,QAAQ,CAACjpB,IAAT,CAAc,OAAd,EAAuByY,GAAG,CAACkT,CAAJ,GAAQ,GAAR,GAAclT,GAAG,CAACoT,CAAzC;;AAEA,MAAIpT,GAAG,CAACkT,CAAJ,GAAQ,CAAR,IAAalT,GAAG,CAACkT,CAAJ,GAAQxC,GAAzB,EAA8B;AAC5BiC,IAAAA,cAAc,CAACvhB,GAAf,CAAmB;AAAEtf,MAAAA,KAAK,EAAEkuB,GAAG,CAACkT,CAAJ,GAAQ,CAAR,GAAY;AAArB,KAAnB;AACD;;AAED,MAAIlT,GAAG,CAACoT,CAAJ,GAAQ,CAAR,IAAapT,GAAG,CAACoT,CAAJ,GAAQ1b,GAAzB,EAA8B;AAC5Bib,IAAAA,cAAc,CAACvhB,GAAf,CAAmB;AAAErmB,MAAAA,MAAM,EAAEi1B,GAAG,CAACoT,CAAJ,GAAQ,CAAR,GAAY;AAAtB,KAAnB;AACD;;AAEDX,EAAAA,iBAAiB,CAACnwB,IAAlB,CAAuB0d,GAAG,CAACkT,CAAJ,GAAQ,KAAR,GAAgBlT,GAAG,CAACoT,CAA3C;AACD,CAxCD;;AA0CA,IAAM8N,mBAAmB,GAAG,SAAtBA,mBAAsB,CAASH,GAAT,EAAc;AACxC,SAAO7T,WAAW,CAAC,CACjBP,sBAAM,CAAC;AACLpJ,IAAAA,SAAS,EAAE,iBADN;AAEL1R,IAAAA,QAAQ,EAAEkvB,GAAG,CAACpS,KAAJ,GAAY,GAAZ,GAAkBxB,IAAI,CAAC,iBAAD,CAF3B;AAGLllB,IAAAA,OAAO,EAAE84B,GAAG,CAAC94B,OAHR;AAILV,IAAAA,IAAI,EAAE;AACJ+kB,MAAAA,MAAM,EAAE;AADJ;AAJD,GAAD,CADW,EASjBoB,QAAQ,CAAC;AACPnK,IAAAA,SAAS,EAAE,YADJ;AAEPwB,IAAAA,KAAK,EAAE,CACL,qCADK,EAEH,kGAFG,EAGH,uDAHG,EAIH,yDAJG,EAKL,QALK,EAML,iDANK,EAOL1uB,IAPK,CAOA,EAPA;AAFA,GAAD,CATS,CAAD,EAoBf;AACDqQ,IAAAA,QAAQ,EAAE,kBAASvE,KAAT,EAAgB;AACxB,UAAMquB,QAAQ,GAAGruB,KAAK,CAAC1K,IAAN,CAAW,qCAAX,CAAjB;AACA+4B,MAAAA,QAAQ,CAACpf,GAAT,CAAa;AACXtf,QAAAA,KAAK,EAAEivC,GAAG,CAACrQ,GAAJ,GAAU,IADN;AAEX3lC,QAAAA,MAAM,EAAEg2C,GAAG,CAACrpB,GAAJ,GAAU;AAFP,OAAb,EAIGiZ,OAJH,CAIWoQ,GAAG,CAACH,SAJf,EAKGO,SALH,CAKa,UAASzzB,CAAT,EAAY;AACrBkjB,QAAAA,gBAAgB,CAACljB,CAAD,EAAIqzB,GAAG,CAACrQ,GAAR,EAAaqQ,GAAG,CAACrpB,GAAjB,CAAhB;AACD,OAPH;AAQD;AAXA,GApBe,CAAX,CAgCJsW,MAhCI,EAAP;AAiCD,CAlCD;;AAoCA,IAAMH,OAAO,GAAG0S,eAAA,CAAgB,wCAAhB,EAA0D,UAASp+B,KAAT,EAAgBzT,OAAhB,EAAyB;AACjG,MAAMmjB,QAAQ,GAAG,EAAjB;;AACA,OAAK,IAAI6F,GAAG,GAAG,CAAV,EAAa0pB,OAAO,GAAG1yC,OAAO,CAACo/B,MAAR,CAAez2B,MAA3C,EAAmDqgB,GAAG,GAAG0pB,OAAzD,EAAkE1pB,GAAG,EAArE,EAAyE;AACvE,QAAMgK,SAAS,GAAGhzB,OAAO,CAACgzB,SAA1B;AACA,QAAMoM,MAAM,GAAGp/B,OAAO,CAACo/B,MAAR,CAAepW,GAAf,CAAf;AACA,QAAMqW,UAAU,GAAGr/B,OAAO,CAACq/B,UAAR,CAAmBrW,GAAnB,CAAnB;AACA,QAAM5R,OAAO,GAAG,EAAhB;;AACA,SAAK,IAAI4qB,GAAG,GAAG,CAAV,EAAa2Q,OAAO,GAAGvT,MAAM,CAACz2B,MAAnC,EAA2Cq5B,GAAG,GAAG2Q,OAAjD,EAA0D3Q,GAAG,EAA7D,EAAiE;AAC/D,UAAMrhC,KAAK,GAAGy+B,MAAM,CAAC4C,GAAD,CAApB;AACA,UAAM4Q,SAAS,GAAGvT,UAAU,CAAC2C,GAAD,CAA5B;AACA5qB,MAAAA,OAAO,CAACjN,IAAR,CAAa,CACX,uDADW,EAEX,0BAFW,EAEiBxJ,KAFjB,EAEwB,IAFxB,EAGX,cAHW,EAGKqyB,SAHL,EAGgB,IAHhB,EAIX,cAJW,EAIKryB,KAJL,EAIY,IAJZ,EAKX,cALW,EAKKiyC,SALL,EAKgB,IALhB,EAMX,cANW,EAMKA,SANL,EAMgB,IANhB,EAOX,8CAPW,EAQXjrC,IARW,CAQN,EARM,CAAb;AASD;;AACDwb,IAAAA,QAAQ,CAAChZ,IAAT,CAAc,iCAAiCiN,OAAO,CAACzP,IAAR,CAAa,EAAb,CAAjC,GAAoD,QAAlE;AACD;;AACD8L,EAAAA,KAAK,CAACG,IAAN,CAAWuP,QAAQ,CAACxb,IAAT,CAAc,EAAd,CAAX;AAEA8L,EAAAA,KAAK,CAAC1K,IAAN,CAAW,iBAAX,EAA8BmG,IAA9B,CAAmC,YAAW;AAC5CtT,IAAAA,yBAAC,CAAC,IAAD,CAAD,CAAQid,IAAR,CAAa,eAAb,EAA8B,IAAI23B,YAAJ,CAAc50C,yBAAC,CAAC,IAAD,CAAf,EAAuB;AACnD8W,MAAAA,SAAS,EAAE1S,OAAO,CAAC0S;AADgC,KAAvB,CAA9B;AAGD,GAJD;AAKD,CA7Be,CAAhB;;AA+BA,IAAMmgC,mBAAmB,GAAG,SAAtBA,mBAAsB,CAASR,GAAT,EAAcn5B,IAAd,EAAoB;AAC9C,SAAOslB,WAAW,CAAC;AACjB3J,IAAAA,SAAS,EAAE,YADM;AAEjBvO,IAAAA,QAAQ,EAAE,CACR2X,sBAAM,CAAC;AACLpJ,MAAAA,SAAS,EAAE,2BADN;AAEL1R,MAAAA,QAAQ,EAAEkvB,GAAG,CAACpS,KAFT;AAGL1mB,MAAAA,OAAO,EAAE84B,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeC,MAHnB;AAIL89B,MAAAA,KAAK,EAAE2T,GAAG,CAACS,YAJN;AAKL96B,MAAAA,QAAQ,EAAE,kBAAS2mB,OAAT,EAAkB;AAC1B,YAAME,YAAY,GAAGF,OAAO,CAAC51B,IAAR,CAAa,oBAAb,CAArB;;AAEA,YAAImQ,IAAI,KAAK,WAAb,EAA0B;AACxB2lB,UAAAA,YAAY,CAACnc,GAAb,CAAiB,kBAAjB,EAAqC,SAArC;AACAic,UAAAA,OAAO,CAAC7mB,IAAR,CAAa,gBAAb,EAA+B,SAA/B;AACD;AACF;AAZI,KAAD,CADE,EAeRmmB,sBAAM,CAAC;AACLpJ,MAAAA,SAAS,EAAE,iBADN;AAEL1R,MAAAA,QAAQ,EAAEsb,IAAI,CAAC,iBAAD,CAFT;AAGLllB,MAAAA,OAAO,EAAE84B,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeE,IAHnB;AAILgY,MAAAA,IAAI,EAAE;AACJ+kB,QAAAA,MAAM,EAAE;AADJ;AAJD,KAAD,CAfE,EAuBRoB,QAAQ,CAAC;AACP3I,MAAAA,KAAK,EAAE,CACL,OADK,EAEH,mDAFG,EAGD,qCAAqCgc,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeG,UAApD,GAAiE,QAHhE,EAIH,OAJG,EAKH,yHALG,EAMDuxC,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeK,WANd,EAOH,WAPG,EAQL,QARK,EASL,wDATK,EAUH,sBAVG,EAWD,qHAXC,EAYD,qGAZC,EAaCqxC,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeS,QAbhB,EAcD,WAdC,EAeH,QAfG,EAgBL,QAhBK,EAiBL,mDAjBK,EAkBH,qCAAqCixC,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeI,UAApD,GAAiE,QAlB9D,EAmBH,OAnBG,EAoBD,0HApBC,EAqBCsxC,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeQ,cArBhB,EAsBD,WAtBC,EAuBH,QAvBG,EAwBH,wDAxBG,EAyBD,sBAzBC,EA0BC,qHA1BD,EA2BC,qGA3BD,EA4BGkxC,GAAG,CAACv2C,IAAJ,CAAS6E,KAAT,CAAeS,QA5BlB,EA6BC,WA7BD,EA8BD,QA9BC,EA+BH,QA/BG,EAgCL,QAhCK,EAiCLuG,IAjCK,CAiCA,EAjCA,CADA;AAmCPqQ,MAAAA,QAAQ,EAAE,kBAASinB,SAAT,EAAoB;AAC5BA,QAAAA,SAAS,CAACl2B,IAAV,CAAe,cAAf,EAA+BmG,IAA/B,CAAoC,YAAW;AAC7C,cAAMgwB,OAAO,GAAGtjC,yBAAC,CAAC,IAAD,CAAjB;AACAsjC,UAAAA,OAAO,CAAC/S,MAAR,CAAegT,OAAO,CAAC;AACrBC,YAAAA,MAAM,EAAEiT,GAAG,CAACjT,MADS;AAErBpM,YAAAA,SAAS,EAAEkM,OAAO,CAACrmB,IAAR,CAAa,OAAb;AAFU,WAAD,CAAP,CAGZymB,MAHY,EAAf;AAID,SAND;;AAQA,YAAIpmB,IAAI,KAAK,MAAb,EAAqB;AACnB+lB,UAAAA,SAAS,CAACl2B,IAAV,CAAe,uBAAf,EAAwC2N,IAAxC;AACAuoB,UAAAA,SAAS,CAACvc,GAAV,CAAc;AAAE,yBAAa;AAAf,WAAd;AACD,SAHD,MAGO,IAAIxJ,IAAI,KAAK,MAAb,EAAqB;AAC1B+lB,UAAAA,SAAS,CAACl2B,IAAV,CAAe,uBAAf,EAAwC2N,IAAxC;AACAuoB,UAAAA,SAAS,CAACvc,GAAV,CAAc;AAAE,yBAAa;AAAf,WAAd;AACD;AACF,OAnDM;AAoDPgc,MAAAA,KAAK,EAAE,eAASnmB,KAAT,EAAgB;AACrB,YAAMomB,OAAO,GAAG/iC,yBAAC,CAAC2c,KAAK,CAACI,MAAP,CAAjB;AACA,YAAMqa,SAAS,GAAG2L,OAAO,CAAC9lB,IAAR,CAAa,OAAb,CAAlB;AACA,YAAIrF,KAAK,GAAGmrB,OAAO,CAAC9lB,IAAR,CAAa,OAAb,CAAZ;AACA,YAAMk6B,SAAS,GAAGjwC,QAAQ,CAACkwC,cAAT,CAAwB,UAAxB,EAAoCx/B,KAAtD;AACA,YAAMy/B,SAAS,GAAGnwC,QAAQ,CAACkwC,cAAT,CAAwB,UAAxB,EAAoCx/B,KAAtD;;AACA,YAAIA,KAAK,KAAK,IAAd,EAAoB;AAClB+E,UAAAA,KAAK,CAAC0hB,eAAN;AACD,SAFD,MAEO,IAAIzmB,KAAK,KAAK,aAAd,EAA6B;AAClCA,UAAAA,KAAK,GAAGy/B,SAAR;AACD,SAFM,MAEA,IAAIz/B,KAAK,KAAK,aAAd,EAA6B;AAClCA,UAAAA,KAAK,GAAGu/B,SAAR;AACD;;AAED,YAAI/f,SAAS,IAAIxf,KAAjB,EAAwB;AACtB,cAAMxM,GAAG,GAAGgsB,SAAS,KAAK,WAAd,GAA4B,kBAA5B,GAAiD,OAA7D;AACA,cAAM6M,MAAM,GAAGlB,OAAO,CAAC/lB,OAAR,CAAgB,aAAhB,EAA+B7P,IAA/B,CAAoC,oBAApC,CAAf;AACA,cAAM+2B,cAAc,GAAGnB,OAAO,CAAC/lB,OAAR,CAAgB,aAAhB,EAA+B7P,IAA/B,CAAoC,4BAApC,CAAvB;AAEA82B,UAAAA,MAAM,CAACnd,GAAP,CAAW1b,GAAX,EAAgBwM,KAAhB;AACAssB,UAAAA,cAAc,CAAChoB,IAAf,CAAoB,UAAUkb,SAA9B,EAAyCxf,KAAzC;;AAEA,cAAI0F,IAAI,KAAK,MAAb,EAAqB;AACnBm5B,YAAAA,GAAG,CAACH,SAAJ,CAAc,WAAd,EAA2B1+B,KAA3B;AACD,WAFD,MAEO,IAAI0F,IAAI,KAAK,MAAb,EAAqB;AAC1Bm5B,YAAAA,GAAG,CAACH,SAAJ,CAAc,WAAd,EAA2B1+B,KAA3B;AACD,WAFM,MAEA;AACL6+B,YAAAA,GAAG,CAACH,SAAJ,CAAclf,SAAd,EAAyBxf,KAAzB;AACD;AACF;AACF;AAlFM,KAAD,CAvBA;AAFO,GAAD,CAAX,CA8GJ8rB,MA9GI,EAAP;AA+GD,CAhHD;;AAkHA,IAAMoH,MAAM,GAAGmL,eAAA,CAAgB,gFAAhB,EAAkG,UAASp+B,KAAT,EAAgBzT,OAAhB,EAAyB;AACxI,MAAIA,OAAO,CAAC2mC,IAAZ,EAAkB;AAChBlzB,IAAAA,KAAK,CAAC0a,QAAN,CAAe,MAAf;AACD;;AACD1a,EAAAA,KAAK,CAACqE,IAAN,CAAW;AACT,kBAAc9X,OAAO,CAACigC;AADb,GAAX;AAGAxsB,EAAAA,KAAK,CAACG,IAAN,CAAW,CACT,kCADS,EAEN5T,OAAO,CAACigC,KAAR,GAAgB,mLAAmLjgC,OAAO,CAACigC,KAA3L,GAAmM,aAAnN,GAAmO,EAF7N,EAGP,kCAAkCjgC,OAAO,CAACga,IAA1C,GAAiD,QAH1C,EAINha,OAAO,CAACwmC,MAAR,GAAiB,oCAAoCxmC,OAAO,CAACwmC,MAA5C,GAAqD,QAAtE,GAAiF,EAJ3E,EAKT,QALS,EAMT7+B,IANS,CAMJ,EANI,CAAX;AAQA8L,EAAAA,KAAK,CAACoF,IAAN,CAAW,OAAX,EAAoB,IAAI44B,UAAJ,CAAYh+B,KAAZ,EAAmBzT,OAAnB,CAApB;AACD,CAhBc,CAAf;;AAkBA,IAAMkzC,WAAW,GAAG,SAAdA,WAAc,CAASb,GAAT,EAAc;AAChC,MAAMr4B,IAAI,GAAG,kCACX,oCADW,GAC4Bq4B,GAAG,CAAC/rC,EADhC,GACqC,4BADrC,GACoE+rC,GAAG,CAACv2C,IAAJ,CAASmC,KAAT,CAAeH,GADnF,GACyF,6BADzF,GACyHu0C,GAAG,CAACv2C,IAAJ,CAASmC,KAAT,CAAeE,SADxI,GACoJ,kBADpJ,GAEX,mCAFW,GAE2Bk0C,GAAG,CAAC/rC,EAF/B,GAEoC,mDAFpC,GAGb,QAHA;AAIA,MAAMkgC,MAAM,GAAG,CACb,oGADa,EAEX6L,GAAG,CAACv2C,IAAJ,CAASmC,KAAT,CAAepB,MAFJ,EAGb,WAHa,EAIb8K,IAJa,CAIR,EAJQ,CAAf;AAMA,SAAO++B,MAAM,CAAC;AACZzG,IAAAA,KAAK,EAAEoS,GAAG,CAACv2C,IAAJ,CAASmC,KAAT,CAAepB,MADV;AAEZ8pC,IAAAA,IAAI,EAAE0L,GAAG,CAAC1L,IAFE;AAGZ3sB,IAAAA,IAAI,EAAEA,IAHM;AAIZwsB,IAAAA,MAAM,EAAEA;AAJI,GAAD,CAAN,CAKJlH,MALI,EAAP;AAMD,CAjBD;;AAmBA,IAAM6T,WAAW,GAAG,SAAdA,WAAc,CAASd,GAAT,EAAc;AAChC,MAAMr4B,IAAI,GAAG,+DACX,qCADW,GAC6Bq4B,GAAG,CAAC/rC,EADjC,GACsC,4BADtC,GACqE+rC,GAAG,CAACv2C,IAAJ,CAASc,KAAT,CAAee,eADpF,GACsG,UADtG,GAEX,oCAFW,GAE4B00C,GAAG,CAAC/rC,EAFhC,GAEqC,4GAFrC,GAGX+rC,GAAG,CAAC/J,eAHO,GAIb,QAJa,GAKb,+BALa,GAMX,oCANW,GAM4B+J,GAAG,CAAC/rC,EANhC,GAMqC,4BANrC,GAMoE+rC,GAAG,CAACv2C,IAAJ,CAASc,KAAT,CAAekB,GANnF,GAMyF,UANzF,GAOX,mCAPW,GAO2Bu0C,GAAG,CAAC/rC,EAP/B,GAOoC,mDAPpC,GAQb,QARA;AASA,MAAMkgC,MAAM,GAAG,CACb,mHADa,EAEX6L,GAAG,CAACv2C,IAAJ,CAASc,KAAT,CAAeC,MAFJ,EAGb,WAHa,EAIb8K,IAJa,CAIR,EAJQ,CAAf;AAMA,SAAO++B,MAAM,CAAC;AACZzG,IAAAA,KAAK,EAAEoS,GAAG,CAACv2C,IAAJ,CAASc,KAAT,CAAeC,MADV;AAEZ8pC,IAAAA,IAAI,EAAE0L,GAAG,CAAC1L,IAFE;AAGZ3sB,IAAAA,IAAI,EAAEA,IAHM;AAIZwsB,IAAAA,MAAM,EAAEA;AAJI,GAAD,CAAN,CAKJlH,MALI,EAAP;AAMD,CAtBD;;AAwBA,IAAM8T,UAAU,GAAG,SAAbA,UAAa,CAASf,GAAT,EAAc;AAC/B,MAAMr4B,IAAI,GAAG,kCACX,mCADW,GAC2Bq4B,GAAG,CAAC/rC,EAD/B,GACoC,4BADpC,GACmE+rC,GAAG,CAACv2C,IAAJ,CAASsC,IAAT,CAAcG,aADjF,GACiG,UADjG,GAEX,kCAFW,GAE0B8zC,GAAG,CAAC/rC,EAF9B,GAEmC,mDAFnC,GAGb,QAHa,GAIb,+BAJa,GAKX,mCALW,GAK2B+rC,GAAG,CAAC/rC,EAL/B,GAKoC,4BALpC,GAKmE+rC,GAAG,CAACv2C,IAAJ,CAASsC,IAAT,CAAcN,GALjF,GAKuF,UALvF,GAMX,kCANW,GAM0Bu0C,GAAG,CAAC/rC,EAN9B,GAMmC,kEANnC,GAOb,QAPa,IAQZ,CAAC+rC,GAAG,CAACjM,iBAAL,GAAyB,2DAA2DiM,GAAG,CAAC/rC,EAA/D,GAAoE,mCAApE,GAA0G+rC,GAAG,CAAC/rC,EAA9G,GAAmH,6BAAnH,GAAmJ+rC,GAAG,CAACv2C,IAAJ,CAASsC,IAAT,CAAcI,eAAjK,GAAmL,gBAA5M,GAA+N,EARnN,IASb,wDATa,GAS8C6zC,GAAG,CAAC/rC,EATlD,GASuD,mCATvD,GAS6F+rC,GAAG,CAAC/rC,EATjG,GASsG,6BATtG,GASsI+rC,GAAG,CAACv2C,IAAJ,CAASsC,IAAT,CAAcK,WATpJ,GASkK,gBAT/K;AAUA,MAAM+nC,MAAM,GAAG,CACb,mGADa,EAEX6L,GAAG,CAACv2C,IAAJ,CAASsC,IAAT,CAAcvB,MAFH,EAGb,WAHa,EAIb8K,IAJa,CAIR,EAJQ,CAAf;AAMA,SAAO++B,MAAM,CAAC;AACZ7R,IAAAA,SAAS,EAAE,aADC;AAEZoL,IAAAA,KAAK,EAAEoS,GAAG,CAACv2C,IAAJ,CAASsC,IAAT,CAAcvB,MAFT;AAGZ8pC,IAAAA,IAAI,EAAE0L,GAAG,CAAC1L,IAHE;AAIZ3sB,IAAAA,IAAI,EAAEA,IAJM;AAKZwsB,IAAAA,MAAM,EAAEA;AALI,GAAD,CAAN,CAMJlH,MANI,EAAP;AAOD,CAxBD;;AA0BA,IAAM2I,OAAO,GAAG4J,eAAA,CAAgB,CAC9B,mCAD8B,EAE5B,wCAF4B,EAG5B,6DAH4B,EAI9B,QAJ8B,EAK9BlqC,IAL8B,CAKzB,EALyB,CAAhB,EAKJ,UAAS8L,KAAT,EAAgBzT,OAAhB,EAAyB;AACnC,MAAMitC,SAAS,GAAG,OAAOjtC,OAAO,CAACitC,SAAf,KAA6B,WAA7B,GAA2CjtC,OAAO,CAACitC,SAAnD,GAA+D,QAAjF;AAEAx5B,EAAAA,KAAK,CAAC0a,QAAN,CAAe8e,SAAf,EAA0Bv2B,IAA1B;;AAEA,MAAI1W,OAAO,CAACqtC,SAAZ,EAAuB;AACrB55B,IAAAA,KAAK,CAAC1K,IAAN,CAAW,qBAAX,EAAkC2N,IAAlC;AACD;AACF,CAbe,CAAhB;AAeA,IAAM2vB,wBAAQ,GAAGwL,eAAA,CAAgB,8BAAhB,EAAgD,UAASp+B,KAAT,EAAgBzT,OAAhB,EAAyB;AACxFyT,EAAAA,KAAK,CAACG,IAAN,CAAW,CACT,YAAY5T,OAAO,CAACsG,EAAR,GAAa,gBAAgBtG,OAAO,CAACsG,EAAxB,GAA6B,GAA1C,GAAgD,EAA5D,IAAkE,GADzD,EAEP,4CAA4CtG,OAAO,CAACsG,EAAR,GAAa,eAAetG,OAAO,CAACsG,EAAvB,GAA4B,GAAzC,GAA+C,EAA3F,CAFO,EAGNtG,OAAO,CAACsmC,OAAR,GAAkB,UAAlB,GAA+B,EAHzB,EAIP,qBAAqBtmC,OAAO,CAACsmC,OAAR,GAAkB,MAAlB,GAA2B,OAAhD,IAA2D,KAJpD,EAKNtmC,OAAO,CAAC8S,IAAR,GAAe9S,OAAO,CAAC8S,IAAvB,GAA8B,EALxB,EAMT,UANS,EAOTnL,IAPS,CAOJ,EAPI,CAAX;AAQD,CATgB,CAAjB;;AAWA,IAAM82B,IAAI,GAAG,SAAPA,IAAO,CAAS4U,aAAT,EAAwBzrB,OAAxB,EAAiC;AAC5C,MAAIyrB,aAAa,CAACr/B,KAAd,CAAoB,IAApB,CAAJ,EAA+B;AAC7B,WAAOq/B,aAAP;AACD;;AACDzrB,EAAAA,OAAO,GAAGA,OAAO,IAAI,GAArB;AACA,SAAO,MAAMA,OAAN,GAAgB,UAAhB,GAA6ByrB,aAA7B,GAA6C,MAA7C,GAAsDzrB,OAAtD,GAAgE,GAAvE;AACD,CAND;;AAQA,IAAMvR,EAAE,GAAG,SAALA,EAAK,CAASi9B,aAAT,EAAwB;AACjC,SAAO;AACLn8B,IAAAA,MAAM,EAAEA,MADH;AAELwjB,IAAAA,OAAO,EAAEA,OAFJ;AAGLW,IAAAA,WAAW,EAAEA,WAHR;AAIL1jB,IAAAA,OAAO,EAAEA,OAJJ;AAKLC,IAAAA,QAAQ,EAAEA,QALL;AAMLkiB,IAAAA,SAAS,EAAEA,SANN;AAOL+X,IAAAA,SAAS,EAAEA,SAPN;AAQLC,IAAAA,WAAW,EAAEA,WARR;AASLvT,IAAAA,WAAW,EAAEA,WATR;AAULP,IAAAA,MAAM,EAAEA,sBAVH;AAWLe,IAAAA,QAAQ,EAAEA,QAXL;AAYL4B,IAAAA,aAAa,EAAEA,aAZV;AAaLwR,IAAAA,cAAc,EAAEA,cAbX;AAcLrT,IAAAA,sBAAsB,EAAEA,sBAdnB;AAeLuT,IAAAA,mBAAmB,EAAEA,mBAfhB;AAgBLC,IAAAA,uBAAuB,EAAEA,uBAhBpB;AAiBLC,IAAAA,mBAAmB,EAAEA,mBAjBhB;AAkBLK,IAAAA,mBAAmB,EAAEA,mBAlBhB;AAmBL1T,IAAAA,OAAO,EAAEA,OAnBJ;AAoBLuH,IAAAA,MAAM,EAAEA,MApBH;AAqBLwM,IAAAA,WAAW,EAAEA,WArBR;AAsBLC,IAAAA,WAAW,EAAEA,WAtBR;AAuBLC,IAAAA,UAAU,EAAEA,UAvBP;AAwBLnL,IAAAA,OAAO,EAAEA,OAxBJ;AAyBL5B,IAAAA,QAAQ,EAAEA,wBAzBL;AA0BL5H,IAAAA,IAAI,EAAEA,IA1BD;AA2BLz+B,IAAAA,OAAO,EAAEszC,aA3BJ;AA6BLtN,IAAAA,SAAS,EAAE,mBAASD,IAAT,EAAewN,QAAf,EAAyB;AAClCxN,MAAAA,IAAI,CAACnU,WAAL,CAAiB,UAAjB,EAA6B,CAAC2hB,QAA9B;AACAxN,MAAAA,IAAI,CAACjuB,IAAL,CAAU,UAAV,EAAsB,CAACy7B,QAAvB;AACD,KAhCI;AAkCL1P,IAAAA,eAAe,EAAE,yBAASkC,IAAT,EAAeyN,QAAf,EAAyB;AACxCzN,MAAAA,IAAI,CAACnU,WAAL,CAAiB,QAAjB,EAA2B4hB,QAA3B;AACD,KApCI;AAsCLC,IAAAA,KAAK,EAAE,eAASC,IAAT,EAAelgC,KAAf,EAAsB;AAC3BkgC,MAAAA,IAAI,CAAC3qC,IAAL,CAAU,UAAV,EAAsB6rB,WAAtB,CAAkC,SAAlC;AACA8e,MAAAA,IAAI,CAAC3qC,IAAL,CAAU,kBAAkByK,KAAlB,GAA0B,IAApC,EAA0C2a,QAA1C,CAAmD,SAAnD;AACD,KAzCI;AA2CLiZ,IAAAA,aAAa,EAAE,uBAASX,OAAT,EAAkBn1B,OAAlB,EAA2B;AACxCm1B,MAAAA,OAAO,CAACjkB,GAAR,CAAY,iBAAZ,EAA+BlR,OAA/B;AACD,KA7CI;AA+CLo2B,IAAAA,cAAc,EAAE,wBAASjB,OAAT,EAAkBn1B,OAAlB,EAA2B;AACzCm1B,MAAAA,OAAO,CAACjkB,GAAR,CAAY,iBAAZ,EAA+BlR,OAA/B;AACD,KAjDI;AAmDLs2B,IAAAA,UAAU,EAAE,oBAASnB,OAAT,EAAkB;AAC5BA,MAAAA,OAAO,CAAC5tB,IAAR,CAAa,OAAb,EAAsBsb,IAAtB;AACD,KArDI;AAuDL0S,IAAAA,UAAU,EAAE,oBAASJ,OAAT,EAAkB;AAC5BA,MAAAA,OAAO,CAAC5tB,IAAR,CAAa,OAAb,EAAsBnC,IAAtB;AACD,KAzDI;;AA2DL;AACJ;AACA;AACA;AACA;AACA;AACIi9B,IAAAA,iBAAiB,EAAE,2BAAS3L,QAAT,EAAmB;AACpC,aAAOA,QAAQ,CAACj/B,IAAT,CAAc,uBAAd,CAAP;AACD,KAnEI;;AAqEL;AACJ;AACA;AACA;AACA;AACA;AACI6qC,IAAAA,aAAa,EAAE,uBAASnN,OAAT,EAAkB;AAC/B,aAAOA,OAAO,CAAC19B,IAAR,CAAa,kBAAb,CAAP;AACD,KA7EI;AA+ELyN,IAAAA,YAAY,EAAE,sBAASP,KAAT,EAAgB;AAC5B,UAAMqY,OAAO,GAAG,CAACglB,aAAa,CAACjhB,OAAd,GAAwByf,SAAS,CAAC,CACjDxW,WAAW,CAAC,CACV1jB,OAAO,EADG,EAEVm6B,WAAW,EAFD,CAAD,CADsC,CAAD,CAAjC,GAKXuB,aAAa,CAACxE,eAAd,KAAkC,QAAlC,GACF33B,MAAM,CAAC,CACPmkB,WAAW,CAAC,CACV1jB,OAAO,EADG,EAEVC,QAAQ,EAFE,CAAD,CADJ,EAKP8iB,OAAO,EALA,EAMPZ,SAAS,EANF,CAAD,CADJ,GASF5iB,MAAM,CAAC,CACPwjB,OAAO,EADA,EAEPW,WAAW,CAAC,CACV1jB,OAAO,EADG,EAEVC,QAAQ,EAFE,CAAD,CAFJ,EAMPkiB,SAAS,EANF,CAAD,CAdM,EAsBbuF,MAtBa,EAAhB;AAwBAhR,MAAAA,OAAO,CAACxf,WAAR,CAAoBmH,KAApB;AAEA,aAAO;AACLuD,QAAAA,IAAI,EAAEvD,KADD;AAELkB,QAAAA,MAAM,EAAEmX,OAFH;AAGLqM,QAAAA,OAAO,EAAErM,OAAO,CAACvlB,IAAR,CAAa,eAAb,CAHJ;AAILuyB,QAAAA,WAAW,EAAEhN,OAAO,CAACvlB,IAAR,CAAa,oBAAb,CAJR;AAKL8O,QAAAA,QAAQ,EAAEyW,OAAO,CAACvlB,IAAR,CAAa,gBAAb,CALL;AAML6O,QAAAA,OAAO,EAAE0W,OAAO,CAACvlB,IAAR,CAAa,eAAb,CANJ;AAOLgxB,QAAAA,SAAS,EAAEzL,OAAO,CAACvlB,IAAR,CAAa,iBAAb;AAPN,OAAP;AASD,KAnHI;AAqHL8N,IAAAA,YAAY,EAAE,sBAASZ,KAAT,EAAgBG,UAAhB,EAA4B;AACxCH,MAAAA,KAAK,CAACrC,IAAN,CAAWwC,UAAU,CAACyB,QAAX,CAAoBjE,IAApB,EAAX;AACAwC,MAAAA,UAAU,CAACe,MAAX,CAAkBpZ,MAAlB;AACAkY,MAAAA,KAAK,CAACjB,GAAN,CAAU,YAAV,EAHwC,CAGf;;AACzBiB,MAAAA,KAAK,CAACke,IAAN;AACD;AA1HI,GAAP;AA4HD,CA7HD;;AA+HAv4B,sCAAA,GAAeA,gCAAA,CAASA,sCAAT,EAAuB;AACpC0a,EAAAA,WAAW,EAAED,EADuB;AAEpC,eAAW;AAFyB,CAAvB,CAAf","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-en-US.js","webpack:///external umd \"jQuery\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/js/core/env.js","webpack:///./src/js/core/func.js","webpack:///./src/js/core/lists.js","webpack:///./src/js/core/dom.js","webpack:///./src/js/Context.js","webpack:///./src/js/summernote.js","webpack:///./src/js/core/range.js","webpack:///./src/js/core/key.js","webpack:///./src/js/core/async.js","webpack:///./src/js/editing/History.js","webpack:///./src/js/editing/Style.js","webpack:///./src/js/editing/Bullet.js","webpack:///./src/js/editing/Typing.js","webpack:///./src/js/editing/Table.js","webpack:///./src/js/module/Editor.js","webpack:///./src/js/module/Clipboard.js","webpack:///./src/js/module/Dropzone.js","webpack:///./src/js/module/Codeview.js","webpack:///./src/js/module/Statusbar.js","webpack:///./src/js/module/Fullscreen.js","webpack:///./src/js/module/Handle.js","webpack:///./src/js/module/AutoLink.js","webpack:///./src/js/module/AutoSync.js","webpack:///./src/js/module/AutoReplace.js","webpack:///./src/js/module/Placeholder.js","webpack:///./src/js/module/Buttons.js","webpack:///./src/js/module/Toolbar.js","webpack:///./src/js/module/LinkDialog.js","webpack:///./src/js/module/LinkPopover.js","webpack:///./src/js/module/ImageDialog.js","webpack:///./src/js/module/ImagePopover.js","webpack:///./src/js/module/TablePopover.js","webpack:///./src/js/module/VideoDialog.js","webpack:///./src/js/module/HelpDialog.js","webpack:///./src/js/module/AirPopover.js","webpack:///./src/js/module/HintPopover.js","webpack:///./src/js/settings.js","webpack:///./src/js/renderer.js","webpack:///./src/styles/lite/js/TooltipUI.js","webpack:///./src/styles/lite/js/DropdownUI.js","webpack:///./src/styles/lite/js/ModalUI.js","webpack:///./src/styles/lite/summernote-lite.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jQuery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jQuery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jQuery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {\nreturn ","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from 'jquery';\n\n/**\n * returns whether font is installed or not.\n *\n * @param {String} fontName\n * @return {Boolean}\n */\nconst genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];\n\nfunction validFontName(fontName) {\n  return ($.inArray(fontName.toLowerCase(), genericFontFamilies) === -1) ? `'${fontName}'` : fontName;\n}\n\nfunction isFontInstalled(fontName) {\n  const testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';\n  const testText = 'mmmmmmmmmmwwwww';\n  const testSize = '200px';\n\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n\n  context.font = testSize + \" '\" + testFontName + \"'\";\n  const originalWidth = context.measureText(testText).width;\n\n  context.font = testSize + ' ' + validFontName(fontName) + ', \"' + testFontName + '\"';\n  const width = context.measureText(testText).width;\n\n  return originalWidth !== width;\n}\n\nconst userAgent = navigator.userAgent;\nconst isMSIE = /MSIE|Trident/i.test(userAgent);\nlet browserVersion;\nif (isMSIE) {\n  let matches = /MSIE (\\d+[.]\\d+)/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n  matches = /Trident\\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n}\n\nconst isEdge = /Edge\\/\\d+/.test(userAgent);\n\nconst isSupportTouch =\n  (('ontouchstart' in window) ||\n   (navigator.MaxTouchPoints > 0) ||\n   (navigator.msMaxTouchPoints > 0));\n\n// [workaround] IE doesn't have input events for contentEditable\n// - see: https://goo.gl/4bfIvA\nconst inputEventName = (isMSIE) ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';\n\n/**\n * @class core.env\n *\n * Object which check platform and agent\n *\n * @singleton\n * @alternateClassName env\n */\nexport default {\n  isMac: navigator.appVersion.indexOf('Mac') > -1,\n  isMSIE,\n  isEdge,\n  isFF: !isEdge && /firefox/i.test(userAgent),\n  isPhantom: /PhantomJS/i.test(userAgent),\n  isWebkit: !isEdge && /webkit/i.test(userAgent),\n  isChrome: !isEdge && /chrome/i.test(userAgent),\n  isSafari: !isEdge && /safari/i.test(userAgent) && (!/chrome/i.test(userAgent)),\n  browserVersion,\n  isSupportTouch,\n  isFontInstalled,\n  isW3CRangeSupport: !!document.createRange,\n  inputEventName,\n  genericFontFamilies,\n  validFontName,\n};\n","import $ from 'jquery';\n\n/**\n * @class core.func\n *\n * func utils (for high-order func's arg)\n *\n * @singleton\n * @alternateClassName func\n */\nfunction eq(itemA) {\n  return function(itemB) {\n    return itemA === itemB;\n  };\n}\n\nfunction eq2(itemA, itemB) {\n  return itemA === itemB;\n}\n\nfunction peq2(propName) {\n  return function(itemA, itemB) {\n    return itemA[propName] === itemB[propName];\n  };\n}\n\nfunction ok() {\n  return true;\n}\n\nfunction fail() {\n  return false;\n}\n\nfunction not(f) {\n  return function() {\n    return !f.apply(f, arguments);\n  };\n}\n\nfunction and(fA, fB) {\n  return function(item) {\n    return fA(item) && fB(item);\n  };\n}\n\nfunction self(a) {\n  return a;\n}\n\nfunction invoke(obj, method) {\n  return function() {\n    return obj[method].apply(obj, arguments);\n  };\n}\n\nlet idCounter = 0;\n\n/**\n * reset globally-unique id\n *\n */\nfunction resetUniqueId() {\n  idCounter = 0;\n}\n\n/**\n * generate a globally-unique id\n *\n * @param {String} [prefix]\n */\nfunction uniqueId(prefix) {\n  const id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n/**\n * returns bnd (bounds) from rect\n *\n * - IE Compatibility Issue: http://goo.gl/sRLOAo\n * - Scroll Issue: http://goo.gl/sNjUc\n *\n * @param {Rect} rect\n * @return {Object} bounds\n * @return {Number} bounds.top\n * @return {Number} bounds.left\n * @return {Number} bounds.width\n * @return {Number} bounds.height\n */\nfunction rect2bnd(rect) {\n  const $document = $(document);\n  return {\n    top: rect.top + $document.scrollTop(),\n    left: rect.left + $document.scrollLeft(),\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n}\n\n/**\n * returns a copy of the object where the keys have become the values and the values the keys.\n * @param {Object} obj\n * @return {Object}\n */\nfunction invertObject(obj) {\n  const inverted = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      inverted[obj[key]] = key;\n    }\n  }\n  return inverted;\n}\n\n/**\n * @param {String} namespace\n * @param {String} [prefix]\n * @return {String}\n */\nfunction namespaceToCamel(namespace, prefix) {\n  prefix = prefix || '';\n  return prefix + namespace.split('.').map(function(name) {\n    return name.substring(0, 1).toUpperCase() + name.substring(1);\n  }).join('');\n}\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param {Function} func\n * @param {Number} wait\n * @param {Boolean} immediate\n * @return {Function}\n */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function() {\n    const context = this;\n    const args = arguments;\n    const later = () => {\n      timeout = null;\n      if (!immediate) {\n        func.apply(context, args);\n      }\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) {\n      func.apply(context, args);\n    }\n  };\n}\n\n/**\n *\n * @param {String} url\n * @return {Boolean}\n */\nfunction isValidUrl(url) {\n  const expression = /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/gi;\n  return expression.test(url);\n}\n\nexport default {\n  eq,\n  eq2,\n  peq2,\n  ok,\n  fail,\n  self,\n  not,\n  and,\n  invoke,\n  resetUniqueId,\n  uniqueId,\n  rect2bnd,\n  invertObject,\n  namespaceToCamel,\n  debounce,\n  isValidUrl,\n};\n","import func from './func';\n\n/**\n * returns the first item of an array.\n *\n * @param {Array} array\n */\nfunction head(array) {\n  return array[0];\n}\n\n/**\n * returns the last item of an array.\n *\n * @param {Array} array\n */\nfunction last(array) {\n  return array[array.length - 1];\n}\n\n/**\n * returns everything but the last entry of the array.\n *\n * @param {Array} array\n */\nfunction initial(array) {\n  return array.slice(0, array.length - 1);\n}\n\n/**\n * returns the rest of the items in an array.\n *\n * @param {Array} array\n */\nfunction tail(array) {\n  return array.slice(1);\n}\n\n/**\n * returns item of array\n */\nfunction find(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    const item = array[idx];\n    if (pred(item)) {\n      return item;\n    }\n  }\n}\n\n/**\n * returns true if all of the values in the array pass the predicate truth test.\n */\nfunction all(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!pred(array[idx])) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * returns true if the value is present in the list.\n */\nfunction contains(array, item) {\n  if (array && array.length && item) {\n    if (array.indexOf) {\n      return array.indexOf(item) !== -1;\n    } else if (array.contains) {\n      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`\n      return array.contains(item);\n    }\n  }\n  return false;\n}\n\n/**\n * get sum from a list\n *\n * @param {Array} array - array\n * @param {Function} fn - iterator\n */\nfunction sum(array, fn) {\n  fn = fn || func.self;\n  return array.reduce(function(memo, v) {\n    return memo + fn(v);\n  }, 0);\n}\n\n/**\n * returns a copy of the collection with array type.\n * @param {Collection} collection - collection eg) node.childNodes, ...\n */\nfunction from(collection) {\n  const result = [];\n  const length = collection.length;\n  let idx = -1;\n  while (++idx < length) {\n    result[idx] = collection[idx];\n  }\n  return result;\n}\n\n/**\n * returns whether list is empty or not\n */\nfunction isEmpty(array) {\n  return !array || !array.length;\n}\n\n/**\n * cluster elements by predicate function.\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n * @param {Array[]}\n */\nfunction clusterBy(array, fn) {\n  if (!array.length) { return []; }\n  const aTail = tail(array);\n  return aTail.reduce(function(memo, v) {\n    const aLast = last(memo);\n    if (fn(last(aLast), v)) {\n      aLast[aLast.length] = v;\n    } else {\n      memo[memo.length] = [v];\n    }\n    return memo;\n  }, [[head(array)]]);\n}\n\n/**\n * returns a copy of the array with all false values removed\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n */\nfunction compact(array) {\n  const aResult = [];\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (array[idx]) { aResult.push(array[idx]); }\n  }\n  return aResult;\n}\n\n/**\n * produces a duplicate-free version of the array\n *\n * @param {Array} array\n */\nfunction unique(array) {\n  const results = [];\n\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!contains(results, array[idx])) {\n      results.push(array[idx]);\n    }\n  }\n\n  return results;\n}\n\n/**\n * returns next item.\n * @param {Array} array\n */\nfunction next(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx + 1];\n  }\n  return null;\n}\n\n/**\n * returns prev item.\n * @param {Array} array\n */\nfunction prev(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx - 1];\n  }\n  return null;\n}\n\n/**\n * @class core.list\n *\n * list utils\n *\n * @singleton\n * @alternateClassName list\n */\nexport default {\n  head,\n  last,\n  initial,\n  tail,\n  prev,\n  next,\n  find,\n  contains,\n  all,\n  sum,\n  from,\n  isEmpty,\n  clusterBy,\n  compact,\n  unique,\n};\n","import $ from 'jquery';\nimport func from './func';\nimport lists from './lists';\nimport env from './env';\n\nconst NBSP_CHAR = String.fromCharCode(160);\nconst ZERO_WIDTH_NBSP_CHAR = '\\ufeff';\n\n/**\n * @method isEditable\n *\n * returns whether node is `note-editable` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEditable(node) {\n  return node && $(node).hasClass('note-editable');\n}\n\n/**\n * @method isControlSizing\n *\n * returns whether node is `note-control-sizing` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isControlSizing(node) {\n  return node && $(node).hasClass('note-control-sizing');\n}\n\n/**\n * @method makePredByNodeName\n *\n * returns predicate which judge whether nodeName is same\n *\n * @param {String} nodeName\n * @return {Function}\n */\nfunction makePredByNodeName(nodeName) {\n  nodeName = nodeName.toUpperCase();\n  return function(node) {\n    return node && node.nodeName.toUpperCase() === nodeName;\n  };\n}\n\n/**\n * @method isText\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is text(3)\n */\nfunction isText(node) {\n  return node && node.nodeType === 3;\n}\n\n/**\n * @method isElement\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is element(1)\n */\nfunction isElement(node) {\n  return node && node.nodeType === 1;\n}\n\n/**\n * ex) br, col, embed, hr, img, input, ...\n * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n */\nfunction isVoid(node) {\n  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());\n}\n\nfunction isPara(node) {\n  if (isEditable(node)) {\n    return false;\n  }\n\n  // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph\n  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nfunction isHeading(node) {\n  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nconst isPre = makePredByNodeName('PRE');\n\nconst isLi = makePredByNodeName('LI');\n\nfunction isPurePara(node) {\n  return isPara(node) && !isLi(node);\n}\n\nconst isTable = makePredByNodeName('TABLE');\n\nconst isData = makePredByNodeName('DATA');\n\nfunction isInline(node) {\n  return !isBodyContainer(node) &&\n         !isList(node) &&\n         !isHr(node) &&\n         !isPara(node) &&\n         !isTable(node) &&\n         !isBlockquote(node) &&\n         !isData(node);\n}\n\nfunction isList(node) {\n  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());\n}\n\nconst isHr = makePredByNodeName('HR');\n\nfunction isCell(node) {\n  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());\n}\n\nconst isBlockquote = makePredByNodeName('BLOCKQUOTE');\n\nfunction isBodyContainer(node) {\n  return isCell(node) || isBlockquote(node) || isEditable(node);\n}\n\nconst isAnchor = makePredByNodeName('A');\n\nfunction isParaInline(node) {\n  return isInline(node) && !!ancestor(node, isPara);\n}\n\nfunction isBodyInline(node) {\n  return isInline(node) && !ancestor(node, isPara);\n}\n\nconst isBody = makePredByNodeName('BODY');\n\n/**\n * returns whether nodeB is closest sibling of nodeA\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @return {Boolean}\n */\nfunction isClosestSibling(nodeA, nodeB) {\n  return nodeA.nextSibling === nodeB ||\n         nodeA.previousSibling === nodeB;\n}\n\n/**\n * returns array of closest siblings with node\n *\n * @param {Node} node\n * @param {function} [pred] - predicate function\n * @return {Node[]}\n */\nfunction withClosestSiblings(node, pred) {\n  pred = pred || func.ok;\n\n  const siblings = [];\n  if (node.previousSibling && pred(node.previousSibling)) {\n    siblings.push(node.previousSibling);\n  }\n  siblings.push(node);\n  if (node.nextSibling && pred(node.nextSibling)) {\n    siblings.push(node.nextSibling);\n  }\n  return siblings;\n}\n\n/**\n * blank HTML for cursor position\n * - [workaround] old IE only works with &nbsp;\n * - [workaround] IE11 and other browser works with bogus br\n */\nconst blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';\n\n/**\n * @method nodeLength\n *\n * returns #text's text size or element's childNodes size\n *\n * @param {Node} node\n */\nfunction nodeLength(node) {\n  if (isText(node)) {\n    return node.nodeValue.length;\n  }\n\n  if (node) {\n    return node.childNodes.length;\n  }\n\n  return 0;\n}\n\n/**\n * returns whether deepest child node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction deepestChildIsEmpty(node) {\n  do {\n    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;\n  } while ((node = node.firstElementChild));\n\n  return isEmpty(node);\n}\n\n/**\n * returns whether node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEmpty(node) {\n  const len = nodeLength(node);\n\n  if (len === 0) {\n    return true;\n  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {\n    // ex) <p><br></p>, <span><br></span>\n    return true;\n  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {\n    // ex) <p></p>, <span></span>\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * padding blankHTML if node is empty (for cursor position)\n */\nfunction paddingBlankHTML(node) {\n  if (!isVoid(node) && !nodeLength(node)) {\n    node.innerHTML = blankHTML;\n  }\n}\n\n/**\n * find nearest ancestor predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction ancestor(node, pred) {\n  while (node) {\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * find nearest ancestor only single child blood line and predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction singleChildAncestor(node, pred) {\n  node = node.parentNode;\n\n  while (node) {\n    if (nodeLength(node) !== 1) { break; }\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * returns new array of ancestor nodes (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listAncestor(node, pred) {\n  pred = pred || func.fail;\n\n  const ancestors = [];\n  ancestor(node, function(el) {\n    if (!isEditable(el)) {\n      ancestors.push(el);\n    }\n\n    return pred(el);\n  });\n  return ancestors;\n}\n\n/**\n * find farthest ancestor predicate hit\n */\nfunction lastAncestor(node, pred) {\n  const ancestors = listAncestor(node);\n  return lists.last(ancestors.filter(pred));\n}\n\n/**\n * returns common ancestor node between two nodes.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n */\nfunction commonAncestor(nodeA, nodeB) {\n  const ancestors = listAncestor(nodeA);\n  for (let n = nodeB; n; n = n.parentNode) {\n    if (ancestors.indexOf(n) > -1) return n;\n  }\n  return null; // difference document area\n}\n\n/**\n * listing all previous siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listPrev(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.previousSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing next siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listNext(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.nextSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing descendant nodes\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listDescendant(node, pred) {\n  const descendants = [];\n  pred = pred || func.ok;\n\n  // start DFS(depth first search) with node\n  (function fnWalk(current) {\n    if (node !== current && pred(current)) {\n      descendants.push(current);\n    }\n    for (let idx = 0, len = current.childNodes.length; idx < len; idx++) {\n      fnWalk(current.childNodes[idx]);\n    }\n  })(node);\n\n  return descendants;\n}\n\n/**\n * wrap node with new tag.\n *\n * @param {Node} node\n * @param {Node} tagName of wrapper\n * @return {Node} - wrapper\n */\nfunction wrap(node, wrapperName) {\n  const parent = node.parentNode;\n  const wrapper = $('<' + wrapperName + '>')[0];\n\n  parent.insertBefore(wrapper, node);\n  wrapper.appendChild(node);\n\n  return wrapper;\n}\n\n/**\n * insert node after preceding\n *\n * @param {Node} node\n * @param {Node} preceding - predicate function\n */\nfunction insertAfter(node, preceding) {\n  const next = preceding.nextSibling;\n  let parent = preceding.parentNode;\n  if (next) {\n    parent.insertBefore(node, next);\n  } else {\n    parent.appendChild(node);\n  }\n  return node;\n}\n\n/**\n * append elements.\n *\n * @param {Node} node\n * @param {Collection} aChild\n */\nfunction appendChildNodes(node, aChild) {\n  $.each(aChild, function(idx, child) {\n    node.appendChild(child);\n  });\n  return node;\n}\n\n/**\n * returns whether boundaryPoint is left edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isLeftEdgePoint(point) {\n  return point.offset === 0;\n}\n\n/**\n * returns whether boundaryPoint is right edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isRightEdgePoint(point) {\n  return point.offset === nodeLength(point.node);\n}\n\n/**\n * returns whether boundaryPoint is edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isEdgePoint(point) {\n  return isLeftEdgePoint(point) || isRightEdgePoint(point);\n}\n\n/**\n * returns whether node is left edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgeOf(node, ancestor) {\n  while (node && node !== ancestor) {\n    if (position(node) !== 0) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether node is right edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgeOf(node, ancestor) {\n  if (!ancestor) {\n    return false;\n  }\n  while (node && node !== ancestor) {\n    if (position(node) !== nodeLength(node.parentNode) - 1) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether point is left edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgePointOf(point, ancestor) {\n  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns whether point is right edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgePointOf(point, ancestor) {\n  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns offset from parent.\n *\n * @param {Node} node\n */\nfunction position(node) {\n  let offset = 0;\n  while ((node = node.previousSibling)) {\n    offset += 1;\n  }\n  return offset;\n}\n\nfunction hasChildren(node) {\n  return !!(node && node.childNodes && node.childNodes.length);\n}\n\n/**\n * returns previous boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction prevPoint(point, isSkipInnerOffset) {\n  let node;\n  let offset;\n\n  if (point.offset === 0) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node);\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset - 1];\n    offset = nodeLength(node);\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? 0 : point.offset - 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPoint(point, isSkipInnerOffset) {\n  let node, offset;\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint with empty node\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPointWithEmptyNode(point, isSkipInnerOffset) {\n  let node, offset = 0;\n\n  // if node is empty string node, return current node's sibling.\n  if (isEmpty(point.node)) {\n    if(point.node === null){\n      return null;\n    }\n\n    node = point.node.nextSibling;\n    offset = 0;\n\n    return {\n      node: node,\n      offset: offset,\n    };\n  }\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node) + 1;\n\n    // if next node is editable ,  return current node's sibling node.\n    if (isEditable(node)) {\n      node = point.node.nextSibling;\n      offset = 0;\n    }\n\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n    if (isEmpty(node)) {\n      if (!isEmpty(point.node.nextSibling)) {\n        return {\n          node: point.node.nextSibling,\n          offset: offset,\n        };\n      }\n      return null;\n    }\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n\n    if (isEmpty(node)) {\n      return null;\n    }\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/*\n* returns the next Text node index or 0 if not found.\n*/\nfunction getNextTextNode(actual) {\n  if(!actual.nextSibling) return undefined;\n  if(actual.parent !== actual.nextSibling.parent) return undefined;\n\n  if(isText(actual.nextSibling) ) return actual.nextSibling;\n  else return getNextTextNode(actual.nextSibling);\n}\n\n/**\n * returns whether pointA and pointB is same or not.\n *\n * @param {BoundaryPoint} pointA\n * @param {BoundaryPoint} pointB\n * @return {Boolean}\n */\nfunction isSamePoint(pointA, pointB) {\n  return pointA.node === pointB.node && pointA.offset === pointB.offset;\n}\n\n/**\n * returns whether point is visible (can set cursor) or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isVisiblePoint(point) {\n  if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {\n    return true;\n  }\n\n  const leftNode = point.node.childNodes[point.offset - 1];\n  const rightNode = point.node.childNodes[point.offset];\n  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * @method prevPointUtil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction prevPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = prevPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * @method nextPointUntil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction nextPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = nextPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * returns whether point has character or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isCharPoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch && (ch !== ' ' && ch !== NBSP_CHAR);\n}\n\n/**\n * returns whether point has space or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isSpacePoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch === ' ' || ch === NBSP_CHAR;\n}\n\n/**\n * @method walkPoint\n *\n * @param {BoundaryPoint} startPoint\n * @param {BoundaryPoint} endPoint\n * @param {Function} handler\n * @param {Boolean} isSkipInnerOffset\n */\nfunction walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {\n  let point = startPoint;\n\n  while (point) {\n    handler(point);\n\n    if (isSamePoint(point, endPoint)) {\n      break;\n    }\n\n    const isSkipOffset = isSkipInnerOffset &&\n                       startPoint.node !== point.node &&\n                       endPoint.node !== point.node;\n    point = nextPointWithEmptyNode(point, isSkipOffset);\n  }\n}\n\n/**\n * @method makeOffsetPath\n *\n * return offsetPath(array of offset) from ancestor\n *\n * @param {Node} ancestor - ancestor node\n * @param {Node} node\n */\nfunction makeOffsetPath(ancestor, node) {\n  const ancestors = listAncestor(node, func.eq(ancestor));\n  return ancestors.map(position).reverse();\n}\n\n/**\n * @method fromOffsetPath\n *\n * return element from offsetPath(array of offset)\n *\n * @param {Node} ancestor - ancestor node\n * @param {array} offsets - offsetPath\n */\nfunction fromOffsetPath(ancestor, offsets) {\n  let current = ancestor;\n  for (let i = 0, len = offsets.length; i < len; i++) {\n    if (current.childNodes.length <= offsets[i]) {\n      current = current.childNodes[current.childNodes.length - 1];\n    } else {\n      current = current.childNodes[offsets[i]];\n    }\n  }\n  return current;\n}\n\n/**\n * @method splitNode\n *\n * split element or #text\n *\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @param {Boolean} [options.isDiscardEmptySplits] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitNode(point, options) {\n  let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;\n  const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;\n  const isDiscardEmptySplits = options && options.isDiscardEmptySplits;\n\n  if (isDiscardEmptySplits) {\n    isSkipPaddingBlankHTML = true;\n  }\n\n  // edge case\n  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {\n    if (isLeftEdgePoint(point)) {\n      return point.node;\n    } else if (isRightEdgePoint(point)) {\n      return point.node.nextSibling;\n    }\n  }\n\n  // split #text\n  if (isText(point.node)) {\n    return point.node.splitText(point.offset);\n  } else {\n    const childNode = point.node.childNodes[point.offset];\n    const clone = insertAfter(point.node.cloneNode(false), point.node);\n    appendChildNodes(clone, listNext(childNode));\n\n    if (!isSkipPaddingBlankHTML) {\n      paddingBlankHTML(point.node);\n      paddingBlankHTML(clone);\n    }\n\n    if (isDiscardEmptySplits) {\n      if (isEmpty(point.node)) {\n        remove(point.node);\n      }\n      if (isEmpty(clone)) {\n        remove(clone);\n        return point.node.nextSibling;\n      }\n    }\n\n    return clone;\n  }\n}\n\n/**\n * @method splitTree\n *\n * split tree by point\n *\n * @param {Node} root - split root\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitTree(root, point, options) {\n  // ex) [#text, <span>, <p>]\n  const ancestors = listAncestor(point.node, func.eq(root));\n\n  if (!ancestors.length) {\n    return null;\n  } else if (ancestors.length === 1) {\n    return splitNode(point, options);\n  }\n\n  return ancestors.reduce(function(node, parent) {\n    if (node === point.node) {\n      node = splitNode(point, options);\n    }\n\n    return splitNode({\n      node: parent,\n      offset: node ? position(node) : nodeLength(parent),\n    }, options);\n  });\n}\n\n/**\n * split point\n *\n * @param {Point} point\n * @param {Boolean} isInline\n * @return {Object}\n */\nfunction splitPoint(point, isInline) {\n  // find splitRoot, container\n  //  - inline: splitRoot is a child of paragraph\n  //  - block: splitRoot is a child of bodyContainer\n  const pred = isInline ? isPara : isBodyContainer;\n  const ancestors = listAncestor(point.node, pred);\n  const topAncestor = lists.last(ancestors) || point.node;\n\n  let splitRoot, container;\n  if (pred(topAncestor)) {\n    splitRoot = ancestors[ancestors.length - 2];\n    container = topAncestor;\n  } else {\n    splitRoot = topAncestor;\n    container = splitRoot.parentNode;\n  }\n\n  // if splitRoot is exists, split with splitTree\n  let pivot = splitRoot && splitTree(splitRoot, point, {\n    isSkipPaddingBlankHTML: isInline,\n    isNotSplitEdgePoint: isInline,\n  });\n\n  // if container is point.node, find pivot with point.offset\n  if (!pivot && container === point.node) {\n    pivot = point.node.childNodes[point.offset];\n  }\n\n  return {\n    rightNode: pivot,\n    container: container,\n  };\n}\n\nfunction create(nodeName) {\n  return document.createElement(nodeName);\n}\n\nfunction createText(text) {\n  return document.createTextNode(text);\n}\n\n/**\n * @method remove\n *\n * remove node, (isRemoveChild: remove child or not)\n *\n * @param {Node} node\n * @param {Boolean} isRemoveChild\n */\nfunction remove(node, isRemoveChild) {\n  if (!node || !node.parentNode) { return; }\n  if (node.removeNode) { return node.removeNode(isRemoveChild); }\n\n  const parent = node.parentNode;\n  if (!isRemoveChild) {\n    const nodes = [];\n    for (let i = 0, len = node.childNodes.length; i < len; i++) {\n      nodes.push(node.childNodes[i]);\n    }\n\n    for (let i = 0, len = nodes.length; i < len; i++) {\n      parent.insertBefore(nodes[i], node);\n    }\n  }\n\n  parent.removeChild(node);\n}\n\n/**\n * @method removeWhile\n *\n * @param {Node} node\n * @param {Function} pred\n */\nfunction removeWhile(node, pred) {\n  while (node) {\n    if (isEditable(node) || !pred(node)) {\n      break;\n    }\n\n    const parent = node.parentNode;\n    remove(node);\n    node = parent;\n  }\n}\n\n/**\n * @method replace\n *\n * replace node with provided nodeName\n *\n * @param {Node} node\n * @param {String} nodeName\n * @return {Node} - new node\n */\nfunction replace(node, nodeName) {\n  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {\n    return node;\n  }\n\n  const newNode = create(nodeName);\n\n  if (node.style.cssText) {\n    newNode.style.cssText = node.style.cssText;\n  }\n\n  appendChildNodes(newNode, lists.from(node.childNodes));\n  insertAfter(newNode, node);\n  remove(node);\n\n  return newNode;\n}\n\nconst isTextarea = makePredByNodeName('TEXTAREA');\n\n/**\n * @param {jQuery} $node\n * @param {Boolean} [stripLinebreaks] - default: false\n */\nfunction value($node, stripLinebreaks) {\n  const val = isTextarea($node[0]) ? $node.val() : $node.html();\n  if (stripLinebreaks) {\n    return val.replace(/[\\n\\r]/g, '');\n  }\n  return val;\n}\n\n/**\n * @method html\n *\n * get the HTML contents of node\n *\n * @param {jQuery} $node\n * @param {Boolean} [isNewlineOnBlock]\n */\nfunction html($node, isNewlineOnBlock) {\n  let markup = value($node);\n\n  if (isNewlineOnBlock) {\n    const regexTag = /<(\\/?)(\\b(?!!)[^>\\s]*)(.*?)(\\s*\\/?>)/g;\n    markup = markup.replace(regexTag, function(match, endSlash, name) {\n      name = name.toUpperCase();\n      const isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&\n                                   !!endSlash;\n      const isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);\n\n      return match + ((isEndOfInlineContainer || isBlockNode) ? '\\n' : '');\n    });\n    markup = markup.trim();\n  }\n\n  return markup;\n}\n\nfunction posFromPlaceholder(placeholder) {\n  const $placeholder = $(placeholder);\n  const pos = $placeholder.offset();\n  const height = $placeholder.outerHeight(true); // include margin\n\n  return {\n    left: pos.left,\n    top: pos.top + height,\n  };\n}\n\nfunction attachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.on(key, events[key]);\n  });\n}\n\nfunction detachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.off(key, events[key]);\n  });\n}\n\n/**\n * @method isCustomStyleTag\n *\n * assert if a node contains a \"note-styletag\" class,\n * which implies that's a custom-made style tag node\n *\n * @param {Node} an HTML DOM node\n */\nfunction isCustomStyleTag(node) {\n  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');\n}\n\nexport default {\n  /** @property {String} NBSP_CHAR */\n  NBSP_CHAR,\n  /** @property {String} ZERO_WIDTH_NBSP_CHAR */\n  ZERO_WIDTH_NBSP_CHAR,\n  /** @property {String} blank */\n  blank: blankHTML,\n  /** @property {String} emptyPara */\n  emptyPara: `<p>${blankHTML}</p>`,\n  makePredByNodeName,\n  isEditable,\n  isControlSizing,\n  isText,\n  isElement,\n  isVoid,\n  isPara,\n  isPurePara,\n  isHeading,\n  isInline,\n  isBlock: func.not(isInline),\n  isBodyInline,\n  isBody,\n  isParaInline,\n  isPre,\n  isList,\n  isTable,\n  isData,\n  isCell,\n  isBlockquote,\n  isBodyContainer,\n  isAnchor,\n  isDiv: makePredByNodeName('DIV'),\n  isLi,\n  isBR: makePredByNodeName('BR'),\n  isSpan: makePredByNodeName('SPAN'),\n  isB: makePredByNodeName('B'),\n  isU: makePredByNodeName('U'),\n  isS: makePredByNodeName('S'),\n  isI: makePredByNodeName('I'),\n  isImg: makePredByNodeName('IMG'),\n  isTextarea,\n  deepestChildIsEmpty,\n  isEmpty,\n  isEmptyAnchor: func.and(isAnchor, isEmpty),\n  isClosestSibling,\n  withClosestSiblings,\n  nodeLength,\n  isLeftEdgePoint,\n  isRightEdgePoint,\n  isEdgePoint,\n  isLeftEdgeOf,\n  isRightEdgeOf,\n  isLeftEdgePointOf,\n  isRightEdgePointOf,\n  prevPoint,\n  nextPoint,\n  nextPointWithEmptyNode,\n  isSamePoint,\n  isVisiblePoint,\n  prevPointUntil,\n  nextPointUntil,\n  isCharPoint,\n  isSpacePoint,\n  walkPoint,\n  ancestor,\n  singleChildAncestor,\n  listAncestor,\n  lastAncestor,\n  listNext,\n  listPrev,\n  listDescendant,\n  commonAncestor,\n  wrap,\n  insertAfter,\n  appendChildNodes,\n  position,\n  hasChildren,\n  makeOffsetPath,\n  fromOffsetPath,\n  splitTree,\n  splitPoint,\n  create,\n  createText,\n  remove,\n  removeWhile,\n  replace,\n  html,\n  value,\n  posFromPlaceholder,\n  attachEvents,\n  detachEvents,\n  isCustomStyleTag,\n};\n","import $ from 'jquery';\nimport func from './core/func';\nimport lists from './core/lists';\nimport dom from './core/dom';\n\nexport default class Context {\n  /**\n   * @param {jQuery} $note\n   * @param {Object} options\n   */\n  constructor($note, options) {\n    this.$note = $note;\n\n    this.memos = {};\n    this.modules = {};\n    this.layoutInfo = {};\n    this.options = $.extend(true, {}, options);\n\n    // init ui with options\n    $.summernote.ui = $.summernote.ui_template(this.options);\n    this.ui = $.summernote.ui;\n\n    this.initialize();\n  }\n\n  /**\n   * create layout and initialize modules and other resources\n   */\n  initialize() {\n    this.layoutInfo = this.ui.createLayout(this.$note);\n    this._initialize();\n    this.$note.hide();\n    return this;\n  }\n\n  /**\n   * destroy modules and other resources and remove layout\n   */\n  destroy() {\n    this._destroy();\n    this.$note.removeData('summernote');\n    this.ui.removeLayout(this.$note, this.layoutInfo);\n  }\n\n  /**\n   * destory modules and other resources and initialize it again\n   */\n  reset() {\n    const disabled = this.isDisabled();\n    this.code(dom.emptyPara);\n    this._destroy();\n    this._initialize();\n\n    if (disabled) {\n      this.disable();\n    }\n  }\n\n  _initialize() {\n    // set own id\n    this.options.id = func.uniqueId($.now());\n    // set default container for tooltips, popovers, and dialogs\n    this.options.container = this.options.container || this.layoutInfo.editor;\n\n    // add optional buttons\n    const buttons = $.extend({}, this.options.buttons);\n    Object.keys(buttons).forEach((key) => {\n      this.memo('button.' + key, buttons[key]);\n    });\n\n    const modules = $.extend({}, this.options.modules, $.summernote.plugins || {});\n\n    // add and initialize modules\n    Object.keys(modules).forEach((key) => {\n      this.module(key, modules[key], true);\n    });\n\n    Object.keys(this.modules).forEach((key) => {\n      this.initializeModule(key);\n    });\n  }\n\n  _destroy() {\n    // destroy modules with reversed order\n    Object.keys(this.modules).reverse().forEach((key) => {\n      this.removeModule(key);\n    });\n\n    Object.keys(this.memos).forEach((key) => {\n      this.removeMemo(key);\n    });\n    // trigger custom onDestroy callback\n    this.triggerEvent('destroy', this);\n  }\n\n  code(html) {\n    const isActivated = this.invoke('codeview.isActivated');\n\n    if (html === undefined) {\n      this.invoke('codeview.sync');\n      return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();\n    } else {\n      if (isActivated) {\n        this.invoke('codeview.sync', html);\n      } else {\n        this.layoutInfo.editable.html(html);\n      }\n      this.$note.val(html);\n      this.triggerEvent('change', html, this.layoutInfo.editable);\n    }\n  }\n\n  isDisabled() {\n    return this.layoutInfo.editable.attr('contenteditable') === 'false';\n  }\n\n  enable() {\n    this.layoutInfo.editable.attr('contenteditable', true);\n    this.invoke('toolbar.activate', true);\n    this.triggerEvent('disable', false);\n    this.options.editing = true;\n  }\n\n  disable() {\n    // close codeview if codeview is opend\n    if (this.invoke('codeview.isActivated')) {\n      this.invoke('codeview.deactivate');\n    }\n    this.layoutInfo.editable.attr('contenteditable', false);\n    this.options.editing = false;\n    this.invoke('toolbar.deactivate', true);\n\n    this.triggerEvent('disable', true);\n  }\n\n  triggerEvent() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];\n    if (callback) {\n      callback.apply(this.$note[0], args);\n    }\n    this.$note.trigger('summernote.' + namespace, args);\n  }\n\n  initializeModule(key) {\n    const module = this.modules[key];\n    module.shouldInitialize = module.shouldInitialize || func.ok;\n    if (!module.shouldInitialize()) {\n      return;\n    }\n\n    // initialize module\n    if (module.initialize) {\n      module.initialize();\n    }\n\n    // attach events\n    if (module.events) {\n      dom.attachEvents(this.$note, module.events);\n    }\n  }\n\n  module(key, ModuleClass, withoutIntialize) {\n    if (arguments.length === 1) {\n      return this.modules[key];\n    }\n\n    this.modules[key] = new ModuleClass(this);\n\n    if (!withoutIntialize) {\n      this.initializeModule(key);\n    }\n  }\n\n  removeModule(key) {\n    const module = this.modules[key];\n    if (module.shouldInitialize()) {\n      if (module.events) {\n        dom.detachEvents(this.$note, module.events);\n      }\n\n      if (module.destroy) {\n        module.destroy();\n      }\n    }\n\n    delete this.modules[key];\n  }\n\n  memo(key, obj) {\n    if (arguments.length === 1) {\n      return this.memos[key];\n    }\n    this.memos[key] = obj;\n  }\n\n  removeMemo(key) {\n    if (this.memos[key] && this.memos[key].destroy) {\n      this.memos[key].destroy();\n    }\n\n    delete this.memos[key];\n  }\n\n  /**\n   * Some buttons need to change their visual style immediately once they get pressed\n   */\n  createInvokeHandlerAndUpdateState(namespace, value) {\n    return (event) => {\n      this.createInvokeHandler(namespace, value)(event);\n      this.invoke('buttons.updateCurrentStyle');\n    };\n  }\n\n  createInvokeHandler(namespace, value) {\n    return (event) => {\n      event.preventDefault();\n      const $target = $(event.target);\n      this.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);\n    };\n  }\n\n  invoke() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const splits = namespace.split('.');\n    const hasSeparator = splits.length > 1;\n    const moduleName = hasSeparator && lists.head(splits);\n    const methodName = hasSeparator ? lists.last(splits) : lists.head(splits);\n\n    const module = this.modules[moduleName || 'editor'];\n    if (!moduleName && this[methodName]) {\n      return this[methodName].apply(this, args);\n    } else if (module && module[methodName] && module.shouldInitialize()) {\n      return module[methodName].apply(module, args);\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from './core/env';\nimport lists from './core/lists';\nimport Context from './Context';\n\n$.fn.extend({\n  /**\n   * Summernote API\n   *\n   * @param {Object|String}\n   * @return {this}\n   */\n  summernote: function() {\n    const type = $.type(lists.head(arguments));\n    const isExternalAPICalled = type === 'string';\n    const hasInitOptions = type === 'object';\n\n    const options = $.extend({}, $.summernote.options, hasInitOptions ? lists.head(arguments) : {});\n\n    // Update options\n    options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);\n    options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons);\n    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;\n\n    this.each((idx, note) => {\n      const $note = $(note);\n      if (!$note.data('summernote')) {\n        const context = new Context($note, options);\n        $note.data('summernote', context);\n        $note.data('summernote').triggerEvent('init', context.layoutInfo);\n      }\n    });\n\n    const $note = this.first();\n    if ($note.length) {\n      const context = $note.data('summernote');\n      if (isExternalAPICalled) {\n        return context.invoke.apply(context, lists.from(arguments));\n      } else if (options.focus) {\n        context.invoke('editor.focus');\n      }\n    }\n\n    return this;\n  },\n});\n","import $ from 'jquery';\nimport env from './env';\nimport func from './func';\nimport lists from './lists';\nimport dom from './dom';\n\n/**\n * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js\n *\n * @param {TextRange} textRange\n * @param {Boolean} isStart\n * @return {BoundaryPoint}\n *\n * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx\n */\nfunction textRangeToPoint(textRange, isStart) {\n  let container = textRange.parentElement();\n  let offset;\n\n  const tester = document.body.createTextRange();\n  let prevContainer;\n  const childNodes = lists.from(container.childNodes);\n  for (offset = 0; offset < childNodes.length; offset++) {\n    if (dom.isText(childNodes[offset])) {\n      continue;\n    }\n    tester.moveToElementText(childNodes[offset]);\n    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {\n      break;\n    }\n    prevContainer = childNodes[offset];\n  }\n\n  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {\n    const textRangeStart = document.body.createTextRange();\n    let curTextNode = null;\n    textRangeStart.moveToElementText(prevContainer || container);\n    textRangeStart.collapse(!prevContainer);\n    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;\n\n    const pointTester = textRange.duplicate();\n    pointTester.setEndPoint('StartToStart', textRangeStart);\n    let textCount = pointTester.text.replace(/[\\r\\n]/g, '').length;\n\n    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    // [workaround] enforce IE to re-reference curTextNode, hack\n    const dummy = curTextNode.nodeValue; // eslint-disable-line\n\n    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&\n      textCount === curTextNode.nodeValue.length) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    container = curTextNode;\n    offset = textCount;\n  }\n\n  return {\n    cont: container,\n    offset: offset,\n  };\n}\n\n/**\n * return TextRange from boundary point (inspired by google closure-library)\n * @param {BoundaryPoint} point\n * @return {TextRange}\n */\nfunction pointToTextRange(point) {\n  const textRangeInfo = function(container, offset) {\n    let node, isCollapseToStart;\n\n    if (dom.isText(container)) {\n      const prevTextNodes = dom.listPrev(container, func.not(dom.isText));\n      const prevContainer = lists.last(prevTextNodes).previousSibling;\n      node = prevContainer || container.parentNode;\n      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);\n      isCollapseToStart = !prevContainer;\n    } else {\n      node = container.childNodes[offset] || container;\n      if (dom.isText(node)) {\n        return textRangeInfo(node, 0);\n      }\n\n      offset = 0;\n      isCollapseToStart = false;\n    }\n\n    return {\n      node: node,\n      collapseToStart: isCollapseToStart,\n      offset: offset,\n    };\n  };\n\n  const textRange = document.body.createTextRange();\n  const info = textRangeInfo(point.node, point.offset);\n\n  textRange.moveToElementText(info.node);\n  textRange.collapse(info.collapseToStart);\n  textRange.moveStart('character', info.offset);\n  return textRange;\n}\n\n/**\n   * Wrapped Range\n   *\n   * @constructor\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   */\nclass WrappedRange {\n  constructor(sc, so, ec, eo) {\n    this.sc = sc;\n    this.so = so;\n    this.ec = ec;\n    this.eo = eo;\n\n    // isOnEditable: judge whether range is on editable or not\n    this.isOnEditable = this.makeIsOn(dom.isEditable);\n    // isOnList: judge whether range is on list node or not\n    this.isOnList = this.makeIsOn(dom.isList);\n    // isOnAnchor: judge whether range is on anchor node or not\n    this.isOnAnchor = this.makeIsOn(dom.isAnchor);\n    // isOnCell: judge whether range is on cell node or not\n    this.isOnCell = this.makeIsOn(dom.isCell);\n    // isOnData: judge whether range is on data node or not\n    this.isOnData = this.makeIsOn(dom.isData);\n  }\n\n  // nativeRange: get nativeRange from sc, so, ec, eo\n  nativeRange() {\n    if (env.isW3CRangeSupport) {\n      const w3cRange = document.createRange();\n      w3cRange.setStart(this.sc, this.so);\n      w3cRange.setEnd(this.ec, this.eo);\n\n      return w3cRange;\n    } else {\n      const textRange = pointToTextRange({\n        node: this.sc,\n        offset: this.so,\n      });\n\n      textRange.setEndPoint('EndToEnd', pointToTextRange({\n        node: this.ec,\n        offset: this.eo,\n      }));\n\n      return textRange;\n    }\n  }\n\n  getPoints() {\n    return {\n      sc: this.sc,\n      so: this.so,\n      ec: this.ec,\n      eo: this.eo,\n    };\n  }\n\n  getStartPoint() {\n    return {\n      node: this.sc,\n      offset: this.so,\n    };\n  }\n\n  getEndPoint() {\n    return {\n      node: this.ec,\n      offset: this.eo,\n    };\n  }\n\n  /**\n   * select update visible range\n   */\n  select() {\n    const nativeRng = this.nativeRange();\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (selection.rangeCount > 0) {\n        selection.removeAllRanges();\n      }\n      selection.addRange(nativeRng);\n    } else {\n      nativeRng.select();\n    }\n\n    return this;\n  }\n\n  /**\n   * Moves the scrollbar to start container(sc) of current range\n   *\n   * @return {WrappedRange}\n   */\n  scrollIntoView(container) {\n    const height = $(container).height();\n    if (container.scrollTop + height < this.sc.offsetTop) {\n      container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);\n    }\n\n    return this;\n  }\n\n  /**\n   * @return {WrappedRange}\n   */\n  normalize() {\n    /**\n     * @param {BoundaryPoint} point\n     * @param {Boolean} isLeftToRight - true: prefer to choose right node\n     *                                - false: prefer to choose left node\n     * @return {BoundaryPoint}\n     */\n    const getVisiblePoint = function(point, isLeftToRight) {\n      if (!point) {\n        return point;\n      }\n\n      // Just use the given point [XXX:Adhoc]\n      //  - case 01. if the point is on the middle of the node\n      //  - case 02. if the point is on the right edge and prefer to choose left node\n      //  - case 03. if the point is on the left edge and prefer to choose right node\n      //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void\n      //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void\n      //  - case 06. if the point is on the block node and there is no children\n      if (dom.isVisiblePoint(point)) {\n        if (!dom.isEdgePoint(point) ||\n            (dom.isRightEdgePoint(point) && !isLeftToRight) ||\n            (dom.isLeftEdgePoint(point) && isLeftToRight) ||\n            (dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling)) ||\n            (dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling)) ||\n            (dom.isBlock(point.node) && dom.isEmpty(point.node))) {\n          return point;\n        }\n      }\n\n      // point on block's edge\n      const block = dom.ancestor(point.node, dom.isBlock);\n      let hasRightNode = false;\n\n      if (!hasRightNode) {\n        const prevPoint = dom.prevPoint(point) || { node: null };\n        hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;\n      }\n\n      let hasLeftNode = false;\n      if (!hasLeftNode) {\n        const nextPoint = dom.nextPoint(point) || { node: null };\n        hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(nextPoint.node)) && isLeftToRight;\n      }\n\n      if (hasRightNode || hasLeftNode) {\n        // returns point already on visible point\n        if (dom.isVisiblePoint(point)) {\n          return point;\n        }\n        // reverse direction\n        isLeftToRight = !isLeftToRight;\n      }\n\n      const nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint)\n        : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);\n      return nextPoint || point;\n    };\n\n    const endPoint = getVisiblePoint(this.getEndPoint(), false);\n    const startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns matched nodes on range\n   *\n   * @param {Function} [pred] - predicate function\n   * @param {Object} [options]\n   * @param {Boolean} [options.includeAncestor]\n   * @param {Boolean} [options.fullyContains]\n   * @return {Node[]}\n   */\n  nodes(pred, options) {\n    pred = pred || func.ok;\n\n    const includeAncestor = options && options.includeAncestor;\n    const fullyContains = options && options.fullyContains;\n\n    // TODO compare points and sort\n    const startPoint = this.getStartPoint();\n    const endPoint = this.getEndPoint();\n\n    const nodes = [];\n    const leftEdgeNodes = [];\n\n    dom.walkPoint(startPoint, endPoint, function(point) {\n      if (dom.isEditable(point.node)) {\n        return;\n      }\n\n      let node;\n      if (fullyContains) {\n        if (dom.isLeftEdgePoint(point)) {\n          leftEdgeNodes.push(point.node);\n        }\n        if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {\n          node = point.node;\n        }\n      } else if (includeAncestor) {\n        node = dom.ancestor(point.node, pred);\n      } else {\n        node = point.node;\n      }\n\n      if (node && pred(node)) {\n        nodes.push(node);\n      }\n    }, true);\n\n    return lists.unique(nodes);\n  }\n\n  /**\n   * returns commonAncestor of range\n   * @return {Element} - commonAncestor\n   */\n  commonAncestor() {\n    return dom.commonAncestor(this.sc, this.ec);\n  }\n\n  /**\n   * returns expanded range by pred\n   *\n   * @param {Function} pred - predicate function\n   * @return {WrappedRange}\n   */\n  expand(pred) {\n    const startAncestor = dom.ancestor(this.sc, pred);\n    const endAncestor = dom.ancestor(this.ec, pred);\n\n    if (!startAncestor && !endAncestor) {\n      return new WrappedRange(this.sc, this.so, this.ec, this.eo);\n    }\n\n    const boundaryPoints = this.getPoints();\n\n    if (startAncestor) {\n      boundaryPoints.sc = startAncestor;\n      boundaryPoints.so = 0;\n    }\n\n    if (endAncestor) {\n      boundaryPoints.ec = endAncestor;\n      boundaryPoints.eo = dom.nodeLength(endAncestor);\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * @param {Boolean} isCollapseToStart\n   * @return {WrappedRange}\n   */\n  collapse(isCollapseToStart) {\n    if (isCollapseToStart) {\n      return new WrappedRange(this.sc, this.so, this.sc, this.so);\n    } else {\n      return new WrappedRange(this.ec, this.eo, this.ec, this.eo);\n    }\n  }\n\n  /**\n   * splitText on range\n   */\n  splitText() {\n    const isSameContainer = this.sc === this.ec;\n    const boundaryPoints = this.getPoints();\n\n    if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {\n      this.ec.splitText(this.eo);\n    }\n\n    if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {\n      boundaryPoints.sc = this.sc.splitText(this.so);\n      boundaryPoints.so = 0;\n\n      if (isSameContainer) {\n        boundaryPoints.ec = boundaryPoints.sc;\n        boundaryPoints.eo = this.eo - this.so;\n      }\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * delete contents on range\n   * @return {WrappedRange}\n   */\n  deleteContents() {\n    if (this.isCollapsed()) {\n      return this;\n    }\n\n    const rng = this.splitText();\n    const nodes = rng.nodes(null, {\n      fullyContains: true,\n    });\n\n    // find new cursor point\n    const point = dom.prevPointUntil(rng.getStartPoint(), function(point) {\n      return !lists.contains(nodes, point.node);\n    });\n\n    const emptyParents = [];\n    $.each(nodes, function(idx, node) {\n      // find empty parents\n      const parent = node.parentNode;\n      if (point.node !== parent && dom.nodeLength(parent) === 1) {\n        emptyParents.push(parent);\n      }\n      dom.remove(node, false);\n    });\n\n    // remove empty parents\n    $.each(emptyParents, function(idx, node) {\n      dom.remove(node, false);\n    });\n\n    return new WrappedRange(\n      point.node,\n      point.offset,\n      point.node,\n      point.offset\n    ).normalize();\n  }\n\n  /**\n   * makeIsOn: return isOn(pred) function\n   */\n  makeIsOn(pred) {\n    return function() {\n      const ancestor = dom.ancestor(this.sc, pred);\n      return !!ancestor && (ancestor === dom.ancestor(this.ec, pred));\n    };\n  }\n\n  /**\n   * @param {Function} pred\n   * @return {Boolean}\n   */\n  isLeftEdgeOf(pred) {\n    if (!dom.isLeftEdgePoint(this.getStartPoint())) {\n      return false;\n    }\n\n    const node = dom.ancestor(this.sc, pred);\n    return node && dom.isLeftEdgeOf(this.sc, node);\n  }\n\n  /**\n   * returns whether range was collapsed or not\n   */\n  isCollapsed() {\n    return this.sc === this.ec && this.so === this.eo;\n  }\n\n  /**\n   * wrap inline nodes which children of body with paragraph\n   *\n   * @return {WrappedRange}\n   */\n  wrapBodyInlineWithPara() {\n    if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {\n      this.sc.innerHTML = dom.emptyPara;\n      return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);\n    }\n\n    /**\n     * [workaround] firefox often create range on not visible point. so normalize here.\n     *  - firefox: |<p>text</p>|\n     *  - chrome: <p>|text|</p>\n     */\n    const rng = this.normalize();\n    if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {\n      return rng;\n    }\n\n    // find inline top ancestor\n    let topAncestor;\n    if (dom.isInline(rng.sc)) {\n      const ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));\n      topAncestor = lists.last(ancestors);\n      if (!dom.isInline(topAncestor)) {\n        topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];\n      }\n    } else {\n      topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];\n    }\n\n    if (topAncestor) {\n      // siblings not in paragraph\n      let inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();\n      inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));\n\n      // wrap with paragraph\n      if (inlineSiblings.length) {\n        const para = dom.wrap(lists.head(inlineSiblings), 'p');\n        dom.appendChildNodes(para, lists.tail(inlineSiblings));\n      }\n    }\n\n    return this.normalize();\n  }\n\n  /**\n   * insert node at current cursor\n   *\n   * @param {Node} node\n   * @return {Node}\n   */\n  insertNode(node) {\n    let rng = this;\n\n    if (dom.isText(node) || dom.isInline(node)) {\n      rng = this.wrapBodyInlineWithPara().deleteContents();\n    }\n\n    const info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));\n    if (info.rightNode) {\n      info.rightNode.parentNode.insertBefore(node, info.rightNode);\n      if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {\n        info.rightNode.parentNode.removeChild(info.rightNode);\n      }\n    } else {\n      info.container.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * insert html at current cursor\n   */\n  pasteHTML(markup) {\n    markup = $.trim(markup);\n\n    const contentsContainer = $('<div></div>').html(markup)[0];\n    let childNodes = lists.from(contentsContainer.childNodes);\n\n    // const rng = this.wrapBodyInlineWithPara().deleteContents();\n    const rng = this;\n    let reversed = false;\n\n    if (rng.so >= 0) {\n      childNodes = childNodes.reverse();\n      reversed = true;\n    }\n\n    childNodes = childNodes.map(function(childNode) {\n      return rng.insertNode(childNode);\n    });\n\n    if (reversed) {\n      childNodes = childNodes.reverse();\n    }\n    return childNodes;\n  }\n\n  /**\n   * returns text in range\n   *\n   * @return {String}\n   */\n  toString() {\n    const nativeRng = this.nativeRange();\n    return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;\n  }\n\n  /**\n   * returns range for word before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordRange(findAfter) {\n    let endPoint = this.getEndPoint();\n\n    if (!dom.isCharPoint(endPoint)) {\n      return this;\n    }\n\n    const startPoint = dom.prevPointUntil(endPoint, function(point) {\n      return !dom.isCharPoint(point);\n    });\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, function(point) {\n        return !dom.isCharPoint(point);\n      });\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordsRange(findAfter) {\n    var endPoint = this.getEndPoint();\n\n    var isNotTextPoint = function(point) {\n      return !dom.isCharPoint(point) && !dom.isSpacePoint(point);\n    };\n\n    if (isNotTextPoint(endPoint)) {\n      return this;\n    }\n\n    var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor that match with a Regex\n   *\n   * example:\n   *  range: 'hi @Peter Pan'\n   *  regex: '/@[a-z ]+/i'\n   *  return range: '@Peter Pan'\n   *\n   * @param {RegExp} [regex]\n   * @return {WrappedRange|null}\n   */\n  getWordsMatchRange(regex) {\n    var endPoint = this.getEndPoint();\n\n    var startPoint = dom.prevPointUntil(endPoint, function(point) {\n      if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {\n        return true;\n      }\n      var rng = new WrappedRange(\n        point.node,\n        point.offset,\n        endPoint.node,\n        endPoint.offset\n      );\n      var result = regex.exec(rng.toString());\n      return result && result.index === 0;\n    });\n\n    var rng = new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n\n    var text = rng.toString();\n    var result = regex.exec(text);\n\n    if (result && result[0].length === text.length) {\n      return rng;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * create offsetPath bookmark\n   *\n   * @param {Node} editable\n   */\n  bookmark(editable) {\n    return {\n      s: {\n        path: dom.makeOffsetPath(editable, this.sc),\n        offset: this.so,\n      },\n      e: {\n        path: dom.makeOffsetPath(editable, this.ec),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * create offsetPath bookmark base on paragraph\n   *\n   * @param {Node[]} paras\n   */\n  paraBookmark(paras) {\n    return {\n      s: {\n        path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),\n        offset: this.so,\n      },\n      e: {\n        path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * getClientRects\n   * @return {Rect[]}\n   */\n  getClientRects() {\n    const nativeRng = this.nativeRange();\n    return nativeRng.getClientRects();\n  }\n}\n\n/**\n * Data structure\n *  * BoundaryPoint: a point of dom tree\n *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range\n *\n * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position\n */\nexport default {\n  /**\n   * create Range Object From arguments or Browser Selection\n   *\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   * @return {WrappedRange}\n   */\n  create: function(sc, so, ec, eo) {\n    if (arguments.length === 4) {\n      return new WrappedRange(sc, so, ec, eo);\n    } else if (arguments.length === 2) { // collapsed\n      ec = sc;\n      eo = so;\n      return new WrappedRange(sc, so, ec, eo);\n    } else {\n      let wrappedRange = this.createFromSelection();\n\n      if (!wrappedRange && arguments.length === 1) {\n        let bodyElement = arguments[0];\n        if (dom.isEditable(bodyElement)) {\n          bodyElement = bodyElement.lastChild;\n        }\n        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);\n      }\n      return wrappedRange;\n    }\n  },\n\n  createFromBodyElement: function(bodyElement, isCollapseToStart = false) {\n    var wrappedRange = this.createFromNode(bodyElement);\n    return wrappedRange.collapse(isCollapseToStart);\n  },\n\n  createFromSelection: function() {\n    let sc, so, ec, eo;\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (!selection || selection.rangeCount === 0) {\n        return null;\n      } else if (dom.isBody(selection.anchorNode)) {\n        // Firefox: returns entire body as range on initialization.\n        // We won't never need it.\n        return null;\n      }\n\n      const nativeRng = selection.getRangeAt(0);\n      sc = nativeRng.startContainer;\n      so = nativeRng.startOffset;\n      ec = nativeRng.endContainer;\n      eo = nativeRng.endOffset;\n    } else { // IE8: TextRange\n      const textRange = document.selection.createRange();\n      const textRangeEnd = textRange.duplicate();\n      textRangeEnd.collapse(false);\n      const textRangeStart = textRange;\n      textRangeStart.collapse(true);\n\n      let startPoint = textRangeToPoint(textRangeStart, true);\n      let endPoint = textRangeToPoint(textRangeEnd, false);\n\n      // same visible point case: range was collapsed.\n      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&\n        dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&\n        endPoint.node.nextSibling === startPoint.node) {\n        startPoint = endPoint;\n      }\n\n      sc = startPoint.cont;\n      so = startPoint.offset;\n      ec = endPoint.cont;\n      eo = endPoint.offset;\n    }\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from node\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNode: function(node) {\n    let sc = node;\n    let so = 0;\n    let ec = node;\n    let eo = dom.nodeLength(ec);\n\n    // browsers can't target a picture or void node\n    if (dom.isVoid(sc)) {\n      so = dom.listPrev(sc).length - 1;\n      sc = sc.parentNode;\n    }\n    if (dom.isBR(ec)) {\n      eo = dom.listPrev(ec).length - 1;\n      ec = ec.parentNode;\n    } else if (dom.isVoid(ec)) {\n      eo = dom.listPrev(ec).length;\n      ec = ec.parentNode;\n    }\n\n    return this.create(sc, so, ec, eo);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeBefore: function(node) {\n    return this.createFromNode(node).collapse(true);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeAfter: function(node) {\n    return this.createFromNode(node).collapse();\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from bookmark\n   *\n   * @param {Node} editable\n   * @param {Object} bookmark\n   * @return {WrappedRange}\n   */\n  createFromBookmark: function(editable, bookmark) {\n    const sc = dom.fromOffsetPath(editable, bookmark.s.path);\n    const so = bookmark.s.offset;\n    const ec = dom.fromOffsetPath(editable, bookmark.e.path);\n    const eo = bookmark.e.offset;\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from paraBookmark\n   *\n   * @param {Object} bookmark\n   * @param {Node[]} paras\n   * @return {WrappedRange}\n   */\n  createFromParaBookmark: function(bookmark, paras) {\n    const so = bookmark.s.offset;\n    const eo = bookmark.e.offset;\n    const sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);\n    const ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n};\n","import lists from './lists';\nimport func from './func';\n\nconst KEY_MAP = {\n  'BACKSPACE': 8,\n  'TAB': 9,\n  'ENTER': 13,\n  'ESCAPE': 27,\n  'SPACE': 32,\n  'DELETE': 46,\n\n  // Arrow\n  'LEFT': 37,\n  'UP': 38,\n  'RIGHT': 39,\n  'DOWN': 40,\n\n  // Number: 0-9\n  'NUM0': 48,\n  'NUM1': 49,\n  'NUM2': 50,\n  'NUM3': 51,\n  'NUM4': 52,\n  'NUM5': 53,\n  'NUM6': 54,\n  'NUM7': 55,\n  'NUM8': 56,\n\n  // Alphabet: a-z\n  'B': 66,\n  'E': 69,\n  'I': 73,\n  'J': 74,\n  'K': 75,\n  'L': 76,\n  'R': 82,\n  'S': 83,\n  'U': 85,\n  'V': 86,\n  'Y': 89,\n  'Z': 90,\n\n  'SLASH': 191,\n  'LEFTBRACKET': 219,\n  'BACKSLASH': 220,\n  'RIGHTBRACKET': 221,\n\n  // Navigation\n  'HOME': 36,\n  'END': 35,\n  'PAGEUP': 33,\n  'PAGEDOWN': 34,\n};\n\n/**\n * @class core.key\n *\n * Object for keycodes.\n *\n * @singleton\n * @alternateClassName key\n */\nexport default {\n  /**\n   * @method isEdit\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isEdit: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.BACKSPACE,\n      KEY_MAP.TAB,\n      KEY_MAP.ENTER,\n      KEY_MAP.SPACE,\n      KEY_MAP.DELETE,\n    ], keyCode);\n  },\n  /**\n   * @method isMove\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isMove: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.LEFT,\n      KEY_MAP.UP,\n      KEY_MAP.RIGHT,\n      KEY_MAP.DOWN,\n    ], keyCode);\n  },\n  /**\n   * @method isNavigation\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isNavigation: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.HOME,\n      KEY_MAP.END,\n      KEY_MAP.PAGEUP,\n      KEY_MAP.PAGEDOWN,\n    ], keyCode);\n  },\n  /**\n   * @property {Object} nameFromCode\n   * @property {String} nameFromCode.8 \"BACKSPACE\"\n   */\n  nameFromCode: func.invertObject(KEY_MAP),\n  code: KEY_MAP,\n};\n","import $ from 'jquery';\n\n/**\n * @method readFileAsDataURL\n *\n * read contents of file as representing URL\n *\n * @param {File} file\n * @return {Promise} - then: dataUrl\n */\nexport function readFileAsDataURL(file) {\n  return $.Deferred((deferred) => {\n    $.extend(new FileReader(), {\n      onload: (e) => {\n        const dataURL = e.target.result;\n        deferred.resolve(dataURL);\n      },\n      onerror: (err) => {\n        deferred.reject(err);\n      },\n    }).readAsDataURL(file);\n  }).promise();\n}\n\n/**\n * @method createImage\n *\n * create `<image>` from url string\n *\n * @param {String} url\n * @return {Promise} - then: $image\n */\nexport function createImage(url) {\n  return $.Deferred((deferred) => {\n    const $img = $('<img>');\n\n    $img.one('load', () => {\n      $img.off('error abort');\n      deferred.resolve($img);\n    }).one('error abort', () => {\n      $img.off('load').detach();\n      deferred.reject($img);\n    }).css({\n      display: 'none',\n    }).appendTo(document.body).attr('src', url);\n  }).promise();\n}\n","import range from '../core/range';\n\nexport default class History {\n  constructor(context) {\n    this.stack = [];\n    this.stackOffset = -1;\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n    this.editable = this.$editable[0];\n  }\n\n  makeSnapshot() {\n    const rng = range.create(this.editable);\n    const emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };\n\n    return {\n      contents: this.$editable.html(),\n      bookmark: ((rng && rng.isOnEditable()) ? rng.bookmark(this.editable) : emptyBookmark),\n    };\n  }\n\n  applySnapshot(snapshot) {\n    if (snapshot.contents !== null) {\n      this.$editable.html(snapshot.contents);\n    }\n    if (snapshot.bookmark !== null) {\n      range.createFromBookmark(this.editable, snapshot.bookmark).select();\n    }\n  }\n\n  /**\n  * @method rewind\n  * Rewinds the history stack back to the first snapshot taken.\n  * Leaves the stack intact, so that \"Redo\" can still be used.\n  */\n  rewind() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    // Return to the first available snapshot.\n    this.stackOffset = 0;\n\n    // Apply that snapshot.\n    this.applySnapshot(this.stack[this.stackOffset]);\n  }\n\n  /**\n  *  @method commit\n  *  Resets history stack, but keeps current editor's content.\n  */\n  commit() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n  * @method reset\n  * Resets the history stack completely; reverting to an empty editor.\n  */\n  reset() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Clear the editable area.\n    this.$editable.html('');\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    if (this.stackOffset > 0) {\n      this.stackOffset--;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    if (this.stack.length - 1 > this.stackOffset) {\n      this.stackOffset++;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * recorded undo\n   */\n  recordUndo() {\n    this.stackOffset++;\n\n    // Wash out stack after stackOffset\n    if (this.stack.length > this.stackOffset) {\n      this.stack = this.stack.slice(0, this.stackOffset);\n    }\n\n    // Create new snapshot and push it to the end\n    this.stack.push(this.makeSnapshot());\n\n    // If the stack size reachs to the limit, then slice it\n    if (this.stack.length > this.context.options.historyLimit) {\n      this.stack.shift();\n      this.stackOffset -= 1;\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class Style {\n  /**\n   * @method jQueryCSS\n   *\n   * [workaround] for old jQuery\n   * passing an array of style properties to .css()\n   * will result in an object of property-value pairs.\n   * (compability with version < 1.9)\n   *\n   * @private\n   * @param  {jQuery} $obj\n   * @param  {Array} propertyNames - An array of one or more CSS properties.\n   * @return {Object}\n   */\n  jQueryCSS($obj, propertyNames) {\n    const result = {};\n    $.each(propertyNames, (idx, propertyName) => {\n      result[propertyName] = $obj.css(propertyName);\n    });\n    return result;\n  }\n\n  /**\n   * returns style object from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  fromNode($node) {\n    const properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];\n    const styleInfo = this.jQueryCSS($node, properties) || {};\n\n    const fontSize = $node[0].style.fontSize || styleInfo['font-size'];\n\n    styleInfo['font-size'] = parseInt(fontSize, 10);\n    styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);\n\n    return styleInfo;\n  }\n\n  /**\n   * paragraph level style\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} styleInfo\n   */\n  stylePara(rng, styleInfo) {\n    $.each(rng.nodes(dom.isPara, {\n      includeAncestor: true,\n    }), (idx, para) => {\n      $(para).css(styleInfo);\n    });\n  }\n\n  /**\n   * insert and returns styleNodes on range.\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} [options] - options for styleNodes\n   * @param {String} [options.nodeName] - default: `SPAN`\n   * @param {Boolean} [options.expandClosestSibling] - default: `false`\n   * @param {Boolean} [options.onlyPartialContains] - default: `false`\n   * @return {Node[]}\n   */\n  styleNodes(rng, options) {\n    rng = rng.splitText();\n\n    const nodeName = (options && options.nodeName) || 'SPAN';\n    const expandClosestSibling = !!(options && options.expandClosestSibling);\n    const onlyPartialContains = !!(options && options.onlyPartialContains);\n\n    if (rng.isCollapsed()) {\n      return [rng.insertNode(dom.create(nodeName))];\n    }\n\n    let pred = dom.makePredByNodeName(nodeName);\n    const nodes = rng.nodes(dom.isText, {\n      fullyContains: true,\n    }).map((text) => {\n      return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);\n    });\n\n    if (expandClosestSibling) {\n      if (onlyPartialContains) {\n        const nodesInRange = rng.nodes();\n        // compose with partial contains predication\n        pred = func.and(pred, (node) => {\n          return lists.contains(nodesInRange, node);\n        });\n      }\n\n      return nodes.map((node) => {\n        const siblings = dom.withClosestSiblings(node, pred);\n        const head = lists.head(siblings);\n        const tails = lists.tail(siblings);\n        $.each(tails, (idx, elem) => {\n          dom.appendChildNodes(head, elem.childNodes);\n          dom.remove(elem);\n        });\n        return lists.head(siblings);\n      });\n    } else {\n      return nodes;\n    }\n  }\n\n  /**\n   * get current style on cursor\n   *\n   * @param {WrappedRange} rng\n   * @return {Object} - object contains style properties.\n   */\n  current(rng) {\n    const $cont = $(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);\n    let styleInfo = this.fromNode($cont);\n\n    // document.queryCommandState for toggle state\n    // [workaround] prevent Firefox nsresult: \"0x80004005 (NS_ERROR_FAILURE)\"\n    try {\n      styleInfo = $.extend(styleInfo, {\n        'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',\n        'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',\n        'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',\n        'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',\n        'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',\n        'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',\n        'font-family': document.queryCommandValue('fontname') || styleInfo['font-family'],\n      });\n    } catch (e) {\n      // eslint-disable-next-line\n    }\n\n    // list-style-type to list-style(unordered, ordered)\n    if (!rng.isOnList()) {\n      styleInfo['list-style'] = 'none';\n    } else {\n      const orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];\n      const isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;\n      styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';\n    }\n\n    const para = dom.ancestor(rng.sc, dom.isPara);\n    if (para && para.style['line-height']) {\n      styleInfo['line-height'] = para.style.lineHeight;\n    } else {\n      const lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);\n      styleInfo['line-height'] = lineHeight.toFixed(1);\n    }\n\n    styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);\n    styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);\n    styleInfo.range = rng;\n\n    return styleInfo;\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport func from '../core/func';\nimport dom from '../core/dom';\nimport range from '../core/range';\n\nexport default class Bullet {\n  /**\n   * toggle ordered list\n   */\n  insertOrderedList(editable) {\n    this.toggleList('OL', editable);\n  }\n\n  /**\n   * toggle unordered list\n   */\n  insertUnorderedList(editable) {\n    this.toggleList('UL', editable);\n  }\n\n  /**\n   * indent\n   */\n  indent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        const previousList = this.findList(head.previousSibling);\n        if (previousList) {\n          paras\n            .map(para => previousList.appendChild(para));\n        } else {\n          this.wrapList(paras, head.parentNode.nodeName);\n          paras\n            .map((para) => para.parentNode)\n            .map((para) => this.appendToPrevious(para));\n        }\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            return (parseInt(val, 10) || 0) + 25;\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * outdent\n   */\n  outdent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        this.releaseList([paras]);\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            val = (parseInt(val, 10) || 0);\n            return val > 25 ? val - 25 : '';\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * toggle list\n   *\n   * @param {String} listName - OL or UL\n   */\n  toggleList(listName, editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    let paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const bookmark = rng.paraBookmark(paras);\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    // paragraph to list\n    if (lists.find(paras, dom.isPurePara)) {\n      let wrappedParas = [];\n      $.each(clustereds, (idx, paras) => {\n        wrappedParas = wrappedParas.concat(this.wrapList(paras, listName));\n      });\n      paras = wrappedParas;\n    // list to paragraph or change list style\n    } else {\n      const diffLists = rng.nodes(dom.isList, {\n        includeAncestor: true,\n      }).filter((listNode) => {\n        return !$.nodeName(listNode, listName);\n      });\n\n      if (diffLists.length) {\n        $.each(diffLists, (idx, listNode) => {\n          dom.replace(listNode, listName);\n        });\n      } else {\n        paras = this.releaseList(clustereds, true);\n      }\n    }\n\n    range.createFromParaBookmark(bookmark, paras).select();\n  }\n\n  /**\n   * @param {Node[]} paras\n   * @param {String} listName\n   * @return {Node[]}\n   */\n  wrapList(paras, listName) {\n    const head = lists.head(paras);\n    const last = lists.last(paras);\n\n    const prevList = dom.isList(head.previousSibling) && head.previousSibling;\n    const nextList = dom.isList(last.nextSibling) && last.nextSibling;\n\n    const listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);\n\n    // P to LI\n    paras = paras.map((para) => {\n      return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;\n    });\n\n    // append to list(<ul>, <ol>)\n    dom.appendChildNodes(listNode, paras);\n\n    if (nextList) {\n      dom.appendChildNodes(listNode, lists.from(nextList.childNodes));\n      dom.remove(nextList);\n    }\n\n    return paras;\n  }\n\n  /**\n   * @method releaseList\n   *\n   * @param {Array[]} clustereds\n   * @param {Boolean} isEscapseToBody\n   * @return {Node[]}\n   */\n  releaseList(clustereds, isEscapseToBody) {\n    let releasedParas = [];\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      const last = lists.last(paras);\n\n      const headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;\n      const parentItem = headList.parentNode;\n\n      if (headList.parentNode.nodeName === 'LI') {\n        paras.map(para => {\n          const newList = this.findNextSiblings(para);\n\n          if (parentItem.nextSibling) {\n            parentItem.parentNode.insertBefore(\n              para,\n              parentItem.nextSibling\n            );\n          } else {\n            parentItem.parentNode.appendChild(para);\n          }\n\n          if (newList.length) {\n            this.wrapList(newList, headList.nodeName);\n            para.appendChild(newList[0].parentNode);\n          }\n        });\n\n        if (headList.children.length === 0) {\n          parentItem.removeChild(headList);\n        }\n\n        if (parentItem.childNodes.length === 0) {\n          parentItem.parentNode.removeChild(parentItem);\n        }\n      } else {\n        const lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {\n          node: last.parentNode,\n          offset: dom.position(last) + 1,\n        }, {\n          isSkipPaddingBlankHTML: true,\n        }) : null;\n\n        const middleList = dom.splitTree(headList, {\n          node: head.parentNode,\n          offset: dom.position(head),\n        }, {\n          isSkipPaddingBlankHTML: true,\n        });\n\n        paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi)\n          : lists.from(middleList.childNodes).filter(dom.isLi);\n\n        // LI to P\n        if (isEscapseToBody || !dom.isList(headList.parentNode)) {\n          paras = paras.map((para) => {\n            return dom.replace(para, 'P');\n          });\n        }\n\n        $.each(lists.from(paras).reverse(), (idx, para) => {\n          dom.insertAfter(para, headList);\n        });\n\n        // remove empty lists\n        const rootLists = lists.compact([headList, middleList, lastList]);\n        $.each(rootLists, (idx, rootList) => {\n          const listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));\n          $.each(listNodes.reverse(), (idx, listNode) => {\n            if (!dom.nodeLength(listNode)) {\n              dom.remove(listNode, true);\n            }\n          });\n        });\n      }\n\n      releasedParas = releasedParas.concat(paras);\n    });\n\n    return releasedParas;\n  }\n\n  /**\n   * @method appendToPrevious\n   *\n   * Appends list to previous list item, if\n   * none exist it wraps the list in a new list item.\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  appendToPrevious(node) {\n    return node.previousSibling\n      ? dom.appendChildNodes(node.previousSibling, [node])\n      : this.wrapList([node], 'LI');\n  }\n\n  /**\n   * @method findList\n   *\n   * Finds an existing list in list item\n   *\n   * @param {HTMLNode} ListItem\n   * @return {Array[]}\n   */\n  findList(node) {\n    return node\n      ? lists.find(node.children, child => ['OL', 'UL'].indexOf(child.nodeName) > -1)\n      : null;\n  }\n\n  /**\n   * @method findNextSiblings\n   *\n   * Finds all list item siblings that follow it\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  findNextSiblings(node) {\n    const siblings = [];\n    while (node.nextSibling) {\n      siblings.push(node.nextSibling);\n      node = node.nextSibling;\n    }\n    return siblings;\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport Bullet from '../editing/Bullet';\n\n/**\n * @class editing.Typing\n *\n * Typing\n *\n */\nexport default class Typing {\n  constructor(context) {\n    // a Bullet instance to toggle lists off\n    this.bullet = new Bullet();\n    this.options = context.options;\n  }\n\n  /**\n   * insert tab\n   *\n   * @param {WrappedRange} rng\n   * @param {Number} tabsize\n   */\n  insertTab(rng, tabsize) {\n    const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));\n    rng = rng.deleteContents();\n    rng.insertNode(tab, true);\n\n    rng = range.create(tab, tabsize);\n    rng.select();\n  }\n\n  /**\n   * insert paragraph\n   *\n   * @param {jQuery} $editable\n   * @param {WrappedRange} rng Can be used in unit tests to \"mock\" the range\n   *\n   * blockquoteBreakingLevel\n   *   0 - No break, the new paragraph remains inside the quote\n   *   1 - Break the first blockquote in the ancestors list\n   *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)\n   */\n  insertParagraph(editable, rng) {\n    rng = rng || range.create(editable);\n\n    // deleteContents on range.\n    rng = rng.deleteContents();\n\n    // Wrap range if it needs to be wrapped by paragraph\n    rng = rng.wrapBodyInlineWithPara();\n\n    // finding paragraph\n    const splitRoot = dom.ancestor(rng.sc, dom.isPara);\n\n    let nextPara;\n    // on paragraph: split paragraph\n    if (splitRoot) {\n      // if it is an empty line with li\n      if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {\n        // toggle UL/OL and escape\n        this.bullet.toggleList(splitRoot.parentNode.nodeName);\n        return;\n      } else {\n        let blockquote = null;\n        if (this.options.blockquoteBreakingLevel === 1) {\n          blockquote = dom.ancestor(splitRoot, dom.isBlockquote);\n        } else if (this.options.blockquoteBreakingLevel === 2) {\n          blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);\n        }\n\n        if (blockquote) {\n          // We're inside a blockquote and options ask us to break it\n          nextPara = $(dom.emptyPara)[0];\n          // If the split is right before a <br>, remove it so that there's no \"empty line\"\n          // after the split in the new blockquote created\n          if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {\n            $(rng.sc.nextSibling).remove();\n          }\n          const split = dom.splitTree(blockquote, rng.getStartPoint(), { isDiscardEmptySplits: true });\n          if (split) {\n            split.parentNode.insertBefore(nextPara, split);\n          } else {\n            dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote\n          }\n        } else {\n          nextPara = dom.splitTree(splitRoot, rng.getStartPoint());\n\n          // not a blockquote, just insert the paragraph\n          let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);\n          emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));\n\n          $.each(emptyAnchors, (idx, anchor) => {\n            dom.remove(anchor);\n          });\n\n          // replace empty heading, pre or custom-made styleTag with P tag\n          if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {\n            nextPara = dom.replace(nextPara, 'p');\n          }\n        }\n      }\n    // no paragraph: insert empty paragraph\n    } else {\n      const next = rng.sc.childNodes[rng.so];\n      nextPara = $(dom.emptyPara)[0];\n      if (next) {\n        rng.sc.insertBefore(nextPara, next);\n      } else {\n        rng.sc.appendChild(nextPara);\n      }\n    }\n\n    range.create(nextPara, 0).normalize().select().scrollIntoView(editable);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport lists from '../core/lists';\n\n/**\n * @class Create a virtual table to create what actions to do in change.\n * @param {object} startPoint Cell selected to apply change.\n * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where\n * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction\n * @param {object} domTable Dom element of table to make changes.\n */\nconst TableResultAction = function(startPoint, where, action, domTable) {\n  const _startPoint = { 'colPos': 0, 'rowPos': 0 };\n  const _virtualTable = [];\n  const _actionCellList = [];\n\n  /// ///////////////////////////////////////////\n  // Private functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Set the startPoint of action.\n   */\n  function setStartPoint() {\n    if (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {\n      // Impossible to identify start Cell point\n      return;\n    }\n    _startPoint.colPos = startPoint.cellIndex;\n    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {\n      // Impossible to identify start Row point\n      return;\n    }\n    _startPoint.rowPos = startPoint.parentElement.rowIndex;\n  }\n\n  /**\n   * Define virtual table position info object.\n   *\n   * @param {int} rowIndex Index position in line of virtual table.\n   * @param {int} cellIndex Index position in column of virtual table.\n   * @param {object} baseRow Row affected by this position.\n   * @param {object} baseCell Cell affected by this position.\n   * @param {bool} isSpan Inform if it is an span cell/row.\n   */\n  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {\n    const objPosition = {\n      'baseRow': baseRow,\n      'baseCell': baseCell,\n      'isRowSpan': isRowSpan,\n      'isColSpan': isColSpan,\n      'isVirtual': isVirtualCell,\n    };\n    if (!_virtualTable[rowIndex]) {\n      _virtualTable[rowIndex] = [];\n    }\n    _virtualTable[rowIndex][cellIndex] = objPosition;\n  }\n\n  /**\n   * Create action cell object.\n   *\n   * @param {object} virtualTableCellObj Object of specific position on virtual table.\n   * @param {enum} resultAction Action to be applied in that item.\n   */\n  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {\n    return {\n      'baseCell': virtualTableCellObj.baseCell,\n      'action': resultAction,\n      'virtualTable': {\n        'rowIndex': virtualRowPosition,\n        'cellIndex': virtualColPosition,\n      },\n    };\n  }\n\n  /**\n   * Recover free index of row to append Cell.\n   *\n   * @param {int} rowIndex Index of row to find free space.\n   * @param {int} cellIndex Index of cell to find free space in table.\n   */\n  function recoverCellIndex(rowIndex, cellIndex) {\n    if (!_virtualTable[rowIndex]) {\n      return cellIndex;\n    }\n    if (!_virtualTable[rowIndex][cellIndex]) {\n      return cellIndex;\n    }\n\n    let newCellIndex = cellIndex;\n    while (_virtualTable[rowIndex][newCellIndex]) {\n      newCellIndex++;\n      if (!_virtualTable[rowIndex][newCellIndex]) {\n        return newCellIndex;\n      }\n    }\n  }\n\n  /**\n   * Recover info about row and cell and add information to virtual table.\n   *\n   * @param {object} row Row to recover information.\n   * @param {object} cell Cell to recover information.\n   */\n  function addCellInfoToVirtual(row, cell) {\n    const cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);\n    const cellHasColspan = (cell.colSpan > 1);\n    const cellHasRowspan = (cell.rowSpan > 1);\n    const isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);\n    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);\n\n    // Add span rows to virtual Table.\n    const rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;\n    if (rowspanNumber > 1) {\n      for (let rp = 1; rp < rowspanNumber; rp++) {\n        const rowspanIndex = row.rowIndex + rp;\n        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);\n      }\n    }\n\n    // Add span cols to virtual table.\n    const colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;\n    if (colspanNumber > 1) {\n      for (let cp = 1; cp < colspanNumber; cp++) {\n        const cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));\n        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);\n      }\n    }\n  }\n\n  /**\n   * Process validation and adjust of start point if needed\n   *\n   * @param {int} rowIndex\n   * @param {int} cellIndex\n   * @param {object} cell\n   * @param {bool} isSelectedCell\n   */\n  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {\n    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {\n      _startPoint.colPos++;\n    }\n  }\n\n  /**\n   * Create virtual table of cells with all cells, including span cells.\n   */\n  function createVirtualTable() {\n    const rows = domTable.rows;\n    for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      const cells = rows[rowIndex].cells;\n      for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);\n      }\n    }\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getDeleteResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (!cell.isVirtual && cell.isRowSpan) {\n          return TableResultAction.resultAction.AddCell;\n        } else if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.RemoveCell;\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getAddResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isRowSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isColSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.AddCell;\n  }\n\n  function init() {\n    setStartPoint();\n    createVirtualTable();\n  }\n\n  /// ///////////////////////////////////////////\n  // Public functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Recover array os what to do in table.\n   */\n  this.getActionList = function() {\n    const fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;\n    const fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;\n\n    let actualPosition = 0;\n    let canContinue = true;\n    while (canContinue) {\n      const rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;\n      const colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;\n      const row = _virtualTable[rowPosition];\n      if (!row) {\n        canContinue = false;\n        return _actionCellList;\n      }\n      const cell = row[colPosition];\n      if (!cell) {\n        canContinue = false;\n        return _actionCellList;\n      }\n\n      // Define action to be applied in this cell\n      let resultAction = TableResultAction.resultAction.Ignore;\n      switch (action) {\n        case TableResultAction.requestAction.Add:\n          resultAction = getAddResultActionToCell(cell);\n          break;\n        case TableResultAction.requestAction.Delete:\n          resultAction = getDeleteResultActionToCell(cell);\n          break;\n      }\n      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));\n      actualPosition++;\n    }\n\n    return _actionCellList;\n  };\n\n  init();\n};\n/**\n*\n* Where action occours enum.\n*/\nTableResultAction.where = { 'Row': 0, 'Column': 1 };\n/**\n*\n* Requested action to apply enum.\n*/\nTableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };\n/**\n*\n* Result action to be executed enum.\n*/\nTableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };\n\n/**\n *\n * @class editing.Table\n *\n * Table\n *\n */\nexport default class Table {\n  /**\n   * handle tab key\n   *\n   * @param {WrappedRange} rng\n   * @param {Boolean} isShift\n   */\n  tab(rng, isShift) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const table = dom.ancestor(cell, dom.isTable);\n    const cells = dom.listDescendant(table, dom.isCell);\n\n    const nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);\n    if (nextCell) {\n      range.create(nextCell, 0).select();\n    }\n  }\n\n  /**\n   * Add a new row\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (top/bottom)\n   * @return {Node}\n   */\n  addRow(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n\n    const currentTr = $(cell).closest('tr');\n    const trAttributes = this.recoverAttributes(currentTr);\n    const html = $('<tr' + trAttributes + '></tr>');\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Add, $(currentTr).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let idCell = 0; idCell < actions.length; idCell++) {\n      const currentCell = actions[idCell];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          {\n            if (position === 'top') {\n              const baseCellTr = currentCell.baseCell.parent;\n              const isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;\n              if (isTopFromRowSpan) {\n                const newTd = $('<div></div>').append($('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();\n                html.append(newTd);\n                break;\n              }\n            }\n            let rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);\n            rowspanNumber++;\n            currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);\n          }\n          break;\n      }\n    }\n\n    if (position === 'top') {\n      currentTr.before(html);\n    } else {\n      const cellHasRowspan = (cell.rowSpan > 1);\n      if (cellHasRowspan) {\n        const lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);\n        $($(currentTr).parent().find('tr')[lastTrIndex]).after($(html));\n        return;\n      }\n      currentTr.after(html);\n    }\n  }\n\n  /**\n   * Add a new col\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (left/right)\n   * @return {Node}\n   */\n  addCol(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const rowsGroup = $(row).siblings();\n    rowsGroup.push(row);\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Add, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      const currentCell = actions[actionIndex];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          if (position === 'right') {\n            $(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          if (position === 'right') {\n            let colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);\n            colspanNumber++;\n            currentCell.baseCell.setAttribute('colSpan', colspanNumber);\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n      }\n    }\n  }\n\n  /*\n  * Copy attributes from element.\n  *\n  * @param {object} Element to recover attributes.\n  * @return {string} Copied string elements.\n  */\n  recoverAttributes(el) {\n    let resultStr = '';\n\n    if (!el) {\n      return resultStr;\n    }\n\n    const attrList = el.attributes || [];\n\n    for (let i = 0; i < attrList.length; i++) {\n      if (attrList[i].name.toLowerCase() === 'id') {\n        continue;\n      }\n\n      if (attrList[i].specified) {\n        resultStr += ' ' + attrList[i].name + '=\\'' + attrList[i].value + '\\'';\n      }\n    }\n\n    return resultStr;\n  }\n\n  /**\n   * Delete current row\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteRow(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n    const rowPos = row[0].rowIndex;\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n\n      const baseCell = actions[actionIndex].baseCell;\n      const virtualPosition = actions[actionIndex].virtualTable;\n      const hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);\n      let rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.AddCell:\n          {\n            const nextRow = row.next('tr')[0];\n            if (!nextRow) { continue; }\n            const cloneRow = row[0].cells[cellPos];\n            if (hasRowspan) {\n              if (rowspanNumber > 2) {\n                rowspanNumber--;\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);\n                nextRow.cells[cellPos].innerHTML = '';\n              } else if (rowspanNumber === 2) {\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].removeAttribute('rowSpan');\n                nextRow.cells[cellPos].innerHTML = '';\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          if (hasRowspan) {\n            if (rowspanNumber > 2) {\n              rowspanNumber--;\n              baseCell.setAttribute('rowSpan', rowspanNumber);\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            } else if (rowspanNumber === 2) {\n              baseCell.removeAttribute('rowSpan');\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          // Do not need remove cell because row will be deleted.\n          continue;\n      }\n    }\n    row.remove();\n  }\n\n  /**\n   * Delete current col\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteCol(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          {\n            const baseCell = actions[actionIndex].baseCell;\n            const hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);\n            if (hasColspan) {\n              let colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;\n              if (colspanNumber > 2) {\n                colspanNumber--;\n                baseCell.setAttribute('colSpan', colspanNumber);\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              } else if (colspanNumber === 2) {\n                baseCell.removeAttribute('colSpan');\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          dom.remove(actions[actionIndex].baseCell, true);\n          continue;\n      }\n    }\n  }\n\n  /**\n   * create empty table element\n   *\n   * @param {Number} rowCount\n   * @param {Number} colCount\n   * @return {Node}\n   */\n  createTable(colCount, rowCount, options) {\n    const tds = [];\n    let tdHTML;\n    for (let idxCol = 0; idxCol < colCount; idxCol++) {\n      tds.push('<td>' + dom.blank + '</td>');\n    }\n    tdHTML = tds.join('');\n\n    const trs = [];\n    let trHTML;\n    for (let idxRow = 0; idxRow < rowCount; idxRow++) {\n      trs.push('<tr>' + tdHTML + '</tr>');\n    }\n    trHTML = trs.join('');\n    const $table = $('<table>' + trHTML + '</table>');\n    if (options && options.tableClassName) {\n      $table.addClass(options.tableClassName);\n    }\n\n    return $table[0];\n  }\n\n  /**\n   * Delete current table\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteTable(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    $(cell).closest('table').remove();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport { readFileAsDataURL, createImage } from '../core/async';\nimport History from '../editing/History';\nimport Style from '../editing/Style';\nimport Typing from '../editing/Typing';\nimport Table from '../editing/Table';\nimport Bullet from '../editing/Bullet';\n\nconst KEY_BOGUS = 'bogus';\n\n/**\n * @class Editor\n */\nexport default class Editor {\n  constructor(context) {\n    this.context = context;\n\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.editable = this.$editable[0];\n    this.lastRange = null;\n    this.snapshot = null;\n\n    this.style = new Style();\n    this.table = new Table();\n    this.typing = new Typing(context);\n    this.bullet = new Bullet();\n    this.history = new History(context);\n\n    this.context.memo('help.escape', this.lang.help.escape);\n    this.context.memo('help.undo', this.lang.help.undo);\n    this.context.memo('help.redo', this.lang.help.redo);\n    this.context.memo('help.tab', this.lang.help.tab);\n    this.context.memo('help.untab', this.lang.help.untab);\n    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);\n    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);\n    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);\n    this.context.memo('help.indent', this.lang.help.indent);\n    this.context.memo('help.outdent', this.lang.help.outdent);\n    this.context.memo('help.formatPara', this.lang.help.formatPara);\n    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);\n    this.context.memo('help.fontName', this.lang.help.fontName);\n\n    // native commands(with execCommand), generate function for execCommand\n    const commands = [\n      'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',\n      'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n      'formatBlock', 'removeFormat', 'backColor',\n    ];\n\n    for (let idx = 0, len = commands.length; idx < len; idx++) {\n      this[commands[idx]] = ((sCmd) => {\n        return (value) => {\n          this.beforeCommand();\n          document.execCommand(sCmd, false, value);\n          this.afterCommand(true);\n        };\n      })(commands[idx]);\n      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);\n    }\n\n    this.fontName = this.wrapCommand((value) => {\n      return this.fontStyling('font-family', env.validFontName(value));\n    });\n\n    this.fontSize = this.wrapCommand((value) => {\n      const unit = this.currentStyle()['font-size-unit'];\n      return this.fontStyling('font-size', value + unit);\n    });\n\n    this.fontSizeUnit = this.wrapCommand((value) => {\n      const size = this.currentStyle()['font-size'];\n      return this.fontStyling('font-size', size + value);\n    });\n\n    for (let idx = 1; idx <= 6; idx++) {\n      this['formatH' + idx] = ((idx) => {\n        return () => {\n          this.formatBlock('H' + idx);\n        };\n      })(idx);\n      this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);\n    }\n\n    this.insertParagraph = this.wrapCommand(() => {\n      this.typing.insertParagraph(this.editable);\n    });\n\n    this.insertOrderedList = this.wrapCommand(() => {\n      this.bullet.insertOrderedList(this.editable);\n    });\n\n    this.insertUnorderedList = this.wrapCommand(() => {\n      this.bullet.insertUnorderedList(this.editable);\n    });\n\n    this.indent = this.wrapCommand(() => {\n      this.bullet.indent(this.editable);\n    });\n\n    this.outdent = this.wrapCommand(() => {\n      this.bullet.outdent(this.editable);\n    });\n\n    /**\n     * insertNode\n     * insert node\n     * @param {Node} node\n     */\n    this.insertNode = this.wrapCommand((node) => {\n      if (this.isLimited($(node).text().length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      rng.insertNode(node);\n      this.setLastRange(range.createFromNodeAfter(node).select());\n    });\n\n    /**\n     * insert text\n     * @param {String} text\n     */\n    this.insertText = this.wrapCommand((text) => {\n      if (this.isLimited(text.length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      const textNode = rng.insertNode(dom.createText(text));\n      this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());\n    });\n\n    /**\n     * paste HTML\n     * @param {String} markup\n     */\n    this.pasteHTML = this.wrapCommand((markup) => {\n      if (this.isLimited(markup.length)) {\n        return;\n      }\n      markup = this.context.invoke('codeview.purify', markup);\n      const contents = this.getLastRange().pasteHTML(markup);\n      this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());\n    });\n\n    /**\n     * formatBlock\n     *\n     * @param {String} tagName\n     */\n    this.formatBlock = this.wrapCommand((tagName, $target) => {\n      const onApplyCustomStyle = this.options.callbacks.onApplyCustomStyle;\n      if (onApplyCustomStyle) {\n        onApplyCustomStyle.call(this, $target, this.context, this.onFormatBlock);\n      } else {\n        this.onFormatBlock(tagName, $target);\n      }\n    });\n\n    /**\n     * insert horizontal rule\n     */\n    this.insertHorizontalRule = this.wrapCommand(() => {\n      const hrNode = this.getLastRange().insertNode(dom.create('HR'));\n      if (hrNode.nextSibling) {\n        this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());\n      }\n    });\n\n    /**\n     * lineHeight\n     * @param {String} value\n     */\n    this.lineHeight = this.wrapCommand((value) => {\n      this.style.stylePara(this.getLastRange(), {\n        lineHeight: value,\n      });\n    });\n\n    /**\n     * create link (command)\n     *\n     * @param {Object} linkInfo\n     */\n    this.createLink = this.wrapCommand((linkInfo) => {\n      let linkUrl = linkInfo.url;\n      const linkText = linkInfo.text;\n      const isNewWindow = linkInfo.isNewWindow;\n      const checkProtocol = linkInfo.checkProtocol;\n      let rng = linkInfo.range || this.getLastRange();\n      const additionalTextLength = linkText.length - rng.toString().length;\n      if (additionalTextLength > 0 && this.isLimited(additionalTextLength)) {\n        return;\n      }\n      const isTextChanged = rng.toString() !== linkText;\n\n      // handle spaced urls from input\n      if (typeof linkUrl === 'string') {\n        linkUrl = linkUrl.trim();\n      }\n\n      if (this.options.onCreateLink) {\n        linkUrl = this.options.onCreateLink(linkUrl);\n      } else if (checkProtocol) {\n        // if url doesn't have any protocol and not even a relative or a label, use http:// as default\n        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\\:|#|\\/)/.test(linkUrl)\n          ? linkUrl : this.options.defaultProtocol + linkUrl;\n      }\n\n      let anchors = [];\n      if (isTextChanged) {\n        rng = rng.deleteContents();\n        const anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);\n        anchors.push(anchor);\n      } else {\n        anchors = this.style.styleNodes(rng, {\n          nodeName: 'A',\n          expandClosestSibling: true,\n          onlyPartialContains: true,\n        });\n      }\n\n      $.each(anchors, (idx, anchor) => {\n        $(anchor).attr('href', linkUrl);\n        if (isNewWindow) {\n          $(anchor).attr('target', '_blank');\n        } else {\n          $(anchor).removeAttr('target');\n        }\n      });\n\n      this.setLastRange(\n        this.createRangeFromList(anchors).select()\n      );\n    });\n\n    /**\n     * setting color\n     *\n     * @param {Object} sObjColor  color code\n     * @param {String} sObjColor.foreColor foreground color\n     * @param {String} sObjColor.backColor background color\n     */\n    this.color = this.wrapCommand((colorInfo) => {\n      const foreColor = colorInfo.foreColor;\n      const backColor = colorInfo.backColor;\n\n      if (foreColor) { document.execCommand('foreColor', false, foreColor); }\n      if (backColor) { document.execCommand('backColor', false, backColor); }\n    });\n\n    /**\n     * Set foreground color\n     *\n     * @param {String} colorCode foreground color code\n     */\n    this.foreColor = this.wrapCommand((colorInfo) => {\n      document.execCommand('foreColor', false, colorInfo);\n    });\n\n    /**\n     * insert Table\n     *\n     * @param {String} dimension of table (ex : \"5x5\")\n     */\n    this.insertTable = this.wrapCommand((dim) => {\n      const dimension = dim.split('x');\n\n      const rng = this.getLastRange().deleteContents();\n      rng.insertNode(this.table.createTable(dimension[0], dimension[1], this.options));\n    });\n\n    /**\n     * remove media object and Figure Elements if media object is img with Figure.\n     */\n    this.removeMedia = this.wrapCommand(() => {\n      let $target = $(this.restoreTarget()).parent();\n      if ($target.closest('figure').length) {\n        $target.closest('figure').remove();\n      } else {\n        $target = $(this.restoreTarget()).detach();\n      }\n      this.context.triggerEvent('media.delete', $target, this.$editable);\n    });\n\n    /**\n     * float me\n     *\n     * @param {String} value\n     */\n    this.floatMe = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      $target.toggleClass('note-float-left', value === 'left');\n      $target.toggleClass('note-float-right', value === 'right');\n      $target.css('float', (value === 'none' ? '' : value));\n    });\n\n    /**\n     * resize overlay element\n     * @param {String} value\n     */\n    this.resize = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      value = parseFloat(value);\n      if (value === 0) {\n        $target.css('width', '');\n      } else {\n        $target.css({\n          width: value * 100 + '%',\n          height: '',\n        });\n      }\n    });\n  }\n\n  initialize() {\n    // bind custom events\n    this.$editable.on('keydown', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        this.context.triggerEvent('enter', event);\n      }\n      this.context.triggerEvent('keydown', event);\n\n      // keep a snapshot to limit text on input event\n      this.snapshot = this.history.makeSnapshot();\n      this.hasKeyShortCut = false;\n      if (!event.isDefaultPrevented()) {\n        if (this.options.shortcuts) {\n          this.hasKeyShortCut = this.handleKeyMap(event);\n        } else {\n          this.preventDefaultEditableShortCuts(event);\n        }\n      }\n      if (this.isLimited(1, event)) {\n        const lastRange = this.getLastRange();\n        if (lastRange.eo - lastRange.so === 0) {\n          return false;\n        }\n      }\n      this.setLastRange();\n\n      // record undo in the key event except keyMap.\n      if (this.options.recordEveryKeystroke) {\n        if (this.hasKeyShortCut === false) {\n          this.history.recordUndo();\n        }\n      }\n    }).on('keyup', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('keyup', event);\n    }).on('focus', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('focus', event);\n    }).on('blur', (event) => {\n      this.context.triggerEvent('blur', event);\n    }).on('mousedown', (event) => {\n      this.context.triggerEvent('mousedown', event);\n    }).on('mouseup', (event) => {\n      this.setLastRange();\n      this.history.recordUndo();\n      this.context.triggerEvent('mouseup', event);\n    }).on('scroll', (event) => {\n      this.context.triggerEvent('scroll', event);\n    }).on('paste', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('paste', event);\n    }).on('input', () => {\n      // To limit composition characters (e.g. Korean)\n      if (this.isLimited(0) && this.snapshot) {\n        this.history.applySnapshot(this.snapshot);\n      }\n    });\n\n    this.$editable.attr('spellcheck', this.options.spellCheck);\n\n    this.$editable.attr('autocorrect', this.options.spellCheck);\n\n    if (this.options.disableGrammar) {\n      this.$editable.attr('data-gramm', false);\n    }\n\n    // init content before set event\n    this.$editable.html(dom.html(this.$note) || dom.emptyPara);\n\n    this.$editable.on(env.inputEventName, func.debounce(() => {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }, 10));\n\n    this.$editable.on('focusin', (event) => {\n      this.context.triggerEvent('focusin', event);\n    }).on('focusout', (event) => {\n      this.context.triggerEvent('focusout', event);\n    });\n\n    if (this.options.airMode) {\n      if (this.options.overrideContextMenu) {\n        this.$editor.on('contextmenu', (event) => {\n          this.context.triggerEvent('contextmenu', event);\n          return false;\n        });\n      }\n    } else {\n      if (this.options.width) {\n        this.$editor.outerWidth(this.options.width);\n      }\n      if (this.options.height) {\n        this.$editable.outerHeight(this.options.height);\n      }\n      if (this.options.maxHeight) {\n        this.$editable.css('max-height', this.options.maxHeight);\n      }\n      if (this.options.minHeight) {\n        this.$editable.css('min-height', this.options.minHeight);\n      }\n    }\n\n    this.history.recordUndo();\n    this.setLastRange();\n  }\n\n  destroy() {\n    this.$editable.off();\n  }\n\n  handleKeyMap(event) {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    const keys = [];\n\n    if (event.metaKey) { keys.push('CMD'); }\n    if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }\n    if (event.shiftKey) { keys.push('SHIFT'); }\n\n    const keyName = key.nameFromCode[event.keyCode];\n    if (keyName) {\n      keys.push(keyName);\n    }\n\n    const eventName = keyMap[keys.join('+')];\n\n    if (keyName === 'TAB' && !this.options.tabDisable) {\n      this.afterCommand();\n    } else if (eventName) {\n      if (this.context.invoke(eventName) !== false) {\n        event.preventDefault();\n        // if keyMap action was invoked\n        return true;\n      }\n    } else if (key.isEdit(event.keyCode)) {\n      this.afterCommand();\n    }\n    return false;\n  }\n\n  preventDefaultEditableShortCuts(event) {\n    // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)\n    if ((event.ctrlKey || event.metaKey) &&\n      lists.contains([66, 73, 85], event.keyCode)) {\n      event.preventDefault();\n    }\n  }\n\n  isLimited(pad, event) {\n    pad = pad || 0;\n\n    if (typeof event !== 'undefined') {\n      if (key.isMove(event.keyCode) ||\n          key.isNavigation(event.keyCode) ||\n          (event.ctrlKey || event.metaKey) ||\n          lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {\n        return false;\n      }\n    }\n\n    if (this.options.maxTextLength > 0) {\n      if ((this.$editable.text().length + pad) > this.options.maxTextLength) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * create range\n   * @return {WrappedRange}\n   */\n  createRange() {\n    this.focus();\n    this.setLastRange();\n    return this.getLastRange();\n  }\n\n  /**\n   * create a new range from the list of elements\n   *\n   * @param {list} dom element list\n   * @return {WrappedRange}\n   */\n  createRangeFromList(lst) {\n    const startRange = range.createFromNodeBefore(lists.head(lst));\n    const startPoint = startRange.getStartPoint();\n    const endRange = range.createFromNodeAfter(lists.last(lst));\n    const endPoint = endRange.getEndPoint();\n\n    return range.create(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * set the last range\n   *\n   * if given rng is exist, set rng as the last range\n   * or create a new range at the end of the document\n   *\n   * @param {WrappedRange} rng\n   */\n  setLastRange(rng) {\n    if (rng) {\n      this.lastRange = rng;\n    } else {\n      this.lastRange = range.create(this.editable);\n\n      if ($(this.lastRange.sc).closest('.note-editable').length === 0) {\n        this.lastRange = range.createFromBodyElement(this.editable);\n      }\n    }\n  }\n\n  /**\n   * get the last range\n   *\n   * if there is a saved last range, return it\n   * or create a new range and return it\n   *\n   * @return {WrappedRange}\n   */\n  getLastRange() {\n    if (!this.lastRange) {\n      this.setLastRange();\n    }\n    return this.lastRange;\n  }\n\n  /**\n   * saveRange\n   *\n   * save current range\n   *\n   * @param {Boolean} [thenCollapse=false]\n   */\n  saveRange(thenCollapse) {\n    if (thenCollapse) {\n      this.getLastRange().collapse().select();\n    }\n  }\n\n  /**\n   * restoreRange\n   *\n   * restore lately range\n   */\n  restoreRange() {\n    if (this.lastRange) {\n      this.lastRange.select();\n      this.focus();\n    }\n  }\n\n  saveTarget(node) {\n    this.$editable.data('target', node);\n  }\n\n  clearTarget() {\n    this.$editable.removeData('target');\n  }\n\n  restoreTarget() {\n    return this.$editable.data('target');\n  }\n\n  /**\n   * currentStyle\n   *\n   * current style\n   * @return {Object|Boolean} unfocus\n   */\n  currentStyle() {\n    let rng = range.create();\n    if (rng) {\n      rng = rng.normalize();\n    }\n    return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);\n  }\n\n  /**\n   * style from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  styleFromNode($node) {\n    return this.style.fromNode($node);\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.undo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /*\n  * commit\n  */\n  commit() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.commit();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.redo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * before command\n   */\n  beforeCommand() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n\n    // Set styleWithCSS before run a command\n    document.execCommand('styleWithCSS', false, this.options.styleWithCSS);\n\n    // keep focus on editable before command execution\n    this.focus();\n  }\n\n  /**\n   * after command\n   * @param {Boolean} isPreventTrigger\n   */\n  afterCommand(isPreventTrigger) {\n    this.normalizeContent();\n    this.history.recordUndo();\n    if (!isPreventTrigger) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  /**\n   * handle tab key\n   */\n  tab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n\n      if (!this.isLimited(this.options.tabSize)) {\n        this.beforeCommand();\n        this.typing.insertTab(rng, this.options.tabSize);\n        this.afterCommand();\n      }\n    }\n  }\n\n  /**\n   * handle shift+tab key\n   */\n  untab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng, true);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * run given function between beforeCommand and afterCommand\n   */\n  wrapCommand(fn) {\n    return function() {\n      this.beforeCommand();\n      fn.apply(this, arguments);\n      this.afterCommand();\n    };\n  }\n\n  /**\n   * insert image\n   *\n   * @param {String} src\n   * @param {String|Function} param\n   * @return {Promise}\n   */\n  insertImage(src, param) {\n    return createImage(src, param).then(($image) => {\n      this.beforeCommand();\n\n      if (typeof param === 'function') {\n        param($image);\n      } else {\n        if (typeof param === 'string') {\n          $image.attr('data-filename', param);\n        }\n        $image.css('width', Math.min(this.$editable.width(), $image.width()));\n      }\n\n      $image.show();\n      this.getLastRange().insertNode($image[0]);\n      this.setLastRange(range.createFromNodeAfter($image[0]).select());\n      this.afterCommand();\n    }).fail((e) => {\n      this.context.triggerEvent('image.upload.error', e);\n    });\n  }\n\n  /**\n   * insertImages\n   * @param {File[]} files\n   */\n  insertImagesAsDataURL(files) {\n    $.each(files, (idx, file) => {\n      const filename = file.name;\n      if (this.options.maximumImageFileSize && this.options.maximumImageFileSize < file.size) {\n        this.context.triggerEvent('image.upload.error', this.lang.image.maximumFileSizeError);\n      } else {\n        readFileAsDataURL(file).then((dataURL) => {\n          return this.insertImage(dataURL, filename);\n        }).fail(() => {\n          this.context.triggerEvent('image.upload.error');\n        });\n      }\n    });\n  }\n\n  /**\n   * insertImagesOrCallback\n   * @param {File[]} files\n   */\n  insertImagesOrCallback(files) {\n    const callbacks = this.options.callbacks;\n    // If onImageUpload set,\n    if (callbacks.onImageUpload) {\n      this.context.triggerEvent('image.upload', files);\n      // else insert Image as dataURL\n    } else {\n      this.insertImagesAsDataURL(files);\n    }\n  }\n\n  /**\n   * return selected plain text\n   * @return {String} text\n   */\n  getSelectedText() {\n    let rng = this.getLastRange();\n\n    // if range on anchor, expand range with anchor\n    if (rng.isOnAnchor()) {\n      rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));\n    }\n\n    return rng.toString();\n  }\n\n  onFormatBlock(tagName, $target) {\n    // [workaround] for MSIE, IE need `<`\n    document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName);\n\n    // support custom class\n    if ($target && $target.length) {\n      // find the exact element has given tagName\n      if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {\n        $target = $target.find(tagName);\n      }\n\n      if ($target && $target.length) {\n        const currentRange = this.createRange();\n        const $parent = $([currentRange.sc, currentRange.ec]).closest(tagName);\n        // remove class added for current block\n        $parent.removeClass();\n        const className = $target[0].className || '';\n        if (className) {\n          $parent.addClass(className);\n        }\n      }\n    }\n  }\n\n  formatPara() {\n    this.formatBlock('P');\n  }\n\n  fontStyling(target, value) {\n    const rng = this.getLastRange();\n\n    if (rng !== '') {\n      const spans = this.style.styleNodes(rng);\n      this.$editor.find('.note-status-output').html('');\n      $(spans).css(target, value);\n\n      // [workaround] added styled bogus span for style\n      //  - also bogus character needed for cursor position\n      if (rng.isCollapsed()) {\n        const firstSpan = lists.head(spans);\n        if (firstSpan && !dom.nodeLength(firstSpan)) {\n          firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;\n          range.createFromNode(firstSpan.firstChild).select();\n          this.setLastRange();\n          this.$editable.data(KEY_BOGUS, firstSpan);\n        }\n      } else {\n        this.setLastRange(\n          this.createRangeFromList(spans).select()\n        );\n      }\n    } else {\n      const noteStatusOutput = $.now();\n      this.$editor.find('.note-status-output').html('<div id=\"note-status-output-' + noteStatusOutput + '\" class=\"alert alert-info\">' + this.lang.output.noSelection + '</div>');\n      setTimeout(function() { $('#note-status-output-' + noteStatusOutput).remove(); }, 5000);\n    }\n  }\n\n  /**\n   * unlink\n   *\n   * @type command\n   */\n  unlink() {\n    let rng = this.getLastRange();\n    if (rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      rng = range.createFromNode(anchor);\n      rng.select();\n      this.setLastRange();\n\n      this.beforeCommand();\n      document.execCommand('unlink');\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * returns link info\n   *\n   * @return {Object}\n   * @return {WrappedRange} return.range\n   * @return {String} return.text\n   * @return {Boolean} [return.isNewWindow=true]\n   * @return {String} [return.url=\"\"]\n   */\n  getLinkInfo() {\n    const rng = this.getLastRange().expand(dom.isAnchor);\n    // Get the first anchor on range(for edit).\n    const $anchor = $(lists.head(rng.nodes(dom.isAnchor)));\n    const linkInfo = {\n      range: rng,\n      text: rng.toString(),\n      url: $anchor.length ? $anchor.attr('href') : '',\n    };\n\n    // When anchor exists,\n    if ($anchor.length) {\n      // Set isNewWindow by checking its target.\n      linkInfo.isNewWindow = $anchor.attr('target') === '_blank';\n    }\n\n    return linkInfo;\n  }\n\n  addRow(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addRow(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  addCol(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addCol(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  deleteRow() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteRow(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteCol() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteCol(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteTable() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteTable(rng);\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * @param {Position} pos\n   * @param {jQuery} $target - target element\n   * @param {Boolean} [bKeepRatio] - keep ratio\n   */\n  resizeTo(pos, $target, bKeepRatio) {\n    let imageSize;\n    if (bKeepRatio) {\n      const newRatio = pos.y / pos.x;\n      const ratio = $target.data('ratio');\n      imageSize = {\n        width: ratio > newRatio ? pos.x : pos.y / ratio,\n        height: ratio > newRatio ? pos.x * ratio : pos.y,\n      };\n    } else {\n      imageSize = {\n        width: pos.x,\n        height: pos.y,\n      };\n    }\n\n    $target.css(imageSize);\n  }\n\n  /**\n   * returns whether editable area has focus or not.\n   */\n  hasFocus() {\n    return this.$editable.is(':focus');\n  }\n\n  /**\n   * set focus\n   */\n  focus() {\n    // [workaround] Screen will move when page is scolled in IE.\n    //  - do focus when not focused\n    if (!this.hasFocus()) {\n      this.$editable.focus();\n    }\n  }\n\n  /**\n   * returns whether contents is empty or not.\n   * @return {Boolean}\n   */\n  isEmpty() {\n    return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();\n  }\n\n  /**\n   * Removes all contents and restores the editable instance to an _emptyPara_.\n   */\n  empty() {\n    this.context.invoke('code', dom.emptyPara);\n  }\n\n  /**\n   * normalize content\n   */\n  normalizeContent() {\n    this.$editable[0].normalize();\n  }\n}\n","import lists from '../core/lists';\n\nexport default class Clipboard {\n  constructor(context) {\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n  }\n\n  initialize() {\n    this.$editable.on('paste', this.pasteByEvent.bind(this));\n  }\n\n  /**\n   * paste by clipboard event\n   *\n   * @param {Event} event\n   */\n  pasteByEvent(event) {\n    const clipboardData = event.originalEvent.clipboardData;\n\n    if (clipboardData && clipboardData.items && clipboardData.items.length) {\n      const item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);\n      if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {\n        // paste img file\n        this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);\n        event.preventDefault();\n      } else if (item.kind === 'string') {\n        // paste text with maxTextLength check\n        if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {\n          event.preventDefault();\n        }\n      }\n    } else if (window.clipboardData) {\n      // for IE\n      let text = window.clipboardData.getData('text');\n      if (this.context.invoke('editor.isLimited', text.length)) {\n        event.preventDefault();\n      }\n    }\n    // Call editor.afterCommand after proceeding default event handler\n    setTimeout(() => {\n      this.context.invoke('editor.afterCommand');\n    }, 10);\n  }\n}\n","import $ from 'jquery';\n\nexport default class Dropzone {\n  constructor(context) {\n    this.context = context;\n    this.$eventListener = $(document);\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.documentEventHandlers = {};\n\n    this.$dropzone = $([\n      '<div class=\"note-dropzone\">',\n        '<div class=\"note-dropzone-message\"></div>',\n      '</div>',\n    ].join('')).prependTo(this.$editor);\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  initialize() {\n    if (this.options.disableDragAndDrop) {\n      // prevent default drop event\n      this.documentEventHandlers.onDrop = (e) => {\n        e.preventDefault();\n      };\n      // do not consider outside of dropzone\n      this.$eventListener = this.$dropzone;\n      this.$eventListener.on('drop', this.documentEventHandlers.onDrop);\n    } else {\n      this.attachDragAndDropEvent();\n    }\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  attachDragAndDropEvent() {\n    let collection = $();\n    const $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');\n\n    this.documentEventHandlers.onDragenter = (e) => {\n      const isCodeview = this.context.invoke('codeview.isActivated');\n      const hasEditorSize = this.$editor.width() > 0 && this.$editor.height() > 0;\n      if (!isCodeview && !collection.length && hasEditorSize) {\n        this.$editor.addClass('dragover');\n        this.$dropzone.width(this.$editor.width());\n        this.$dropzone.height(this.$editor.height());\n        $dropzoneMessage.text(this.lang.image.dragImageHere);\n      }\n      collection = collection.add(e.target);\n    };\n\n    this.documentEventHandlers.onDragleave = (e) => {\n      collection = collection.not(e.target);\n\n      // If nodeName is BODY, then just make it over (fix for IE)\n      if (!collection.length || e.target.nodeName === 'BODY') {\n        collection = $();\n        this.$editor.removeClass('dragover');\n      }\n    };\n\n    this.documentEventHandlers.onDrop = () => {\n      collection = $();\n      this.$editor.removeClass('dragover');\n    };\n\n    // show dropzone on dragenter when dragging a object to document\n    // -but only if the editor is visible, i.e. has a positive width and height\n    this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter)\n      .on('dragleave', this.documentEventHandlers.onDragleave)\n      .on('drop', this.documentEventHandlers.onDrop);\n\n    // change dropzone's message on hover.\n    this.$dropzone.on('dragenter', () => {\n      this.$dropzone.addClass('hover');\n      $dropzoneMessage.text(this.lang.image.dropImage);\n    }).on('dragleave', () => {\n      this.$dropzone.removeClass('hover');\n      $dropzoneMessage.text(this.lang.image.dragImageHere);\n    });\n\n    // attach dropImage\n    this.$dropzone.on('drop', (event) => {\n      const dataTransfer = event.originalEvent.dataTransfer;\n\n      // stop the browser from opening the dropped content\n      event.preventDefault();\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        this.$editable.focus();\n        this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);\n      } else {\n        $.each(dataTransfer.types, (idx, type) => {\n          // skip moz-specific types\n          if (type.toLowerCase().indexOf('_moz_') > -1) {\n            return;\n          }\n          const content = dataTransfer.getData(type);\n\n          if (type.toLowerCase().indexOf('text') > -1) {\n            this.context.invoke('editor.pasteHTML', content);\n          } else {\n            $(content).each((idx, item) => {\n              this.context.invoke('editor.insertNode', item);\n            });\n          }\n        });\n      }\n    }).on('dragover', false); // prevent default dragover event\n  }\n\n  destroy() {\n    Object.keys(this.documentEventHandlers).forEach((key) => {\n      this.$eventListener.off(key.substr(2).toLowerCase(), this.documentEventHandlers[key]);\n    });\n    this.documentEventHandlers = {};\n  }\n}\n","import dom from '../core/dom';\nimport key from '../core/key';\n\n/**\n * @class Codeview\n */\nexport default class CodeView {\n  constructor(context) {\n    this.context = context;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n    this.CodeMirrorConstructor = window.CodeMirror;\n\n    if (this.options.codemirror.CodeMirrorConstructor) {\n      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;\n    }\n  }\n\n  sync(html) {\n    const isCodeview = this.isActivated();\n    const CodeMirror = this.CodeMirrorConstructor;\n\n    if (isCodeview) {\n      if (html) {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').getDoc().setValue(html);\n        } else {\n          this.$codable.val(html);\n        }\n      } else {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').save();\n        }\n      }\n    }\n  }\n\n  initialize() {\n    this.$codable.on('keyup', (event) => {\n      if (event.keyCode === key.code.ESCAPE) {\n        this.deactivate();\n      }\n    });\n  }\n\n  /**\n   * @return {Boolean}\n   */\n  isActivated() {\n    return this.$editor.hasClass('codeview');\n  }\n\n  /**\n   * toggle codeview\n   */\n  toggle() {\n    if (this.isActivated()) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n    this.context.triggerEvent('codeview.toggled');\n  }\n\n  /**\n   * purify input value\n   * @param value\n   * @returns {*}\n   */\n  purify(value) {\n    if (this.options.codeviewFilter) {\n      // filter code view regex\n      value = value.replace(this.options.codeviewFilterRegex, '');\n      // allow specific iframe tag\n      if (this.options.codeviewIframeFilter) {\n        const whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);\n        value = value.replace(/(<iframe.*?>.*?(?:<\\/iframe>)?)/gi, function(tag) {\n          // remove if src attribute is duplicated\n          if (/<.+src(?==?('|\"|\\s)?)[\\s\\S]+src(?=('|\"|\\s)?)[^>]*?>/i.test(tag)) {\n            return '';\n          }\n          for (const src of whitelist) {\n            // pass if src is trusted\n            if ((new RegExp('src=\"(https?:)?\\/\\/' + src.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '\\/(.+)\"')).test(tag)) {\n              return tag;\n            }\n          }\n          return '';\n        });\n      }\n    }\n    return value;\n  }\n\n  /**\n   * activate code view\n   */\n  activate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));\n    this.$codable.height(this.$editable.height());\n\n    this.context.invoke('toolbar.updateCodeview', true);\n    this.context.invoke('airPopover.updateCodeview', true);\n\n    this.$editor.addClass('codeview');\n    this.$codable.focus();\n\n    // activate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror);\n\n      // CodeMirror TernServer\n      if (this.options.codemirror.tern) {\n        const server = new CodeMirror.TernServer(this.options.codemirror.tern);\n        cmEditor.ternServer = server;\n        cmEditor.on('cursorActivity', (cm) => {\n          server.updateArgHints(cm);\n        });\n      }\n\n      cmEditor.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);\n      });\n      cmEditor.on('change', () => {\n        this.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);\n      });\n\n      // CodeMirror hasn't Padding.\n      cmEditor.setSize(null, this.$editable.outerHeight());\n      this.$codable.data('cmEditor', cmEditor);\n    } else {\n      this.$codable.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', this.$codable.val(), event);\n      });\n      this.$codable.on('input', () => {\n        this.context.triggerEvent('change.codeview', this.$codable.val(), this.$codable);\n      });\n    }\n  }\n\n  /**\n   * deactivate code view\n   */\n  deactivate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    // deactivate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = this.$codable.data('cmEditor');\n      this.$codable.val(cmEditor.getValue());\n      cmEditor.toTextArea();\n    }\n\n    const value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);\n    const isChange = this.$editable.html() !== value;\n\n    this.$editable.html(value);\n    this.$editable.height(this.options.height ? this.$codable.height() : 'auto');\n    this.$editor.removeClass('codeview');\n\n    if (isChange) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n\n    this.$editable.focus();\n\n    this.context.invoke('toolbar.updateCodeview', false);\n    this.context.invoke('airPopover.updateCodeview', false);\n  }\n\n  destroy() {\n    if (this.isActivated()) {\n      this.deactivate();\n    }\n  }\n}\n","import $ from 'jquery';\nconst EDITABLE_PADDING = 24;\n\nexport default class Statusbar {\n  constructor(context) {\n    this.$document = $(document);\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n  }\n\n  initialize() {\n    if (this.options.airMode || this.options.disableResizeEditor) {\n      this.destroy();\n      return;\n    }\n\n    this.$statusbar.on('mousedown', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const editableTop = this.$editable.offset().top - this.$document.scrollTop();\n      const editableCodeTop = this.$codable.offset().top - this.$document.scrollTop();\n\n      const onMouseMove = (event) => {\n        let height = event.clientY - (editableTop + EDITABLE_PADDING);\n        let heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);\n\n        height = (this.options.minheight > 0) ? Math.max(height, this.options.minheight) : height;\n        height = (this.options.maxHeight > 0) ? Math.min(height, this.options.maxHeight) : height;\n        heightCode = (this.options.minheight > 0) ? Math.max(heightCode, this.options.minheight) : heightCode;\n        heightCode = (this.options.maxHeight > 0) ? Math.min(heightCode, this.options.maxHeight) : heightCode;\n\n\n        this.$editable.height(height);\n        this.$codable.height(heightCode);\n      };\n\n      this.$document.on('mousemove', onMouseMove).one('mouseup', () => {\n        this.$document.off('mousemove', onMouseMove);\n      });\n    });\n  }\n\n  destroy() {\n    this.$statusbar.off();\n    this.$statusbar.addClass('locked');\n  }\n}\n","import $ from 'jquery';\n\nexport default class Fullscreen {\n  constructor(context) {\n    this.context = context;\n\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n\n    this.$window = $(window);\n    this.$scrollbar = $('html, body');\n    this.scrollbarClassName = 'note-fullscreen-body';\n\n    this.onResize = () => {\n      this.resizeTo({\n        h: this.$window.height() - this.$toolbar.outerHeight(),\n      });\n    };\n  }\n\n  resizeTo(size) {\n    this.$editable.css('height', size.h);\n    this.$codable.css('height', size.h);\n    if (this.$codable.data('cmeditor')) {\n      this.$codable.data('cmeditor').setsize(null, size.h);\n    }\n  }\n\n  /**\n   * toggle fullscreen\n   */\n  toggle() {\n    this.$editor.toggleClass('fullscreen');\n    const isFullscreen = this.isFullscreen();\n    this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);\n    if (isFullscreen) {\n      this.$editable.data('orgHeight', this.$editable.css('height'));\n      this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));\n      this.$editable.css('maxHeight', '');\n      this.$window.on('resize', this.onResize).trigger('resize');\n    } else {\n      this.$window.off('resize', this.onResize);\n      this.resizeTo({ h: this.$editable.data('orgHeight') });\n      this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));\n    }\n\n    this.context.invoke('toolbar.updateFullscreen', isFullscreen);\n  }\n\n  isFullscreen() {\n    return this.$editor.hasClass('fullscreen');\n  }\n\n  destroy() {\n    this.$scrollbar.removeClass(this.scrollbarClassName);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\n\nexport default class Handle {\n  constructor(context) {\n    this.context = context;\n    this.$document = $(document);\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        if (this.update(e.target, e)) {\n          e.preventDefault();\n        }\n      },\n      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  initialize() {\n    this.$handle = $([\n      '<div class=\"note-handle\">',\n        '<div class=\"note-control-selection\">',\n          '<div class=\"note-control-selection-bg\"></div>',\n          '<div class=\"note-control-holder note-control-nw\"></div>',\n          '<div class=\"note-control-holder note-control-ne\"></div>',\n          '<div class=\"note-control-holder note-control-sw\"></div>',\n          '<div class=\"',\n            (this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),\n          ' note-control-se\"></div>',\n          (this.options.disableResizeImage ? '' : '<div class=\"note-control-selection-info\"></div>'),\n        '</div>',\n      '</div>',\n    ].join('')).prependTo(this.$editingArea);\n\n    this.$handle.on('mousedown', (event) => {\n      if (dom.isControlSizing(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const $target = this.$handle.find('.note-control-selection').data('target');\n        const posStart = $target.offset();\n        const scrollTop = this.$document.scrollTop();\n\n        const onMouseMove = (event) => {\n          this.context.invoke('editor.resizeTo', {\n            x: event.clientX - posStart.left,\n            y: event.clientY - (posStart.top - scrollTop),\n          }, $target, !event.shiftKey);\n\n          this.update($target[0], event);\n        };\n\n        this.$document\n          .on('mousemove', onMouseMove)\n          .one('mouseup', (e) => {\n            e.preventDefault();\n            this.$document.off('mousemove', onMouseMove);\n            this.context.invoke('editor.afterCommand');\n          });\n\n        if (!$target.data('ratio')) { // original ratio.\n          $target.data('ratio', $target.height() / $target.width());\n        }\n      }\n    });\n\n    // Listen for scrolling on the handle overlay.\n    this.$handle.on('wheel', (e) => {\n      e.preventDefault();\n      this.update();\n    });\n  }\n\n  destroy() {\n    this.$handle.remove();\n  }\n\n  update(target, event) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isImage = dom.isImg(target);\n    const $selection = this.$handle.find('.note-control-selection');\n\n    this.context.invoke('imagePopover.update', target, event);\n\n    if (isImage) {\n      const $image = $(target);\n      const position = $image.position();\n      const pos = {\n        left: position.left + parseInt($image.css('marginLeft'), 10),\n        top: position.top + parseInt($image.css('marginTop'), 10),\n      };\n\n      // exclude margin\n      const imageSize = {\n        w: $image.outerWidth(false),\n        h: $image.outerHeight(false),\n      };\n\n      $selection.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n        width: imageSize.w,\n        height: imageSize.h,\n      }).data('target', $image); // save current image element.\n\n      const origImageObj = new Image();\n      origImageObj.src = $image.attr('src');\n\n      const sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';\n      $selection.find('.note-control-selection-info').text(sizingText);\n      this.context.invoke('editor.saveTarget', target);\n    } else {\n      this.hide();\n    }\n\n    return isImage;\n  }\n\n  /**\n   * hide\n   *\n   * @param {jQuery} $handle\n   */\n  hide() {\n    this.context.invoke('editor.clearTarget');\n    this.$handle.children().hide();\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport key from '../core/key';\n\nconst defaultScheme = 'http://';\nconst linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\\:[\\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\\.)?(.+)$/i;\n\nexport default class AutoLink {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n  }\n\n  destroy() {\n    this.lastWordRange = null;\n  }\n\n  replace() {\n    if (!this.lastWordRange) {\n      return;\n    }\n\n    const keyword = this.lastWordRange.toString();\n    const match = keyword.match(linkPattern);\n\n    if (match && (match[1] || match[2])) {\n      const link = match[1] ? keyword : defaultScheme + keyword;\n      const urlText = this.options.showDomainOnlyForAutolink ?\n        keyword.replace(/^(?:https?:\\/\\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\\.)?/i, '').split('/')[0]\n        : keyword;\n      const node = $('<a></a>').html(urlText).attr('href', link)[0];\n      if (this.context.options.linkTargetBlank) {\n        $(node).attr('target', '_blank');\n      }\n\n      this.lastWordRange.insertNode(node);\n      this.lastWordRange = null;\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  handleKeydown(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWordRange = wordRange;\n    }\n  }\n\n  handleKeyup(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import dom from '../core/dom';\n\n/**\n * textarea auto sync.\n */\nexport default class AutoSync {\n  constructor(context) {\n    this.$note = context.layoutInfo.note;\n    this.events = {\n      'summernote.change': () => {\n        this.$note.val(context.invoke('code'));\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return dom.isTextarea(this.$note[0]);\n  }\n}\n","import lists from '../core/lists';\nimport dom from '../core/dom';\nimport key from '../core/key';\n\nexport default class AutoReplace {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options.replace || {};\n\n    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];\n    this.previousKeydownCode = null;\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.match;\n  }\n\n  initialize() {\n    this.lastWord = null;\n  }\n\n  destroy() {\n    this.lastWord = null;\n  }\n\n  replace() {\n    if (!this.lastWord) {\n      return;\n    }\n\n    const self = this;\n    const keyword = this.lastWord.toString();\n    this.options.match(keyword, function(match) {\n      if (match) {\n        let node = '';\n\n        if (typeof match === 'string') {\n          node = dom.createText(match);\n        } else if (match instanceof jQuery) {\n          node = match[0];\n        } else if (match instanceof Node) {\n          node = match;\n        }\n\n        if (!node) return;\n        self.lastWord.insertNode(node);\n        self.lastWord = null;\n        self.context.invoke('editor.focus');\n      }\n    });\n  }\n\n  handleKeydown(e) {\n    // this forces it to remember the last whole word, even if multiple termination keys are pressed\n    // before the previous key is let go.\n    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {\n      this.previousKeydownCode = e.keyCode;\n      return;\n    }\n\n    if (lists.contains(this.keys, e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWord = wordRange;\n    }\n    this.previousKeydownCode = e.keyCode;\n  }\n\n  handleKeyup(e) {\n    if (lists.contains(this.keys, e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import $ from 'jquery';\nexport default class Placeholder {\n  constructor(context) {\n    this.context = context;\n\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n\n    if (this.options.inheritPlaceholder === true) {\n      // get placeholder value from the original element\n      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;\n    }\n\n    this.events = {\n      'summernote.init summernote.change': () => {\n        this.update();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.placeholder;\n  }\n\n  initialize() {\n    this.$placeholder = $('<div class=\"note-placeholder\"></div>');\n    this.$placeholder.on('click', () => {\n      this.context.invoke('focus');\n    }).html(this.options.placeholder).prependTo(this.$editingArea);\n\n    this.update();\n  }\n\n  destroy() {\n    this.$placeholder.remove();\n  }\n\n  update() {\n    const isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');\n    this.$placeholder.toggle(isShow);\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport env from '../core/env';\n\nexport default class Buttons {\n  constructor(context) {\n    this.ui = $.summernote.ui;\n    this.context = context;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.invertedKeyMap = func.invertObject(\n      this.options.keyMap[env.isMac ? 'mac' : 'pc']\n    );\n  }\n\n  representShortcut(editorMethod) {\n    let shortcut = this.invertedKeyMap[editorMethod];\n    if (!this.options.shortcuts || !shortcut) {\n      return '';\n    }\n\n    if (env.isMac) {\n      shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');\n    }\n\n    shortcut = shortcut.replace('BACKSLASH', '\\\\')\n      .replace('SLASH', '/')\n      .replace('LEFTBRACKET', '[')\n      .replace('RIGHTBRACKET', ']');\n\n    return ' (' + shortcut + ')';\n  }\n\n  button(o) {\n    if (!this.options.tooltip && o.tooltip) {\n      delete o.tooltip;\n    }\n    o.container = this.options.container;\n    return this.ui.button(o);\n  }\n\n  initialize() {\n    this.addToolbarButtons();\n    this.addImagePopoverButtons();\n    this.addLinkPopoverButtons();\n    this.addTablePopoverButtons();\n    this.fontInstalledMap = {};\n  }\n\n  destroy() {\n    delete this.fontInstalledMap;\n  }\n\n  isFontInstalled(name) {\n    if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {\n      this.fontInstalledMap[name] = env.isFontInstalled(name) ||\n        lists.contains(this.options.fontNamesIgnoreCheck, name);\n    }\n    return this.fontInstalledMap[name];\n  }\n\n  isFontDeservedToAdd(name) {\n    name = name.toLowerCase();\n    return (name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1);\n  }\n\n  colorPalette(className, tooltip, backColor, foreColor) {\n    return this.ui.buttonGroup({\n      className: 'note-color ' + className,\n      children: [\n        this.button({\n          className: 'note-current-color-button',\n          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),\n          tooltip: tooltip,\n          click: (e) => {\n            const $button = $(e.currentTarget);\n            if (backColor && foreColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n                foreColor: $button.attr('data-foreColor'),\n              });\n            } else if (backColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n              });\n            } else if (foreColor) {\n              this.context.invoke('editor.color', {\n                foreColor: $button.attr('data-foreColor'),\n              });\n            }\n          },\n          callback: ($button) => {\n            const $recentColor = $button.find('.note-recent-color');\n            if (backColor) {\n              $recentColor.css('background-color', this.options.colorButton.backColor);\n              $button.attr('data-backColor', this.options.colorButton.backColor);\n            }\n            if (foreColor) {\n              $recentColor.css('color', this.options.colorButton.foreColor);\n              $button.attr('data-foreColor', this.options.colorButton.foreColor);\n            } else {\n              $recentColor.css('color', 'transparent');\n            }\n          },\n        }),\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('', this.options),\n          tooltip: this.lang.color.more,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          items: (backColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.background + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"backColor\" data-value=\"transparent\">',\n                  this.lang.color.transparent,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"backColor\"><!-- back colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"backColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"backColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.backColor + '\" data-event=\"backColorPalette-'+this.options.id+'\">',\n              '</div>',\n              '<div class=\"note-holder-custom\" id=\"backColorPalette-'+this.options.id+'\" data-event=\"backColor\"></div>',\n            '</div>',\n          ].join('') : '') +\n          (foreColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.foreground + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                  this.lang.color.resetToDefault,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"foreColor\"><!-- fore colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"foreColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"foreColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.foreColor + '\" data-event=\"foreColorPalette-'+this.options.id+'\">',\n              '</div>', // Fix missing Div, Commented to find easily if it's wrong\n              '<div class=\"note-holder-custom\" id=\"foreColorPalette-'+this.options.id+'\" data-event=\"foreColor\"></div>',\n            '</div>',\n          ].join('') : ''),\n          callback: ($dropdown) => {\n            $dropdown.find('.note-holder').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: this.options.colors,\n                colorsName: this.options.colorsName,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            /* TODO: do we have to record recent custom colors within cookies? */\n            var customColors = [\n              ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF'],\n            ];\n            $dropdown.find('.note-holder-custom').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: customColors,\n                colorsName: customColors,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            $dropdown.find('input[type=color]').each((idx, item) => {\n              $(item).change(function() {\n                const $chip = $dropdown.find('#' + $(this).data('event')).find('.note-color-btn').first();\n                const color = this.value.toUpperCase();\n                $chip.css('background-color', color)\n                  .attr('aria-label', color)\n                  .attr('data-value', color)\n                  .attr('data-original-title', color);\n                $chip.click();\n              });\n            });\n          },\n          click: (event) => {\n            event.stopPropagation();\n\n            const $parent = $('.' + className).find('.note-dropdown-menu');\n            const $button = $(event.target);\n            const eventName = $button.data('event');\n            const value = $button.attr('data-value');\n\n            if (eventName === 'openPalette') {\n              const $picker = $parent.find('#' + value);\n              const $palette = $($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]);\n\n              // Shift palette chips\n              const $chip = $palette.find('.note-color-btn').last().detach();\n\n              // Set chip attributes\n              const color = $picker.val();\n              $chip.css('background-color', color)\n                .attr('aria-label', color)\n                .attr('data-value', color)\n                .attr('data-original-title', color);\n              $palette.prepend($chip);\n              $picker.click();\n            } else {\n              if (lists.contains(['backColor', 'foreColor'], eventName)) {\n                const key = eventName === 'backColor' ? 'background-color' : 'color';\n                const $color = $button.closest('.note-color').find('.note-recent-color');\n                const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n                $color.css(key, value);\n                $currentButton.attr('data-' + eventName, value);\n              }\n              this.context.invoke('editor.' + eventName, value);\n            }\n          },\n        }),\n      ],\n    }).render();\n  }\n\n  addToolbarButtons() {\n    this.context.memo('button.style', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            this.ui.icon(this.options.icons.magic), this.options\n          ),\n          tooltip: this.lang.style.style,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          className: 'dropdown-style',\n          items: this.options.styleTags,\n          title: this.lang.style.style,\n          template: (item) => {\n            // TBD: need to be simplified\n            if (typeof item === 'string') {\n              item = {\n                tag: item,\n                title: (Object.prototype.hasOwnProperty.call(this.lang.style, item) ? this.lang.style[item] : item),\n              };\n            }\n\n            const tag = item.tag;\n            const title = item.title;\n            const style = item.style ? ' style=\"' + item.style + '\" ' : '';\n            const className = item.className ? ' class=\"' + item.className + '\"' : '';\n\n            return '<' + tag + style + className + '>' + title + '</' + tag + '>';\n          },\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }),\n      ]).render();\n    });\n\n    for (let styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {\n      const item = this.options.styleTags[styleIdx];\n\n      this.context.memo('button.style.' + item, () => {\n        return this.button({\n          className: 'note-btn-style-' + item,\n          contents: '<div data-value=\"' + item + '\">' + item.toUpperCase() + '</div>',\n          tooltip: this.lang.style[item],\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }).render();\n      });\n    }\n\n    this.context.memo('button.bold', () => {\n      return this.button({\n        className: 'note-btn-bold',\n        contents: this.ui.icon(this.options.icons.bold),\n        tooltip: this.lang.font.bold + this.representShortcut('bold'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.bold'),\n      }).render();\n    });\n\n    this.context.memo('button.italic', () => {\n      return this.button({\n        className: 'note-btn-italic',\n        contents: this.ui.icon(this.options.icons.italic),\n        tooltip: this.lang.font.italic + this.representShortcut('italic'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.italic'),\n      }).render();\n    });\n\n    this.context.memo('button.underline', () => {\n      return this.button({\n        className: 'note-btn-underline',\n        contents: this.ui.icon(this.options.icons.underline),\n        tooltip: this.lang.font.underline + this.representShortcut('underline'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.underline'),\n      }).render();\n    });\n\n    this.context.memo('button.clear', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.eraser),\n        tooltip: this.lang.font.clear + this.representShortcut('removeFormat'),\n        click: this.context.createInvokeHandler('editor.removeFormat'),\n      }).render();\n    });\n\n    this.context.memo('button.strikethrough', () => {\n      return this.button({\n        className: 'note-btn-strikethrough',\n        contents: this.ui.icon(this.options.icons.strikethrough),\n        tooltip: this.lang.font.strikethrough + this.representShortcut('strikethrough'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.strikethrough'),\n      }).render();\n    });\n\n    this.context.memo('button.superscript', () => {\n      return this.button({\n        className: 'note-btn-superscript',\n        contents: this.ui.icon(this.options.icons.superscript),\n        tooltip: this.lang.font.superscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.superscript'),\n      }).render();\n    });\n\n    this.context.memo('button.subscript', () => {\n      return this.button({\n        className: 'note-btn-subscript',\n        contents: this.ui.icon(this.options.icons.subscript),\n        tooltip: this.lang.font.subscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.subscript'),\n      }).render();\n    });\n\n    this.context.memo('button.fontname', () => {\n      const styleInfo = this.context.invoke('editor.currentStyle');\n\n      if (this.options.addDefaultFonts) {\n        // Add 'default' fonts into the fontnames array if not exist\n        $.each(styleInfo['font-family'].split(','), (idx, fontname) => {\n          fontname = fontname.trim().replace(/['\"]+/g, '');\n          if (this.isFontDeservedToAdd(fontname)) {\n            if (this.options.fontNames.indexOf(fontname) === -1) {\n              this.options.fontNames.push(fontname);\n            }\n          }\n        });\n      }\n\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            '<span class=\"note-current-fontname\"></span>', this.options\n          ),\n          tooltip: this.lang.font.name,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontname',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontNames.filter(this.isFontInstalled.bind(this)),\n          title: this.lang.font.name,\n          template: (item) => {\n            return '<span style=\"font-family: ' + env.validFontName(item) + '\">' + item + '</span>';\n          },\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontName'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsize', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsize\"></span>', this.options),\n          tooltip: this.lang.font.size,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsize',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizes,\n          title: this.lang.font.size,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSize'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsizeunit', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsizeunit\"></span>', this.options),\n          tooltip: this.lang.font.sizeunit,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsizeunit',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizeUnits,\n          title: this.lang.font.sizeunit,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.color', () => {\n      return this.colorPalette('note-color-all', this.lang.color.recent, true, true);\n    });\n\n    this.context.memo('button.forecolor', () => {\n      return this.colorPalette('note-color-fore', this.lang.color.foreground, false, true);\n    });\n\n    this.context.memo('button.backcolor', () => {\n      return this.colorPalette('note-color-back', this.lang.color.background, true, false);\n    });\n\n    this.context.memo('button.ul', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unorderedlist),\n        tooltip: this.lang.lists.unordered + this.representShortcut('insertUnorderedList'),\n        click: this.context.createInvokeHandler('editor.insertUnorderedList'),\n      }).render();\n    });\n\n    this.context.memo('button.ol', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.orderedlist),\n        tooltip: this.lang.lists.ordered + this.representShortcut('insertOrderedList'),\n        click: this.context.createInvokeHandler('editor.insertOrderedList'),\n      }).render();\n    });\n\n    const justifyLeft = this.button({\n      contents: this.ui.icon(this.options.icons.alignLeft),\n      tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),\n      click: this.context.createInvokeHandler('editor.justifyLeft'),\n    });\n\n    const justifyCenter = this.button({\n      contents: this.ui.icon(this.options.icons.alignCenter),\n      tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),\n      click: this.context.createInvokeHandler('editor.justifyCenter'),\n    });\n\n    const justifyRight = this.button({\n      contents: this.ui.icon(this.options.icons.alignRight),\n      tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),\n      click: this.context.createInvokeHandler('editor.justifyRight'),\n    });\n\n    const justifyFull = this.button({\n      contents: this.ui.icon(this.options.icons.alignJustify),\n      tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),\n      click: this.context.createInvokeHandler('editor.justifyFull'),\n    });\n\n    const outdent = this.button({\n      contents: this.ui.icon(this.options.icons.outdent),\n      tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),\n      click: this.context.createInvokeHandler('editor.outdent'),\n    });\n\n    const indent = this.button({\n      contents: this.ui.icon(this.options.icons.indent),\n      tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),\n      click: this.context.createInvokeHandler('editor.indent'),\n    });\n\n    this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));\n    this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));\n    this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));\n    this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));\n    this.context.memo('button.outdent', func.invoke(outdent, 'render'));\n    this.context.memo('button.indent', func.invoke(indent, 'render'));\n\n    this.context.memo('button.paragraph', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.alignLeft), this.options),\n          tooltip: this.lang.paragraph.paragraph,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown([\n          this.ui.buttonGroup({\n            className: 'note-align',\n            children: [justifyLeft, justifyCenter, justifyRight, justifyFull],\n          }),\n          this.ui.buttonGroup({\n            className: 'note-list',\n            children: [outdent, indent],\n          }),\n        ]),\n      ]).render();\n    });\n\n    this.context.memo('button.height', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.textHeight), this.options),\n          tooltip: this.lang.font.height,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          items: this.options.lineHeights,\n          checkClassName: this.options.icons.menuCheck,\n          className: 'dropdown-line-height',\n          title: this.lang.font.height,\n          click: this.context.createInvokeHandler('editor.lineHeight'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.table', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.table), this.options),\n          tooltip: this.lang.table.table,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          title: this.lang.table.table,\n          className: 'note-table',\n          items: [\n            '<div class=\"note-dimension-picker\">',\n              '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n              '<div class=\"note-dimension-picker-highlighted\"></div>',\n              '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n            '</div>',\n            '<div class=\"note-dimension-display\">1 x 1</div>',\n          ].join(''),\n        }),\n      ], {\n        callback: ($node) => {\n          const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n          $catcher.css({\n            width: this.options.insertTableMaxSize.col + 'em',\n            height: this.options.insertTableMaxSize.row + 'em',\n          }).mouseup(this.context.createInvokeHandler('editor.insertTable'))\n            .on('mousemove', this.tableMoveHandler.bind(this));\n        },\n      }).render();\n    });\n\n    this.context.memo('button.link', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.link + this.representShortcut('linkDialog.show'),\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.picture', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.picture),\n        tooltip: this.lang.image.image,\n        click: this.context.createInvokeHandler('imageDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.video', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.video),\n        tooltip: this.lang.video.video,\n        click: this.context.createInvokeHandler('videoDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.hr', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.minus),\n        tooltip: this.lang.hr.insert + this.representShortcut('insertHorizontalRule'),\n        click: this.context.createInvokeHandler('editor.insertHorizontalRule'),\n      }).render();\n    });\n\n    this.context.memo('button.fullscreen', () => {\n      return this.button({\n        className: 'btn-fullscreen note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.arrowsAlt),\n        tooltip: this.lang.options.fullscreen,\n        click: this.context.createInvokeHandler('fullscreen.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.codeview', () => {\n      return this.button({\n        className: 'btn-codeview note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.code),\n        tooltip: this.lang.options.codeview,\n        click: this.context.createInvokeHandler('codeview.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.redo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.redo),\n        tooltip: this.lang.history.redo + this.representShortcut('redo'),\n        click: this.context.createInvokeHandler('editor.redo'),\n      }).render();\n    });\n\n    this.context.memo('button.undo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.undo),\n        tooltip: this.lang.history.undo + this.representShortcut('undo'),\n        click: this.context.createInvokeHandler('editor.undo'),\n      }).render();\n    });\n\n    this.context.memo('button.help', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.question),\n        tooltip: this.lang.options.help,\n        click: this.context.createInvokeHandler('helpDialog.show'),\n      }).render();\n    });\n  }\n\n  /**\n   * image: [\n   *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n   *   ['float', ['floatLeft', 'floatRight', 'floatNone']],\n   *   ['remove', ['removeMedia']],\n   * ],\n   */\n  addImagePopoverButtons() {\n    // Image Size Buttons\n    this.context.memo('button.resizeFull', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">100%</span>',\n        tooltip: this.lang.image.resizeFull,\n        click: this.context.createInvokeHandler('editor.resize', '1'),\n      }).render();\n    });\n    this.context.memo('button.resizeHalf', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">50%</span>',\n        tooltip: this.lang.image.resizeHalf,\n        click: this.context.createInvokeHandler('editor.resize', '0.5'),\n      }).render();\n    });\n    this.context.memo('button.resizeQuarter', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">25%</span>',\n        tooltip: this.lang.image.resizeQuarter,\n        click: this.context.createInvokeHandler('editor.resize', '0.25'),\n      }).render();\n    });\n    this.context.memo('button.resizeNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.resizeNone,\n        click: this.context.createInvokeHandler('editor.resize', '0'),\n      }).render();\n    });\n\n    // Float Buttons\n    this.context.memo('button.floatLeft', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatLeft),\n        tooltip: this.lang.image.floatLeft,\n        click: this.context.createInvokeHandler('editor.floatMe', 'left'),\n      }).render();\n    });\n\n    this.context.memo('button.floatRight', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatRight),\n        tooltip: this.lang.image.floatRight,\n        click: this.context.createInvokeHandler('editor.floatMe', 'right'),\n      }).render();\n    });\n\n    this.context.memo('button.floatNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.floatNone,\n        click: this.context.createInvokeHandler('editor.floatMe', 'none'),\n      }).render();\n    });\n\n    // Remove Buttons\n    this.context.memo('button.removeMedia', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.image.remove,\n        click: this.context.createInvokeHandler('editor.removeMedia'),\n      }).render();\n    });\n  }\n\n  addLinkPopoverButtons() {\n    this.context.memo('button.linkDialogShow', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.edit,\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.unlink', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unlink),\n        tooltip: this.lang.link.unlink,\n        click: this.context.createInvokeHandler('editor.unlink'),\n      }).render();\n    });\n  }\n\n  /**\n   * table : [\n   *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n   *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]\n   * ],\n   */\n  addTablePopoverButtons() {\n    this.context.memo('button.addRowUp', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowAbove),\n        tooltip: this.lang.table.addRowAbove,\n        click: this.context.createInvokeHandler('editor.addRow', 'top'),\n      }).render();\n    });\n    this.context.memo('button.addRowDown', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowBelow),\n        tooltip: this.lang.table.addRowBelow,\n        click: this.context.createInvokeHandler('editor.addRow', 'bottom'),\n      }).render();\n    });\n    this.context.memo('button.addColLeft', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colBefore),\n        tooltip: this.lang.table.addColLeft,\n        click: this.context.createInvokeHandler('editor.addCol', 'left'),\n      }).render();\n    });\n    this.context.memo('button.addColRight', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colAfter),\n        tooltip: this.lang.table.addColRight,\n        click: this.context.createInvokeHandler('editor.addCol', 'right'),\n      }).render();\n    });\n    this.context.memo('button.deleteRow', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowRemove),\n        tooltip: this.lang.table.delRow,\n        click: this.context.createInvokeHandler('editor.deleteRow'),\n      }).render();\n    });\n    this.context.memo('button.deleteCol', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colRemove),\n        tooltip: this.lang.table.delCol,\n        click: this.context.createInvokeHandler('editor.deleteCol'),\n      }).render();\n    });\n    this.context.memo('button.deleteTable', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.table.delTable,\n        click: this.context.createInvokeHandler('editor.deleteTable'),\n      }).render();\n    });\n  }\n\n  build($container, groups) {\n    for (let groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {\n      const group = groups[groupIdx];\n      const groupName = Array.isArray(group) ? group[0] : group;\n      const buttons = Array.isArray(group) ? ((group.length === 1) ? [group[0]] : group[1]) : [group];\n\n      const $group = this.ui.buttonGroup({\n        className: 'note-' + groupName,\n      }).render();\n\n      for (let idx = 0, len = buttons.length; idx < len; idx++) {\n        const btn = this.context.memo('button.' + buttons[idx]);\n        if (btn) {\n          $group.append(typeof btn === 'function' ? btn(this.context) : btn);\n        }\n      }\n      $group.appendTo($container);\n    }\n  }\n\n  /**\n   * @param {jQuery} [$container]\n   */\n  updateCurrentStyle($container) {\n    const $cont = $container || this.$toolbar;\n\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    this.updateBtnStates($cont, {\n      '.note-btn-bold': () => {\n        return styleInfo['font-bold'] === 'bold';\n      },\n      '.note-btn-italic': () => {\n        return styleInfo['font-italic'] === 'italic';\n      },\n      '.note-btn-underline': () => {\n        return styleInfo['font-underline'] === 'underline';\n      },\n      '.note-btn-subscript': () => {\n        return styleInfo['font-subscript'] === 'subscript';\n      },\n      '.note-btn-superscript': () => {\n        return styleInfo['font-superscript'] === 'superscript';\n      },\n      '.note-btn-strikethrough': () => {\n        return styleInfo['font-strikethrough'] === 'strikethrough';\n      },\n    });\n\n    if (styleInfo['font-family']) {\n      const fontNames = styleInfo['font-family'].split(',').map((name) => {\n        return name.replace(/[\\'\\\"]/g, '')\n          .replace(/\\s+$/, '')\n          .replace(/^\\s+/, '');\n      });\n      const fontName = lists.find(fontNames, this.isFontInstalled.bind(this));\n\n      $cont.find('.dropdown-fontname a').each((idx, item) => {\n        const $item = $(item);\n        // always compare string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontName + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);\n    }\n\n    if (styleInfo['font-size']) {\n      const fontSize = styleInfo['font-size'];\n      $cont.find('.dropdown-fontsize a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontSize + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsize').text(fontSize);\n\n      const fontSizeUnit = styleInfo['font-size-unit'];\n      $cont.find('.dropdown-fontsizeunit a').each((idx, item) => {\n        const $item = $(item);\n        const isChecked = ($item.data('value') + '') === (fontSizeUnit + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);\n    }\n\n    if (styleInfo['line-height']) {\n      const lineHeight = styleInfo['line-height'];\n      $cont.find('.dropdown-line-height a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($(item).data('value') + '') === (lineHeight + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-line-height').text(lineHeight);\n    }\n  }\n\n  updateBtnStates($container, infos) {\n    $.each(infos, (selector, pred) => {\n      this.ui.toggleBtnActive($container.find(selector), pred());\n    });\n  }\n\n  tableMoveHandler(event) {\n    const PX_PER_EM = 18;\n    const $picker = $(event.target.parentNode); // target is mousecatcher\n    const $dimensionDisplay = $picker.next();\n    const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n    const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n    const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n    let posOffset;\n    // HTML5 with jQuery - e.offsetX is undefined in Firefox\n    if (event.offsetX === undefined) {\n      const posCatcher = $(event.target).offset();\n      posOffset = {\n        x: event.pageX - posCatcher.left,\n        y: event.pageY - posCatcher.top,\n      };\n    } else {\n      posOffset = {\n        x: event.offsetX,\n        y: event.offsetY,\n      };\n    }\n\n    const dim = {\n      c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n      r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n    };\n\n    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n    $catcher.data('value', dim.c + 'x' + dim.r);\n\n    if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {\n      $unhighlighted.css({ width: dim.c + 1 + 'em' });\n    }\n\n    if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {\n      $unhighlighted.css({ height: dim.r + 1 + 'em' });\n    }\n\n    $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n  }\n}\n","import $ from 'jquery';\nexport default class Toolbar {\n  constructor(context) {\n    this.context = context;\n\n    this.$window = $(window);\n    this.$document = $(document);\n\n    this.ui = $.summernote.ui;\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.options = context.options;\n\n    this.isFollowing = false;\n    this.followScroll = this.followScroll.bind(this);\n  }\n\n  shouldInitialize() {\n    return !this.options.airMode;\n  }\n\n  initialize() {\n    this.options.toolbar = this.options.toolbar || [];\n\n    if (!this.options.toolbar.length) {\n      this.$toolbar.hide();\n    } else {\n      this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);\n    }\n\n    if (this.options.toolbarContainer) {\n      this.$toolbar.appendTo(this.options.toolbarContainer);\n    }\n\n    this.changeContainer(false);\n\n    this.$note.on('summernote.keyup summernote.mouseup summernote.change', () => {\n      this.context.invoke('buttons.updateCurrentStyle');\n    });\n\n    this.context.invoke('buttons.updateCurrentStyle');\n    if (this.options.followingToolbar) {\n      this.$window.on('scroll resize', this.followScroll);\n    }\n  }\n\n  destroy() {\n    this.$toolbar.children().remove();\n\n    if (this.options.followingToolbar) {\n      this.$window.off('scroll resize', this.followScroll);\n    }\n  }\n\n  followScroll() {\n    if (this.$editor.hasClass('fullscreen')) {\n      return false;\n    }\n\n    const editorHeight = this.$editor.outerHeight();\n    const editorWidth = this.$editor.width();\n    const toolbarHeight = this.$toolbar.height();\n    const statusbarHeight = this.$statusbar.height();\n\n    // check if the web app is currently using another static bar\n    let otherBarHeight = 0;\n    if (this.options.otherStaticBar) {\n      otherBarHeight = $(this.options.otherStaticBar).outerHeight();\n    }\n\n    const currentOffset = this.$document.scrollTop();\n    const editorOffsetTop = this.$editor.offset().top;\n    const editorOffsetBottom = editorOffsetTop + editorHeight;\n    const activateOffset = editorOffsetTop - otherBarHeight;\n    const deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;\n\n    if (!this.isFollowing &&\n      (currentOffset > activateOffset) && (currentOffset < deactivateOffsetBottom - toolbarHeight)) {\n      this.isFollowing = true;\n      this.$editable.css({\n        marginTop: this.$toolbar.outerHeight(),\n      });\n      this.$toolbar.css({\n        position: 'fixed',\n        top: otherBarHeight,\n        width: editorWidth,\n        zIndex: 1000,\n      });\n    } else if (this.isFollowing &&\n      ((currentOffset < activateOffset) || (currentOffset > deactivateOffsetBottom))) {\n      this.isFollowing = false;\n      this.$toolbar.css({\n        position: 'relative',\n        top: 0,\n        width: '100%',\n        zIndex: 'auto',\n      });\n      this.$editable.css({\n        marginTop: '',\n      });\n    }\n  }\n\n  changeContainer(isFullscreen) {\n    if (isFullscreen) {\n      this.$toolbar.prependTo(this.$editor);\n    } else {\n      if (this.options.toolbarContainer) {\n        this.$toolbar.appendTo(this.options.toolbarContainer);\n      }\n    }\n    if (this.options.followingToolbar) {\n      this.followScroll();\n    }\n  }\n\n  updateFullscreen(isFullscreen) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);\n\n    this.changeContainer(isFullscreen);\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  }\n\n  activate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, true);\n  }\n\n  deactivate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, false);\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\n\nexport default class LinkDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-txt-${this.options.id}\" class=\"note-form-label\">${this.lang.link.textToDisplay}</label>`,\n        `<input id=\"note-dialog-link-txt-${this.options.id}\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-url-${this.options.id}\" class=\"note-form-label\">${this.lang.link.url}</label>`,\n        `<input id=\"note-dialog-link-url-${this.options.id}\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>`,\n      '</div>',\n      !this.options.disableLinkTarget\n        ? $('<div></div>').append(this.ui.checkbox({\n          className: 'sn-checkbox-open-in-new-window',\n          text: this.lang.link.openInNewWindow,\n          checked: true,\n        }).render()).html()\n        : '',\n      $('<div></div>').append(this.ui.checkbox({\n        className: 'sn-checkbox-use-protocol',\n        text: this.lang.link.useProtocol,\n        checked: true,\n      }).render()).html(),\n    ].join('');\n\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.link.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      className: 'link-dialog',\n      title: this.lang.link.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  /**\n   * toggle update button\n   */\n  toggleLinkBtn($linkBtn, $linkText, $linkUrl) {\n    this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());\n  }\n\n  /**\n   * Show link dialog and set event handlers on dialog controls.\n   *\n   * @param {Object} linkInfo\n   * @return {Promise}\n   */\n  showLinkDialog(linkInfo) {\n    return $.Deferred((deferred) => {\n      const $linkText = this.$dialog.find('.note-link-text');\n      const $linkUrl = this.$dialog.find('.note-link-url');\n      const $linkBtn = this.$dialog.find('.note-link-btn');\n      const $openInNewWindow = this.$dialog\n        .find('.sn-checkbox-open-in-new-window input[type=checkbox]');\n      const $useProtocol = this.$dialog\n        .find('.sn-checkbox-use-protocol input[type=checkbox]');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // If no url was given and given text is valid URL then copy that into URL Field\n        if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {\n          linkInfo.url = linkInfo.text;\n        }\n\n        $linkText.on('input paste propertychange', () => {\n          // If linktext was modified by input events,\n          // cloning text from linkUrl will be stopped.\n          linkInfo.text = $linkText.val();\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.text);\n\n        $linkUrl.on('input paste propertychange', () => {\n          // Display same text on `Text to display` as default\n          // when linktext has no text\n          if (!linkInfo.text) {\n            $linkText.val($linkUrl.val());\n          }\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.url);\n\n        if (!env.isSupportTouch) {\n          $linkUrl.trigger('focus');\n        }\n\n        this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        this.bindEnterKey($linkUrl, $linkBtn);\n        this.bindEnterKey($linkText, $linkBtn);\n\n        const isNewWindowChecked = linkInfo.isNewWindow !== undefined\n          ? linkInfo.isNewWindow : this.context.options.linkTargetBlank;\n\n        $openInNewWindow.prop('checked', isNewWindowChecked);\n\n        const useProtocolChecked = linkInfo.url\n          ? false : this.context.options.useProtocol;\n\n        $useProtocol.prop('checked', useProtocolChecked);\n\n        $linkBtn.one('click', (event) => {\n          event.preventDefault();\n\n          deferred.resolve({\n            range: linkInfo.range,\n            url: $linkUrl.val(),\n            text: $linkText.val(),\n            isNewWindow: $openInNewWindow.is(':checked'),\n            checkProtocol: $useProtocol.is(':checked'),\n          });\n          this.ui.hideDialog(this.$dialog);\n        });\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        // detach events\n        $linkText.off();\n        $linkUrl.off();\n        $linkBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  /**\n   * @param {Object} layoutInfo\n   */\n  show() {\n    const linkInfo = this.context.invoke('editor.getLinkInfo');\n\n    this.context.invoke('editor.saveRange');\n    this.showLinkDialog(linkInfo).then((linkInfo) => {\n      this.context.invoke('editor.restoreRange');\n      this.context.invoke('editor.createLink', linkInfo);\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class LinkPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.link);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-link-popover',\n      callback: ($node) => {\n        const $content = $node.find('.popover-content,.note-popover-content');\n        $content.prepend('<span><a target=\"_blank\"></a>&nbsp;</span>');\n      },\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.link);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update() {\n    // Prevent focusing on editable when invoke('code') is executed\n    if (!this.context.invoke('editor.hasFocus')) {\n      this.hide();\n      return;\n    }\n\n    const rng = this.context.invoke('editor.getLastRange');\n    if (rng.isCollapsed() && rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      const href = $(anchor).attr('href');\n      this.$popover.find('a').attr('href', href).text(href);\n\n      const pos = dom.posFromPlaceholder(anchor);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class ImageDialog {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    let imageLimitation = '';\n    if (this.options.maximumImageFileSize) {\n      const unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));\n      const readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +\n                         ' ' + ' KMGTP'[unit] + 'B';\n      imageLimitation = `<small>${this.lang.image.maximumFileSize + ' : ' + readableSize}</small>`;\n    }\n\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group note-group-select-from-files\">',\n        '<label for=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.selectFromFiles + '</label>',\n        '<input id=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-image-input form-control-file note-form-control note-input\" ',\n        ' type=\"file\" name=\"files\" accept=\"'+this.options.acceptImageFileTypes+'\" multiple=\"multiple\"/>',\n        imageLimitation,\n      '</div>',\n      '<div class=\"form-group note-group-image-url\">',\n        '<label for=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.url + '</label>',\n        '<input id=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-image-url form-control note-form-control note-input\" type=\"text\"/>',\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.image.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.image.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showImageDialog().then((data) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      if (typeof data === 'string') { // image url\n        // If onImageLinkInsert set,\n        if (this.options.callbacks.onImageLinkInsert) {\n          this.context.triggerEvent('image.link.insert', data);\n        } else {\n          this.context.invoke('editor.insertImage', data);\n        }\n      } else { // array of files\n        this.context.invoke('editor.insertImagesOrCallback', data);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show image dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showImageDialog() {\n    return $.Deferred((deferred) => {\n      const $imageInput = this.$dialog.find('.note-image-input');\n      const $imageUrl = this.$dialog.find('.note-image-url');\n      const $imageBtn = this.$dialog.find('.note-image-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // Cloning imageInput to clear element.\n        $imageInput.replaceWith($imageInput.clone().on('change', (event) => {\n          deferred.resolve(event.target.files || event.target.value);\n        }).val(''));\n\n        $imageUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($imageBtn, $imageUrl.val());\n        }).val('');\n\n        if (!env.isSupportTouch) {\n          $imageUrl.trigger('focus');\n        }\n\n        $imageBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($imageUrl.val());\n        });\n\n        this.bindEnterKey($imageUrl, $imageBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $imageInput.off();\n        $imageUrl.off();\n        $imageBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\n/**\n * Image popover module\n *  mouse events that show/hide popover will be handled by Handle.js.\n *  Handle.js will receive the events and invoke 'imagePopover.update'.\n */\nexport default class ImagePopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n\n    this.editable = context.layoutInfo.editable[0];\n    this.options = context.options;\n\n    this.events = {\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.image);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-image-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n    this.context.invoke('buttons.build', $content, this.options.popover.image);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target, event) {\n    if (dom.isImg(target)) {\n      const position = $(target).offset();\n      const containerOffset = $(this.options.container).offset();\n      let pos = {};\n      if (this.options.popatmouse) {\n        pos.left = event.pageX - 20;\n        pos.top = event.pageY;\n      } else {\n        pos = position;\n      }\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class TablePopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        this.update(e.target);\n      },\n      'summernote.keyup summernote.scroll summernote.change': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.table);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-table-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.table);\n\n    // [workaround] Disable Firefox's default table editor\n    if (env.isFF) {\n      document.execCommand('enableInlineTableEditing', false, false);\n    }\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isCell = dom.isCell(target) || dom.isCell(target?.parentElement);\n\n    if (isCell) {\n      const pos = dom.posFromPlaceholder(target);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n\n    return isCell;\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class VideoDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group row-fluid\">',\n        `<label for=\"note-dialog-video-url-${this.options.id}\" class=\"note-form-label\">${this.lang.video.url} <small class=\"text-muted\">${this.lang.video.providers}</small></label>`,\n        `<input id=\"note-dialog-video-url-${this.options.id}\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.video.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.video.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  createVideoNode(url) {\n    // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)\n    const ytRegExp = /\\/\\/(?:(?:www|m)\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))([\\w|-]{11})(?:(?:[\\?&]t=)(\\S+))?$/;\n    const ytRegExpForStart = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n    const ytMatch = url.match(ytRegExp);\n\n    const gdRegExp = /(?:\\.|\\/\\/)drive\\.google\\.com\\/file\\/d\\/(.[a-zA-Z0-9_-]*)\\/view/;\n    const gdMatch = url.match(gdRegExp);\n\n    const igRegExp = /(?:www\\.|\\/\\/)instagram\\.com\\/p\\/(.[a-zA-Z0-9_-]*)/;\n    const igMatch = url.match(igRegExp);\n\n    const vRegExp = /\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9]+)/;\n    const vMatch = url.match(vRegExp);\n\n    const vimRegExp = /\\/\\/(player\\.)?vimeo\\.com\\/([a-z]*\\/)*(\\d+)[?]?.*/;\n    const vimMatch = url.match(vimRegExp);\n\n    const dmRegExp = /.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?/;\n    const dmMatch = url.match(dmRegExp);\n\n    const youkuRegExp = /\\/\\/v\\.youku\\.com\\/v_show\\/id_(\\w+)=*\\.html/;\n    const youkuMatch = url.match(youkuRegExp);\n\n    const peerTubeRegExp =/\\/\\/(.*)\\/videos\\/watch\\/([^?]*)(?:\\?(?:start=(\\w*))?(?:&stop=(\\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/; \n    const peerTubeMatch = url.match(peerTubeRegExp);\n\n    const qqRegExp = /\\/\\/v\\.qq\\.com.*?vid=(.+)/;\n    const qqMatch = url.match(qqRegExp);\n\n    const qqRegExp2 = /\\/\\/v\\.qq\\.com\\/x?\\/?(page|cover).*?\\/([^\\/]+)\\.html\\??.*/;\n    const qqMatch2 = url.match(qqRegExp2);\n\n    const mp4RegExp = /^.+.(mp4|m4v)$/;\n    const mp4Match = url.match(mp4RegExp);\n\n    const oggRegExp = /^.+.(ogg|ogv)$/;\n    const oggMatch = url.match(oggRegExp);\n\n    const webmRegExp = /^.+.(webm)$/;\n    const webmMatch = url.match(webmRegExp);\n\n    const fbRegExp = /(?:www\\.|\\/\\/)facebook\\.com\\/([^\\/]+)\\/videos\\/([0-9]+)/;\n    const fbMatch = url.match(fbRegExp);\n\n    let $video;\n    if (ytMatch && ytMatch[1].length === 11) {\n      const youtubeId = ytMatch[1];\n      var start = 0;\n      if (typeof ytMatch[2] !== 'undefined') {\n        const ytMatchForStart = ytMatch[2].match(ytRegExpForStart);\n        if (ytMatchForStart) {\n          for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {\n            start += (typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0);\n          }\n        }\n      }\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : ''))\n        .attr('width', '640').attr('height', '360');\n    } else if (gdMatch && gdMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview')\n        .attr('width', '640').attr('height', '480');\n    } else if (igMatch && igMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/')\n        .attr('width', '612').attr('height', '710')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else if (vMatch && vMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', vMatch[0] + '/embed/simple')\n        .attr('width', '600').attr('height', '600')\n        .attr('class', 'vine-embed');\n    } else if (vimMatch && vimMatch[3].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('src', '//player.vimeo.com/video/' + vimMatch[3])\n        .attr('width', '640').attr('height', '360');\n    } else if (dmMatch && dmMatch[2].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2])\n        .attr('width', '640').attr('height', '360');\n    } else if (youkuMatch && youkuMatch[1].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '498')\n        .attr('width', '510')\n        .attr('src', '//player.youku.com/embed/' + youkuMatch[1]);\n    } else if (peerTubeMatch && peerTubeMatch[0].length){\n      var begin = 0;\n      if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];\n      var end =0;\n      if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];\n      var loop = 0;\n      if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];\n      var autoplay = 0;\n      if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];\n      var muted = 0;\n      if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];\n      $video = $('<iframe allowfullscreen sandbox=\"allow-same-origin allow-scripts allow-popups\">')\n        .attr('frameborder', 0)\n        .attr('src', '//'+ peerTubeMatch[1] +'/videos/embed/' + peerTubeMatch[2]+\"?loop=\"+loop\n      +\"&autoplay=\"+autoplay+\"&muted=\"+muted +(begin > 0 ? '&start=' + begin : '')+(end > 0 ? '&end=' + start : ''))\n        .attr('width', '560')\n        .attr('height', '315');\n    }else if ((qqMatch && qqMatch[1].length) || (qqMatch2 && qqMatch2[2].length)) {\n      const vid = ((qqMatch && qqMatch[1].length) ? qqMatch[1] : qqMatch2[2]);\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '310')\n        .attr('width', '500')\n        .attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');\n    } else if (mp4Match || oggMatch || webmMatch) {\n      $video = $('<video controls>')\n        .attr('src', url)\n        .attr('width', '640').attr('height', '360');\n    } else if (fbMatch && fbMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560')\n        .attr('width', '560').attr('height', '301')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else {\n      // this is not a known video link. Now what, Cat? Now what?\n      return false;\n    }\n\n    $video.addClass('note-video-clip');\n\n    return $video[0];\n  }\n\n  show() {\n    const text = this.context.invoke('editor.getSelectedText');\n    this.context.invoke('editor.saveRange');\n    this.showVideoDialog(text).then((url) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      // build node\n      const $node = this.createVideoNode(url);\n\n      if ($node) {\n        // insert video node\n        this.context.invoke('editor.insertNode', $node);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show video dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showVideoDialog(/* text */) {\n    return $.Deferred((deferred) => {\n      const $videoUrl = this.$dialog.find('.note-video-url');\n      const $videoBtn = this.$dialog.find('.note-video-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        $videoUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($videoBtn, $videoUrl.val());\n        });\n\n        if (!env.isSupportTouch) {\n          $videoUrl.trigger('focus');\n        }\n\n        $videoBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($videoUrl.val());\n        });\n\n        this.bindEnterKey($videoUrl, $videoBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $videoUrl.off();\n        $videoBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\n\nexport default class HelpDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<p class=\"text-center\">',\n        '<a href=\"http://summernote.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Summernote @@VERSION@@</a> · ',\n        '<a href=\"https://github.com/summernote/summernote\" target=\"_blank\" rel=\"noopener noreferrer\">Project</a> · ',\n        '<a href=\"https://github.com/summernote/summernote/issues\" target=\"_blank\" rel=\"noopener noreferrer\">Issues</a>',\n      '</p>',\n    ].join('');\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.options.help,\n      fade: this.options.dialogsFade,\n      body: this.createShortcutList(),\n      footer: body,\n      callback: ($node) => {\n        $node.find('.modal-body,.note-modal-body').css({\n          'max-height': 300,\n          'overflow': 'scroll',\n        });\n      },\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  createShortcutList() {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    return Object.keys(keyMap).map((key) => {\n      const command = keyMap[key];\n      const $row = $('<div><div class=\"help-list-item\"></div></div>');\n      $row.append($('<label><kbd>' + key + '</kdb></label>').css({\n        'width': 180,\n        'margin-right': 10,\n      })).append($('<span></span>').html(this.context.memo('help.' + command) || command));\n      return $row.html();\n    }).join('');\n  }\n\n  /**\n   * show help dialog\n   *\n   * @return {Promise}\n   */\n  showHelpDialog() {\n    return $.Deferred((deferred) => {\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n        deferred.resolve();\n      });\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showHelpDialog().then(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\n\nconst AIRMODE_POPOVER_X_OFFSET = -5;\nconst AIRMODE_POPOVER_Y_OFFSET = 5;\n\nexport default class AirPopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n\n    this.hidable = true;\n    this.onContextmenu = false;\n    this.pageX = null;\n    this.pageY = null;\n\n    this.events = {\n      'summernote.contextmenu': (e) => {\n        if (this.options.editing) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.onContextmenu = true;\n          this.update(true);\n        }\n      },\n      'summernote.mousedown': (we, e) => {\n        this.pageX = e.pageX;\n        this.pageY = e.pageY;\n      },\n      'summernote.keyup summernote.mouseup summernote.scroll': (we, e) => {\n        if (this.options.editing && !this.onContextmenu) {\n          this.pageX = e.pageX;\n          this.pageY = e.pageY;\n          this.update();\n        }\n        this.onContextmenu = false;\n      },\n      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.focusout': () => {\n        if (!this.$popover.is(':active,:focus')) {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.options.airMode && !lists.isEmpty(this.options.popover.air);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-air-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.air);\n\n    // disable hiding this popover preemptively by 'summernote.blur' event.\n    this.$popover.on('mousedown', () => { this.hidable = false; });\n    // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).\n    this.$popover.on('mouseup', () => { this.hidable = true; });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(forcelyOpen) {\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {\n      let rect = {\n        left: this.pageX,\n        top: this.pageY,\n      };\n\n      const containerOffset = $(this.options.container).offset();\n      rect.top -= containerOffset.top;\n      rect.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,\n        top: rect.top + AIRMODE_POPOVER_Y_OFFSET,\n      });\n      this.context.invoke('buttons.updateCurrentStyle', this.$popover);\n    } else {\n      this.hide();\n    }\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.hide();\n    } \n  }\n\n  hide() {\n    if (this.hidable) {\n      this.$popover.hide();\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport key from '../core/key';\n\nconst POPOVER_DIST = 5;\n\nexport default class HintPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.hint = this.options.hint || [];\n    this.direction = this.options.hintDirection || 'bottom';\n    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.hints.length > 0;\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n    this.matchingWord = null;\n    this.$popover = this.ui.popover({\n      className: 'note-hint-popover',\n      hideArrow: true,\n      direction: '',\n    }).render().appendTo(this.options.container);\n\n    this.$popover.hide();\n    this.$content = this.$popover.find('.popover-content,.note-popover-content');\n    this.$content.on('click', '.note-hint-item', (e) => {\n      this.$content.find('.active').removeClass('active');\n      $(e.currentTarget).addClass('active');\n      this.replace();\n    });\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  selectItem($item) {\n    this.$content.find('.active').removeClass('active');\n    $item.addClass('active');\n\n    this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);\n  }\n\n  moveDown() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $next = $current.next();\n\n    if ($next.length) {\n      this.selectItem($next);\n    } else {\n      let $nextGroup = $current.parent().next();\n\n      if (!$nextGroup.length) {\n        $nextGroup = this.$content.find('.note-hint-group').first();\n      }\n\n      this.selectItem($nextGroup.find('.note-hint-item').first());\n    }\n  }\n\n  moveUp() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $prev = $current.prev();\n\n    if ($prev.length) {\n      this.selectItem($prev);\n    } else {\n      let $prevGroup = $current.parent().prev();\n\n      if (!$prevGroup.length) {\n        $prevGroup = this.$content.find('.note-hint-group').last();\n      }\n\n      this.selectItem($prevGroup.find('.note-hint-item').last());\n    }\n  }\n\n  replace() {\n    const $item = this.$content.find('.note-hint-item.active');\n\n    if ($item.length) {\n      var node = this.nodeFromItem($item);\n      // If matchingWord length = 0 -> capture OK / open hint / but as mention capture \"\" (\\w*)\n      if (this.matchingWord !== null && this.matchingWord.length === 0) {\n        this.lastWordRange.so = this.lastWordRange.eo;\n      // Else si > 0 and normal case -> adjust range \"before\" for correct position of insertion\n      } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {\n        let rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;\n        if (rangeCompute > 0) {\n          this.lastWordRange.so += rangeCompute;\n        }\n      }\n      this.lastWordRange.insertNode(node);\n\n      if (this.options.hintSelect === 'next') {\n        var blank = document.createTextNode('');\n        $(node).after(blank);\n        range.createFromNodeBefore(blank).select();\n      } else {\n        range.createFromNodeAfter(node).select();\n      }\n\n      this.lastWordRange = null;\n      this.hide();\n      this.context.invoke('editor.focus');\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  nodeFromItem($item) {\n    const hint = this.hints[$item.data('index')];\n    const item = $item.data('item');\n    let node = hint.content ? hint.content(item) : item;\n    if (typeof node === 'string') {\n      node = dom.createText(node);\n    }\n    return node;\n  }\n\n  createItemTemplates(hintIdx, items) {\n    const hint = this.hints[hintIdx];\n    return items.map((item /*, idx */) => {\n      const $item = $('<div class=\"note-hint-item\"></div>');\n      $item.append(hint.template ? hint.template(item) : item + '');\n      $item.data({\n        'index': hintIdx,\n        'item': item,\n      });\n      return $item;\n    });\n  }\n\n  handleKeydown(e) {\n    if (!this.$popover.is(':visible')) {\n      return;\n    }\n\n    if (e.keyCode === key.code.ENTER) {\n      e.preventDefault();\n      this.replace();\n    } else if (e.keyCode === key.code.UP) {\n      e.preventDefault();\n      this.moveUp();\n    } else if (e.keyCode === key.code.DOWN) {\n      e.preventDefault();\n      this.moveDown();\n    }\n  }\n\n  searchKeyword(index, keyword, callback) {\n    const hint = this.hints[index];\n    if (hint && hint.match.test(keyword) && hint.search) {\n      const matches = hint.match.exec(keyword);\n      this.matchingWord = matches[0];\n      hint.search(matches[1], callback);\n    } else {\n      callback();\n    }\n  }\n\n  createGroup(idx, keyword) {\n    const $group = $('<div class=\"note-hint-group note-hint-group-' + idx + '\"></div>');\n    this.searchKeyword(idx, keyword, (items) => {\n      items = items || [];\n      if (items.length) {\n        $group.html(this.createItemTemplates(idx, items));\n        this.show();\n      }\n    });\n\n    return $group;\n  }\n\n  handleKeyup(e) {\n    if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {\n      let range = this.context.invoke('editor.getLastRange');\n      let wordRange, keyword;\n      if (this.options.hintMode === 'words') {\n        wordRange = range.getWordsRange(range);\n        keyword = wordRange.toString();\n\n        this.hints.forEach((hint) => {\n          if (hint.match.test(keyword)) {\n            wordRange = range.getWordsMatchRange(hint.match);\n            return false;\n          }\n        });\n\n        if (!wordRange) {\n          this.hide();\n          return;\n        }\n\n        keyword = wordRange.toString();\n      } else {\n        wordRange = range.getWordRange();\n        keyword = wordRange.toString();\n      }\n\n      if (this.hints.length && keyword) {\n        this.$content.empty();\n\n        const bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));\n        const containerOffset = $(this.options.container).offset();\n        if (bnd) {\n          bnd.top -= containerOffset.top;\n          bnd.left -= containerOffset.left;\n\n          this.$popover.hide();\n          this.lastWordRange = wordRange;\n          this.hints.forEach((hint, idx) => {\n            if (hint.match.test(keyword)) {\n              this.createGroup(idx, keyword).appendTo(this.$content);\n            }\n          });\n          // select first .note-hint-item\n          this.$content.find('.note-hint-item:first').addClass('active');\n\n          // set position for popover after group is created\n          if (this.direction === 'top') {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST,\n            });\n          } else {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top + bnd.height + POPOVER_DIST,\n            });\n          }\n        }\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  show() {\n    this.$popover.show();\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport '../lang/summernote-en-US';\nimport './summernote';\nimport dom from './core/dom';\nimport range from './core/range';\nimport lists from './core/lists';\nimport Editor from './module/Editor';\nimport Clipboard from './module/Clipboard';\nimport Dropzone from './module/Dropzone';\nimport Codeview from './module/Codeview';\nimport Statusbar from './module/Statusbar';\nimport Fullscreen from './module/Fullscreen';\nimport Handle from './module/Handle';\nimport AutoLink from './module/AutoLink';\nimport AutoSync from './module/AutoSync';\nimport AutoReplace from './module/AutoReplace';\nimport Placeholder from './module/Placeholder';\nimport Buttons from './module/Buttons';\nimport Toolbar from './module/Toolbar';\nimport LinkDialog from './module/LinkDialog';\nimport LinkPopover from './module/LinkPopover';\nimport ImageDialog from './module/ImageDialog';\nimport ImagePopover from './module/ImagePopover';\nimport TablePopover from './module/TablePopover';\nimport VideoDialog from './module/VideoDialog';\nimport HelpDialog from './module/HelpDialog';\nimport AirPopover from './module/AirPopover';\nimport HintPopover from './module/HintPopover';\n\n$.summernote = $.extend($.summernote, {\n  version: '@@VERSION@@',\n  plugins: {},\n\n  dom: dom,\n  range: range,\n  lists: lists,\n\n  options: {\n    langInfo: $.summernote.lang['en-US'],\n    editing: true,\n    modules: {\n      'editor': Editor,\n      'clipboard': Clipboard,\n      'dropzone': Dropzone,\n      'codeview': Codeview,\n      'statusbar': Statusbar,\n      'fullscreen': Fullscreen,\n      'handle': Handle,\n      // FIXME: HintPopover must be front of autolink\n      //  - Script error about range when Enter key is pressed on hint popover\n      'hintPopover': HintPopover,\n      'autoLink': AutoLink,\n      'autoSync': AutoSync,\n      'autoReplace': AutoReplace,\n      'placeholder': Placeholder,\n      'buttons': Buttons,\n      'toolbar': Toolbar,\n      'linkDialog': LinkDialog,\n      'linkPopover': LinkPopover,\n      'imageDialog': ImageDialog,\n      'imagePopover': ImagePopover,\n      'tablePopover': TablePopover,\n      'videoDialog': VideoDialog,\n      'helpDialog': HelpDialog,\n      'airPopover': AirPopover,\n    },\n\n    buttons: {},\n\n    lang: 'en-US',\n\n    followingToolbar: false,\n    toolbarPosition: 'top',\n    otherStaticBar: '',\n\n    // toolbar\n    codeviewKeepButton: false,\n    toolbar: [\n      ['style', ['style']],\n      ['font', ['bold', 'underline', 'clear']],\n      ['fontname', ['fontname']],\n      ['color', ['color']],\n      ['para', ['ul', 'ol', 'paragraph']],\n      ['table', ['table']],\n      ['insert', ['link', 'picture', 'video']],\n      ['view', ['fullscreen', 'codeview', 'help']],\n    ],\n\n    // popover\n    popatmouse: true,\n    popover: {\n      image: [\n        ['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n        ['float', ['floatLeft', 'floatRight', 'floatNone']],\n        ['remove', ['removeMedia']],\n      ],\n      link: [\n        ['link', ['linkDialogShow', 'unlink']],\n      ],\n      table: [\n        ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n        ['delete', ['deleteRow', 'deleteCol', 'deleteTable']],\n      ],\n      air: [\n        ['color', ['color']],\n        ['font', ['bold', 'underline', 'clear']],\n        ['para', ['ul', 'paragraph']],\n        ['table', ['table']],\n        ['insert', ['link', 'picture']],\n        ['view', ['fullscreen', 'codeview']],\n      ],\n    },\n\n    // air mode: inline editor\n    airMode: false,\n    overrideContextMenu: false, // TBD\n\n    width: null,\n    height: null,\n    linkTargetBlank: true,\n    useProtocol: true,\n    defaultProtocol: 'http://',\n\n    focus: false,\n    tabDisabled: false,\n    tabSize: 4,\n    styleWithCSS: false,\n    shortcuts: true,\n    textareaAutoSync: true,\n    tooltip: 'auto',\n    container: null,\n    maxTextLength: 0,\n    blockquoteBreakingLevel: 2,\n    spellCheck: true,\n    disableGrammar: false,\n    placeholder: null,\n    inheritPlaceholder: false,\n    // TODO: need to be documented\n    recordEveryKeystroke: false,\n    historyLimit: 200,\n\n    // TODO: need to be documented\n    showDomainOnlyForAutolink: false,\n\n    // TODO: need to be documented\n    hintMode: 'word',\n    hintSelect: 'after',\n    hintDirection: 'bottom',\n\n    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n\n    fontNames: [\n      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',\n      'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',\n      'Tahoma', 'Times New Roman', 'Verdana',\n    ],\n    fontNamesIgnoreCheck: [],\n    addDefaultFonts: true,\n\n    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],\n\n    fontSizeUnits: ['px', 'pt'],\n\n    // pallete colors(n x n)\n    colors: [\n      ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],\n      ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],\n      ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],\n      ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],\n      ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],\n      ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],\n      ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],\n      ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'],\n    ],\n\n    // http://chir.ag/projects/name-that-color/\n    colorsName: [\n      ['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'],\n      ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'],\n      ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'],\n      ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'],\n      ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'],\n      ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'],\n      ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'],\n      ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou'],\n    ],\n\n    colorButton: {\n      foreColor: '#000000',\n      backColor: '#FFFF00',\n    },\n\n    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],\n\n    tableClassName: 'table table-bordered',\n\n    insertTableMaxSize: {\n      col: 10,\n      row: 10,\n    },\n\n    // By default, dialogs are attached in container.\n    dialogsInBody: false,\n    dialogsFade: false,\n\n    maximumImageFileSize: null,\n    acceptImageFileTypes: \"image/*\",\n\n    callbacks: {\n      onBeforeCommand: null,\n      onBlur: null,\n      onBlurCodeview: null,\n      onChange: null,\n      onChangeCodeview: null,\n      onDialogShown: null,\n      onEnter: null,\n      onFocus: null,\n      onImageLinkInsert: null,\n      onImageUpload: null,\n      onImageUploadError: null,\n      onInit: null,\n      onKeydown: null,\n      onKeyup: null,\n      onMousedown: null,\n      onMouseup: null,\n      onPaste: null,\n      onScroll: null,\n    },\n\n    codemirror: {\n      mode: 'text/html',\n      htmlMode: true,\n      lineNumbers: true,\n    },\n\n    codeviewFilter: true,\n    codeviewFilterRegex: /<\\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,\n    codeviewIframeFilter: true,\n    codeviewIframeWhitelistSrc: [],\n    codeviewIframeWhitelistSrcBase: [\n      'www.youtube.com',\n      'www.youtube-nocookie.com',\n      'www.facebook.com',\n      'vine.co',\n      'instagram.com',\n      'player.vimeo.com',\n      'www.dailymotion.com',\n      'player.youku.com',\n      'jumpingbean.tv',\n      'v.qq.com',\n    ],\n\n    keyMap: {\n      pc: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CTRL+Z': 'undo',\n        'CTRL+Y': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CTRL+B': 'bold',\n        'CTRL+I': 'italic',\n        'CTRL+U': 'underline',\n        'CTRL+SHIFT+S': 'strikethrough',\n        'CTRL+BACKSLASH': 'removeFormat',\n        'CTRL+SHIFT+L': 'justifyLeft',\n        'CTRL+SHIFT+E': 'justifyCenter',\n        'CTRL+SHIFT+R': 'justifyRight',\n        'CTRL+SHIFT+J': 'justifyFull',\n        'CTRL+SHIFT+NUM7': 'insertUnorderedList',\n        'CTRL+SHIFT+NUM8': 'insertOrderedList',\n        'CTRL+LEFTBRACKET': 'outdent',\n        'CTRL+RIGHTBRACKET': 'indent',\n        'CTRL+NUM0': 'formatPara',\n        'CTRL+NUM1': 'formatH1',\n        'CTRL+NUM2': 'formatH2',\n        'CTRL+NUM3': 'formatH3',\n        'CTRL+NUM4': 'formatH4',\n        'CTRL+NUM5': 'formatH5',\n        'CTRL+NUM6': 'formatH6',\n        'CTRL+ENTER': 'insertHorizontalRule',\n        'CTRL+K': 'linkDialog.show',\n      },\n\n      mac: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CMD+Z': 'undo',\n        'CMD+SHIFT+Z': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CMD+B': 'bold',\n        'CMD+I': 'italic',\n        'CMD+U': 'underline',\n        'CMD+SHIFT+S': 'strikethrough',\n        'CMD+BACKSLASH': 'removeFormat',\n        'CMD+SHIFT+L': 'justifyLeft',\n        'CMD+SHIFT+E': 'justifyCenter',\n        'CMD+SHIFT+R': 'justifyRight',\n        'CMD+SHIFT+J': 'justifyFull',\n        'CMD+SHIFT+NUM7': 'insertUnorderedList',\n        'CMD+SHIFT+NUM8': 'insertOrderedList',\n        'CMD+LEFTBRACKET': 'outdent',\n        'CMD+RIGHTBRACKET': 'indent',\n        'CMD+NUM0': 'formatPara',\n        'CMD+NUM1': 'formatH1',\n        'CMD+NUM2': 'formatH2',\n        'CMD+NUM3': 'formatH3',\n        'CMD+NUM4': 'formatH4',\n        'CMD+NUM5': 'formatH5',\n        'CMD+NUM6': 'formatH6',\n        'CMD+ENTER': 'insertHorizontalRule',\n        'CMD+K': 'linkDialog.show',\n      },\n    },\n    icons: {\n      'align': 'note-icon-align',\n      'alignCenter': 'note-icon-align-center',\n      'alignJustify': 'note-icon-align-justify',\n      'alignLeft': 'note-icon-align-left',\n      'alignRight': 'note-icon-align-right',\n      'rowBelow': 'note-icon-row-below',\n      'colBefore': 'note-icon-col-before',\n      'colAfter': 'note-icon-col-after',\n      'rowAbove': 'note-icon-row-above',\n      'rowRemove': 'note-icon-row-remove',\n      'colRemove': 'note-icon-col-remove',\n      'indent': 'note-icon-align-indent',\n      'outdent': 'note-icon-align-outdent',\n      'arrowsAlt': 'note-icon-arrows-alt',\n      'bold': 'note-icon-bold',\n      'caret': 'note-icon-caret',\n      'circle': 'note-icon-circle',\n      'close': 'note-icon-close',\n      'code': 'note-icon-code',\n      'eraser': 'note-icon-eraser',\n      'floatLeft': 'note-icon-float-left',\n      'floatRight': 'note-icon-float-right',\n      'font': 'note-icon-font',\n      'frame': 'note-icon-frame',\n      'italic': 'note-icon-italic',\n      'link': 'note-icon-link',\n      'unlink': 'note-icon-chain-broken',\n      'magic': 'note-icon-magic',\n      'menuCheck': 'note-icon-menu-check',\n      'minus': 'note-icon-minus',\n      'orderedlist': 'note-icon-orderedlist',\n      'pencil': 'note-icon-pencil',\n      'picture': 'note-icon-picture',\n      'question': 'note-icon-question',\n      'redo': 'note-icon-redo',\n      'rollback': 'note-icon-rollback',\n      'square': 'note-icon-square',\n      'strikethrough': 'note-icon-strikethrough',\n      'subscript': 'note-icon-subscript',\n      'superscript': 'note-icon-superscript',\n      'table': 'note-icon-table',\n      'textHeight': 'note-icon-text-height',\n      'trash': 'note-icon-trash',\n      'underline': 'note-icon-underline',\n      'undo': 'note-icon-undo',\n      'unorderedlist': 'note-icon-unorderedlist',\n      'video': 'note-icon-video',\n    },\n  },\n});\n","import $ from 'jquery';\n\nclass Renderer {\n  constructor(markup, children, options, callback) {\n    this.markup = markup;\n    this.children = children;\n    this.options = options;\n    this.callback = callback;\n  }\n\n  render($parent) {\n    const $node = $(this.markup);\n\n    if (this.options && this.options.contents) {\n      $node.html(this.options.contents);\n    }\n\n    if (this.options && this.options.className) {\n      $node.addClass(this.options.className);\n    }\n\n    if (this.options && this.options.data) {\n      $.each(this.options.data, (k, v) => {\n        $node.attr('data-' + k, v);\n      });\n    }\n\n    if (this.options && this.options.click) {\n      $node.on('click', this.options.click);\n    }\n\n    if (this.children) {\n      const $container = $node.find('.note-children-container');\n      this.children.forEach((child) => {\n        child.render($container.length ? $container : $node);\n      });\n    }\n\n    if (this.callback) {\n      this.callback($node, this.options);\n    }\n\n    if (this.options && this.options.callback) {\n      this.options.callback($node);\n    }\n\n    if ($parent) {\n      $parent.append($node);\n    }\n\n    return $node;\n  }\n}\n\nexport default {\n  create: (markup, callback) => {\n    return function() {\n      const options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];\n      let children = Array.isArray(arguments[0]) ? arguments[0] : [];\n      if (options && options.children) {\n        children = options.children;\n      }\n      return new Renderer(markup, children, options, callback);\n    };\n  },\n};\n","import $ from 'jquery';\n\nclass TooltipUI {\n  constructor($node, options) {\n    this.$node = $node;\n    this.options = $.extend({}, {\n      title: '',\n      target: options.container,\n      trigger: 'hover focus',\n      placement: 'bottom',\n    }, options);\n\n    // create tooltip node\n    this.$tooltip = $([\n      '<div class=\"note-tooltip\">',\n        '<div class=\"note-tooltip-arrow\"></div>',\n        '<div class=\"note-tooltip-content\"></div>',\n      '</div>',\n    ].join(''));\n\n    // define event\n    if (this.options.trigger !== 'manual') {\n      const showCallback = this.show.bind(this);\n      const hideCallback = this.hide.bind(this);\n      const toggleCallback = this.toggle.bind(this);\n\n      this.options.trigger.split(' ').forEach(function(eventName) {\n        if (eventName === 'hover') {\n          $node.off('mouseenter mouseleave');\n          $node.on('mouseenter', showCallback).on('mouseleave', hideCallback);\n        } else if (eventName === 'click') {\n          $node.on('click', toggleCallback);\n        } else if (eventName === 'focus') {\n          $node.on('focus', showCallback).on('blur', hideCallback);\n        }\n      });\n    }\n  }\n\n  show() {\n    const $node = this.$node;\n    const offset = $node.offset();\n    const targetOffset = $(this.options.target).offset();\n    offset.top -= targetOffset.top;\n    offset.left -= targetOffset.left;\n\n    const $tooltip = this.$tooltip;\n    const title = this.options.title || $node.attr('title') || $node.data('title');\n    const placement = this.options.placement || $node.data('placement');\n\n    $tooltip.addClass(placement);\n    $tooltip.find('.note-tooltip-content').text(title);\n    $tooltip.appendTo(this.options.target);\n\n    const nodeWidth = $node.outerWidth();\n    const nodeHeight = $node.outerHeight();\n    const tooltipWidth = $tooltip.outerWidth();\n    const tooltipHeight = $tooltip.outerHeight();\n\n    if (placement === 'bottom') {\n      $tooltip.css({\n        top: offset.top + nodeHeight,\n        left: offset.left + (nodeWidth / 2 - tooltipWidth / 2),\n      });\n    } else if (placement === 'top') {\n      $tooltip.css({\n        top: offset.top - tooltipHeight,\n        left: offset.left + (nodeWidth / 2 - tooltipWidth / 2),\n      });\n    } else if (placement === 'left') {\n      $tooltip.css({\n        top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),\n        left: offset.left - tooltipWidth,\n      });\n    } else if (placement === 'right') {\n      $tooltip.css({\n        top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),\n        left: offset.left + nodeWidth,\n      });\n    }\n\n    $tooltip.addClass('in');\n  }\n\n  hide() {\n    this.$tooltip.removeClass('in');\n    setTimeout(() => {\n      this.$tooltip.remove();\n    }, 200);\n  }\n\n  toggle() {\n    if (this.$tooltip.hasClass('in')) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n}\n\nexport default TooltipUI;\n","import $ from 'jquery';\n\nclass DropdownUI {\n  constructor($node, options) {\n    this.$button = $node;\n    this.options = $.extend({}, {\n      target: options.container,\n    }, options);\n    this.setEvent();\n  }\n\n  setEvent() {\n    this.$button.on('click', (e) => {\n      this.toggle();\n      e.stopImmediatePropagation();\n    });\n  }\n\n  clear() {\n    var $parent = $('.note-btn-group.open');\n    $parent.find('.note-btn.active').removeClass('active');\n    $parent.removeClass('open');\n  }\n\n  show() {\n    this.$button.addClass('active');\n    this.$button.parent().addClass('open');\n\n    var $dropdown = this.$button.next();\n    var offset = $dropdown.offset();\n    var width = $dropdown.outerWidth();\n    var windowWidth = $(window).width();\n    var targetMarginRight = parseFloat($(this.options.target).css('margin-right'));\n\n    if (offset.left + width > windowWidth - targetMarginRight) {\n      $dropdown.css('margin-left', windowWidth - targetMarginRight - (offset.left + width));\n    } else {\n      $dropdown.css('margin-left', '');\n    }\n  }\n\n  hide() {\n    this.$button.removeClass('active');\n    this.$button.parent().removeClass('open');\n  }\n\n  toggle() {\n    var isOpened = this.$button.parent().hasClass('open');\n\n    this.clear();\n\n    if (isOpened) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n}\n\n$(document).on('click', function(e) {\n  if (!$(e.target).closest('.note-btn-group').length) {\n    $('.note-btn-group.open').removeClass('open');\n    $('.note-btn-group .note-btn.active').removeClass('active');\n  }\n});\n\n$(document).on('click.note-dropdown-menu', function(e) {\n  $(e.target).closest('.note-dropdown-menu').parent().removeClass('open');\n  $(e.target).closest('.note-dropdown-menu').parent().find('.note-btn.active').removeClass('active');\n});\n\nexport default DropdownUI;\n","import $ from 'jquery';\n\nclass ModalUI {\n  constructor($node /*, options */) {\n    this.$modal = $node;\n    this.$backdrop = $('<div class=\"note-modal-backdrop\"></div>');\n  }\n\n  show() {\n    this.$backdrop.appendTo(document.body).show();\n    this.$modal.addClass('open').show();\n    this.$modal.trigger('note.modal.show');\n    this.$modal.off('click', '.close').on('click', '.close', this.hide.bind(this));\n    this.$modal.on('keydown', (event) => {\n      if (event.which === 27) {\n        event.preventDefault();\n        this.hide();\n      }\n    });\n  }\n\n  hide() {\n    this.$modal.removeClass('open').hide();\n    this.$backdrop.hide();\n    this.$modal.trigger('note.modal.hide');\n    this.$modal.off('keydown');\n  }\n}\n\nexport default ModalUI;\n","import $ from 'jquery';\nimport '/js/settings';\nimport renderer from '/js/renderer';\n\nimport './summernote-lite.scss';\nimport TooltipUI from './js/TooltipUI';\nimport DropdownUI from './js/DropdownUI';\nimport ModalUI from './js/ModalUI';\n\nconst editor = renderer.create('<div class=\"note-editor note-frame\"></div>');\nconst toolbar = renderer.create('<div class=\"note-toolbar\" role=\"toolbar\"></div>');\nconst editingArea = renderer.create('<div class=\"note-editing-area\"></div>');\nconst codable = renderer.create('<textarea class=\"note-codable\" aria-multiline=\"true\"></textarea>');\nconst editable = renderer.create('<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>');\nconst statusbar = renderer.create([\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n  '<div class=\"note-statusbar\" role=\"status\">',\n    '<div class=\"note-resizebar\" aria-label=\"resize\">',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n    '</div>',\n  '</div>',\n].join(''));\n\nconst airEditor = renderer.create('<div class=\"note-editor note-airframe\"></div>');\nconst airEditable = renderer.create([\n  '<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>',\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n].join(''));\n\nconst buttonGroup = renderer.create('<div class=\"note-btn-group\"></div>');\nconst button = renderer.create('<button type=\"button\" class=\"note-btn\" tabindex=\"-1\"></button>', function($node, options) {\n  // set button type\n  if (options && options.tooltip) {\n    $node.attr({\n      'aria-label': options.tooltip,\n    });\n    $node.data('_lite_tooltip', new TooltipUI($node, {\n      title: options.tooltip,\n      container: options.container,\n    })).on('click', (e) => {\n      $(e.currentTarget).data('_lite_tooltip').hide();\n    });\n  }\n  if (options.contents) {\n    $node.html(options.contents);\n  }\n\n  if (options && options.data && options.data.toggle === 'dropdown') {\n    $node.data('_lite_dropdown', new DropdownUI($node, {\n      container: options.container,\n    }));\n  }\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdown = renderer.create('<div class=\"note-dropdown-menu\" role=\"list\"></div>', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    const $temp = $('<a class=\"note-dropdown-item\" href=\"#\" data-value=\"' + value + '\" role=\"listitem\" aria-label=\"' + value + '\"></a>');\n\n    $temp.html(content).data('item', item);\n\n    return $temp;\n  }) : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  $node.on('click', '> .note-dropdown-item', function(e) {\n    const $a = $(this);\n\n    const item = $a.data('item');\n    const value = $a.data('value');\n\n    if (item.click) {\n      item.click($a);\n    } else if (options.itemClick) {\n      options.itemClick(e, item, value);\n    }\n  });\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownCheck = renderer.create('<div class=\"note-dropdown-menu note-check\" role=\"list\"></div>', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n\n    const $temp = $('<a class=\"note-dropdown-item\" href=\"#\" data-value=\"' + value + '\" role=\"listitem\" aria-label=\"' + item + '\"></a>');\n    $temp.html([icon(options.checkClassName), ' ', content]).data('item', item);\n    return $temp;\n  }) : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  $node.on('click', '> .note-dropdown-item', function(e) {\n    const $a = $(this);\n\n    const item = $a.data('item');\n    const value = $a.data('value');\n\n    if (item.click) {\n      item.click($a);\n    } else if (options.itemClick) {\n      options.itemClick(e, item, value);\n    }\n  });\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownButtonContents = function(contents, options) {\n  return contents + ' ' + icon(options.icons.caret, 'span');\n};\n\nconst dropdownButton = function(opt, callback) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdown({\n      className: opt.className,\n      items: opt.items,\n      template: opt.template,\n      itemClick: opt.itemClick,\n    }),\n  ], { callback: callback }).render();\n};\n\nconst dropdownCheckButton = function(opt, callback) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdownCheck({\n      className: opt.className,\n      checkClassName: opt.checkClassName,\n      items: opt.items,\n      template: opt.template,\n      itemClick: opt.itemClick,\n    }),\n  ], { callback: callback }).render();\n};\n\nconst paragraphDropdownButton = function(opt) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdown([\n      buttonGroup({\n        className: 'note-align',\n        children: opt.items[0],\n      }),\n      buttonGroup({\n        className: 'note-list',\n        children: opt.items[1],\n      }),\n    ]),\n  ]).render();\n};\n\nconst tableMoveHandler = function(event, col, row) {\n  const PX_PER_EM = 18;\n  const $picker = $(event.target.parentNode); // target is mousecatcher\n  const $dimensionDisplay = $picker.next();\n  const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n  const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n  const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n  let posOffset;\n  // HTML5 with jQuery - e.offsetX is undefined in Firefox\n  if (event.offsetX === undefined) {\n    const posCatcher = $(event.target).offset();\n    posOffset = {\n      x: event.pageX - posCatcher.left,\n      y: event.pageY - posCatcher.top,\n    };\n  } else {\n    posOffset = {\n      x: event.offsetX,\n      y: event.offsetY,\n    };\n  }\n\n  const dim = {\n    c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n    r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n  };\n\n  $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n  $catcher.data('value', dim.c + 'x' + dim.r);\n\n  if (dim.c > 3 && dim.c < col) {\n    $unhighlighted.css({ width: dim.c + 1 + 'em' });\n  }\n\n  if (dim.r > 3 && dim.r < row) {\n    $unhighlighted.css({ height: dim.r + 1 + 'em' });\n  }\n\n  $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n};\n\nconst tableDropdownButton = function(opt) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdown({\n      className: 'note-table',\n      items: [\n        '<div class=\"note-dimension-picker\">',\n          '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n          '<div class=\"note-dimension-picker-highlighted\"></div>',\n          '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n        '</div>',\n        '<div class=\"note-dimension-display\">1 x 1</div>',\n      ].join(''),\n    }),\n  ], {\n    callback: function($node) {\n      const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n      $catcher.css({\n        width: opt.col + 'em',\n        height: opt.row + 'em',\n      })\n        .mouseup(opt.itemClick)\n        .mousemove(function(e) {\n          tableMoveHandler(e, opt.col, opt.row);\n        });\n    },\n  }).render();\n};\n\nconst palette = renderer.create('<div class=\"note-color-palette\"></div>', function($node, options) {\n  const contents = [];\n  for (let row = 0, rowSize = options.colors.length; row < rowSize; row++) {\n    const eventName = options.eventName;\n    const colors = options.colors[row];\n    const colorsName = options.colorsName[row];\n    const buttons = [];\n    for (let col = 0, colSize = colors.length; col < colSize; col++) {\n      const color = colors[col];\n      const colorName = colorsName[col];\n      buttons.push([\n        '<button type=\"button\" class=\"note-btn note-color-btn\"',\n        'style=\"background-color:', color, '\" ',\n        'data-event=\"', eventName, '\" ',\n        'data-value=\"', color, '\" ',\n        'data-title=\"', colorName, '\" ',\n        'aria-label=\"', colorName, '\" ',\n        'data-toggle=\"button\" tabindex=\"-1\"></button>',\n      ].join(''));\n    }\n    contents.push('<div class=\"note-color-row\">' + buttons.join('') + '</div>');\n  }\n  $node.html(contents.join(''));\n\n  $node.find('.note-color-btn').each(function() {\n    $(this).data('_lite_tooltip', new TooltipUI($(this), {\n      container: options.container,\n    }));\n  });\n});\n\nconst colorDropdownButton = function(opt, type) {\n  return buttonGroup({\n    className: 'note-color',\n    children: [\n      button({\n        className: 'note-current-color-button',\n        contents: opt.title,\n        tooltip: opt.lang.color.recent,\n        click: opt.currentClick,\n        callback: function($button) {\n          const $recentColor = $button.find('.note-recent-color');\n\n          if (type !== 'foreColor') {\n            $recentColor.css('background-color', '#FFFF00');\n            $button.attr('data-backColor', '#FFFF00');\n          }\n        },\n      }),\n      button({\n        className: 'dropdown-toggle',\n        contents: icon('note-icon-caret'),\n        tooltip: opt.lang.color.more,\n        data: {\n          toggle: 'dropdown',\n        },\n      }),\n      dropdown({\n        items: [\n          '<div>',\n            '<div class=\"note-btn-group btn-background-color\">',\n              '<div class=\"note-palette-title\">' + opt.lang.color.background + '</div>',\n            '<div>',\n            '<button type=\"button\" class=\"note-color-reset note-btn note-btn-block\" data-event=\"backColor\" data-value=\"transparent\">',\n              opt.lang.color.transparent,\n            '</button>',\n          '</div>',\n          '<div class=\"note-holder\" data-event=\"backColor\"></div>',\n            '<div class=\"btn-sm\">',\n              '<input type=\"color\" id=\"html5bcp\" class=\"note-btn btn-default\" value=\"#21104A\" style=\"width:100%;\" data-value=\"cp\">',\n              '<button type=\"button\" class=\"note-color-reset btn\" data-event=\"backColor\" data-value=\"cpbackColor\">',\n                opt.lang.color.cpSelect,\n              '</button>',\n            '</div>',\n          '</div>',\n          '<div class=\"note-btn-group btn-foreground-color\">',\n            '<div class=\"note-palette-title\">' + opt.lang.color.foreground + '</div>',\n            '<div>',\n              '<button type=\"button\" class=\"note-color-reset note-btn note-btn-block\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                opt.lang.color.resetToDefault,\n              '</button>',\n            '</div>',\n            '<div class=\"note-holder\" data-event=\"foreColor\"></div>',\n              '<div class=\"btn-sm\">',\n                '<input type=\"color\" id=\"html5fcp\" class=\"note-btn btn-default\" value=\"#21104A\" style=\"width:100%;\" data-value=\"cp\">',\n                '<button type=\"button\" class=\"note-color-reset btn\" data-event=\"foreColor\" data-value=\"cpforeColor\">',\n                  opt.lang.color.cpSelect,\n                '</button>',\n              '</div>',\n            '</div>',\n          '</div>',\n        ].join(''),\n        callback: function($dropdown) {\n          $dropdown.find('.note-holder').each(function() {\n            const $holder = $(this);\n            $holder.append(palette({\n              colors: opt.colors,\n              eventName: $holder.data('event'),\n            }).render());\n          });\n\n          if (type === 'fore') {\n            $dropdown.find('.btn-background-color').hide();\n            $dropdown.css({ 'min-width': '210px' });\n          } else if (type === 'back') {\n            $dropdown.find('.btn-foreground-color').hide();\n            $dropdown.css({ 'min-width': '210px' });\n          }\n        },\n        click: function(event) {\n          const $button = $(event.target);\n          const eventName = $button.data('event');\n          let value = $button.data('value');\n          const foreinput = document.getElementById('html5fcp').value;\n          const backinput = document.getElementById('html5bcp').value;\n          if (value === 'cp') {\n            event.stopPropagation();\n          } else if (value === 'cpbackColor') {\n            value = backinput;\n          } else if (value === 'cpforeColor') {\n            value = foreinput;\n          }\n\n          if (eventName && value) {\n            const key = eventName === 'backColor' ? 'background-color' : 'color';\n            const $color = $button.closest('.note-color').find('.note-recent-color');\n            const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n            $color.css(key, value);\n            $currentButton.attr('data-' + eventName, value);\n\n            if (type === 'fore') {\n              opt.itemClick('foreColor', value);\n            } else if (type === 'back') {\n              opt.itemClick('backColor', value);\n            } else {\n              opt.itemClick(eventName, value);\n            }\n          }\n        },\n      }),\n    ],\n  }).render();\n};\n\nconst dialog = renderer.create('<div class=\"note-modal\" aria-hidden=\"false\" tabindex=\"-1\" role=\"dialog\"></div>', function($node, options) {\n  if (options.fade) {\n    $node.addClass('fade');\n  }\n  $node.attr({\n    'aria-label': options.title,\n  });\n  $node.html([\n    '<div class=\"note-modal-content\">',\n      (options.title ? '<div class=\"note-modal-header\"><button type=\"button\" class=\"close\" aria-label=\"Close\" aria-hidden=\"true\"><i class=\"note-icon-close\"></i></button><h4 class=\"note-modal-title\">' + options.title + '</h4></div>' : ''),\n      '<div class=\"note-modal-body\">' + options.body + '</div>',\n      (options.footer ? '<div class=\"note-modal-footer\">' + options.footer + '</div>' : ''),\n    '</div>',\n  ].join(''));\n\n  $node.data('modal', new ModalUI($node, options));\n});\n\nconst videoDialog = function(opt) {\n  const body = '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-video-url-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.video.url + ' <small class=\"text-muted\">' + opt.lang.video.providers + '</small></label>' +\n    '<input id=\"note-dialog-video-url-' + opt.id + '\" class=\"note-video-url note-input\" type=\"text\"/>' +\n  '</div>';\n  const footer = [\n    '<button type=\"button\" href=\"#\" class=\"note-btn note-btn-primary note-video-btn disabled\" disabled>',\n      opt.lang.video.insert,\n    '</button>',\n  ].join('');\n\n  return dialog({\n    title: opt.lang.video.insert,\n    fade: opt.fade,\n    body: body,\n    footer: footer,\n  }).render();\n};\n\nconst imageDialog = function(opt) {\n  const body = '<div class=\"note-form-group note-group-select-from-files\">' +\n    '<label for=\"note-dialog-image-file-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.image.selectFromFiles + '</label>' +\n    '<input id=\"note-dialog-image-file-' + opt.id + '\" class=\"note-note-image-input note-input\" type=\"file\" name=\"files\" accept=\"image/*\" multiple=\"multiple\"/>' +\n    opt.imageLimitation +\n  '</div>' +\n  '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-image-url-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.image.url + '</label>' +\n    '<input id=\"note-dialog-image-url-' + opt.id + '\" class=\"note-image-url note-input\" type=\"text\"/>' +\n  '</div>';\n  const footer = [\n    '<button href=\"#\" type=\"button\" class=\"note-btn note-btn-primary note-btn-large note-image-btn disabled\" disabled>',\n      opt.lang.image.insert,\n    '</button>',\n  ].join('');\n\n  return dialog({\n    title: opt.lang.image.insert,\n    fade: opt.fade,\n    body: body,\n    footer: footer,\n  }).render();\n};\n\nconst linkDialog = function(opt) {\n  const body = '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-link-txt-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.link.textToDisplay + '</label>' +\n    '<input id=\"note-dialog-link-txt-' + opt.id + '\" class=\"note-link-text note-input\" type=\"text\"/>' +\n  '</div>' +\n  '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-link-url-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.link.url + '</label>' +\n    '<input id=\"note-dialog-link-url-' + opt.id + '\" class=\"note-link-url note-input\" type=\"text\" value=\"http://\"/>' +\n  '</div>' +\n  (!opt.disableLinkTarget ? '<div class=\"checkbox\"><label for=\"note-dialog-link-nw-' + opt.id + '\"><input id=\"note-dialog-link-nw-' + opt.id + '\" type=\"checkbox\" checked> ' + opt.lang.link.openInNewWindow + '</label></div>' : '') +\n  '<div class=\"checkbox\"><label for=\"note-dialog-link-up-' + opt.id + '\"><input id=\"note-dialog-link-up-' + opt.id + '\" type=\"checkbox\" checked> ' + opt.lang.link.useProtocol + '</label></div>';\n  const footer = [\n    '<button href=\"#\" type=\"button\" class=\"note-btn note-btn-primary note-link-btn disabled\" disabled>',\n      opt.lang.link.insert,\n    '</button>',\n  ].join('');\n\n  return dialog({\n    className: 'link-dialog',\n    title: opt.lang.link.insert,\n    fade: opt.fade,\n    body: body,\n    footer: footer,\n  }).render();\n};\n\nconst popover = renderer.create([\n  '<div class=\"note-popover bottom\">',\n    '<div class=\"note-popover-arrow\"></div>',\n    '<div class=\"popover-content note-children-container\"></div>',\n  '</div>',\n].join(''), function($node, options) {\n  const direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';\n\n  $node.addClass(direction).hide();\n\n  if (options.hideArrow) {\n    $node.find('.note-popover-arrow').hide();\n  }\n});\n\nconst checkbox = renderer.create('<div class=\"checkbox\"></div>', function($node, options) {\n  $node.html([\n    '<label' + (options.id ? ' for=\"note-' + options.id + '\"' : '') + '>',\n      '<input role=\"checkbox\" type=\"checkbox\"' + (options.id ? ' id=\"note-' + options.id + '\"' : ''),\n      (options.checked ? ' checked' : ''),\n      ' aria-checked=\"' + (options.checked ? 'true' : 'false') + '\"/>',\n      (options.text ? options.text : ''),\n    '</label>',\n  ].join(''));\n});\n\nconst icon = function(iconClassName, tagName) {\n  if (iconClassName.match(/^</)) {\n    return iconClassName;\n  }\n  tagName = tagName || 'i';\n  return '<' + tagName + ' class=\"' + iconClassName + '\"></' + tagName + '>';\n};\n\nconst ui = function(editorOptions) {\n  return {\n    editor: editor,\n    toolbar: toolbar,\n    editingArea: editingArea,\n    codable: codable,\n    editable: editable,\n    statusbar: statusbar,\n    airEditor: airEditor,\n    airEditable: airEditable,\n    buttonGroup: buttonGroup,\n    button: button,\n    dropdown: dropdown,\n    dropdownCheck: dropdownCheck,\n    dropdownButton: dropdownButton,\n    dropdownButtonContents: dropdownButtonContents,\n    dropdownCheckButton: dropdownCheckButton,\n    paragraphDropdownButton: paragraphDropdownButton,\n    tableDropdownButton: tableDropdownButton,\n    colorDropdownButton: colorDropdownButton,\n    palette: palette,\n    dialog: dialog,\n    videoDialog: videoDialog,\n    imageDialog: imageDialog,\n    linkDialog: linkDialog,\n    popover: popover,\n    checkbox: checkbox,\n    icon: icon,\n    options: editorOptions,\n\n    toggleBtn: function($btn, isEnable) {\n      $btn.toggleClass('disabled', !isEnable);\n      $btn.attr('disabled', !isEnable);\n    },\n\n    toggleBtnActive: function($btn, isActive) {\n      $btn.toggleClass('active', isActive);\n    },\n\n    check: function($dom, value) {\n      $dom.find('.checked').removeClass('checked');\n      $dom.find('[data-value=\"' + value + '\"]').addClass('checked');\n    },\n\n    onDialogShown: function($dialog, handler) {\n      $dialog.one('note.modal.show', handler);\n    },\n\n    onDialogHidden: function($dialog, handler) {\n      $dialog.one('note.modal.hide', handler);\n    },\n\n    showDialog: function($dialog) {\n      $dialog.data('modal').show();\n    },\n\n    hideDialog: function($dialog) {\n      $dialog.data('modal').hide();\n    },\n\n    /**\n     * get popover content area\n     *\n     * @param $popover\n     * @returns {*}\n     */\n    getPopoverContent: function($popover) {\n      return $popover.find('.note-popover-content');\n    },\n\n    /**\n     * get dialog's body area\n     *\n     * @param $dialog\n     * @returns {*}\n     */\n    getDialogBody: function($dialog) {\n      return $dialog.find('.note-modal-body');\n    },\n\n    createLayout: function($note) {\n      const $editor = (editorOptions.airMode ? airEditor([\n        editingArea([\n          codable(),\n          airEditable(),\n        ]),\n      ]) : (editorOptions.toolbarPosition === 'bottom'\n        ? editor([\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          toolbar(),\n          statusbar(),\n        ])\n        : editor([\n          toolbar(),\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          statusbar(),\n        ])\n      )).render();\n\n      $editor.insertAfter($note);\n\n      return {\n        note: $note,\n        editor: $editor,\n        toolbar: $editor.find('.note-toolbar'),\n        editingArea: $editor.find('.note-editing-area'),\n        editable: $editor.find('.note-editable'),\n        codable: $editor.find('.note-codable'),\n        statusbar: $editor.find('.note-statusbar'),\n      };\n    },\n\n    removeLayout: function($note, layoutInfo) {\n      $note.html(layoutInfo.editable.html());\n      layoutInfo.editor.remove();\n      $note.off('summernote'); // remove summernote custom event\n      $note.show();\n    },\n  };\n};\n\n$.summernote = $.extend($.summernote, {\n  ui_template: ui,\n  interface: 'lite',\n});\n"],"names":["$","summernote","lang","extend","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","genericFontFamilies","validFontName","fontName","inArray","toLowerCase","isFontInstalled","testFontName","testText","testSize","canvas","document","createElement","context","getContext","originalWidth","measureText","width","userAgent","navigator","isMSIE","test","browserVersion","matches","exec","parseFloat","isEdge","isSupportTouch","window","MaxTouchPoints","msMaxTouchPoints","inputEventName","isMac","appVersion","indexOf","isFF","isPhantom","isWebkit","isChrome","isSafari","isW3CRangeSupport","createRange","eq","itemA","itemB","eq2","peq2","propName","ok","fail","not","f","apply","arguments","and","fA","fB","item","self","a","invoke","obj","method","idCounter","resetUniqueId","uniqueId","prefix","id","rect2bnd","rect","$document","top","scrollTop","scrollLeft","bottom","invertObject","inverted","key","Object","prototype","hasOwnProperty","call","namespaceToCamel","namespace","split","map","substring","toUpperCase","join","debounce","func","wait","immediate","timeout","args","later","callNow","clearTimeout","setTimeout","isValidUrl","expression","head","array","last","length","initial","slice","tail","find","pred","idx","len","all","contains","sum","fn","reduce","memo","v","from","collection","result","isEmpty","clusterBy","aTail","aLast","compact","aResult","push","unique","results","next","prev","env","NBSP_CHAR","String","fromCharCode","ZERO_WIDTH_NBSP_CHAR","isEditable","node","hasClass","isControlSizing","makePredByNodeName","nodeName","isText","nodeType","isElement","isVoid","isPara","isHeading","isPre","isLi","isPurePara","isTable","isData","isInline","isBodyContainer","isList","isHr","isBlockquote","isCell","isAnchor","isParaInline","ancestor","isBodyInline","isBody","isClosestSibling","nodeA","nodeB","nextSibling","previousSibling","withClosestSiblings","siblings","blankHTML","nodeLength","nodeValue","childNodes","deepestChildIsEmpty","firstElementChild","innerHTML","paddingBlankHTML","parentNode","singleChildAncestor","listAncestor","ancestors","el","lastAncestor","filter","commonAncestor","n","listPrev","nodes","listNext","listDescendant","descendants","fnWalk","current","wrap","wrapperName","parent","wrapper","insertBefore","appendChild","insertAfter","preceding","appendChildNodes","aChild","each","child","isLeftEdgePoint","point","offset","isRightEdgePoint","isEdgePoint","isLeftEdgeOf","position","isRightEdgeOf","isLeftEdgePointOf","isRightEdgePointOf","hasChildren","prevPoint","isSkipInnerOffset","nextPoint","nextTextNode","getNextTextNode","nextPointWithEmptyNode","actual","undefined","isSamePoint","pointA","pointB","isVisiblePoint","leftNode","rightNode","prevPointUntil","nextPointUntil","isCharPoint","ch","charAt","isSpacePoint","walkPoint","startPoint","endPoint","handler","isSkipOffset","makeOffsetPath","reverse","fromOffsetPath","offsets","i","splitNode","isSkipPaddingBlankHTML","isNotSplitEdgePoint","isDiscardEmptySplits","splitText","childNode","clone","cloneNode","splitTree","root","splitPoint","topAncestor","splitRoot","container","pivot","create","createText","text","createTextNode","isRemoveChild","removeNode","removeChild","removeWhile","replace","newNode","cssText","isTextarea","value","$node","stripLinebreaks","val","html","isNewlineOnBlock","markup","regexTag","match","endSlash","isEndOfInlineContainer","isBlockNode","trim","posFromPlaceholder","placeholder","$placeholder","pos","outerHeight","attachEvents","events","keys","forEach","on","detachEvents","off","isCustomStyleTag","classList","blank","emptyPara","isBlock","isDiv","isBR","isSpan","isB","isU","isS","isI","isImg","isEmptyAnchor","dom","Context","$note","memos","modules","layoutInfo","ui","ui_template","initialize","createLayout","_initialize","hide","_destroy","removeData","removeLayout","disabled","isDisabled","code","disable","now","editor","buttons","plugins","module","initializeModule","removeModule","removeMemo","triggerEvent","isActivated","codable","editable","attr","editing","callback","callbacks","trigger","shouldInitialize","ModuleClass","withoutIntialize","destroy","event","createInvokeHandler","preventDefault","$target","target","closest","data","splits","hasSeparator","moduleName","methodName","type","isExternalAPICalled","hasInitOptions","langInfo","icons","tooltip","note","first","focus","textRangeToPoint","textRange","isStart","parentElement","tester","body","createTextRange","prevContainer","moveToElementText","compareEndPoints","textRangeStart","curTextNode","collapse","firstChild","pointTester","duplicate","setEndPoint","textCount","dummy","cont","pointToTextRange","textRangeInfo","isCollapseToStart","prevTextNodes","collapseToStart","info","moveStart","WrappedRange","sc","so","ec","eo","isOnEditable","makeIsOn","isOnList","isOnAnchor","isOnCell","isOnData","w3cRange","setStart","setEnd","nativeRng","nativeRange","selection","getSelection","rangeCount","removeAllRanges","addRange","offsetTop","Math","abs","getVisiblePoint","isLeftToRight","block","hasRightNode","hasLeftNode","getEndPoint","isCollapsed","getStartPoint","includeAncestor","fullyContains","leftEdgeNodes","startAncestor","endAncestor","boundaryPoints","getPoints","isSameContainer","rng","emptyParents","normalize","inlineSiblings","concat","para","wrapBodyInlineWithPara","deleteContents","contentsContainer","reversed","insertNode","toString","findAfter","isNotTextPoint","regex","index","s","path","e","paras","getClientRects","wrappedRange","createFromSelection","bodyElement","lastChild","createFromBodyElement","createFromNode","anchorNode","getRangeAt","startContainer","startOffset","endContainer","endOffset","textRangeEnd","isTextNode","createFromNodeBefore","createFromNodeAfter","createFromBookmark","bookmark","createFromParaBookmark","KEY_MAP","isEdit","keyCode","BACKSPACE","TAB","ENTER","SPACE","DELETE","isMove","LEFT","UP","RIGHT","DOWN","isNavigation","HOME","END","PAGEUP","PAGEDOWN","nameFromCode","readFileAsDataURL","file","Deferred","deferred","FileReader","onload","dataURL","resolve","onerror","err","reject","readAsDataURL","promise","createImage","$img","one","detach","css","display","appendTo","range","History","stack","stackOffset","$editable","emptyBookmark","contents","snapshot","recordUndo","applySnapshot","makeSnapshot","historyLimit","shift","Style","$obj","propertyNames","propertyName","properties","styleInfo","jQueryCSS","fontSize","parseInt","expandClosestSibling","onlyPartialContains","nodesInRange","tails","elem","$cont","fromNode","queryCommandState","queryCommandValue","orderedTypes","isUnordered","lineHeight","toFixed","anchor","Bullet","toggleList","clustereds","previousList","findList","wrapList","appendToPrevious","releaseList","listName","paraBookmark","wrappedParas","diffLists","listNode","prevList","nextList","isEscapseToBody","releasedParas","headList","parentItem","newList","findNextSiblings","children","lastList","middleList","rootLists","rootList","listNodes","Typing","bullet","tabsize","tab","Array","nextPara","blockquoteBreakingLevel","emptyAnchors","scrollIntoView","TableResultAction","where","domTable","_startPoint","_virtualTable","_actionCellList","setStartPoint","tagName","colPos","cellIndex","rowPos","rowIndex","setVirtualTablePosition","baseRow","baseCell","isRowSpan","isColSpan","isVirtualCell","objPosition","getActionCell","virtualTableCellObj","resultAction","virtualRowPosition","virtualColPosition","recoverCellIndex","newCellIndex","addCellInfoToVirtual","row","cell","cellHasColspan","colSpan","cellHasRowspan","rowSpan","isThisSelectedCell","rowspanNumber","attributes","rp","rowspanIndex","adjustStartPoint","colspanNumber","cp","cellspanIndex","isSelectedCell","createVirtualTable","rows","cells","getDeleteResultActionToCell","Column","SubtractSpanCount","Row","isVirtual","AddCell","RemoveCell","getAddResultActionToCell","SumSpanCount","Ignore","init","getActionList","fixedRow","fixedCol","actualPosition","canContinue","rowPosition","colPosition","requestAction","Add","Delete","Table","isShift","nextCell","currentTr","trAttributes","recoverAttributes","vTable","actions","idCell","currentCell","tdAttributes","append","baseCellTr","isTopFromRowSpan","newTd","removeAttr","setAttribute","before","lastTrIndex","after","rowsGroup","actionIndex","resultStr","attrList","specified","cellPos","virtualPosition","virtualTable","hasRowspan","nextRow","cloneRow","removeAttribute","hasColspan","colCount","rowCount","tds","tdHTML","idxCol","trs","trHTML","idxRow","$table","tableClassName","addClass","KEY_BOGUS","Editor","$editor","lastRange","typing","escape","untab","insertParagraph","insertOrderedList","insertUnorderedList","formatPara","insertHorizontalRule","commands","sCmd","beforeCommand","execCommand","afterCommand","wrapCommand","fontStyling","unit","currentStyle","fontSizeUnit","formatBlock","isLimited","getLastRange","setLastRange","insertText","textNode","pasteHTML","onApplyCustomStyle","onFormatBlock","hrNode","stylePara","createLink","linkInfo","linkUrl","linkText","isNewWindow","checkProtocol","additionalTextLength","isTextChanged","onCreateLink","defaultProtocol","anchors","styleNodes","createRangeFromList","colorInfo","foreColor","backColor","insertTable","dim","dimension","createTable","removeMedia","restoreTarget","floatMe","toggleClass","resize","hasKeyShortCut","isDefaultPrevented","handleKeyMap","preventDefaultEditableShortCuts","recordEveryKeystroke","spellCheck","disableGrammar","airMode","overrideContextMenu","outerWidth","maxHeight","minHeight","keyMap","metaKey","ctrlKey","altKey","shiftKey","keyName","eventName","tabDisable","pad","maxTextLength","lst","startRange","endRange","thenCollapse","commit","styleWithCSS","isPreventTrigger","normalizeContent","tabSize","insertTab","src","param","then","$image","min","show","files","filename","maximumImageFileSize","insertImage","onImageUpload","insertImagesAsDataURL","currentRange","$parent","removeClass","className","spans","firstSpan","noteStatusOutput","expand","$anchor","addRow","addCol","deleteRow","deleteCol","deleteTable","bKeepRatio","imageSize","newRatio","y","x","ratio","is","hasFocus","Clipboard","pasteByEvent","bind","clipboardData","originalEvent","items","kind","getAsFile","getData","Dropzone","$eventListener","documentEventHandlers","$dropzone","prependTo","disableDragAndDrop","onDrop","attachDragAndDropEvent","$dropzoneMessage","onDragenter","isCodeview","hasEditorSize","add","onDragleave","dataTransfer","types","content","substr","CodeView","$codable","CodeMirrorConstructor","CodeMirror","codemirror","getDoc","setValue","save","ESCAPE","deactivate","activate","codeviewFilter","codeviewFilterRegex","codeviewIframeFilter","whitelist","codeviewIframeWhitelistSrc","codeviewIframeWhitelistSrcBase","tag","RegExp","prettifyHtml","cmEditor","fromTextArea","tern","server","TernServer","ternServer","cm","updateArgHints","getValue","setSize","toTextArea","purify","isChange","EDITABLE_PADDING","Statusbar","$statusbar","statusbar","disableResizeEditor","stopPropagation","editableTop","editableCodeTop","onMouseMove","clientY","heightCode","minheight","max","Fullscreen","$toolbar","toolbar","$window","$scrollbar","scrollbarClassName","onResize","resizeTo","h","setsize","isFullscreen","Handle","$editingArea","editingArea","we","update","$handle","disableResizeImage","posStart","clientX","isImage","$selection","w","origImageObj","Image","sizingText","defaultScheme","linkPattern","AutoLink","handleKeyup","handleKeydown","lastWordRange","keyword","urlText","showDomainOnlyForAutolink","linkTargetBlank","wordRange","getWordRange","AutoSync","AutoReplace","PERIOD","COMMA","SEMICOLON","SLASH","previousKeydownCode","lastWord","jQuery","Node","Placeholder","inheritPlaceholder","isShow","toggle","Buttons","invertedKeyMap","editorMethod","o","button","addToolbarButtons","addImagePopoverButtons","addLinkPopoverButtons","addTablePopoverButtons","fontInstalledMap","fontNamesIgnoreCheck","buttonGroup","icon","click","$button","currentTarget","$recentColor","colorButton","dropdownButtonContents","dropdown","$dropdown","$holder","palette","colors","colorsName","render","customColors","change","$chip","$picker","$palette","prepend","$color","$currentButton","magic","styleTags","title","template","styleIdx","styleLen","representShortcut","createInvokeHandlerAndUpdateState","eraser","addDefaultFonts","fontname","isFontDeservedToAdd","fontNames","dropdownCheck","checkClassName","menuCheck","fontSizes","fontSizeUnits","colorPalette","unorderedlist","orderedlist","justifyLeft","alignLeft","justifyCenter","alignCenter","justifyRight","alignRight","justifyFull","alignJustify","textHeight","lineHeights","$catcher","insertTableMaxSize","col","mouseup","tableMoveHandler","picture","minus","arrowsAlt","question","rollback","trash","rowAbove","rowBelow","colBefore","colAfter","rowRemove","colRemove","$container","groups","groupIdx","groupLen","group","groupName","isArray","$group","btn","updateBtnStates","$item","isChecked","infos","selector","toggleBtnActive","PX_PER_EM","$dimensionDisplay","$highlighted","$unhighlighted","posOffset","offsetX","posCatcher","pageX","pageY","offsetY","c","ceil","r","Toolbar","isFollowing","followScroll","toolbarContainer","changeContainer","followingToolbar","editorHeight","editorWidth","toolbarHeight","statusbarHeight","otherBarHeight","otherStaticBar","currentOffset","editorOffsetTop","editorOffsetBottom","activateOffset","deactivateOffsetBottom","marginTop","zIndex","isIncludeCodeview","$btn","toggleBtn","LinkDialog","$body","dialogsInBody","disableLinkTarget","checkbox","checked","buttonClass","footer","$dialog","dialog","fade","dialogsFade","hideDialog","$input","$linkBtn","$linkText","$linkUrl","$openInNewWindow","$useProtocol","onDialogShown","toggleLinkBtn","bindEnterKey","isNewWindowChecked","prop","useProtocolChecked","onDialogHidden","state","showDialog","showLinkDialog","LinkPopover","relatedTarget","$popover","popover","$content","href","containerOffset","ImageDialog","imageLimitation","floor","log","readableSize","pow","acceptImageFileTypes","showImageDialog","onImageLinkInsert","$imageInput","$imageUrl","$imageBtn","replaceWith","ImagePopover","popatmouse","TablePopover","VideoDialog","ytRegExp","ytRegExpForStart","ytMatch","gdRegExp","gdMatch","igRegExp","igMatch","vRegExp","vMatch","vimRegExp","vimMatch","dmRegExp","dmMatch","youkuRegExp","youkuMatch","peerTubeRegExp","peerTubeMatch","qqRegExp","qqMatch","qqRegExp2","qqMatch2","mp4RegExp","mp4Match","oggRegExp","oggMatch","webmRegExp","webmMatch","fbRegExp","fbMatch","$video","youtubeId","start","ytMatchForStart","begin","end","loop","autoplay","muted","vid","encodeURIComponent","showVideoDialog","createVideoNode","$videoUrl","$videoBtn","HelpDialog","createShortcutList","command","$row","showHelpDialog","AIRMODE_POPOVER_X_OFFSET","AIRMODE_POPOVER_Y_OFFSET","AirPopover","hidable","onContextmenu","air","forcelyOpen","POPOVER_DIST","HintPopover","hint","direction","hintDirection","hints","matchingWord","hideArrow","innerHeight","$current","$next","selectItem","$nextGroup","$prev","$prevGroup","nodeFromItem","rangeCompute","hintSelect","hintIdx","moveUp","moveDown","search","searchKeyword","createItemTemplates","hintMode","getWordsRange","getWordsMatchRange","empty","bnd","createGroup","Codeview","version","toolbarPosition","codeviewKeepButton","tabDisabled","textareaAutoSync","onBeforeCommand","onBlur","onBlurCodeview","onChange","onChangeCodeview","onEnter","onFocus","onImageUploadError","onInit","onKeydown","onKeyup","onMousedown","onMouseup","onPaste","onScroll","mode","htmlMode","lineNumbers","pc","mac","Renderer","k","TooltipUI","placement","$tooltip","showCallback","hideCallback","toggleCallback","targetOffset","nodeWidth","nodeHeight","tooltipWidth","tooltipHeight","DropdownUI","setEvent","stopImmediatePropagation","windowWidth","targetMarginRight","isOpened","ModalUI","$modal","$backdrop","which","renderer","airEditor","airEditable","$temp","$a","itemClick","caret","dropdownButton","opt","dropdownCheckButton","paragraphDropdownButton","tableDropdownButton","mousemove","rowSize","colSize","colorName","colorDropdownButton","currentClick","foreinput","getElementById","backinput","videoDialog","imageDialog","linkDialog","iconClassName","editorOptions","isEnable","isActive","check","$dom","getPopoverContent","getDialogBody"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.css b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.css
new file mode 100644
index 0000000..3818db2
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.css
@@ -0,0 +1 @@
+@font-face{font-display:auto;font-family:summernote;font-style:normal;font-weight:400;src:url(font/summernote.eot?#iefix) format("embedded-opentype"),url(font/summernote.woff2) format("woff2"),url(font/summernote.woff) format("woff"),url(font/summernote.ttf) format("truetype")}[class*=" note-icon"]:before,[class^=note-icon]:before{text-rendering:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;speak:none;display:inline-block;font-family:summernote;font-size:inherit;font-style:normal;text-decoration:inherit;text-transform:none;vertical-align:middle}.note-icon-fw{text-align:center;width:1.25em}.note-icon-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.note-icon-pull-left{float:left}.note-icon-pull-right{float:right}.note-icon.note-icon-pull-left{margin-right:.3em}.note-icon.note-icon-pull-right{margin-left:.3em}.note-icon-align:before{content:"\ea01"}.note-icon-align-center:before{content:"\ea02"}.note-icon-align-indent:before{content:"\ea03"}.note-icon-align-justify:before{content:"\ea04"}.note-icon-align-left:before{content:"\ea05"}.note-icon-align-outdent:before{content:"\ea06"}.note-icon-align-right:before{content:"\ea07"}.note-icon-arrow-circle-down:before{content:"\ea08"}.note-icon-arrow-circle-left:before{content:"\ea09"}.note-icon-arrow-circle-right:before{content:"\ea0a"}.note-icon-arrow-circle-up:before{content:"\ea0b"}.note-icon-arrows-alt:before{content:"\ea0c"}.note-icon-arrows-h:before{content:"\ea0d"}.note-icon-arrows-v:before{content:"\ea0e"}.note-icon-bold:before{content:"\ea0f"}.note-icon-caret:before{content:"\ea10"}.note-icon-chain-broken:before{content:"\ea11"}.note-icon-circle:before{content:"\ea12"}.note-icon-close:before{content:"\ea13"}.note-icon-code:before{content:"\ea14"}.note-icon-col-after:before{content:"\ea15"}.note-icon-col-before:before{content:"\ea16"}.note-icon-col-remove:before{content:"\ea17"}.note-icon-eraser:before{content:"\ea18"}.note-icon-float-left:before{content:"\ea19"}.note-icon-float-none:before{content:"\ea1a"}.note-icon-float-right:before{content:"\ea1b"}.note-icon-font:before{content:"\ea1c"}.note-icon-frame:before{content:"\ea1d"}.note-icon-italic:before{content:"\ea1e"}.note-icon-link:before{content:"\ea1f"}.note-icon-magic:before{content:"\ea20"}.note-icon-menu-check:before{content:"\ea21"}.note-icon-minus:before{content:"\ea22"}.note-icon-orderedlist:before{content:"\ea23"}.note-icon-pencil:before{content:"\ea24"}.note-icon-picture:before{content:"\ea25"}.note-icon-question:before{content:"\ea26"}.note-icon-redo:before{content:"\ea27"}.note-icon-rollback:before{content:"\ea28"}.note-icon-row-above:before{content:"\ea29"}.note-icon-row-below:before{content:"\ea2a"}.note-icon-row-remove:before{content:"\ea2b"}.note-icon-special-character:before{content:"\ea2c"}.note-icon-square:before{content:"\ea2d"}.note-icon-strikethrough:before{content:"\ea2e"}.note-icon-subscript:before{content:"\ea2f"}.note-icon-summernote:before{content:"\ea30"}.note-icon-superscript:before{content:"\ea31"}.note-icon-table:before{content:"\ea32"}.note-icon-text-height:before{content:"\ea33"}.note-icon-trash:before{content:"\ea34"}.note-icon-underline:before{content:"\ea35"}.note-icon-undo:before{content:"\ea36"}.note-icon-unorderedlist:before{content:"\ea37"}.note-icon-video:before{content:"\ea38"}.note-frame{border-radius:4px;-ms-box-sizing:border-box;box-sizing:border-box;color:#000;font-family:sans-serif}.note-toolbar{background-color:#f5f5f5;border-bottom:1px solid;border-color:#ddd;border-top-left-radius:3px;border-top-right-radius:3px;color:#333;padding:10px 5px}.note-btn-group{display:inline-block;margin-right:8px;position:relative}.note-btn-group>.note-btn-group{margin-right:0}.note-btn-group>.note-btn:first-child{margin-left:0}.note-btn-group .note-btn+.note-btn,.note-btn-group .note-btn+.note-btn-group,.note-btn-group .note-btn-group+.note-btn,.note-btn-group .note-btn-group+.note-btn-group{margin-left:-1px}.note-btn-group>.note-btn-group:not(:first-child)>.note-btn,.note-btn-group>.note-btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.note-btn-group>.note-btn-group:not(:last-child)>.note-btn,.note-btn-group>.note-btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.note-btn-group.open>.note-dropdown{display:block}.note-btn{background-color:#fff;background-image:none;border:1px solid #dae0e5;border-radius:3px;color:#333;cursor:pointer;display:inline-block;font-size:14px;font-weight:400;line-height:1.4;margin-bottom:0;outline:0;padding:5px 10px;text-align:center;touch-action:manipulation;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.note-btn.focus,.note-btn:focus,.note-btn:hover{background-color:#ebebeb;border-color:#dae0e5;color:#333}.note-btn.disabled.focus,.note-btn.disabled:focus,.note-btn[disabled].focus,.note-btn[disabled]:focus,fieldset[disabled] .note-btn.focus,fieldset[disabled] .note-btn:focus{background-color:#fff;border-color:#dae0e5}.note-btn.active,.note-btn.focus,.note-btn:active,.note-btn:focus,.note-btn:hover{background-color:#ebebeb;border:1px solid #dae0e5;border-radius:1px;color:#333;outline:0;text-decoration:none}.note-btn.active,.note-btn:active{background-image:none;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.note-btn.disabled,.note-btn[disabled],fieldset[disabled] .note-btn{box-shadow:none;cursor:not-allowed;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=65);filter:alpha(opacity=65);-webkit-opacity:.65;-khtml-opacity:.65;-moz-opacity:.65;opacity:.65}.note-btn>span.note-icon-caret:first-child{margin-left:-1px}.note-btn>span.note-icon-caret:nth-child(2){margin-right:-5px;padding-left:3px}.note-btn-primary{background:#fa6362;color:#fff}.note-btn-primary.focus,.note-btn-primary:focus,.note-btn-primary:hover{background-color:#fa6362;border:1px solid #dae0e5;border-radius:1px;color:#fff;text-decoration:none}.note-btn-block{display:block;width:100%}.note-btn-block+.note-btn-block{margin-top:5px}input[type=button].note-btn-block,input[type=reset].note-btn-block,input[type=submit].note-btn-block{width:100%}button.close{-webkit-appearance:none;background:transparent;border:0;cursor:pointer;padding:0}.close{color:#000;float:right;font-size:21px;line-height:1;opacity:.2}.close:hover{-ms-filter:alpha(opacity=100);filter:alpha(opacity=100);-webkit-opacity:1;-khtml-opacity:1;-moz-opacity:1;opacity:1}.note-dropdown{position:relative}.note-color .dropdown-toggle{padding-left:5px;width:30px}.note-dropdown-menu{background:#fff;background-clip:padding-box;border:1px solid #e2e2e2;box-shadow:0 1px 1px rgba(0,0,0,.06);display:none;float:left;left:0;min-width:100px;padding:5px;position:absolute;text-align:left;top:100%;z-index:1000}.note-dropdown-menu>:last-child{margin-right:0}.note-btn-group.open .note-dropdown-menu,.note-dropdown-item{display:block}.note-dropdown-item:hover{background-color:#ebebeb}a.note-dropdown-item,a.note-dropdown-item:hover{color:#000;margin:5px 0;text-decoration:none}.note-modal{bottom:0;display:none;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=100);filter:alpha(opacity=100);left:0;-webkit-opacity:1;-khtml-opacity:1;-moz-opacity:1;opacity:1;position:fixed;right:0;top:0;z-index:1050}.note-modal.open{display:block}.note-modal-content{background:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.2);border-radius:5px;box-shadow:0 3px 9px rgba(0,0,0,.5);margin:30px 20px;outline:0;position:relative;width:auto}.note-modal-header{border:1px solid #ededef;padding:10px 20px}.note-modal-body{padding:20px 30px;position:relative}.note-modal-body kbd{background-color:#000;border-radius:2px;-ms-box-sizing:border-box;box-sizing:border-box;color:#fff;font-weight:700;padding:3px 5px}.note-modal-footer{height:40px;padding:10px;text-align:center}.note-modal-footer a{color:#337ab7;text-decoration:none}.note-modal-footer a:focus,.note-modal-footer a:hover{color:#23527c;text-decoration:underline}.note-modal-footer .note-btn{float:right}.note-modal-title{color:#42515f;font-size:20px;line-height:1.4;margin:0}.note-modal-backdrop{background:#000;bottom:0;display:none;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);filter:alpha(opacity=50);left:0;-webkit-opacity:.5;-khtml-opacity:.5;-moz-opacity:.5;opacity:.5;position:fixed;right:0;top:0;z-index:1040}.note-modal-backdrop.open{display:block}@media (min-width:768px){.note-modal-content{margin:30px auto;width:600px}}@media (min-width:992px){.note-modal-content-large{width:900px}}.note-modal .note-help-block{color:#737373;display:block;margin-bottom:10px;margin-top:5px}.note-modal .note-nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.note-modal .note-nav-link{-webkit-text-decoration-skip:objects;background-color:transparent;color:#007bff;display:block;padding:.5rem 1rem;text-decoration:none}.note-modal .note-nav-link:focus,.note-modal .note-nav-link:hover{color:#0056b3;text-decoration:none}.note-modal .note-nav-link.disabled{color:#868e96}.note-modal .note-nav-tabs{border-bottom:1px solid #ddd}.note-modal .note-nav-tabs .note-nav-item{margin-bottom:-1px}.note-modal .note-nav-tabs .note-nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.note-modal .note-nav-tabs .note-nav-link:focus,.note-modal .note-nav-tabs .note-nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.note-modal .note-nav-tabs .note-nav-link.disabled{background-color:transparent;border-color:transparent;color:#868e96}.note-modal .note-nav-tabs .note-nav-item.show .note-nav-link{background-color:#fff;border-color:#ddd #ddd #fff;color:#495057}.note-modal .note-tab-content{margin:15px auto}.note-modal .note-tab-content>.note-tab-pane,.note-modal .note-tab-content>.note-tab-pane:target~.note-tab-pane:last-child{display:none}.note-modal .note-tab-content>.note-tab-pane:target,.note-modal .note-tab-content>:last-child{display:block}.note-form-group{padding-bottom:20px}.note-form-group:last-child{padding-bottom:0}.note-form-label{color:#42515f;display:block;font-size:16px;font-weight:700;margin-bottom:10px;width:100%}.note-input{background:#fff;border:1px solid #ededef;-ms-box-sizing:border-box;box-sizing:border-box;display:block;font-size:14px;outline:0;padding:6px 4px;width:100%}.note-input::-webkit-input-placeholder{color:#eee}.note-input:-moz-placeholder,.note-input::-moz-placeholder{color:#eee}.note-input:-ms-input-placeholder{color:#eee}.note-tooltip{display:block;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);filter:alpha(opacity=0);font-size:13px;-webkit-opacity:0;-khtml-opacity:0;-moz-opacity:0;opacity:0;position:absolute;transition:opacity .15s;z-index:1070}.note-tooltip.in{-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=90);filter:alpha(opacity=90);-webkit-opacity:.9;-khtml-opacity:.9;-moz-opacity:.9;opacity:.9}.note-tooltip.top{margin-top:-3px;padding:5px 0}.note-tooltip.right{margin-left:3px;padding:0 5px}.note-tooltip.bottom{margin-top:3px;padding:5px 0}.note-tooltip.left{margin-left:-3px;padding:0 5px}.note-tooltip.bottom .note-tooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;left:50%;margin-left:-5px;top:0}.note-tooltip.top .note-tooltip-arrow{border-top-color:#000;border-width:5px 5px 0;bottom:0;left:50%;margin-left:-5px}.note-tooltip.right .note-tooltip-arrow{border-right-color:#000;border-width:5px 5px 5px 0;left:0;margin-top:-5px;top:50%}.note-tooltip.left .note-tooltip-arrow{border-left-color:#000;border-width:5px 0 5px 5px;margin-top:-5px;right:0;top:50%}.note-tooltip-arrow{border-color:transparent;border-style:solid;height:0;position:absolute;width:0}.note-tooltip-content{background-color:#000;color:#fff;font-family:sans-serif;max-width:200px;padding:3px 8px;text-align:center}.note-popover{background:#fff;border:1px solid #ccc;display:block;display:none;font-family:sans-serif;font-size:13px;position:absolute;z-index:1060}.note-popover.in{display:block}.note-popover.top{margin-top:-10px;padding:5px 0}.note-popover.right{margin-left:10px;padding:0 5px}.note-popover.bottom{margin-top:10px;padding:5px 0}.note-popover.left{margin-left:-10px;padding:0 5px}.note-popover.bottom .note-popover-arrow{border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0;left:20px;margin-left:-10px;top:-11px}.note-popover.bottom .note-popover-arrow:after{border-bottom-color:#fff;border-top-width:0;content:"\0020";margin-left:-10px;top:1px}.note-popover.top .note-popover-arrow{border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px;left:20px;margin-left:-10px}.note-popover.top .note-popover-arrow:after{border-bottom-width:0;border-top-color:#fff;bottom:1px;content:"\0020";margin-left:-10px}.note-popover.right .note-popover-arrow{border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25);left:-11px;margin-top:-10px;top:50%}.note-popover.right .note-popover-arrow:after{border-left-width:0;border-right-color:#fff;content:"\0020";left:1px;margin-top:-10px}.note-popover.left .note-popover-arrow{border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0;margin-top:-10px;right:-11px;top:50%}.note-popover.left .note-popover-arrow:after{border-left-color:#fff;border-right-width:0;content:"\0020";margin-top:-10px;right:1px}.note-popover-arrow{border:11px solid transparent;height:0;position:absolute;width:0}.note-popover-arrow:after{border:10px solid transparent;content:"\0020";display:block;height:0;position:absolute;width:0}.note-popover-content{background-color:#fff;color:#000;min-height:30px;min-width:100px;padding:3px 8px;text-align:center}.note-editor{position:relative}.note-editor .note-dropzone{background-color:#fff;color:#87cefa;display:none;opacity:.95;position:absolute;z-index:100}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-airframe,.note-editor.note-frame{border:1px solid #00000032}.note-editor.note-airframe.codeview .note-editing-area .note-editable,.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-airframe.codeview .note-editing-area .note-codable,.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-airframe .note-editing-area,.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-airframe .note-editing-area .note-editable,.note-editor.note-frame .note-editing-area .note-editable{word-wrap:break-word;overflow:auto;padding:10px}.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false],.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false]{background-color:#8080801d}.note-editor.note-airframe .note-editing-area .note-codable,.note-editor.note-frame .note-editing-area .note-codable{background-color:#222;border:none;border-radius:0;box-shadow:none;-ms-box-sizing:border-box;box-sizing:border-box;color:#ccc;display:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;margin-bottom:0;outline:none;padding:10px;resize:none;width:100%}.note-editor.note-airframe.fullscreen,.note-editor.note-frame.fullscreen{left:0;position:fixed;top:0;width:100%!important;z-index:1050}.note-editor.note-airframe.fullscreen .note-resizebar,.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-airframe .note-status-output,.note-editor.note-frame .note-status-output{border:0;border-top:1px solid #e2e2e2;color:#000;display:block;font-size:14px;height:20px;line-height:1.42857143;margin-bottom:0;width:100%}.note-editor.note-airframe .note-status-output:empty,.note-editor.note-frame .note-status-output:empty{border-top:0 solid transparent;height:0}.note-editor.note-airframe .note-status-output .pull-right,.note-editor.note-frame .note-status-output .pull-right{float:right!important}.note-editor.note-airframe .note-status-output .text-muted,.note-editor.note-frame .note-status-output .text-muted{color:#777}.note-editor.note-airframe .note-status-output .text-primary,.note-editor.note-frame .note-status-output .text-primary{color:#286090}.note-editor.note-airframe .note-status-output .text-success,.note-editor.note-frame .note-status-output .text-success{color:#3c763d}.note-editor.note-airframe .note-status-output .text-info,.note-editor.note-frame .note-status-output .text-info{color:#31708f}.note-editor.note-airframe .note-status-output .text-warning,.note-editor.note-frame .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-airframe .note-status-output .text-danger,.note-editor.note-frame .note-status-output .text-danger{color:#a94442}.note-editor.note-airframe .note-status-output .alert,.note-editor.note-frame .note-status-output .alert{background-color:#f5f5f5;border-radius:0;color:#000;margin:-7px 0 0;padding:7px 10px 2px}.note-editor.note-airframe .note-status-output .alert .note-icon,.note-editor.note-frame .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-airframe .note-status-output .alert-success,.note-editor.note-frame .note-status-output .alert-success{background-color:#dff0d8!important;color:#3c763d!important}.note-editor.note-airframe .note-status-output .alert-info,.note-editor.note-frame .note-status-output .alert-info{background-color:#d9edf7!important;color:#31708f!important}.note-editor.note-airframe .note-status-output .alert-warning,.note-editor.note-frame .note-status-output .alert-warning{background-color:#fcf8e3!important;color:#8a6d3b!important}.note-editor.note-airframe .note-status-output .alert-danger,.note-editor.note-frame .note-status-output .alert-danger{background-color:#f2dede!important;color:#a94442!important}.note-editor.note-airframe .note-statusbar,.note-editor.note-frame .note-statusbar{background-color:#8080801d;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #00000032}.note-editor.note-airframe .note-statusbar .note-resizebar,.note-editor.note-frame .note-statusbar .note-resizebar{cursor:ns-resize;height:9px;padding-top:1px;width:100%}.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{border-top:1px solid #00000032;margin:1px auto;width:20px}.note-editor.note-airframe .note-statusbar.locked .note-resizebar,.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-airframe .note-placeholder,.note-editor.note-frame .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.note-popover.popover .arrow{left:20px!important}.note-toolbar{position:relative}.note-editor .note-toolbar,.note-popover .popover-content{margin:0;padding:0 0 5px 5px}.note-editor .note-toolbar>.note-btn-group,.note-popover .popover-content>.note-btn-group{margin-left:0;margin-right:5px;margin-top:5px}.note-editor .note-toolbar .note-btn-group .note-table,.note-popover .popover-content .note-btn-group .note-table{min-width:0;padding:5px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{cursor:pointer;height:10em;position:absolute!important;width:10em;z-index:3}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:5em;position:relative!important;width:5em;z-index:1}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:1em;position:absolute!important;width:1em;z-index:2}.note-editor .note-toolbar .note-style .dropdown-style blockquote,.note-editor .note-toolbar .note-style .dropdown-style pre,.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre{margin:0;padding:5px 10px}.note-editor .note-toolbar .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h4,.note-editor .note-toolbar .note-style .dropdown-style h5,.note-editor .note-toolbar .note-style .dropdown-style h6,.note-editor .note-toolbar .note-style .dropdown-style p,.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p{margin:0;padding:0}.note-editor .note-toolbar .note-color-all .note-dropdown-menu,.note-popover .popover-content .note-color-all .note-dropdown-menu{min-width:337px}.note-editor .note-toolbar .note-color .dropdown-toggle,.note-popover .popover-content .note-color .dropdown-toggle{padding-left:5px;width:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:160px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child{margin:0 5px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title{border-bottom:1px solid #eee;font-size:12px;margin:2px 7px;text-align:center}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select{border-radius:5px;cursor:pointer;font-size:11px;margin:3px;padding:0 3px;width:100%}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover{background:#eee}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row{height:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-editor .note-toolbar .note-para .note-dropdown-menu,.note-popover .popover-content .note-para .note-dropdown-menu{min-width:228px;padding:5px}.note-editor .note-toolbar .note-para .note-dropdown-menu>div+div,.note-popover .popover-content .note-para .note-dropdown-menu>div+div{margin-left:5px}.note-editor .note-toolbar .note-dropdown-menu,.note-popover .popover-content .note-dropdown-menu{min-width:160px}.note-editor .note-toolbar .note-dropdown-menu.right,.note-popover .popover-content .note-dropdown-menu.right{left:auto;right:0}.note-editor .note-toolbar .note-dropdown-menu.right:before,.note-popover .popover-content .note-dropdown-menu.right:before{left:auto!important;right:9px}.note-editor .note-toolbar .note-dropdown-menu.right:after,.note-popover .popover-content .note-dropdown-menu.right:after{left:auto!important;right:10px}.note-editor .note-toolbar .note-dropdown-menu.note-check a i,.note-popover .popover-content .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i,.note-popover .popover-content .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-editor .note-toolbar .note-fontsize-10,.note-popover .popover-content .note-fontsize-10{font-size:10px}.note-editor .note-toolbar .note-color-palette,.note-popover .popover-content .note-color-palette{line-height:1}.note-editor .note-toolbar .note-color-palette div .note-color-btn,.note-popover .popover-content .note-color-palette div .note-color-btn{border:0;border-radius:0;height:20px;margin:0;padding:0;width:20px}.note-editor .note-toolbar .note-color-palette div .note-color-btn:hover,.note-popover .popover-content .note-color-palette div .note-color-btn:hover{transform:scale(1.2);transition:all .2s}.note-modal .modal-dialog{border-radius:5px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{border:4px dashed #d3d3d3;color:#d3d3d3;font-size:30px;line-height:4;margin-bottom:10px;min-height:100px;text-align:center}.note-placeholder{color:gray;display:none;position:absolute}.note-handle .note-control-selection{border:1px solid #000;display:none;position:absolute}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{background-color:#000;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30);height:100%;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;width:100%}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-holder,.note-handle .note-control-selection .note-control-sizing{border:1px solid #000;height:7px;width:7px}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{border-bottom:none;border-right:none;left:-5px;top:-5px}.note-handle .note-control-selection .note-control-ne{border-bottom:none;border-left:none;right:-5px;top:-5px}.note-handle .note-control-selection .note-control-sw{border-right:none;border-top:none;bottom:-5px;left:-5px}.note-handle .note-control-selection .note-control-se{bottom:-5px;cursor:se-resize;right:-5px}.note-handle .note-control-selection .note-control-se.note-control-holder{border-left:none;border-top:none;cursor:default}.note-handle .note-control-selection .note-control-selection-info{background-color:#000;border-radius:5px;bottom:0;color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70);font-size:12px;margin:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;padding:5px;right:0}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;overflow:auto;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{background-color:#428bca;clear:both;color:#fff;cursor:pointer;display:block;font-weight:400;line-height:1.4;outline:0;text-decoration:none;white-space:nowrap}body .note-fullscreen-body,html .note-fullscreen-body{overflow:hidden!important}.note-editor .note-editing-area .note-editable table{border-collapse:collapse;width:100%}.note-editor .note-editing-area .note-editable table td,.note-editor .note-editing-area .note-editable table th{border:1px solid #ececec;padding:5px 3px}.note-editor .note-editing-area .note-editable a{background-color:inherit;color:#337ab7;font-family:inherit;font-weight:inherit;text-decoration:inherit}.note-editor .note-editing-area .note-editable a:focus,.note-editor .note-editing-area .note-editable a:hover{color:#23527c;outline:0;text-decoration:underline}.note-editor .note-editing-area .note-editable figure{margin:0}.note-modal .note-modal-body label{display:inline-block;margin-bottom:2px;padding:2px 5px}.note-modal .note-modal-body .help-list-item:hover{background-color:#e0e0e0}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.help-list-item label{display:inline-block;margin-bottom:5px}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js
new file mode 100644
index 0000000..9832f8d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("jQuery"));else if("function"==typeof define&&define.amd)define(["jQuery"],e);else{var o="object"==typeof exports?e(require("jQuery")):e(t.jQuery);for(var n in o)("object"==typeof exports?exports:t)[n]=o[n]}}(self,(function(t){return(()=>{"use strict";var e={9770:(t,e,o)=>{var n=o(1145),i=o.n(n);i().summernote=i().summernote||{lang:{}},i().extend(i().summernote.lang,{"en-US":{font:{bold:"Bold",italic:"Italic",underline:"Underline",clear:"Remove Font Style",height:"Line Height",name:"Font Family",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript",size:"Font Size",sizeunit:"Font Size Unit"},image:{image:"Picture",insert:"Insert Image",resizeFull:"Resize full",resizeHalf:"Resize half",resizeQuarter:"Resize quarter",resizeNone:"Original size",floatLeft:"Float Left",floatRight:"Float Right",floatNone:"Remove float",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Drag image or text here",dropImage:"Drop image or Text",selectFromFiles:"Select from files",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Image URL",remove:"Remove Image",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Insert Video",url:"Video URL",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)"},link:{link:"Link",insert:"Insert Link",unlink:"Unlink",edit:"Edit",textToDisplay:"Text to display",url:"To what URL should this link go?",openInNewWindow:"Open in new window",useProtocol:"Use default protocol"},table:{table:"Table",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Insert Horizontal Rule"},style:{style:"Style",p:"Normal",blockquote:"Quote",pre:"Code",h1:"Header 1",h2:"Header 2",h3:"Header 3",h4:"Header 4",h5:"Header 5",h6:"Header 6"},lists:{unordered:"Unordered list",ordered:"Ordered list"},options:{help:"Help",fullscreen:"Full Screen",codeview:"Code View"},paragraph:{paragraph:"Paragraph",outdent:"Outdent",indent:"Indent",left:"Align left",center:"Align center",right:"Align right",justify:"Justify full"},color:{recent:"Recent Color",more:"More Color",background:"Background Color",foreground:"Text Color",transparent:"Transparent",setTransparent:"Set transparent",reset:"Reset",resetToDefault:"Reset to default",cpSelect:"Select"},shortcut:{shortcuts:"Keyboard shortcuts",close:"Close",textFormatting:"Text formatting",action:"Action",paragraphFormatting:"Paragraph formatting",documentStyle:"Document Style",extraKeys:"Extra keys"},help:{escape:"Escape",insertParagraph:"Insert Paragraph",undo:"Undo the last command",redo:"Redo the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Undo",redo:"Redo"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"},output:{noSelection:"No Selection Made!"}}})},1145:e=>{e.exports=t}},o={};function n(t){var i=o[t];if(void 0!==i)return i.exports;var r=o[t]={exports:{}};return e[t](r,r.exports,n),r.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};return(()=>{n.r(i);var t=n(1145),e=n.n(t),o=(n(9770),["sans-serif","serif","monospace","cursive","fantasy"]);function r(t){return-1===e().inArray(t.toLowerCase(),o)?"'".concat(t,"'"):t}var a,s=navigator.userAgent,l=/MSIE|Trident/i.test(s);if(l){var c=/MSIE (\d+[.]\d+)/.exec(s);c&&(a=parseFloat(c[1])),(c=/Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(s))&&(a=parseFloat(c[1]))}var u=/Edge\/\d+/.test(s),d="ontouchstart"in window||navigator.MaxTouchPoints>0||navigator.msMaxTouchPoints>0,h=l?"DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted":"input";const f={isMac:navigator.appVersion.indexOf("Mac")>-1,isMSIE:l,isEdge:u,isFF:!u&&/firefox/i.test(s),isPhantom:/PhantomJS/i.test(s),isWebkit:!u&&/webkit/i.test(s),isChrome:!u&&/chrome/i.test(s),isSafari:!u&&/safari/i.test(s)&&!/chrome/i.test(s),browserVersion:a,isSupportTouch:d,isFontInstalled:function(t){var e="Comic Sans MS"===t?"Courier New":"Comic Sans MS",o="mmmmmmmmmmwwwww",n=document.createElement("canvas").getContext("2d");n.font="200px '"+e+"'";var i=n.measureText(o).width;return n.font="200px "+r(t)+', "'+e+'"',i!==n.measureText(o).width},isW3CRangeSupport:!!document.createRange,inputEventName:h,genericFontFamilies:o,validFontName:r};var p=0;const v={eq:function(t){return function(e){return t===e}},eq2:function(t,e){return t===e},peq2:function(t){return function(e,o){return e[t]===o[t]}},ok:function(){return!0},fail:function(){return!1},self:function(t){return t},not:function(t){return function(){return!t.apply(t,arguments)}},and:function(t,e){return function(o){return t(o)&&e(o)}},invoke:function(t,e){return function(){return t[e].apply(t,arguments)}},resetUniqueId:function(){p=0},uniqueId:function(t){var e=++p+"";return t?t+e:e},rect2bnd:function(t){var o=e()(document);return{top:t.top+o.scrollTop(),left:t.left+o.scrollLeft(),width:t.right-t.left,height:t.bottom-t.top}},invertObject:function(t){var e={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[t[o]]=o);return e},namespaceToCamel:function(t,e){return(e=e||"")+t.split(".").map((function(t){return t.substring(0,1).toUpperCase()+t.substring(1)})).join("")},debounce:function(t,e,o){var n;return function(){var i=this,r=arguments,a=function(){n=null,o||t.apply(i,r)},s=o&&!n;clearTimeout(n),n=setTimeout(a,e),s&&t.apply(i,r)}},isValidUrl:function(t){return/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi.test(t)}};function m(t){return t[0]}function g(t){return t[t.length-1]}function b(t){return t.slice(1)}function k(t,e){if(t&&t.length&&e){if(t.indexOf)return-1!==t.indexOf(e);if(t.contains)return t.contains(e)}return!1}const y={head:m,last:g,initial:function(t){return t.slice(0,t.length-1)},tail:b,prev:function(t,e){if(t&&t.length&&e){var o=t.indexOf(e);return-1===o?null:t[o-1]}return null},next:function(t,e){if(t&&t.length&&e){var o=t.indexOf(e);return-1===o?null:t[o+1]}return null},find:function(t,e){for(var o=0,n=t.length;o<n;o++){var i=t[o];if(e(i))return i}},contains:k,all:function(t,e){for(var o=0,n=t.length;o<n;o++)if(!e(t[o]))return!1;return!0},sum:function(t,e){return e=e||v.self,t.reduce((function(t,o){return t+e(o)}),0)},from:function(t){for(var e=[],o=t.length,n=-1;++n<o;)e[n]=t[n];return e},isEmpty:function(t){return!t||!t.length},clusterBy:function(t,e){return t.length?b(t).reduce((function(t,o){var n=g(t);return e(g(n),o)?n[n.length]=o:t[t.length]=[o],t}),[[m(t)]]):[]},compact:function(t){for(var e=[],o=0,n=t.length;o<n;o++)t[o]&&e.push(t[o]);return e},unique:function(t){for(var e=[],o=0,n=t.length;o<n;o++)k(e,t[o])||e.push(t[o]);return e}};var w=String.fromCharCode(160);function C(t){return t&&e()(t).hasClass("note-editable")}function x(t){return t=t.toUpperCase(),function(e){return e&&e.nodeName.toUpperCase()===t}}function S(t){return t&&3===t.nodeType}function T(t){return t&&/^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(t.nodeName.toUpperCase())}function E(t){return!C(t)&&(t&&/^DIV|^P|^LI|^H[1-7]/.test(t.nodeName.toUpperCase()))}var $=x("PRE"),N=x("LI");var I=x("TABLE"),P=x("DATA");function R(t){return!(H(t)||L(t)||A(t)||E(t)||I(t)||D(t)||P(t))}function L(t){return t&&/^UL|^OL/.test(t.nodeName.toUpperCase())}var A=x("HR");function F(t){return t&&/^TD|^TH/.test(t.nodeName.toUpperCase())}var D=x("BLOCKQUOTE");function H(t){return F(t)||D(t)||C(t)}var B=x("A");var z=x("BODY");var M=f.isMSIE&&f.browserVersion<11?"&nbsp;":"<br>";function O(t){return S(t)?t.nodeValue.length:t?t.childNodes.length:0}function j(t){var e=O(t);return 0===e||(!S(t)&&1===e&&t.innerHTML===M||!(!y.all(t.childNodes,S)||""!==t.innerHTML))}function U(t){T(t)||O(t)||(t.innerHTML=M)}function W(t,e){for(;t;){if(e(t))return t;if(C(t))break;t=t.parentNode}return null}function K(t,e){e=e||v.fail;var o=[];return W(t,(function(t){return C(t)||o.push(t),e(t)})),o}function V(t,e){e=e||v.fail;for(var o=[];t&&!e(t);)o.push(t),t=t.nextSibling;return o}function q(t,e){var o=e.nextSibling,n=e.parentNode;return o?n.insertBefore(t,o):n.appendChild(t),t}function _(t,o){return e().each(o,(function(e,o){t.appendChild(o)})),t}function G(t){return 0===t.offset}function Y(t){return t.offset===O(t.node)}function Z(t){return G(t)||Y(t)}function X(t,e){for(;t&&t!==e;){if(0!==J(t))return!1;t=t.parentNode}return!0}function Q(t,e){if(!e)return!1;for(;t&&t!==e;){if(J(t)!==O(t.parentNode)-1)return!1;t=t.parentNode}return!0}function J(t){for(var e=0;t=t.previousSibling;)e+=1;return e}function tt(t){return!!(t&&t.childNodes&&t.childNodes.length)}function et(t,e){var o,n;if(0===t.offset){if(C(t.node))return null;o=t.node.parentNode,n=J(t.node)}else tt(t.node)?n=O(o=t.node.childNodes[t.offset-1]):(o=t.node,n=e?0:t.offset-1);return{node:o,offset:n}}function ot(t,e){var o,n;if(O(t.node)===t.offset){if(C(t.node))return null;var i=it(t.node);i?(o=i,n=0):(o=t.node.parentNode,n=J(t.node)+1)}else tt(t.node)?(o=t.node.childNodes[t.offset],n=0):(o=t.node,n=e?O(t.node):t.offset+1);return{node:o,offset:n}}function nt(t,e){var o,n=0;if(j(t.node))return null===t.node?null:{node:o=t.node.nextSibling,offset:n=0};if(O(t.node)===t.offset){if(C(t.node))return null;o=t.node.parentNode,n=J(t.node)+1,C(o)&&(o=t.node.nextSibling,n=0)}else if(tt(t.node)){if(n=0,j(o=t.node.childNodes[t.offset]))return j(t.node.nextSibling)?null:{node:t.node.nextSibling,offset:n}}else if(o=t.node,n=e?O(t.node):t.offset+1,j(o))return null;return{node:o,offset:n}}function it(t){if(t.nextSibling&&t.parent===t.nextSibling.parent)return S(t.nextSibling)?t.nextSibling:it(t.nextSibling)}function rt(t,e){return t.node===e.node&&t.offset===e.offset}function at(t,e){var o=e&&e.isSkipPaddingBlankHTML,n=e&&e.isNotSplitEdgePoint,i=e&&e.isDiscardEmptySplits;if(i&&(o=!0),Z(t)&&(S(t.node)||n)){if(G(t))return t.node;if(Y(t))return t.node.nextSibling}if(S(t.node))return t.node.splitText(t.offset);var r=t.node.childNodes[t.offset],a=q(t.node.cloneNode(!1),t.node);return _(a,V(r)),o||(U(t.node),U(a)),i&&(j(t.node)&&ct(t.node),j(a))?(ct(a),t.node.nextSibling):a}function st(t,e,o){var n=K(e.node,v.eq(t));return n.length?1===n.length?at(e,o):n.reduce((function(t,n){return t===e.node&&(t=at(e,o)),at({node:n,offset:t?J(t):O(n)},o)})):null}function lt(t){return document.createElement(t)}function ct(t,e){if(t&&t.parentNode){if(t.removeNode)return t.removeNode(e);var o=t.parentNode;if(!e){for(var n=[],i=0,r=t.childNodes.length;i<r;i++)n.push(t.childNodes[i]);for(var a=0,s=n.length;a<s;a++)o.insertBefore(n[a],t)}o.removeChild(t)}}var ut=x("TEXTAREA");function dt(t,e){var o=ut(t[0])?t.val():t.html();return e?o.replace(/[\n\r]/g,""):o}const ht={NBSP_CHAR:w,ZERO_WIDTH_NBSP_CHAR:"\ufeff",blank:M,emptyPara:"<p>".concat(M,"</p>"),makePredByNodeName:x,isEditable:C,isControlSizing:function(t){return t&&e()(t).hasClass("note-control-sizing")},isText:S,isElement:function(t){return t&&1===t.nodeType},isVoid:T,isPara:E,isPurePara:function(t){return E(t)&&!N(t)},isHeading:function(t){return t&&/^H[1-7]/.test(t.nodeName.toUpperCase())},isInline:R,isBlock:v.not(R),isBodyInline:function(t){return R(t)&&!W(t,E)},isBody:z,isParaInline:function(t){return R(t)&&!!W(t,E)},isPre:$,isList:L,isTable:I,isData:P,isCell:F,isBlockquote:D,isBodyContainer:H,isAnchor:B,isDiv:x("DIV"),isLi:N,isBR:x("BR"),isSpan:x("SPAN"),isB:x("B"),isU:x("U"),isS:x("S"),isI:x("I"),isImg:x("IMG"),isTextarea:ut,deepestChildIsEmpty:function(t){do{if(null===t.firstElementChild||""===t.firstElementChild.innerHTML)break}while(t=t.firstElementChild);return j(t)},isEmpty:j,isEmptyAnchor:v.and(B,j),isClosestSibling:function(t,e){return t.nextSibling===e||t.previousSibling===e},withClosestSiblings:function(t,e){e=e||v.ok;var o=[];return t.previousSibling&&e(t.previousSibling)&&o.push(t.previousSibling),o.push(t),t.nextSibling&&e(t.nextSibling)&&o.push(t.nextSibling),o},nodeLength:O,isLeftEdgePoint:G,isRightEdgePoint:Y,isEdgePoint:Z,isLeftEdgeOf:X,isRightEdgeOf:Q,isLeftEdgePointOf:function(t,e){return G(t)&&X(t.node,e)},isRightEdgePointOf:function(t,e){return Y(t)&&Q(t.node,e)},prevPoint:et,nextPoint:ot,nextPointWithEmptyNode:nt,isSamePoint:rt,isVisiblePoint:function(t){if(S(t.node)||!tt(t.node)||j(t.node))return!0;var e=t.node.childNodes[t.offset-1],o=t.node.childNodes[t.offset];return!((e&&!T(e)||o&&!T(o))&&!I(o))},prevPointUntil:function(t,e){for(;t;){if(e(t))return t;t=et(t)}return null},nextPointUntil:function(t,e){for(;t;){if(e(t))return t;t=ot(t)}return null},isCharPoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return e&&" "!==e&&e!==w},isSpacePoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return" "===e||e===w},walkPoint:function(t,e,o,n){for(var i=t;i&&(o(i),!rt(i,e));){i=nt(i,n&&t.node!==i.node&&e.node!==i.node)}},ancestor:W,singleChildAncestor:function(t,e){for(t=t.parentNode;t&&1===O(t);){if(e(t))return t;if(C(t))break;t=t.parentNode}return null},listAncestor:K,lastAncestor:function(t,e){var o=K(t);return y.last(o.filter(e))},listNext:V,listPrev:function(t,e){e=e||v.fail;for(var o=[];t&&!e(t);)o.push(t),t=t.previousSibling;return o},listDescendant:function(t,e){var o=[];return e=e||v.ok,function n(i){t!==i&&e(i)&&o.push(i);for(var r=0,a=i.childNodes.length;r<a;r++)n(i.childNodes[r])}(t),o},commonAncestor:function(t,e){for(var o=K(t),n=e;n;n=n.parentNode)if(o.indexOf(n)>-1)return n;return null},wrap:function(t,o){var n=t.parentNode,i=e()("<"+o+">")[0];return n.insertBefore(i,t),i.appendChild(t),i},insertAfter:q,appendChildNodes:_,position:J,hasChildren:tt,makeOffsetPath:function(t,e){return K(e,v.eq(t)).map(J).reverse()},fromOffsetPath:function(t,e){for(var o=t,n=0,i=e.length;n<i;n++)o=o.childNodes.length<=e[n]?o.childNodes[o.childNodes.length-1]:o.childNodes[e[n]];return o},splitTree:st,splitPoint:function(t,e){var o,n,i=e?E:H,r=K(t.node,i),a=y.last(r)||t.node;i(a)?(o=r[r.length-2],n=a):n=(o=a).parentNode;var s=o&&st(o,t,{isSkipPaddingBlankHTML:e,isNotSplitEdgePoint:e});return s||n!==t.node||(s=t.node.childNodes[t.offset]),{rightNode:s,container:n}},create:lt,createText:function(t){return document.createTextNode(t)},remove:ct,removeWhile:function(t,e){for(;t&&!C(t)&&e(t);){var o=t.parentNode;ct(t),t=o}},replace:function(t,e){if(t.nodeName.toUpperCase()===e.toUpperCase())return t;var o=lt(e);return t.style.cssText&&(o.style.cssText=t.style.cssText),_(o,y.from(t.childNodes)),q(o,t),ct(t),o},html:function(t,e){var o=dt(t);if(e){o=(o=o.replace(/<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g,(function(t,e,o){o=o.toUpperCase();var n=/^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(o)&&!!e,i=/^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(o);return t+(n||i?"\n":"")}))).trim()}return o},value:dt,posFromPlaceholder:function(t){var o=e()(t),n=o.offset(),i=o.outerHeight(!0);return{left:n.left,top:n.top+i}},attachEvents:function(t,e){Object.keys(e).forEach((function(o){t.on(o,e[o])}))},detachEvents:function(t,e){Object.keys(e).forEach((function(o){t.off(o,e[o])}))},isCustomStyleTag:function(t){return t&&!S(t)&&y.contains(t.classList,"note-styletag")}};function ft(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var pt=function(){function t(o,n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=o,this.memos={},this.modules={},this.layoutInfo={},this.options=e().extend(!0,{},n),e().summernote.ui=e().summernote.ui_template(this.options),this.ui=e().summernote.ui,this.initialize()}var o,n,i;return o=t,n=[{key:"initialize",value:function(){return this.layoutInfo=this.ui.createLayout(this.$note),this._initialize(),this.$note.hide(),this}},{key:"destroy",value:function(){this._destroy(),this.$note.removeData("summernote"),this.ui.removeLayout(this.$note,this.layoutInfo)}},{key:"reset",value:function(){var t=this.isDisabled();this.code(ht.emptyPara),this._destroy(),this._initialize(),t&&this.disable()}},{key:"_initialize",value:function(){var t=this;this.options.id=v.uniqueId(e().now()),this.options.container=this.options.container||this.layoutInfo.editor;var o=e().extend({},this.options.buttons);Object.keys(o).forEach((function(e){t.memo("button."+e,o[e])}));var n=e().extend({},this.options.modules,e().summernote.plugins||{});Object.keys(n).forEach((function(e){t.module(e,n[e],!0)})),Object.keys(this.modules).forEach((function(e){t.initializeModule(e)}))}},{key:"_destroy",value:function(){var t=this;Object.keys(this.modules).reverse().forEach((function(e){t.removeModule(e)})),Object.keys(this.memos).forEach((function(e){t.removeMemo(e)})),this.triggerEvent("destroy",this)}},{key:"code",value:function(t){var e=this.invoke("codeview.isActivated");if(void 0===t)return this.invoke("codeview.sync"),e?this.layoutInfo.codable.val():this.layoutInfo.editable.html();e?this.invoke("codeview.sync",t):this.layoutInfo.editable.html(t),this.$note.val(t),this.triggerEvent("change",t,this.layoutInfo.editable)}},{key:"isDisabled",value:function(){return"false"===this.layoutInfo.editable.attr("contenteditable")}},{key:"enable",value:function(){this.layoutInfo.editable.attr("contenteditable",!0),this.invoke("toolbar.activate",!0),this.triggerEvent("disable",!1),this.options.editing=!0}},{key:"disable",value:function(){this.invoke("codeview.isActivated")&&this.invoke("codeview.deactivate"),this.layoutInfo.editable.attr("contenteditable",!1),this.options.editing=!1,this.invoke("toolbar.deactivate",!0),this.triggerEvent("disable",!0)}},{key:"triggerEvent",value:function(){var t=y.head(arguments),e=y.tail(y.from(arguments)),o=this.options.callbacks[v.namespaceToCamel(t,"on")];o&&o.apply(this.$note[0],e),this.$note.trigger("summernote."+t,e)}},{key:"initializeModule",value:function(t){var e=this.modules[t];e.shouldInitialize=e.shouldInitialize||v.ok,e.shouldInitialize()&&(e.initialize&&e.initialize(),e.events&&ht.attachEvents(this.$note,e.events))}},{key:"module",value:function(t,e,o){if(1===arguments.length)return this.modules[t];this.modules[t]=new e(this),o||this.initializeModule(t)}},{key:"removeModule",value:function(t){var e=this.modules[t];e.shouldInitialize()&&(e.events&&ht.detachEvents(this.$note,e.events),e.destroy&&e.destroy()),delete this.modules[t]}},{key:"memo",value:function(t,e){if(1===arguments.length)return this.memos[t];this.memos[t]=e}},{key:"removeMemo",value:function(t){this.memos[t]&&this.memos[t].destroy&&this.memos[t].destroy(),delete this.memos[t]}},{key:"createInvokeHandlerAndUpdateState",value:function(t,e){var o=this;return function(n){o.createInvokeHandler(t,e)(n),o.invoke("buttons.updateCurrentStyle")}}},{key:"createInvokeHandler",value:function(t,o){var n=this;return function(i){i.preventDefault();var r=e()(i.target);n.invoke(t,o||r.closest("[data-value]").data("value"),r)}}},{key:"invoke",value:function(){var t=y.head(arguments),e=y.tail(y.from(arguments)),o=t.split("."),n=o.length>1,i=n&&y.head(o),r=n?y.last(o):y.head(o),a=this.modules[i||"editor"];return!i&&this[r]?this[r].apply(this,e):a&&a[r]&&a.shouldInitialize()?a[r].apply(a,e):void 0}}],n&&ft(o.prototype,n),i&&ft(o,i),t}();function vt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}function mt(t,e){var o,n,i=t.parentElement(),r=document.body.createTextRange(),a=y.from(i.childNodes);for(o=0;o<a.length;o++)if(!ht.isText(a[o])){if(r.moveToElementText(a[o]),r.compareEndPoints("StartToStart",t)>=0)break;n=a[o]}if(0!==o&&ht.isText(a[o-1])){var s=document.body.createTextRange(),l=null;s.moveToElementText(n||i),s.collapse(!n),l=n?n.nextSibling:i.firstChild;var c=t.duplicate();c.setEndPoint("StartToStart",s);for(var u=c.text.replace(/[\r\n]/g,"").length;u>l.nodeValue.length&&l.nextSibling;)u-=l.nodeValue.length,l=l.nextSibling;l.nodeValue;e&&l.nextSibling&&ht.isText(l.nextSibling)&&u===l.nodeValue.length&&(u-=l.nodeValue.length,l=l.nextSibling),i=l,o=u}return{cont:i,offset:o}}function gt(t){var e=document.body.createTextRange(),o=function t(e,o){var n,i;if(ht.isText(e)){var r=ht.listPrev(e,v.not(ht.isText)),a=y.last(r).previousSibling;n=a||e.parentNode,o+=y.sum(y.tail(r),ht.nodeLength),i=!a}else{if(n=e.childNodes[o]||e,ht.isText(n))return t(n,0);o=0,i=!1}return{node:n,collapseToStart:i,offset:o}}(t.node,t.offset);return e.moveToElementText(o.node),e.collapse(o.collapseToStart),e.moveStart("character",o.offset),e}e().fn.extend({summernote:function(){var t=e().type(y.head(arguments)),o="string"===t,n="object"===t,i=e().extend({},e().summernote.options,n?y.head(arguments):{});i.langInfo=e().extend(!0,{},e().summernote.lang["en-US"],e().summernote.lang[i.lang]),i.icons=e().extend(!0,{},e().summernote.options.icons,i.icons),i.tooltip="auto"===i.tooltip?!f.isSupportTouch:i.tooltip,this.each((function(t,o){var n=e()(o);if(!n.data("summernote")){var r=new pt(n,i);n.data("summernote",r),n.data("summernote").triggerEvent("init",r.layoutInfo)}}));var r=this.first();if(r.length){var a=r.data("summernote");if(o)return a.invoke.apply(a,y.from(arguments));i.focus&&a.invoke("editor.focus")}return this}});var bt=function(){function t(e,o,n,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sc=e,this.so=o,this.ec=n,this.eo=i,this.isOnEditable=this.makeIsOn(ht.isEditable),this.isOnList=this.makeIsOn(ht.isList),this.isOnAnchor=this.makeIsOn(ht.isAnchor),this.isOnCell=this.makeIsOn(ht.isCell),this.isOnData=this.makeIsOn(ht.isData)}var o,n,i;return o=t,n=[{key:"nativeRange",value:function(){if(f.isW3CRangeSupport){var t=document.createRange();return t.setStart(this.sc,this.so),t.setEnd(this.ec,this.eo),t}var e=gt({node:this.sc,offset:this.so});return e.setEndPoint("EndToEnd",gt({node:this.ec,offset:this.eo})),e}},{key:"getPoints",value:function(){return{sc:this.sc,so:this.so,ec:this.ec,eo:this.eo}}},{key:"getStartPoint",value:function(){return{node:this.sc,offset:this.so}}},{key:"getEndPoint",value:function(){return{node:this.ec,offset:this.eo}}},{key:"select",value:function(){var t=this.nativeRange();if(f.isW3CRangeSupport){var e=document.getSelection();e.rangeCount>0&&e.removeAllRanges(),e.addRange(t)}else t.select();return this}},{key:"scrollIntoView",value:function(t){var o=e()(t).height();return t.scrollTop+o<this.sc.offsetTop&&(t.scrollTop+=Math.abs(t.scrollTop+o-this.sc.offsetTop)),this}},{key:"normalize",value:function(){var e=function(t,e){if(!t)return t;if(ht.isVisiblePoint(t)&&(!ht.isEdgePoint(t)||ht.isRightEdgePoint(t)&&!e||ht.isLeftEdgePoint(t)&&e||ht.isRightEdgePoint(t)&&e&&ht.isVoid(t.node.nextSibling)||ht.isLeftEdgePoint(t)&&!e&&ht.isVoid(t.node.previousSibling)||ht.isBlock(t.node)&&ht.isEmpty(t.node)))return t;var o=ht.ancestor(t.node,ht.isBlock),n=!1;if(!n){var i=ht.prevPoint(t)||{node:null};n=(ht.isLeftEdgePointOf(t,o)||ht.isVoid(i.node))&&!e}var r=!1;if(!r){var a=ht.nextPoint(t)||{node:null};r=(ht.isRightEdgePointOf(t,o)||ht.isVoid(a.node))&&e}if(n||r){if(ht.isVisiblePoint(t))return t;e=!e}return(e?ht.nextPointUntil(ht.nextPoint(t),ht.isVisiblePoint):ht.prevPointUntil(ht.prevPoint(t),ht.isVisiblePoint))||t},o=e(this.getEndPoint(),!1),n=this.isCollapsed()?o:e(this.getStartPoint(),!0);return new t(n.node,n.offset,o.node,o.offset)}},{key:"nodes",value:function(t,e){t=t||v.ok;var o=e&&e.includeAncestor,n=e&&e.fullyContains,i=this.getStartPoint(),r=this.getEndPoint(),a=[],s=[];return ht.walkPoint(i,r,(function(e){var i;ht.isEditable(e.node)||(n?(ht.isLeftEdgePoint(e)&&s.push(e.node),ht.isRightEdgePoint(e)&&y.contains(s,e.node)&&(i=e.node)):i=o?ht.ancestor(e.node,t):e.node,i&&t(i)&&a.push(i))}),!0),y.unique(a)}},{key:"commonAncestor",value:function(){return ht.commonAncestor(this.sc,this.ec)}},{key:"expand",value:function(e){var o=ht.ancestor(this.sc,e),n=ht.ancestor(this.ec,e);if(!o&&!n)return new t(this.sc,this.so,this.ec,this.eo);var i=this.getPoints();return o&&(i.sc=o,i.so=0),n&&(i.ec=n,i.eo=ht.nodeLength(n)),new t(i.sc,i.so,i.ec,i.eo)}},{key:"collapse",value:function(e){return e?new t(this.sc,this.so,this.sc,this.so):new t(this.ec,this.eo,this.ec,this.eo)}},{key:"splitText",value:function(){var e=this.sc===this.ec,o=this.getPoints();return ht.isText(this.ec)&&!ht.isEdgePoint(this.getEndPoint())&&this.ec.splitText(this.eo),ht.isText(this.sc)&&!ht.isEdgePoint(this.getStartPoint())&&(o.sc=this.sc.splitText(this.so),o.so=0,e&&(o.ec=o.sc,o.eo=this.eo-this.so)),new t(o.sc,o.so,o.ec,o.eo)}},{key:"deleteContents",value:function(){if(this.isCollapsed())return this;var o=this.splitText(),n=o.nodes(null,{fullyContains:!0}),i=ht.prevPointUntil(o.getStartPoint(),(function(t){return!y.contains(n,t.node)})),r=[];return e().each(n,(function(t,e){var o=e.parentNode;i.node!==o&&1===ht.nodeLength(o)&&r.push(o),ht.remove(e,!1)})),e().each(r,(function(t,e){ht.remove(e,!1)})),new t(i.node,i.offset,i.node,i.offset).normalize()}},{key:"makeIsOn",value:function(t){return function(){var e=ht.ancestor(this.sc,t);return!!e&&e===ht.ancestor(this.ec,t)}}},{key:"isLeftEdgeOf",value:function(t){if(!ht.isLeftEdgePoint(this.getStartPoint()))return!1;var e=ht.ancestor(this.sc,t);return e&&ht.isLeftEdgeOf(this.sc,e)}},{key:"isCollapsed",value:function(){return this.sc===this.ec&&this.so===this.eo}},{key:"wrapBodyInlineWithPara",value:function(){if(ht.isBodyContainer(this.sc)&&ht.isEmpty(this.sc))return this.sc.innerHTML=ht.emptyPara,new t(this.sc.firstChild,0,this.sc.firstChild,0);var e,o=this.normalize();if(ht.isParaInline(this.sc)||ht.isPara(this.sc))return o;if(ht.isInline(o.sc)){var n=ht.listAncestor(o.sc,v.not(ht.isInline));e=y.last(n),ht.isInline(e)||(e=n[n.length-2]||o.sc.childNodes[o.so])}else e=o.sc.childNodes[o.so>0?o.so-1:0];if(e){var i=ht.listPrev(e,ht.isParaInline).reverse();if((i=i.concat(ht.listNext(e.nextSibling,ht.isParaInline))).length){var r=ht.wrap(y.head(i),"p");ht.appendChildNodes(r,y.tail(i))}}return this.normalize()}},{key:"insertNode",value:function(t){var e=this;(ht.isText(t)||ht.isInline(t))&&(e=this.wrapBodyInlineWithPara().deleteContents());var o=ht.splitPoint(e.getStartPoint(),ht.isInline(t));return o.rightNode?(o.rightNode.parentNode.insertBefore(t,o.rightNode),ht.isEmpty(o.rightNode)&&ht.isPara(t)&&o.rightNode.parentNode.removeChild(o.rightNode)):o.container.appendChild(t),t}},{key:"pasteHTML",value:function(t){t=e().trim(t);var o=e()("<div></div>").html(t)[0],n=y.from(o.childNodes),i=this,r=!1;return i.so>=0&&(n=n.reverse(),r=!0),n=n.map((function(t){return i.insertNode(t)})),r&&(n=n.reverse()),n}},{key:"toString",value:function(){var t=this.nativeRange();return f.isW3CRangeSupport?t.toString():t.text}},{key:"getWordRange",value:function(e){var o=this.getEndPoint();if(!ht.isCharPoint(o))return this;var n=ht.prevPointUntil(o,(function(t){return!ht.isCharPoint(t)}));return e&&(o=ht.nextPointUntil(o,(function(t){return!ht.isCharPoint(t)}))),new t(n.node,n.offset,o.node,o.offset)}},{key:"getWordsRange",value:function(e){var o=this.getEndPoint(),n=function(t){return!ht.isCharPoint(t)&&!ht.isSpacePoint(t)};if(n(o))return this;var i=ht.prevPointUntil(o,n);return e&&(o=ht.nextPointUntil(o,n)),new t(i.node,i.offset,o.node,o.offset)}},{key:"getWordsMatchRange",value:function(e){var o=this.getEndPoint(),n=ht.prevPointUntil(o,(function(n){if(!ht.isCharPoint(n)&&!ht.isSpacePoint(n))return!0;var i=new t(n.node,n.offset,o.node,o.offset),r=e.exec(i.toString());return r&&0===r.index})),i=new t(n.node,n.offset,o.node,o.offset),r=i.toString(),a=e.exec(r);return a&&a[0].length===r.length?i:null}},{key:"bookmark",value:function(t){return{s:{path:ht.makeOffsetPath(t,this.sc),offset:this.so},e:{path:ht.makeOffsetPath(t,this.ec),offset:this.eo}}}},{key:"paraBookmark",value:function(t){return{s:{path:y.tail(ht.makeOffsetPath(y.head(t),this.sc)),offset:this.so},e:{path:y.tail(ht.makeOffsetPath(y.last(t),this.ec)),offset:this.eo}}}},{key:"getClientRects",value:function(){return this.nativeRange().getClientRects()}}],n&&vt(o.prototype,n),i&&vt(o,i),t}();const kt={create:function(t,e,o,n){if(4===arguments.length)return new bt(t,e,o,n);if(2===arguments.length)return new bt(t,e,o=t,n=e);var i=this.createFromSelection();if(!i&&1===arguments.length){var r=arguments[0];return ht.isEditable(r)&&(r=r.lastChild),this.createFromBodyElement(r,ht.emptyPara===arguments[0].innerHTML)}return i},createFromBodyElement:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.createFromNode(t);return o.collapse(e)},createFromSelection:function(){var t,e,o,n;if(f.isW3CRangeSupport){var i=document.getSelection();if(!i||0===i.rangeCount)return null;if(ht.isBody(i.anchorNode))return null;var r=i.getRangeAt(0);t=r.startContainer,e=r.startOffset,o=r.endContainer,n=r.endOffset}else{var a=document.selection.createRange(),s=a.duplicate();s.collapse(!1);var l=a;l.collapse(!0);var c=mt(l,!0),u=mt(s,!1);ht.isText(c.node)&&ht.isLeftEdgePoint(c)&&ht.isTextNode(u.node)&&ht.isRightEdgePoint(u)&&u.node.nextSibling===c.node&&(c=u),t=c.cont,e=c.offset,o=u.cont,n=u.offset}return new bt(t,e,o,n)},createFromNode:function(t){var e=t,o=0,n=t,i=ht.nodeLength(n);return ht.isVoid(e)&&(o=ht.listPrev(e).length-1,e=e.parentNode),ht.isBR(n)?(i=ht.listPrev(n).length-1,n=n.parentNode):ht.isVoid(n)&&(i=ht.listPrev(n).length,n=n.parentNode),this.create(e,o,n,i)},createFromNodeBefore:function(t){return this.createFromNode(t).collapse(!0)},createFromNodeAfter:function(t){return this.createFromNode(t).collapse()},createFromBookmark:function(t,e){var o=ht.fromOffsetPath(t,e.s.path),n=e.s.offset,i=ht.fromOffsetPath(t,e.e.path),r=e.e.offset;return new bt(o,n,i,r)},createFromParaBookmark:function(t,e){var o=t.s.offset,n=t.e.offset,i=ht.fromOffsetPath(y.head(e),t.s.path),r=ht.fromOffsetPath(y.last(e),t.e.path);return new bt(i,o,r,n)}};var yt={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,SPACE:32,DELETE:46,LEFT:37,UP:38,RIGHT:39,DOWN:40,NUM0:48,NUM1:49,NUM2:50,NUM3:51,NUM4:52,NUM5:53,NUM6:54,NUM7:55,NUM8:56,B:66,E:69,I:73,J:74,K:75,L:76,R:82,S:83,U:85,V:86,Y:89,Z:90,SLASH:191,LEFTBRACKET:219,BACKSLASH:220,RIGHTBRACKET:221,HOME:36,END:35,PAGEUP:33,PAGEDOWN:34};const wt={isEdit:function(t){return y.contains([yt.BACKSPACE,yt.TAB,yt.ENTER,yt.SPACE,yt.DELETE],t)},isMove:function(t){return y.contains([yt.LEFT,yt.UP,yt.RIGHT,yt.DOWN],t)},isNavigation:function(t){return y.contains([yt.HOME,yt.END,yt.PAGEUP,yt.PAGEDOWN],t)},nameFromCode:v.invertObject(yt),code:yt};function Ct(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var xt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.stack=[],this.stackOffset=-1,this.context=e,this.$editable=e.layoutInfo.editable,this.editable=this.$editable[0]}var e,o,n;return e=t,(o=[{key:"makeSnapshot",value:function(){var t=kt.create(this.editable);return{contents:this.$editable.html(),bookmark:t&&t.isOnEditable()?t.bookmark(this.editable):{s:{path:[],offset:0},e:{path:[],offset:0}}}}},{key:"applySnapshot",value:function(t){null!==t.contents&&this.$editable.html(t.contents),null!==t.bookmark&&kt.createFromBookmark(this.editable,t.bookmark).select()}},{key:"rewind",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset=0,this.applySnapshot(this.stack[this.stackOffset])}},{key:"commit",value:function(){this.stack=[],this.stackOffset=-1,this.recordUndo()}},{key:"reset",value:function(){this.stack=[],this.stackOffset=-1,this.$editable.html(""),this.recordUndo()}},{key:"undo",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset>0&&(this.stackOffset--,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"redo",value:function(){this.stack.length-1>this.stackOffset&&(this.stackOffset++,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"recordUndo",value:function(){this.stackOffset++,this.stack.length>this.stackOffset&&(this.stack=this.stack.slice(0,this.stackOffset)),this.stack.push(this.makeSnapshot()),this.stack.length>this.context.options.historyLimit&&(this.stack.shift(),this.stackOffset-=1)}}])&&Ct(e.prototype,o),n&&Ct(e,n),t}();function St(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Tt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var o,n,i;return o=t,n=[{key:"jQueryCSS",value:function(t,o){var n={};return e().each(o,(function(e,o){n[o]=t.css(o)})),n}},{key:"fromNode",value:function(t){var e=this.jQueryCSS(t,["font-family","font-size","text-align","list-style-type","line-height"])||{},o=t[0].style.fontSize||e["font-size"];return e["font-size"]=parseInt(o,10),e["font-size-unit"]=o.match(/[a-z%]+$/),e}},{key:"stylePara",value:function(t,o){e().each(t.nodes(ht.isPara,{includeAncestor:!0}),(function(t,n){e()(n).css(o)}))}},{key:"styleNodes",value:function(t,o){t=t.splitText();var n=o&&o.nodeName||"SPAN",i=!(!o||!o.expandClosestSibling),r=!(!o||!o.onlyPartialContains);if(t.isCollapsed())return[t.insertNode(ht.create(n))];var a=ht.makePredByNodeName(n),s=t.nodes(ht.isText,{fullyContains:!0}).map((function(t){return ht.singleChildAncestor(t,a)||ht.wrap(t,n)}));if(i){if(r){var l=t.nodes();a=v.and(a,(function(t){return y.contains(l,t)}))}return s.map((function(t){var o=ht.withClosestSiblings(t,a),n=y.head(o),i=y.tail(o);return e().each(i,(function(t,e){ht.appendChildNodes(n,e.childNodes),ht.remove(e)})),y.head(o)}))}return s}},{key:"current",value:function(t){var o=e()(ht.isElement(t.sc)?t.sc:t.sc.parentNode),n=this.fromNode(o);try{n=e().extend(n,{"font-bold":document.queryCommandState("bold")?"bold":"normal","font-italic":document.queryCommandState("italic")?"italic":"normal","font-underline":document.queryCommandState("underline")?"underline":"normal","font-subscript":document.queryCommandState("subscript")?"subscript":"normal","font-superscript":document.queryCommandState("superscript")?"superscript":"normal","font-strikethrough":document.queryCommandState("strikethrough")?"strikethrough":"normal","font-family":document.queryCommandValue("fontname")||n["font-family"]})}catch(t){}if(t.isOnList()){var i=["circle","disc","disc-leading-zero","square"].indexOf(n["list-style-type"])>-1;n["list-style"]=i?"unordered":"ordered"}else n["list-style"]="none";var r=ht.ancestor(t.sc,ht.isPara);if(r&&r.style["line-height"])n["line-height"]=r.style.lineHeight;else{var a=parseInt(n["line-height"],10)/parseInt(n["font-size"],10);n["line-height"]=a.toFixed(1)}return n.anchor=t.isOnAnchor()&&ht.ancestor(t.sc,ht.isAnchor),n.ancestors=ht.listAncestor(t.sc,ht.isEditable),n.range=t,n}}],n&&St(o.prototype,n),i&&St(o,i),t}();function Et(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var $t=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var o,n,i;return o=t,n=[{key:"insertOrderedList",value:function(t){this.toggleList("OL",t)}},{key:"insertUnorderedList",value:function(t){this.toggleList("UL",t)}},{key:"indent",value:function(t){var o=this,n=kt.create(t).wrapBodyInlineWithPara(),i=n.nodes(ht.isPara,{includeAncestor:!0}),r=y.clusterBy(i,v.peq2("parentNode"));e().each(r,(function(t,n){var i=y.head(n);if(ht.isLi(i)){var r=o.findList(i.previousSibling);r?n.map((function(t){return r.appendChild(t)})):(o.wrapList(n,i.parentNode.nodeName),n.map((function(t){return t.parentNode})).map((function(t){return o.appendToPrevious(t)})))}else e().each(n,(function(t,o){e()(o).css("marginLeft",(function(t,e){return(parseInt(e,10)||0)+25}))}))})),n.select()}},{key:"outdent",value:function(t){var o=this,n=kt.create(t).wrapBodyInlineWithPara(),i=n.nodes(ht.isPara,{includeAncestor:!0}),r=y.clusterBy(i,v.peq2("parentNode"));e().each(r,(function(t,n){var i=y.head(n);ht.isLi(i)?o.releaseList([n]):e().each(n,(function(t,o){e()(o).css("marginLeft",(function(t,e){return(e=parseInt(e,10)||0)>25?e-25:""}))}))})),n.select()}},{key:"toggleList",value:function(t,o){var n=this,i=kt.create(o).wrapBodyInlineWithPara(),r=i.nodes(ht.isPara,{includeAncestor:!0}),a=i.paraBookmark(r),s=y.clusterBy(r,v.peq2("parentNode"));if(y.find(r,ht.isPurePara)){var l=[];e().each(s,(function(e,o){l=l.concat(n.wrapList(o,t))})),r=l}else{var c=i.nodes(ht.isList,{includeAncestor:!0}).filter((function(o){return!e().nodeName(o,t)}));c.length?e().each(c,(function(e,o){ht.replace(o,t)})):r=this.releaseList(s,!0)}kt.createFromParaBookmark(a,r).select()}},{key:"wrapList",value:function(t,e){var o=y.head(t),n=y.last(t),i=ht.isList(o.previousSibling)&&o.previousSibling,r=ht.isList(n.nextSibling)&&n.nextSibling,a=i||ht.insertAfter(ht.create(e||"UL"),n);return t=t.map((function(t){return ht.isPurePara(t)?ht.replace(t,"LI"):t})),ht.appendChildNodes(a,t),r&&(ht.appendChildNodes(a,y.from(r.childNodes)),ht.remove(r)),t}},{key:"releaseList",value:function(t,o){var n=this,i=[];return e().each(t,(function(t,r){var a=y.head(r),s=y.last(r),l=o?ht.lastAncestor(a,ht.isList):a.parentNode,c=l.parentNode;if("LI"===l.parentNode.nodeName)r.map((function(t){var e=n.findNextSiblings(t);c.nextSibling?c.parentNode.insertBefore(t,c.nextSibling):c.parentNode.appendChild(t),e.length&&(n.wrapList(e,l.nodeName),t.appendChild(e[0].parentNode))})),0===l.children.length&&c.removeChild(l),0===c.childNodes.length&&c.parentNode.removeChild(c);else{var u=l.childNodes.length>1?ht.splitTree(l,{node:s.parentNode,offset:ht.position(s)+1},{isSkipPaddingBlankHTML:!0}):null,d=ht.splitTree(l,{node:a.parentNode,offset:ht.position(a)},{isSkipPaddingBlankHTML:!0});r=o?ht.listDescendant(d,ht.isLi):y.from(d.childNodes).filter(ht.isLi),!o&&ht.isList(l.parentNode)||(r=r.map((function(t){return ht.replace(t,"P")}))),e().each(y.from(r).reverse(),(function(t,e){ht.insertAfter(e,l)}));var h=y.compact([l,d,u]);e().each(h,(function(t,o){var n=[o].concat(ht.listDescendant(o,ht.isList));e().each(n.reverse(),(function(t,e){ht.nodeLength(e)||ht.remove(e,!0)}))}))}i=i.concat(r)})),i}},{key:"appendToPrevious",value:function(t){return t.previousSibling?ht.appendChildNodes(t.previousSibling,[t]):this.wrapList([t],"LI")}},{key:"findList",value:function(t){return t?y.find(t.children,(function(t){return["OL","UL"].indexOf(t.nodeName)>-1})):null}},{key:"findNextSiblings",value:function(t){for(var e=[];t.nextSibling;)e.push(t.nextSibling),t=t.nextSibling;return e}}],n&&Et(o.prototype,n),i&&Et(o,i),t}();function Nt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var It=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.bullet=new $t,this.options=e.options}var o,n,i;return o=t,n=[{key:"insertTab",value:function(t,e){var o=ht.createText(new Array(e+1).join(ht.NBSP_CHAR));(t=t.deleteContents()).insertNode(o,!0),(t=kt.create(o,e)).select()}},{key:"insertParagraph",value:function(t,o){o=(o=(o=o||kt.create(t)).deleteContents()).wrapBodyInlineWithPara();var n,i=ht.ancestor(o.sc,ht.isPara);if(i){if(ht.isLi(i)&&(ht.isEmpty(i)||ht.deepestChildIsEmpty(i)))return void this.bullet.toggleList(i.parentNode.nodeName);var r=null;if(1===this.options.blockquoteBreakingLevel?r=ht.ancestor(i,ht.isBlockquote):2===this.options.blockquoteBreakingLevel&&(r=ht.lastAncestor(i,ht.isBlockquote)),r){n=e()(ht.emptyPara)[0],ht.isRightEdgePoint(o.getStartPoint())&&ht.isBR(o.sc.nextSibling)&&e()(o.sc.nextSibling).remove();var a=ht.splitTree(r,o.getStartPoint(),{isDiscardEmptySplits:!0});a?a.parentNode.insertBefore(n,a):ht.insertAfter(n,r)}else{n=ht.splitTree(i,o.getStartPoint());var s=ht.listDescendant(i,ht.isEmptyAnchor);s=s.concat(ht.listDescendant(n,ht.isEmptyAnchor)),e().each(s,(function(t,e){ht.remove(e)})),(ht.isHeading(n)||ht.isPre(n)||ht.isCustomStyleTag(n))&&ht.isEmpty(n)&&(n=ht.replace(n,"p"))}}else{var l=o.sc.childNodes[o.so];n=e()(ht.emptyPara)[0],l?o.sc.insertBefore(n,l):o.sc.appendChild(n)}kt.create(n,0).normalize().select().scrollIntoView(t)}}],n&&Nt(o.prototype,n),i&&Nt(o,i),t}();function Pt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Rt=function t(e,o,n,i){var r={colPos:0,rowPos:0},a=[],s=[];function l(t,e,o,n,i,r,s){var l={baseRow:o,baseCell:n,isRowSpan:i,isColSpan:r,isVirtual:s};a[t]||(a[t]=[]),a[t][e]=l}function c(t,e,o,n){return{baseCell:t.baseCell,action:e,virtualTable:{rowIndex:o,cellIndex:n}}}function u(t,e){if(!a[t])return e;if(!a[t][e])return e;for(var o=e;a[t][o];)if(o++,!a[t][o])return o}function d(t,e){var o=u(t.rowIndex,e.cellIndex),n=e.colSpan>1,i=e.rowSpan>1,a=t.rowIndex===r.rowPos&&e.cellIndex===r.colPos;l(t.rowIndex,o,t,e,i,n,!1);var s=e.attributes.rowSpan?parseInt(e.attributes.rowSpan.value,10):0;if(s>1)for(var c=1;c<s;c++){var d=t.rowIndex+c;h(d,o,e,a),l(d,o,t,e,!0,n,!0)}var f=e.attributes.colSpan?parseInt(e.attributes.colSpan.value,10):0;if(f>1)for(var p=1;p<f;p++){var v=u(t.rowIndex,o+p);h(t.rowIndex,v,e,a),l(t.rowIndex,v,t,e,i,!0,!0)}}function h(t,e,o,n){t===r.rowPos&&r.colPos>=o.cellIndex&&o.cellIndex<=e&&!n&&r.colPos++}function f(e){switch(o){case t.where.Column:if(e.isColSpan)return t.resultAction.SubtractSpanCount;break;case t.where.Row:if(!e.isVirtual&&e.isRowSpan)return t.resultAction.AddCell;if(e.isRowSpan)return t.resultAction.SubtractSpanCount}return t.resultAction.RemoveCell}function p(e){switch(o){case t.where.Column:if(e.isColSpan)return t.resultAction.SumSpanCount;if(e.isRowSpan&&e.isVirtual)return t.resultAction.Ignore;break;case t.where.Row:if(e.isRowSpan)return t.resultAction.SumSpanCount;if(e.isColSpan&&e.isVirtual)return t.resultAction.Ignore}return t.resultAction.AddCell}this.getActionList=function(){for(var e=o===t.where.Row?r.rowPos:-1,i=o===t.where.Column?r.colPos:-1,l=0,u=!0;u;){var d=e>=0?e:l,h=i>=0?i:l,v=a[d];if(!v)return u=!1,s;var m=v[h];if(!m)return u=!1,s;var g=t.resultAction.Ignore;switch(n){case t.requestAction.Add:g=p(m);break;case t.requestAction.Delete:g=f(m)}s.push(c(m,g,d,h)),l++}return s},e&&e.tagName&&("td"===e.tagName.toLowerCase()||"th"===e.tagName.toLowerCase())&&(r.colPos=e.cellIndex,e.parentElement&&e.parentElement.tagName&&"tr"===e.parentElement.tagName.toLowerCase()&&(r.rowPos=e.parentElement.rowIndex)),function(){for(var t=i.rows,e=0;e<t.length;e++)for(var o=t[e].cells,n=0;n<o.length;n++)d(t[e],o[n])}()};Rt.where={Row:0,Column:1},Rt.requestAction={Add:0,Delete:1},Rt.resultAction={Ignore:0,SubtractSpanCount:1,RemoveCell:2,AddCell:3,SumSpanCount:4};var Lt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var o,n,i;return o=t,n=[{key:"tab",value:function(t,e){var o=ht.ancestor(t.commonAncestor(),ht.isCell),n=ht.ancestor(o,ht.isTable),i=ht.listDescendant(n,ht.isCell),r=y[e?"prev":"next"](i,o);r&&kt.create(r,0).select()}},{key:"addRow",value:function(t,o){for(var n=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(n).closest("tr"),r=this.recoverAttributes(i),a=e()("<tr"+r+"></tr>"),s=new Rt(n,Rt.where.Row,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),l=0;l<s.length;l++){var c=s[l],u=this.recoverAttributes(c.baseCell);switch(c.action){case Rt.resultAction.AddCell:a.append("<td"+u+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("top"===o&&(c.baseCell.parent?c.baseCell.closest("tr").rowIndex:0)<=i[0].rowIndex){var d=e()("<div></div>").append(e()("<td"+u+">"+ht.blank+"</td>").removeAttr("rowspan")).html();a.append(d);break}var h=parseInt(c.baseCell.rowSpan,10);h++,c.baseCell.setAttribute("rowSpan",h)}}if("top"===o)i.before(a);else{if(n.rowSpan>1){var f=i[0].rowIndex+(n.rowSpan-2);return void e()(e()(i).parent().find("tr")[f]).after(e()(a))}i.after(a)}}},{key:"addCol",value:function(t,o){var n=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(n).closest("tr");e()(i).siblings().push(i);for(var r=new Rt(n,Rt.where.Column,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),a=0;a<r.length;a++){var s=r[a],l=this.recoverAttributes(s.baseCell);switch(s.action){case Rt.resultAction.AddCell:"right"===o?e()(s.baseCell).after("<td"+l+">"+ht.blank+"</td>"):e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("right"===o){var c=parseInt(s.baseCell.colSpan,10);c++,s.baseCell.setAttribute("colSpan",c)}else e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>")}}}},{key:"recoverAttributes",value:function(t){var e="";if(!t)return e;for(var o=t.attributes||[],n=0;n<o.length;n++)"id"!==o[n].name.toLowerCase()&&o[n].specified&&(e+=" "+o[n].name+"='"+o[n].value+"'");return e}},{key:"deleteRow",value:function(t){for(var o=ht.ancestor(t.commonAncestor(),ht.isCell),n=e()(o).closest("tr"),i=n.children("td, th").index(e()(o)),r=n[0].rowIndex,a=new Rt(o,Rt.where.Row,Rt.requestAction.Delete,e()(n).closest("table")[0]).getActionList(),s=0;s<a.length;s++)if(a[s]){var l=a[s].baseCell,c=a[s].virtualTable,u=l.rowSpan&&l.rowSpan>1,d=u?parseInt(l.rowSpan,10):0;switch(a[s].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.AddCell:var h=n.next("tr")[0];if(!h)continue;var f=n[0].cells[i];u&&(d>2?(d--,h.insertBefore(f,h.cells[i]),h.cells[i].setAttribute("rowSpan",d),h.cells[i].innerHTML=""):2===d&&(h.insertBefore(f,h.cells[i]),h.cells[i].removeAttribute("rowSpan"),h.cells[i].innerHTML=""));continue;case Rt.resultAction.SubtractSpanCount:u&&(d>2?(d--,l.setAttribute("rowSpan",d),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")):2===d&&(l.removeAttribute("rowSpan"),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")));continue;case Rt.resultAction.RemoveCell:continue}}n.remove()}},{key:"deleteCol",value:function(t){for(var o=ht.ancestor(t.commonAncestor(),ht.isCell),n=e()(o).closest("tr"),i=n.children("td, th").index(e()(o)),r=new Rt(o,Rt.where.Column,Rt.requestAction.Delete,e()(n).closest("table")[0]).getActionList(),a=0;a<r.length;a++)if(r[a])switch(r[a].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.SubtractSpanCount:var s=r[a].baseCell;if(s.colSpan&&s.colSpan>1){var l=s.colSpan?parseInt(s.colSpan,10):0;l>2?(l--,s.setAttribute("colSpan",l),s.cellIndex===i&&(s.innerHTML="")):2===l&&(s.removeAttribute("colSpan"),s.cellIndex===i&&(s.innerHTML=""))}continue;case Rt.resultAction.RemoveCell:ht.remove(r[a].baseCell,!0);continue}}},{key:"createTable",value:function(t,o,n){for(var i,r=[],a=0;a<t;a++)r.push("<td>"+ht.blank+"</td>");i=r.join("");for(var s,l=[],c=0;c<o;c++)l.push("<tr>"+i+"</tr>");s=l.join("");var u=e()("<table>"+s+"</table>");return n&&n.tableClassName&&u.addClass(n.tableClassName),u[0]}},{key:"deleteTable",value:function(t){var o=ht.ancestor(t.commonAncestor(),ht.isCell);e()(o).closest("table").remove()}}],n&&Pt(o.prototype,n),i&&Pt(o,i),t}();function At(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Ft=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.$note=o.layoutInfo.note,this.$editor=o.layoutInfo.editor,this.$editable=o.layoutInfo.editable,this.options=o.options,this.lang=this.options.langInfo,this.editable=this.$editable[0],this.lastRange=null,this.snapshot=null,this.style=new Tt,this.table=new Lt,this.typing=new It(o),this.bullet=new $t,this.history=new xt(o),this.context.memo("help.escape",this.lang.help.escape),this.context.memo("help.undo",this.lang.help.undo),this.context.memo("help.redo",this.lang.help.redo),this.context.memo("help.tab",this.lang.help.tab),this.context.memo("help.untab",this.lang.help.untab),this.context.memo("help.insertParagraph",this.lang.help.insertParagraph),this.context.memo("help.insertOrderedList",this.lang.help.insertOrderedList),this.context.memo("help.insertUnorderedList",this.lang.help.insertUnorderedList),this.context.memo("help.indent",this.lang.help.indent),this.context.memo("help.outdent",this.lang.help.outdent),this.context.memo("help.formatPara",this.lang.help.formatPara),this.context.memo("help.insertHorizontalRule",this.lang.help.insertHorizontalRule),this.context.memo("help.fontName",this.lang.help.fontName);for(var i=["bold","italic","underline","strikethrough","superscript","subscript","justifyLeft","justifyCenter","justifyRight","justifyFull","formatBlock","removeFormat","backColor"],r=0,a=i.length;r<a;r++)this[i[r]]=function(t){return function(e){n.beforeCommand(),document.execCommand(t,!1,e),n.afterCommand(!0)}}(i[r]),this.context.memo("help."+i[r],this.lang.help[i[r]]);this.fontName=this.wrapCommand((function(t){return n.fontStyling("font-family",f.validFontName(t))})),this.fontSize=this.wrapCommand((function(t){var e=n.currentStyle()["font-size-unit"];return n.fontStyling("font-size",t+e)})),this.fontSizeUnit=this.wrapCommand((function(t){var e=n.currentStyle()["font-size"];return n.fontStyling("font-size",e+t)}));for(var s=1;s<=6;s++)this["formatH"+s]=function(t){return function(){n.formatBlock("H"+t)}}(s),this.context.memo("help.formatH"+s,this.lang.help["formatH"+s]);this.insertParagraph=this.wrapCommand((function(){n.typing.insertParagraph(n.editable)})),this.insertOrderedList=this.wrapCommand((function(){n.bullet.insertOrderedList(n.editable)})),this.insertUnorderedList=this.wrapCommand((function(){n.bullet.insertUnorderedList(n.editable)})),this.indent=this.wrapCommand((function(){n.bullet.indent(n.editable)})),this.outdent=this.wrapCommand((function(){n.bullet.outdent(n.editable)})),this.insertNode=this.wrapCommand((function(t){n.isLimited(e()(t).text().length)||(n.getLastRange().insertNode(t),n.setLastRange(kt.createFromNodeAfter(t).select()))})),this.insertText=this.wrapCommand((function(t){if(!n.isLimited(t.length)){var e=n.getLastRange().insertNode(ht.createText(t));n.setLastRange(kt.create(e,ht.nodeLength(e)).select())}})),this.pasteHTML=this.wrapCommand((function(t){if(!n.isLimited(t.length)){t=n.context.invoke("codeview.purify",t);var e=n.getLastRange().pasteHTML(t);n.setLastRange(kt.createFromNodeAfter(y.last(e)).select())}})),this.formatBlock=this.wrapCommand((function(t,e){var o=n.options.callbacks.onApplyCustomStyle;o?o.call(n,e,n.context,n.onFormatBlock):n.onFormatBlock(t,e)})),this.insertHorizontalRule=this.wrapCommand((function(){var t=n.getLastRange().insertNode(ht.create("HR"));t.nextSibling&&n.setLastRange(kt.create(t.nextSibling,0).normalize().select())})),this.lineHeight=this.wrapCommand((function(t){n.style.stylePara(n.getLastRange(),{lineHeight:t})})),this.createLink=this.wrapCommand((function(t){var o=t.url,i=t.text,r=t.isNewWindow,a=t.checkProtocol,s=t.range||n.getLastRange(),l=i.length-s.toString().length;if(!(l>0&&n.isLimited(l))){var c=s.toString()!==i;"string"==typeof o&&(o=o.trim()),n.options.onCreateLink?o=n.options.onCreateLink(o):a&&(o=/^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(o)?o:n.options.defaultProtocol+o);var u=[];if(c){var d=(s=s.deleteContents()).insertNode(e()("<A>"+i+"</A>")[0]);u.push(d)}else u=n.style.styleNodes(s,{nodeName:"A",expandClosestSibling:!0,onlyPartialContains:!0});e().each(u,(function(t,n){e()(n).attr("href",o),r?e()(n).attr("target","_blank"):e()(n).removeAttr("target")})),n.setLastRange(n.createRangeFromList(u).select())}})),this.color=this.wrapCommand((function(t){var e=t.foreColor,o=t.backColor;e&&document.execCommand("foreColor",!1,e),o&&document.execCommand("backColor",!1,o)})),this.foreColor=this.wrapCommand((function(t){document.execCommand("foreColor",!1,t)})),this.insertTable=this.wrapCommand((function(t){var e=t.split("x");n.getLastRange().deleteContents().insertNode(n.table.createTable(e[0],e[1],n.options))})),this.removeMedia=this.wrapCommand((function(){var t=e()(n.restoreTarget()).parent();t.closest("figure").length?t.closest("figure").remove():t=e()(n.restoreTarget()).detach(),n.context.triggerEvent("media.delete",t,n.$editable)})),this.floatMe=this.wrapCommand((function(t){var o=e()(n.restoreTarget());o.toggleClass("note-float-left","left"===t),o.toggleClass("note-float-right","right"===t),o.css("float","none"===t?"":t)})),this.resize=this.wrapCommand((function(t){var o=e()(n.restoreTarget());0===(t=parseFloat(t))?o.css("width",""):o.css({width:100*t+"%",height:""})}))}var o,n,i;return o=t,n=[{key:"initialize",value:function(){var t=this;this.$editable.on("keydown",(function(e){if(e.keyCode===wt.code.ENTER&&t.context.triggerEvent("enter",e),t.context.triggerEvent("keydown",e),t.snapshot=t.history.makeSnapshot(),t.hasKeyShortCut=!1,e.isDefaultPrevented()||(t.options.shortcuts?t.hasKeyShortCut=t.handleKeyMap(e):t.preventDefaultEditableShortCuts(e)),t.isLimited(1,e)){var o=t.getLastRange();if(o.eo-o.so==0)return!1}t.setLastRange(),t.options.recordEveryKeystroke&&!1===t.hasKeyShortCut&&t.history.recordUndo()})).on("keyup",(function(e){t.setLastRange(),t.context.triggerEvent("keyup",e)})).on("focus",(function(e){t.setLastRange(),t.context.triggerEvent("focus",e)})).on("blur",(function(e){t.context.triggerEvent("blur",e)})).on("mousedown",(function(e){t.context.triggerEvent("mousedown",e)})).on("mouseup",(function(e){t.setLastRange(),t.history.recordUndo(),t.context.triggerEvent("mouseup",e)})).on("scroll",(function(e){t.context.triggerEvent("scroll",e)})).on("paste",(function(e){t.setLastRange(),t.context.triggerEvent("paste",e)})).on("input",(function(){t.isLimited(0)&&t.snapshot&&t.history.applySnapshot(t.snapshot)})),this.$editable.attr("spellcheck",this.options.spellCheck),this.$editable.attr("autocorrect",this.options.spellCheck),this.options.disableGrammar&&this.$editable.attr("data-gramm",!1),this.$editable.html(ht.html(this.$note)||ht.emptyPara),this.$editable.on(f.inputEventName,v.debounce((function(){t.context.triggerEvent("change",t.$editable.html(),t.$editable)}),10)),this.$editable.on("focusin",(function(e){t.context.triggerEvent("focusin",e)})).on("focusout",(function(e){t.context.triggerEvent("focusout",e)})),this.options.airMode?this.options.overrideContextMenu&&this.$editor.on("contextmenu",(function(e){return t.context.triggerEvent("contextmenu",e),!1})):(this.options.width&&this.$editor.outerWidth(this.options.width),this.options.height&&this.$editable.outerHeight(this.options.height),this.options.maxHeight&&this.$editable.css("max-height",this.options.maxHeight),this.options.minHeight&&this.$editable.css("min-height",this.options.minHeight)),this.history.recordUndo(),this.setLastRange()}},{key:"destroy",value:function(){this.$editable.off()}},{key:"handleKeyMap",value:function(t){var e=this.options.keyMap[f.isMac?"mac":"pc"],o=[];t.metaKey&&o.push("CMD"),t.ctrlKey&&!t.altKey&&o.push("CTRL"),t.shiftKey&&o.push("SHIFT");var n=wt.nameFromCode[t.keyCode];n&&o.push(n);var i=e[o.join("+")];if("TAB"!==n||this.options.tabDisable)if(i){if(!1!==this.context.invoke(i))return t.preventDefault(),!0}else wt.isEdit(t.keyCode)&&this.afterCommand();else this.afterCommand();return!1}},{key:"preventDefaultEditableShortCuts",value:function(t){(t.ctrlKey||t.metaKey)&&y.contains([66,73,85],t.keyCode)&&t.preventDefault()}},{key:"isLimited",value:function(t,e){return t=t||0,(void 0===e||!(wt.isMove(e.keyCode)||wt.isNavigation(e.keyCode)||e.ctrlKey||e.metaKey||y.contains([wt.code.BACKSPACE,wt.code.DELETE],e.keyCode)))&&this.options.maxTextLength>0&&this.$editable.text().length+t>this.options.maxTextLength}},{key:"createRange",value:function(){return this.focus(),this.setLastRange(),this.getLastRange()}},{key:"createRangeFromList",value:function(t){var e=kt.createFromNodeBefore(y.head(t)).getStartPoint(),o=kt.createFromNodeAfter(y.last(t)).getEndPoint();return kt.create(e.node,e.offset,o.node,o.offset)}},{key:"setLastRange",value:function(t){t?this.lastRange=t:(this.lastRange=kt.create(this.editable),0===e()(this.lastRange.sc).closest(".note-editable").length&&(this.lastRange=kt.createFromBodyElement(this.editable)))}},{key:"getLastRange",value:function(){return this.lastRange||this.setLastRange(),this.lastRange}},{key:"saveRange",value:function(t){t&&this.getLastRange().collapse().select()}},{key:"restoreRange",value:function(){this.lastRange&&(this.lastRange.select(),this.focus())}},{key:"saveTarget",value:function(t){this.$editable.data("target",t)}},{key:"clearTarget",value:function(){this.$editable.removeData("target")}},{key:"restoreTarget",value:function(){return this.$editable.data("target")}},{key:"currentStyle",value:function(){var t=kt.create();return t&&(t=t.normalize()),t?this.style.current(t):this.style.fromNode(this.$editable)}},{key:"styleFromNode",value:function(t){return this.style.fromNode(t)}},{key:"undo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.undo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"commit",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.commit(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"redo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.redo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"beforeCommand",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),document.execCommand("styleWithCSS",!1,this.options.styleWithCSS),this.focus()}},{key:"afterCommand",value:function(t){this.normalizeContent(),this.history.recordUndo(),t||this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"tab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t);else{if(0===this.options.tabSize)return!1;this.isLimited(this.options.tabSize)||(this.beforeCommand(),this.typing.insertTab(t,this.options.tabSize),this.afterCommand())}}},{key:"untab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t,!0);else if(0===this.options.tabSize)return!1}},{key:"wrapCommand",value:function(t){return function(){this.beforeCommand(),t.apply(this,arguments),this.afterCommand()}}},{key:"insertImage",value:function(t,o){var n,i=this;return(n=t,e().Deferred((function(t){var o=e()("<img>");o.one("load",(function(){o.off("error abort"),t.resolve(o)})).one("error abort",(function(){o.off("load").detach(),t.reject(o)})).css({display:"none"}).appendTo(document.body).attr("src",n)})).promise()).then((function(t){i.beforeCommand(),"function"==typeof o?o(t):("string"==typeof o&&t.attr("data-filename",o),t.css("width",Math.min(i.$editable.width(),t.width()))),t.show(),i.getLastRange().insertNode(t[0]),i.setLastRange(kt.createFromNodeAfter(t[0]).select()),i.afterCommand()})).fail((function(t){i.context.triggerEvent("image.upload.error",t)}))}},{key:"insertImagesAsDataURL",value:function(t){var o=this;e().each(t,(function(t,n){var i=n.name;o.options.maximumImageFileSize&&o.options.maximumImageFileSize<n.size?o.context.triggerEvent("image.upload.error",o.lang.image.maximumFileSizeError):function(t){return e().Deferred((function(o){e().extend(new FileReader,{onload:function(t){var e=t.target.result;o.resolve(e)},onerror:function(t){o.reject(t)}}).readAsDataURL(t)})).promise()}(n).then((function(t){return o.insertImage(t,i)})).fail((function(){o.context.triggerEvent("image.upload.error")}))}))}},{key:"insertImagesOrCallback",value:function(t){this.options.callbacks.onImageUpload?this.context.triggerEvent("image.upload",t):this.insertImagesAsDataURL(t)}},{key:"getSelectedText",value:function(){var t=this.getLastRange();return t.isOnAnchor()&&(t=kt.createFromNode(ht.ancestor(t.sc,ht.isAnchor))),t.toString()}},{key:"onFormatBlock",value:function(t,o){if(document.execCommand("FormatBlock",!1,f.isMSIE?"<"+t+">":t),o&&o.length&&(o[0].tagName.toUpperCase()!==t.toUpperCase()&&(o=o.find(t)),o&&o.length)){var n=this.createRange(),i=e()([n.sc,n.ec]).closest(t);i.removeClass();var r=o[0].className||"";r&&i.addClass(r)}}},{key:"formatPara",value:function(){this.formatBlock("P")}},{key:"fontStyling",value:function(t,o){var n=this.getLastRange();if(""!==n){var i=this.style.styleNodes(n);if(this.$editor.find(".note-status-output").html(""),e()(i).css(t,o),n.isCollapsed()){var r=y.head(i);r&&!ht.nodeLength(r)&&(r.innerHTML=ht.ZERO_WIDTH_NBSP_CHAR,kt.createFromNode(r.firstChild).select(),this.setLastRange(),this.$editable.data("bogus",r))}else this.setLastRange(this.createRangeFromList(i).select())}else{var a=e().now();this.$editor.find(".note-status-output").html('<div id="note-status-output-'+a+'" class="alert alert-info">'+this.lang.output.noSelection+"</div>"),setTimeout((function(){e()("#note-status-output-"+a).remove()}),5e3)}}},{key:"unlink",value:function(){var t=this.getLastRange();if(t.isOnAnchor()){var e=ht.ancestor(t.sc,ht.isAnchor);(t=kt.createFromNode(e)).select(),this.setLastRange(),this.beforeCommand(),document.execCommand("unlink"),this.afterCommand()}}},{key:"getLinkInfo",value:function(){var t=this.getLastRange().expand(ht.isAnchor),o=e()(y.head(t.nodes(ht.isAnchor))),n={range:t,text:t.toString(),url:o.length?o.attr("href"):""};return o.length&&(n.isNewWindow="_blank"===o.attr("target")),n}},{key:"addRow",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addRow(e,t),this.afterCommand())}},{key:"addCol",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addCol(e,t),this.afterCommand())}},{key:"deleteRow",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteRow(t),this.afterCommand())}},{key:"deleteCol",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteCol(t),this.afterCommand())}},{key:"deleteTable",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteTable(t),this.afterCommand())}},{key:"resizeTo",value:function(t,e,o){var n;if(o){var i=t.y/t.x,r=e.data("ratio");n={width:r>i?t.x:t.y/r,height:r>i?t.x*r:t.y}}else n={width:t.x,height:t.y};e.css(n)}},{key:"hasFocus",value:function(){return this.$editable.is(":focus")}},{key:"focus",value:function(){this.hasFocus()||this.$editable.focus()}},{key:"isEmpty",value:function(){return ht.isEmpty(this.$editable[0])||ht.emptyPara===this.$editable.html()}},{key:"empty",value:function(){this.context.invoke("code",ht.emptyPara)}},{key:"normalizeContent",value:function(){this.$editable[0].normalize()}}],n&&At(o.prototype,n),i&&At(o,i),t}();function Dt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Ht=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editable=e.layoutInfo.editable}var e,o,n;return e=t,(o=[{key:"initialize",value:function(){this.$editable.on("paste",this.pasteByEvent.bind(this))}},{key:"pasteByEvent",value:function(t){var e=this,o=t.originalEvent.clipboardData;if(o&&o.items&&o.items.length){var n=o.items.length>1?o.items[1]:y.head(o.items);"file"===n.kind&&-1!==n.type.indexOf("image/")?(this.context.invoke("editor.insertImagesOrCallback",[n.getAsFile()]),t.preventDefault()):"string"===n.kind&&this.context.invoke("editor.isLimited",o.getData("Text").length)&&t.preventDefault()}else if(window.clipboardData){var i=window.clipboardData.getData("text");this.context.invoke("editor.isLimited",i.length)&&t.preventDefault()}setTimeout((function(){e.context.invoke("editor.afterCommand")}),10)}}])&&Dt(e.prototype,o),n&&Dt(e,n),t}();function Bt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var zt=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.$eventListener=e()(document),this.$editor=o.layoutInfo.editor,this.$editable=o.layoutInfo.editable,this.options=o.options,this.lang=this.options.langInfo,this.documentEventHandlers={},this.$dropzone=e()(['<div class="note-dropzone">','<div class="note-dropzone-message"></div>',"</div>"].join("")).prependTo(this.$editor)}var o,n,i;return o=t,n=[{key:"initialize",value:function(){this.options.disableDragAndDrop?(this.documentEventHandlers.onDrop=function(t){t.preventDefault()},this.$eventListener=this.$dropzone,this.$eventListener.on("drop",this.documentEventHandlers.onDrop)):this.attachDragAndDropEvent()}},{key:"attachDragAndDropEvent",value:function(){var t=this,o=e()(),n=this.$dropzone.find(".note-dropzone-message");this.documentEventHandlers.onDragenter=function(e){var i=t.context.invoke("codeview.isActivated"),r=t.$editor.width()>0&&t.$editor.height()>0;i||o.length||!r||(t.$editor.addClass("dragover"),t.$dropzone.width(t.$editor.width()),t.$dropzone.height(t.$editor.height()),n.text(t.lang.image.dragImageHere)),o=o.add(e.target)},this.documentEventHandlers.onDragleave=function(n){(o=o.not(n.target)).length&&"BODY"!==n.target.nodeName||(o=e()(),t.$editor.removeClass("dragover"))},this.documentEventHandlers.onDrop=function(){o=e()(),t.$editor.removeClass("dragover")},this.$eventListener.on("dragenter",this.documentEventHandlers.onDragenter).on("dragleave",this.documentEventHandlers.onDragleave).on("drop",this.documentEventHandlers.onDrop),this.$dropzone.on("dragenter",(function(){t.$dropzone.addClass("hover"),n.text(t.lang.image.dropImage)})).on("dragleave",(function(){t.$dropzone.removeClass("hover"),n.text(t.lang.image.dragImageHere)})),this.$dropzone.on("drop",(function(o){var n=o.originalEvent.dataTransfer;o.preventDefault(),n&&n.files&&n.files.length?(t.$editable.focus(),t.context.invoke("editor.insertImagesOrCallback",n.files)):e().each(n.types,(function(o,i){if(!(i.toLowerCase().indexOf("_moz_")>-1)){var r=n.getData(i);i.toLowerCase().indexOf("text")>-1?t.context.invoke("editor.pasteHTML",r):e()(r).each((function(e,o){t.context.invoke("editor.insertNode",o)}))}}))})).on("dragover",!1)}},{key:"destroy",value:function(){var t=this;Object.keys(this.documentEventHandlers).forEach((function(e){t.$eventListener.off(e.substr(2).toLowerCase(),t.documentEventHandlers[e])})),this.documentEventHandlers={}}}],n&&Bt(o.prototype,n),i&&Bt(o,i),t}();function Mt(t,e){var o="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!o){if(Array.isArray(t)||(o=function(t,e){if(!t)return;if("string"==typeof t)return Ot(t,e);var o=Object.prototype.toString.call(t).slice(8,-1);"Object"===o&&t.constructor&&(o=t.constructor.name);if("Map"===o||"Set"===o)return Array.from(t);if("Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return Ot(t,e)}(t))||e&&t&&"number"==typeof t.length){o&&(t=o);var n=0,i=function(){};return{s:i,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,a=!0,s=!1;return{s:function(){o=o.call(t)},n:function(){var t=o.next();return a=t.done,t},e:function(t){s=!0,r=t},f:function(){try{a||null==o.return||o.return()}finally{if(s)throw r}}}}function Ot(t,e){(null==e||e>t.length)&&(e=t.length);for(var o=0,n=new Array(e);o<e;o++)n[o]=t[o];return n}function jt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Ut=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editor=e.layoutInfo.editor,this.$editable=e.layoutInfo.editable,this.$codable=e.layoutInfo.codable,this.options=e.options,this.CodeMirrorConstructor=window.CodeMirror,this.options.codemirror.CodeMirrorConstructor&&(this.CodeMirrorConstructor=this.options.codemirror.CodeMirrorConstructor)}var e,o,n;return e=t,o=[{key:"sync",value:function(t){var e=this.isActivated(),o=this.CodeMirrorConstructor;e&&(t?o?this.$codable.data("cmEditor").getDoc().setValue(t):this.$codable.val(t):o&&this.$codable.data("cmEditor").save())}},{key:"initialize",value:function(){var t=this;this.$codable.on("keyup",(function(e){e.keyCode===wt.code.ESCAPE&&t.deactivate()}))}},{key:"isActivated",value:function(){return this.$editor.hasClass("codeview")}},{key:"toggle",value:function(){this.isActivated()?this.deactivate():this.activate(),this.context.triggerEvent("codeview.toggled")}},{key:"purify",value:function(t){if(this.options.codeviewFilter&&(t=t.replace(this.options.codeviewFilterRegex,""),this.options.codeviewIframeFilter)){var e=this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);t=t.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi,(function(t){if(/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(t))return"";var o,n=Mt(e);try{for(n.s();!(o=n.n()).done;){var i=o.value;if(new RegExp('src="(https?:)?//'+i.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+'/(.+)"').test(t))return t}}catch(t){n.e(t)}finally{n.f()}return""}))}return t}},{key:"activate",value:function(){var t=this,e=this.CodeMirrorConstructor;if(this.$codable.val(ht.html(this.$editable,this.options.prettifyHtml)),this.$codable.height(this.$editable.height()),this.context.invoke("toolbar.updateCodeview",!0),this.context.invoke("airPopover.updateCodeview",!0),this.$editor.addClass("codeview"),this.$codable.focus(),e){var o=e.fromTextArea(this.$codable[0],this.options.codemirror);if(this.options.codemirror.tern){var n=new e.TernServer(this.options.codemirror.tern);o.ternServer=n,o.on("cursorActivity",(function(t){n.updateArgHints(t)}))}o.on("blur",(function(e){t.context.triggerEvent("blur.codeview",o.getValue(),e)})),o.on("change",(function(){t.context.triggerEvent("change.codeview",o.getValue(),o)})),o.setSize(null,this.$editable.outerHeight()),this.$codable.data("cmEditor",o)}else this.$codable.on("blur",(function(e){t.context.triggerEvent("blur.codeview",t.$codable.val(),e)})),this.$codable.on("input",(function(){t.context.triggerEvent("change.codeview",t.$codable.val(),t.$codable)}))}},{key:"deactivate",value:function(){if(this.CodeMirrorConstructor){var t=this.$codable.data("cmEditor");this.$codable.val(t.getValue()),t.toTextArea()}var e=this.purify(ht.value(this.$codable,this.options.prettifyHtml)||ht.emptyPara),o=this.$editable.html()!==e;this.$editable.html(e),this.$editable.height(this.options.height?this.$codable.height():"auto"),this.$editor.removeClass("codeview"),o&&this.context.triggerEvent("change",this.$editable.html(),this.$editable),this.$editable.focus(),this.context.invoke("toolbar.updateCodeview",!1),this.context.invoke("airPopover.updateCodeview",!1)}},{key:"destroy",value:function(){this.isActivated()&&this.deactivate()}}],o&&jt(e.prototype,o),n&&jt(e,n),t}();function Wt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Kt=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$document=e()(document),this.$statusbar=o.layoutInfo.statusbar,this.$editable=o.layoutInfo.editable,this.$codable=o.layoutInfo.codable,this.options=o.options}var o,n,i;return o=t,(n=[{key:"initialize",value:function(){var t=this;this.options.airMode||this.options.disableResizeEditor?this.destroy():this.$statusbar.on("mousedown",(function(e){e.preventDefault(),e.stopPropagation();var o=t.$editable.offset().top-t.$document.scrollTop(),n=t.$codable.offset().top-t.$document.scrollTop(),i=function(e){var i=e.clientY-(o+24),r=e.clientY-(n+24);i=t.options.minheight>0?Math.max(i,t.options.minheight):i,i=t.options.maxHeight>0?Math.min(i,t.options.maxHeight):i,r=t.options.minheight>0?Math.max(r,t.options.minheight):r,r=t.options.maxHeight>0?Math.min(r,t.options.maxHeight):r,t.$editable.height(i),t.$codable.height(r)};t.$document.on("mousemove",i).one("mouseup",(function(){t.$document.off("mousemove",i)}))}))}},{key:"destroy",value:function(){this.$statusbar.off(),this.$statusbar.addClass("locked")}}])&&Wt(o.prototype,n),i&&Wt(o,i),t}();function Vt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var qt=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.$editor=o.layoutInfo.editor,this.$toolbar=o.layoutInfo.toolbar,this.$editable=o.layoutInfo.editable,this.$codable=o.layoutInfo.codable,this.$window=e()(window),this.$scrollbar=e()("html, body"),this.scrollbarClassName="note-fullscreen-body",this.onResize=function(){n.resizeTo({h:n.$window.height()-n.$toolbar.outerHeight()})}}var o,n,i;return o=t,(n=[{key:"resizeTo",value:function(t){this.$editable.css("height",t.h),this.$codable.css("height",t.h),this.$codable.data("cmeditor")&&this.$codable.data("cmeditor").setsize(null,t.h)}},{key:"toggle",value:function(){this.$editor.toggleClass("fullscreen");var t=this.isFullscreen();this.$scrollbar.toggleClass(this.scrollbarClassName,t),t?(this.$editable.data("orgHeight",this.$editable.css("height")),this.$editable.data("orgMaxHeight",this.$editable.css("maxHeight")),this.$editable.css("maxHeight",""),this.$window.on("resize",this.onResize).trigger("resize")):(this.$window.off("resize",this.onResize),this.resizeTo({h:this.$editable.data("orgHeight")}),this.$editable.css("maxHeight",this.$editable.css("orgMaxHeight"))),this.context.invoke("toolbar.updateFullscreen",t)}},{key:"isFullscreen",value:function(){return this.$editor.hasClass("fullscreen")}},{key:"destroy",value:function(){this.$scrollbar.removeClass(this.scrollbarClassName)}}])&&Vt(o.prototype,n),i&&Vt(o,i),t}();function _t(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Gt=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.$document=e()(document),this.$editingArea=o.layoutInfo.editingArea,this.options=o.options,this.lang=this.options.langInfo,this.events={"summernote.mousedown":function(t,e){n.update(e.target,e)&&e.preventDefault()},"summernote.keyup summernote.scroll summernote.change summernote.dialog.shown":function(){n.update()},"summernote.disable summernote.blur":function(){n.hide()},"summernote.codeview.toggled":function(){n.update()}}}var o,n,i;return o=t,n=[{key:"initialize",value:function(){var t=this;this.$handle=e()(['<div class="note-handle">','<div class="note-control-selection">','<div class="note-control-selection-bg"></div>','<div class="note-control-holder note-control-nw"></div>','<div class="note-control-holder note-control-ne"></div>','<div class="note-control-holder note-control-sw"></div>','<div class="',this.options.disableResizeImage?"note-control-holder":"note-control-sizing",' note-control-se"></div>',this.options.disableResizeImage?"":'<div class="note-control-selection-info"></div>',"</div>","</div>"].join("")).prependTo(this.$editingArea),this.$handle.on("mousedown",(function(e){if(ht.isControlSizing(e.target)){e.preventDefault(),e.stopPropagation();var o=t.$handle.find(".note-control-selection").data("target"),n=o.offset(),i=t.$document.scrollTop(),r=function(e){t.context.invoke("editor.resizeTo",{x:e.clientX-n.left,y:e.clientY-(n.top-i)},o,!e.shiftKey),t.update(o[0],e)};t.$document.on("mousemove",r).one("mouseup",(function(e){e.preventDefault(),t.$document.off("mousemove",r),t.context.invoke("editor.afterCommand")})),o.data("ratio")||o.data("ratio",o.height()/o.width())}})),this.$handle.on("wheel",(function(e){e.preventDefault(),t.update()}))}},{key:"destroy",value:function(){this.$handle.remove()}},{key:"update",value:function(t,o){if(this.context.isDisabled())return!1;var n=ht.isImg(t),i=this.$handle.find(".note-control-selection");if(this.context.invoke("imagePopover.update",t,o),n){var r=e()(t),a=r.position(),s={left:a.left+parseInt(r.css("marginLeft"),10),top:a.top+parseInt(r.css("marginTop"),10)},l={w:r.outerWidth(!1),h:r.outerHeight(!1)};i.css({display:"block",left:s.left,top:s.top,width:l.w,height:l.h}).data("target",r);var c=new Image;c.src=r.attr("src");var u=l.w+"x"+l.h+" ("+this.lang.image.original+": "+c.width+"x"+c.height+")";i.find(".note-control-selection-info").text(u),this.context.invoke("editor.saveTarget",t)}else this.hide();return n}},{key:"hide",value:function(){this.context.invoke("editor.clearTarget"),this.$handle.children().hide()}}],n&&_t(o.prototype,n),i&&_t(o,i),t}();function Yt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Zt=/^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i,Xt=function(){function t(e){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||o.handleKeyup(e)},"summernote.keydown":function(t,e){o.handleKeydown(e)}}}var o,n,i;return o=t,(n=[{key:"initialize",value:function(){this.lastWordRange=null}},{key:"destroy",value:function(){this.lastWordRange=null}},{key:"replace",value:function(){if(this.lastWordRange){var t=this.lastWordRange.toString(),o=t.match(Zt);if(o&&(o[1]||o[2])){var n=o[1]?t:"http://"+t,i=this.options.showDomainOnlyForAutolink?t.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i,"").split("/")[0]:t,r=e()("<a></a>").html(i).attr("href",n)[0];this.context.options.linkTargetBlank&&e()(r).attr("target","_blank"),this.lastWordRange.insertNode(r),this.lastWordRange=null,this.context.invoke("editor.focus")}}}},{key:"handleKeydown",value:function(t){if(y.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWordRange=e}}},{key:"handleKeyup",value:function(t){y.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)&&this.replace()}}])&&Yt(o.prototype,n),i&&Yt(o,i),t}();function Qt(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Jt=function(){function t(e){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=e.layoutInfo.note,this.events={"summernote.change":function(){o.$note.val(e.invoke("code"))}}}var e,o,n;return e=t,(o=[{key:"shouldInitialize",value:function(){return ht.isTextarea(this.$note[0])}}])&&Qt(e.prototype,o),n&&Qt(e,n),t}();function te(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var ee=function(){function t(e){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options.replace||{},this.keys=[wt.code.ENTER,wt.code.SPACE,wt.code.PERIOD,wt.code.COMMA,wt.code.SEMICOLON,wt.code.SLASH],this.previousKeydownCode=null,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||o.handleKeyup(e)},"summernote.keydown":function(t,e){o.handleKeydown(e)}}}var e,o,n;return e=t,(o=[{key:"shouldInitialize",value:function(){return!!this.options.match}},{key:"initialize",value:function(){this.lastWord=null}},{key:"destroy",value:function(){this.lastWord=null}},{key:"replace",value:function(){if(this.lastWord){var t=this,e=this.lastWord.toString();this.options.match(e,(function(e){if(e){var o="";if("string"==typeof e?o=ht.createText(e):e instanceof jQuery?o=e[0]:e instanceof Node&&(o=e),!o)return;t.lastWord.insertNode(o),t.lastWord=null,t.context.invoke("editor.focus")}}))}}},{key:"handleKeydown",value:function(t){if(this.previousKeydownCode&&y.contains(this.keys,this.previousKeydownCode))this.previousKeydownCode=t.keyCode;else{if(y.contains(this.keys,t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWord=e}this.previousKeydownCode=t.keyCode}}},{key:"handleKeyup",value:function(t){y.contains(this.keys,t.keyCode)&&this.replace()}}])&&te(e.prototype,o),n&&te(e,n),t}();function oe(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var ne=function(){function t(e){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editingArea=e.layoutInfo.editingArea,this.options=e.options,!0===this.options.inheritPlaceholder&&(this.options.placeholder=this.context.$note.attr("placeholder")||this.options.placeholder),this.events={"summernote.init summernote.change":function(){o.update()},"summernote.codeview.toggled":function(){o.update()}}}var o,n,i;return o=t,(n=[{key:"shouldInitialize",value:function(){return!!this.options.placeholder}},{key:"initialize",value:function(){var t=this;this.$placeholder=e()('<div class="note-placeholder"></div>'),this.$placeholder.on("click",(function(){t.context.invoke("focus")})).html(this.options.placeholder).prependTo(this.$editingArea),this.update()}},{key:"destroy",value:function(){this.$placeholder.remove()}},{key:"update",value:function(){var t=!this.context.invoke("codeview.isActivated")&&this.context.invoke("editor.isEmpty");this.$placeholder.toggle(t)}}])&&oe(o.prototype,n),i&&oe(o,i),t}();function ie(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var re=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.ui=e().summernote.ui,this.context=o,this.$toolbar=o.layoutInfo.toolbar,this.options=o.options,this.lang=this.options.langInfo,this.invertedKeyMap=v.invertObject(this.options.keyMap[f.isMac?"mac":"pc"])}var o,n,i;return o=t,n=[{key:"representShortcut",value:function(t){var e=this.invertedKeyMap[t];return this.options.shortcuts&&e?(f.isMac&&(e=e.replace("CMD","⌘").replace("SHIFT","⇧"))," ("+(e=e.replace("BACKSLASH","\\").replace("SLASH","/").replace("LEFTBRACKET","[").replace("RIGHTBRACKET","]"))+")"):""}},{key:"button",value:function(t){return!this.options.tooltip&&t.tooltip&&delete t.tooltip,t.container=this.options.container,this.ui.button(t)}},{key:"initialize",value:function(){this.addToolbarButtons(),this.addImagePopoverButtons(),this.addLinkPopoverButtons(),this.addTablePopoverButtons(),this.fontInstalledMap={}}},{key:"destroy",value:function(){delete this.fontInstalledMap}},{key:"isFontInstalled",value:function(t){return Object.prototype.hasOwnProperty.call(this.fontInstalledMap,t)||(this.fontInstalledMap[t]=f.isFontInstalled(t)||y.contains(this.options.fontNamesIgnoreCheck,t)),this.fontInstalledMap[t]}},{key:"isFontDeservedToAdd",value:function(t){return""!==(t=t.toLowerCase())&&this.isFontInstalled(t)&&-1===f.genericFontFamilies.indexOf(t)}},{key:"colorPalette",value:function(t,o,n,i){var r=this;return this.ui.buttonGroup({className:"note-color "+t,children:[this.button({className:"note-current-color-button",contents:this.ui.icon(this.options.icons.font+" note-recent-color"),tooltip:o,click:function(t){var o=e()(t.currentTarget);n&&i?r.context.invoke("editor.color",{backColor:o.attr("data-backColor"),foreColor:o.attr("data-foreColor")}):n?r.context.invoke("editor.color",{backColor:o.attr("data-backColor")}):i&&r.context.invoke("editor.color",{foreColor:o.attr("data-foreColor")})},callback:function(t){var e=t.find(".note-recent-color");n&&(e.css("background-color",r.options.colorButton.backColor),t.attr("data-backColor",r.options.colorButton.backColor)),i?(e.css("color",r.options.colorButton.foreColor),t.attr("data-foreColor",r.options.colorButton.foreColor)):e.css("color","transparent")}}),this.button({className:"dropdown-toggle",contents:this.ui.dropdownButtonContents("",this.options),tooltip:this.lang.color.more,data:{toggle:"dropdown"}}),this.ui.dropdown({items:(n?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.background+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">',this.lang.color.transparent,"</button>","</div>",'<div class="note-holder" data-event="backColor">\x3c!-- back colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="backColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.backColor+'" data-event="backColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="backColorPalette-'+this.options.id+'" data-event="backColor"></div>',"</div>"].join(""):"")+(i?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.foreground+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">',this.lang.color.resetToDefault,"</button>","</div>",'<div class="note-holder" data-event="foreColor">\x3c!-- fore colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="foreColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.foreColor+'" data-event="foreColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="foreColorPalette-'+this.options.id+'" data-event="foreColor"></div>',"</div>"].join(""):""),callback:function(t){t.find(".note-holder").each((function(t,o){var n=e()(o);n.append(r.ui.palette({colors:r.options.colors,colorsName:r.options.colorsName,eventName:n.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())}));var o=[["#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF"]];t.find(".note-holder-custom").each((function(t,n){var i=e()(n);i.append(r.ui.palette({colors:o,colorsName:o,eventName:i.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())})),t.find("input[type=color]").each((function(o,n){e()(n).change((function(){var o=t.find("#"+e()(this).data("event")).find(".note-color-btn").first(),n=this.value.toUpperCase();o.css("background-color",n).attr("aria-label",n).attr("data-value",n).attr("data-original-title",n),o.click()}))}))},click:function(o){o.stopPropagation();var n=e()("."+t).find(".note-dropdown-menu"),i=e()(o.target),a=i.data("event"),s=i.attr("data-value");if("openPalette"===a){var l=n.find("#"+s),c=e()(n.find("#"+l.data("event")).find(".note-color-row")[0]),u=c.find(".note-color-btn").last().detach(),d=l.val();u.css("background-color",d).attr("aria-label",d).attr("data-value",d).attr("data-original-title",d),c.prepend(u),l.click()}else{if(y.contains(["backColor","foreColor"],a)){var h="backColor"===a?"background-color":"color",f=i.closest(".note-color").find(".note-recent-color"),p=i.closest(".note-color").find(".note-current-color-button");f.css(h,s),p.attr("data-"+a,s)}r.context.invoke("editor."+a,s)}}})]}).render()}},{key:"addToolbarButtons",value:function(){var t=this;this.context.memo("button.style",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.magic),t.options),tooltip:t.lang.style.style,data:{toggle:"dropdown"}}),t.ui.dropdown({className:"dropdown-style",items:t.options.styleTags,title:t.lang.style.style,template:function(e){"string"==typeof e&&(e={tag:e,title:Object.prototype.hasOwnProperty.call(t.lang.style,e)?t.lang.style[e]:e});var o=e.tag,n=e.title;return"<"+o+(e.style?' style="'+e.style+'" ':"")+(e.className?' class="'+e.className+'"':"")+">"+n+"</"+o+">"},click:t.context.createInvokeHandler("editor.formatBlock")})]).render()}));for(var o=function(e,o){var n=t.options.styleTags[e];t.context.memo("button.style."+n,(function(){return t.button({className:"note-btn-style-"+n,contents:'<div data-value="'+n+'">'+n.toUpperCase()+"</div>",tooltip:t.lang.style[n],click:t.context.createInvokeHandler("editor.formatBlock")}).render()}))},n=0,i=this.options.styleTags.length;n<i;n++)o(n);this.context.memo("button.bold",(function(){return t.button({className:"note-btn-bold",contents:t.ui.icon(t.options.icons.bold),tooltip:t.lang.font.bold+t.representShortcut("bold"),click:t.context.createInvokeHandlerAndUpdateState("editor.bold")}).render()})),this.context.memo("button.italic",(function(){return t.button({className:"note-btn-italic",contents:t.ui.icon(t.options.icons.italic),tooltip:t.lang.font.italic+t.representShortcut("italic"),click:t.context.createInvokeHandlerAndUpdateState("editor.italic")}).render()})),this.context.memo("button.underline",(function(){return t.button({className:"note-btn-underline",contents:t.ui.icon(t.options.icons.underline),tooltip:t.lang.font.underline+t.representShortcut("underline"),click:t.context.createInvokeHandlerAndUpdateState("editor.underline")}).render()})),this.context.memo("button.clear",(function(){return t.button({contents:t.ui.icon(t.options.icons.eraser),tooltip:t.lang.font.clear+t.representShortcut("removeFormat"),click:t.context.createInvokeHandler("editor.removeFormat")}).render()})),this.context.memo("button.strikethrough",(function(){return t.button({className:"note-btn-strikethrough",contents:t.ui.icon(t.options.icons.strikethrough),tooltip:t.lang.font.strikethrough+t.representShortcut("strikethrough"),click:t.context.createInvokeHandlerAndUpdateState("editor.strikethrough")}).render()})),this.context.memo("button.superscript",(function(){return t.button({className:"note-btn-superscript",contents:t.ui.icon(t.options.icons.superscript),tooltip:t.lang.font.superscript,click:t.context.createInvokeHandlerAndUpdateState("editor.superscript")}).render()})),this.context.memo("button.subscript",(function(){return t.button({className:"note-btn-subscript",contents:t.ui.icon(t.options.icons.subscript),tooltip:t.lang.font.subscript,click:t.context.createInvokeHandlerAndUpdateState("editor.subscript")}).render()})),this.context.memo("button.fontname",(function(){var o=t.context.invoke("editor.currentStyle");return t.options.addDefaultFonts&&e().each(o["font-family"].split(","),(function(e,o){o=o.trim().replace(/['"]+/g,""),t.isFontDeservedToAdd(o)&&-1===t.options.fontNames.indexOf(o)&&t.options.fontNames.push(o)})),t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontname"></span>',t.options),tooltip:t.lang.font.name,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontname",checkClassName:t.options.icons.menuCheck,items:t.options.fontNames.filter(t.isFontInstalled.bind(t)),title:t.lang.font.name,template:function(t){return'<span style="font-family: '+f.validFontName(t)+'">'+t+"</span>"},click:t.context.createInvokeHandlerAndUpdateState("editor.fontName")})]).render()})),this.context.memo("button.fontsize",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>',t.options),tooltip:t.lang.font.size,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsize",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizes,title:t.lang.font.size,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSize")})]).render()})),this.context.memo("button.fontsizeunit",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>',t.options),tooltip:t.lang.font.sizeunit,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsizeunit",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizeUnits,title:t.lang.font.sizeunit,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSizeUnit")})]).render()})),this.context.memo("button.color",(function(){return t.colorPalette("note-color-all",t.lang.color.recent,!0,!0)})),this.context.memo("button.forecolor",(function(){return t.colorPalette("note-color-fore",t.lang.color.foreground,!1,!0)})),this.context.memo("button.backcolor",(function(){return t.colorPalette("note-color-back",t.lang.color.background,!0,!1)})),this.context.memo("button.ul",(function(){return t.button({contents:t.ui.icon(t.options.icons.unorderedlist),tooltip:t.lang.lists.unordered+t.representShortcut("insertUnorderedList"),click:t.context.createInvokeHandler("editor.insertUnorderedList")}).render()})),this.context.memo("button.ol",(function(){return t.button({contents:t.ui.icon(t.options.icons.orderedlist),tooltip:t.lang.lists.ordered+t.representShortcut("insertOrderedList"),click:t.context.createInvokeHandler("editor.insertOrderedList")}).render()}));var r=this.button({contents:this.ui.icon(this.options.icons.alignLeft),tooltip:this.lang.paragraph.left+this.representShortcut("justifyLeft"),click:this.context.createInvokeHandler("editor.justifyLeft")}),a=this.button({contents:this.ui.icon(this.options.icons.alignCenter),tooltip:this.lang.paragraph.center+this.representShortcut("justifyCenter"),click:this.context.createInvokeHandler("editor.justifyCenter")}),s=this.button({contents:this.ui.icon(this.options.icons.alignRight),tooltip:this.lang.paragraph.right+this.representShortcut("justifyRight"),click:this.context.createInvokeHandler("editor.justifyRight")}),l=this.button({contents:this.ui.icon(this.options.icons.alignJustify),tooltip:this.lang.paragraph.justify+this.representShortcut("justifyFull"),click:this.context.createInvokeHandler("editor.justifyFull")}),c=this.button({contents:this.ui.icon(this.options.icons.outdent),tooltip:this.lang.paragraph.outdent+this.representShortcut("outdent"),click:this.context.createInvokeHandler("editor.outdent")}),u=this.button({contents:this.ui.icon(this.options.icons.indent),tooltip:this.lang.paragraph.indent+this.representShortcut("indent"),click:this.context.createInvokeHandler("editor.indent")});this.context.memo("button.justifyLeft",v.invoke(r,"render")),this.context.memo("button.justifyCenter",v.invoke(a,"render")),this.context.memo("button.justifyRight",v.invoke(s,"render")),this.context.memo("button.justifyFull",v.invoke(l,"render")),this.context.memo("button.outdent",v.invoke(c,"render")),this.context.memo("button.indent",v.invoke(u,"render")),this.context.memo("button.paragraph",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.alignLeft),t.options),tooltip:t.lang.paragraph.paragraph,data:{toggle:"dropdown"}}),t.ui.dropdown([t.ui.buttonGroup({className:"note-align",children:[r,a,s,l]}),t.ui.buttonGroup({className:"note-list",children:[c,u]})])]).render()})),this.context.memo("button.height",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.textHeight),t.options),tooltip:t.lang.font.height,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({items:t.options.lineHeights,checkClassName:t.options.icons.menuCheck,className:"dropdown-line-height",title:t.lang.font.height,click:t.context.createInvokeHandler("editor.lineHeight")})]).render()})),this.context.memo("button.table",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.table),t.options),tooltip:t.lang.table.table,data:{toggle:"dropdown"}}),t.ui.dropdown({title:t.lang.table.table,className:"note-table",items:['<div class="note-dimension-picker">','<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>','<div class="note-dimension-picker-highlighted"></div>','<div class="note-dimension-picker-unhighlighted"></div>',"</div>",'<div class="note-dimension-display">1 x 1</div>'].join("")})],{callback:function(e){e.find(".note-dimension-picker-mousecatcher").css({width:t.options.insertTableMaxSize.col+"em",height:t.options.insertTableMaxSize.row+"em"}).mouseup(t.context.createInvokeHandler("editor.insertTable")).on("mousemove",t.tableMoveHandler.bind(t))}}).render()})),this.context.memo("button.link",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.link+t.representShortcut("linkDialog.show"),click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.picture",(function(){return t.button({contents:t.ui.icon(t.options.icons.picture),tooltip:t.lang.image.image,click:t.context.createInvokeHandler("imageDialog.show")}).render()})),this.context.memo("button.video",(function(){return t.button({contents:t.ui.icon(t.options.icons.video),tooltip:t.lang.video.video,click:t.context.createInvokeHandler("videoDialog.show")}).render()})),this.context.memo("button.hr",(function(){return t.button({contents:t.ui.icon(t.options.icons.minus),tooltip:t.lang.hr.insert+t.representShortcut("insertHorizontalRule"),click:t.context.createInvokeHandler("editor.insertHorizontalRule")}).render()})),this.context.memo("button.fullscreen",(function(){return t.button({className:"btn-fullscreen note-codeview-keep",contents:t.ui.icon(t.options.icons.arrowsAlt),tooltip:t.lang.options.fullscreen,click:t.context.createInvokeHandler("fullscreen.toggle")}).render()})),this.context.memo("button.codeview",(function(){return t.button({className:"btn-codeview note-codeview-keep",contents:t.ui.icon(t.options.icons.code),tooltip:t.lang.options.codeview,click:t.context.createInvokeHandler("codeview.toggle")}).render()})),this.context.memo("button.redo",(function(){return t.button({contents:t.ui.icon(t.options.icons.redo),tooltip:t.lang.history.redo+t.representShortcut("redo"),click:t.context.createInvokeHandler("editor.redo")}).render()})),this.context.memo("button.undo",(function(){return t.button({contents:t.ui.icon(t.options.icons.undo),tooltip:t.lang.history.undo+t.representShortcut("undo"),click:t.context.createInvokeHandler("editor.undo")}).render()})),this.context.memo("button.help",(function(){return t.button({contents:t.ui.icon(t.options.icons.question),tooltip:t.lang.options.help,click:t.context.createInvokeHandler("helpDialog.show")}).render()}))}},{key:"addImagePopoverButtons",value:function(){var t=this;this.context.memo("button.resizeFull",(function(){return t.button({contents:'<span class="note-fontsize-10">100%</span>',tooltip:t.lang.image.resizeFull,click:t.context.createInvokeHandler("editor.resize","1")}).render()})),this.context.memo("button.resizeHalf",(function(){return t.button({contents:'<span class="note-fontsize-10">50%</span>',tooltip:t.lang.image.resizeHalf,click:t.context.createInvokeHandler("editor.resize","0.5")}).render()})),this.context.memo("button.resizeQuarter",(function(){return t.button({contents:'<span class="note-fontsize-10">25%</span>',tooltip:t.lang.image.resizeQuarter,click:t.context.createInvokeHandler("editor.resize","0.25")}).render()})),this.context.memo("button.resizeNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.resizeNone,click:t.context.createInvokeHandler("editor.resize","0")}).render()})),this.context.memo("button.floatLeft",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatLeft),tooltip:t.lang.image.floatLeft,click:t.context.createInvokeHandler("editor.floatMe","left")}).render()})),this.context.memo("button.floatRight",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatRight),tooltip:t.lang.image.floatRight,click:t.context.createInvokeHandler("editor.floatMe","right")}).render()})),this.context.memo("button.floatNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.floatNone,click:t.context.createInvokeHandler("editor.floatMe","none")}).render()})),this.context.memo("button.removeMedia",(function(){return t.button({contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.image.remove,click:t.context.createInvokeHandler("editor.removeMedia")}).render()}))}},{key:"addLinkPopoverButtons",value:function(){var t=this;this.context.memo("button.linkDialogShow",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.edit,click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.unlink",(function(){return t.button({contents:t.ui.icon(t.options.icons.unlink),tooltip:t.lang.link.unlink,click:t.context.createInvokeHandler("editor.unlink")}).render()}))}},{key:"addTablePopoverButtons",value:function(){var t=this;this.context.memo("button.addRowUp",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowAbove),tooltip:t.lang.table.addRowAbove,click:t.context.createInvokeHandler("editor.addRow","top")}).render()})),this.context.memo("button.addRowDown",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowBelow),tooltip:t.lang.table.addRowBelow,click:t.context.createInvokeHandler("editor.addRow","bottom")}).render()})),this.context.memo("button.addColLeft",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colBefore),tooltip:t.lang.table.addColLeft,click:t.context.createInvokeHandler("editor.addCol","left")}).render()})),this.context.memo("button.addColRight",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colAfter),tooltip:t.lang.table.addColRight,click:t.context.createInvokeHandler("editor.addCol","right")}).render()})),this.context.memo("button.deleteRow",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowRemove),tooltip:t.lang.table.delRow,click:t.context.createInvokeHandler("editor.deleteRow")}).render()})),this.context.memo("button.deleteCol",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colRemove),tooltip:t.lang.table.delCol,click:t.context.createInvokeHandler("editor.deleteCol")}).render()})),this.context.memo("button.deleteTable",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.table.delTable,click:t.context.createInvokeHandler("editor.deleteTable")}).render()}))}},{key:"build",value:function(t,e){for(var o=0,n=e.length;o<n;o++){for(var i=e[o],r=Array.isArray(i)?i[0]:i,a=Array.isArray(i)?1===i.length?[i[0]]:i[1]:[i],s=this.ui.buttonGroup({className:"note-"+r}).render(),l=0,c=a.length;l<c;l++){var u=this.context.memo("button."+a[l]);u&&s.append("function"==typeof u?u(this.context):u)}s.appendTo(t)}}},{key:"updateCurrentStyle",value:function(t){var o=t||this.$toolbar,n=this.context.invoke("editor.currentStyle");if(this.updateBtnStates(o,{".note-btn-bold":function(){return"bold"===n["font-bold"]},".note-btn-italic":function(){return"italic"===n["font-italic"]},".note-btn-underline":function(){return"underline"===n["font-underline"]},".note-btn-subscript":function(){return"subscript"===n["font-subscript"]},".note-btn-superscript":function(){return"superscript"===n["font-superscript"]},".note-btn-strikethrough":function(){return"strikethrough"===n["font-strikethrough"]}}),n["font-family"]){var i=n["font-family"].split(",").map((function(t){return t.replace(/[\'\"]/g,"").replace(/\s+$/,"").replace(/^\s+/,"")})),r=y.find(i,this.isFontInstalled.bind(this));o.find(".dropdown-fontname a").each((function(t,o){var n=e()(o),i=n.data("value")+""==r+"";n.toggleClass("checked",i)})),o.find(".note-current-fontname").text(r).css("font-family",r)}if(n["font-size"]){var a=n["font-size"];o.find(".dropdown-fontsize a").each((function(t,o){var n=e()(o),i=n.data("value")+""==a+"";n.toggleClass("checked",i)})),o.find(".note-current-fontsize").text(a);var s=n["font-size-unit"];o.find(".dropdown-fontsizeunit a").each((function(t,o){var n=e()(o),i=n.data("value")+""==s+"";n.toggleClass("checked",i)})),o.find(".note-current-fontsizeunit").text(s)}if(n["line-height"]){var l=n["line-height"];o.find(".dropdown-line-height a").each((function(t,o){var n=e()(o),i=e()(o).data("value")+""==l+"";n.toggleClass("checked",i)})),o.find(".note-current-line-height").text(l)}}},{key:"updateBtnStates",value:function(t,o){var n=this;e().each(o,(function(e,o){n.ui.toggleBtnActive(t.find(e),o())}))}},{key:"tableMoveHandler",value:function(t){var o,n=e()(t.target.parentNode),i=n.next(),r=n.find(".note-dimension-picker-mousecatcher"),a=n.find(".note-dimension-picker-highlighted"),s=n.find(".note-dimension-picker-unhighlighted");if(void 0===t.offsetX){var l=e()(t.target).offset();o={x:t.pageX-l.left,y:t.pageY-l.top}}else o={x:t.offsetX,y:t.offsetY};var c=Math.ceil(o.x/18)||1,u=Math.ceil(o.y/18)||1;a.css({width:c+"em",height:u+"em"}),r.data("value",c+"x"+u),c>3&&c<this.options.insertTableMaxSize.col&&s.css({width:c+1+"em"}),u>3&&u<this.options.insertTableMaxSize.row&&s.css({height:u+1+"em"}),i.html(c+" x "+u)}}],n&&ie(o.prototype,n),i&&ie(o,i),t}();function ae(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var se=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.$window=e()(window),this.$document=e()(document),this.ui=e().summernote.ui,this.$note=o.layoutInfo.note,this.$editor=o.layoutInfo.editor,this.$toolbar=o.layoutInfo.toolbar,this.$editable=o.layoutInfo.editable,this.$statusbar=o.layoutInfo.statusbar,this.options=o.options,this.isFollowing=!1,this.followScroll=this.followScroll.bind(this)}var o,n,i;return o=t,(n=[{key:"shouldInitialize",value:function(){return!this.options.airMode}},{key:"initialize",value:function(){var t=this;this.options.toolbar=this.options.toolbar||[],this.options.toolbar.length?this.context.invoke("buttons.build",this.$toolbar,this.options.toolbar):this.$toolbar.hide(),this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.changeContainer(!1),this.$note.on("summernote.keyup summernote.mouseup summernote.change",(function(){t.context.invoke("buttons.updateCurrentStyle")})),this.context.invoke("buttons.updateCurrentStyle"),this.options.followingToolbar&&this.$window.on("scroll resize",this.followScroll)}},{key:"destroy",value:function(){this.$toolbar.children().remove(),this.options.followingToolbar&&this.$window.off("scroll resize",this.followScroll)}},{key:"followScroll",value:function(){if(this.$editor.hasClass("fullscreen"))return!1;var t=this.$editor.outerHeight(),o=this.$editor.width(),n=this.$toolbar.height(),i=this.$statusbar.height(),r=0;this.options.otherStaticBar&&(r=e()(this.options.otherStaticBar).outerHeight());var a=this.$document.scrollTop(),s=this.$editor.offset().top,l=s-r,c=s+t-r-n-i;!this.isFollowing&&a>l&&a<c-n?(this.isFollowing=!0,this.$editable.css({marginTop:this.$toolbar.outerHeight()}),this.$toolbar.css({position:"fixed",top:r,width:o,zIndex:1e3})):this.isFollowing&&(a<l||a>c)&&(this.isFollowing=!1,this.$toolbar.css({position:"relative",top:0,width:"100%",zIndex:"auto"}),this.$editable.css({marginTop:""}))}},{key:"changeContainer",value:function(t){t?this.$toolbar.prependTo(this.$editor):this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.options.followingToolbar&&this.followScroll()}},{key:"updateFullscreen",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-fullscreen"),t),this.changeContainer(t)}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-codeview"),t),t?this.deactivate():this.activate()}},{key:"activate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!0)}},{key:"deactivate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!1)}}])&&ae(o.prototype,n),i&&ae(o,i),t}();function le(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var ce=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=o.layoutInfo.editor,this.options=o.options,this.lang=this.options.langInfo,o.memo("help.linkDialog.show",this.options.langInfo.help["linkDialog.show"])}var o,n,i;return o=t,(n=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,o=['<div class="form-group note-form-group">','<label for="note-dialog-link-txt-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.textToDisplay,"</label>"),'<input id="note-dialog-link-txt-'.concat(this.options.id,'" class="note-link-text form-control note-form-control note-input" type="text"/>'),"</div>",'<div class="form-group note-form-group">','<label for="note-dialog-link-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.url,"</label>"),'<input id="note-dialog-link-url-'.concat(this.options.id,'" class="note-link-url form-control note-form-control note-input" type="text" value="http://"/>'),"</div>",this.options.disableLinkTarget?"":e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-open-in-new-window",text:this.lang.link.openInNewWindow,checked:!0}).render()).html(),e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-use-protocol",text:this.lang.link.useProtocol,checked:!0}).render()).html()].join(""),n='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-link-btn",'" value="').concat(this.lang.link.insert,'" disabled>');this.$dialog=this.ui.dialog({className:"link-dialog",title:this.lang.link.insert,fade:this.options.dialogsFade,body:o,footer:n}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"toggleLinkBtn",value:function(t,e,o){this.ui.toggleBtn(t,e.val()&&o.val())}},{key:"showLinkDialog",value:function(t){var o=this;return e().Deferred((function(e){var n=o.$dialog.find(".note-link-text"),i=o.$dialog.find(".note-link-url"),r=o.$dialog.find(".note-link-btn"),a=o.$dialog.find(".sn-checkbox-open-in-new-window input[type=checkbox]"),s=o.$dialog.find(".sn-checkbox-use-protocol input[type=checkbox]");o.ui.onDialogShown(o.$dialog,(function(){o.context.triggerEvent("dialog.shown"),!t.url&&v.isValidUrl(t.text)&&(t.url=t.text),n.on("input paste propertychange",(function(){t.text=n.val(),o.toggleLinkBtn(r,n,i)})).val(t.text),i.on("input paste propertychange",(function(){t.text||n.val(i.val()),o.toggleLinkBtn(r,n,i)})).val(t.url),f.isSupportTouch||i.trigger("focus"),o.toggleLinkBtn(r,n,i),o.bindEnterKey(i,r),o.bindEnterKey(n,r);var l=void 0!==t.isNewWindow?t.isNewWindow:o.context.options.linkTargetBlank;a.prop("checked",l);var c=!t.url&&o.context.options.useProtocol;s.prop("checked",c),r.one("click",(function(r){r.preventDefault(),e.resolve({range:t.range,url:i.val(),text:n.val(),isNewWindow:a.is(":checked"),checkProtocol:s.is(":checked")}),o.ui.hideDialog(o.$dialog)}))})),o.ui.onDialogHidden(o.$dialog,(function(){n.off(),i.off(),r.off(),"pending"===e.state()&&e.reject()})),o.ui.showDialog(o.$dialog)})).promise()}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getLinkInfo");this.context.invoke("editor.saveRange"),this.showLinkDialog(e).then((function(e){t.context.invoke("editor.restoreRange"),t.context.invoke("editor.createLink",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}}])&&le(o.prototype,n),i&&le(o,i),t}();function ue(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var de=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.options=o.options,this.events={"summernote.keyup summernote.mouseup summernote.change summernote.scroll":function(){n.update()},"summernote.disable summernote.dialog.shown":function(){n.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&n.$popover[0].contains(e.originalEvent.relatedTarget)||n.hide()}}}var o,n,i;return o=t,(n=[{key:"shouldInitialize",value:function(){return!y.isEmpty(this.options.popover.link)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-link-popover",callback:function(t){t.find(".popover-content,.note-popover-content").prepend('<span><a target="_blank"></a>&nbsp;</span>')}}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.link),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(){if(this.context.invoke("editor.hasFocus")){var t=this.context.invoke("editor.getLastRange");if(t.isCollapsed()&&t.isOnAnchor()){var o=ht.ancestor(t.sc,ht.isAnchor),n=e()(o).attr("href");this.$popover.find("a").attr("href",n).text(n);var i=ht.posFromPlaceholder(o),r=e()(this.options.container).offset();i.top-=r.top,i.left-=r.left,this.$popover.css({display:"block",left:i.left,top:i.top})}else this.hide()}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}])&&ue(o.prototype,n),i&&ue(o,i),t}();function he(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var fe=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=o.layoutInfo.editor,this.options=o.options,this.lang=this.options.langInfo}var o,n,i;return o=t,(n=[{key:"initialize",value:function(){var t="";if(this.options.maximumImageFileSize){var e=Math.floor(Math.log(this.options.maximumImageFileSize)/Math.log(1024)),o=1*(this.options.maximumImageFileSize/Math.pow(1024,e)).toFixed(2)+" "+" KMGTP"[e]+"B";t="<small>".concat(this.lang.image.maximumFileSize+" : "+o,"</small>")}var n=this.options.dialogsInBody?this.$body:this.options.container,i=['<div class="form-group note-form-group note-group-select-from-files">','<label for="note-dialog-image-file-'+this.options.id+'" class="note-form-label">'+this.lang.image.selectFromFiles+"</label>",'<input id="note-dialog-image-file-'+this.options.id+'" class="note-image-input form-control-file note-form-control note-input" ',' type="file" name="files" accept="'+this.options.acceptImageFileTypes+'" multiple="multiple"/>',t,"</div>",'<div class="form-group note-group-image-url">','<label for="note-dialog-image-url-'+this.options.id+'" class="note-form-label">'+this.lang.image.url+"</label>",'<input id="note-dialog-image-url-'+this.options.id+'" class="note-image-url form-control note-form-control note-input" type="text"/>',"</div>"].join(""),r='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-image-btn",'" value="').concat(this.lang.image.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.image.insert,fade:this.options.dialogsFade,body:i,footer:r}).render().appendTo(n)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showImageDialog().then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange"),"string"==typeof e?t.options.callbacks.onImageLinkInsert?t.context.triggerEvent("image.link.insert",e):t.context.invoke("editor.insertImage",e):t.context.invoke("editor.insertImagesOrCallback",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showImageDialog",value:function(){var t=this;return e().Deferred((function(e){var o=t.$dialog.find(".note-image-input"),n=t.$dialog.find(".note-image-url"),i=t.$dialog.find(".note-image-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),o.replaceWith(o.clone().on("change",(function(t){e.resolve(t.target.files||t.target.value)})).val("")),n.on("input paste propertychange",(function(){t.ui.toggleBtn(i,n.val())})).val(""),f.isSupportTouch||n.trigger("focus"),i.click((function(t){t.preventDefault(),e.resolve(n.val())})),t.bindEnterKey(n,i)})),t.ui.onDialogHidden(t.$dialog,(function(){o.off(),n.off(),i.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&he(o.prototype,n),i&&he(o,i),t}();function pe(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var ve=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.editable=o.layoutInfo.editable[0],this.options=o.options,this.events={"summernote.disable summernote.dialog.shown":function(){n.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&n.$popover[0].contains(e.originalEvent.relatedTarget)||n.hide()}}}var o,n,i;return o=t,n=[{key:"shouldInitialize",value:function(){return!y.isEmpty(this.options.popover.image)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-image-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.image),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t,o){if(ht.isImg(t)){var n=e()(t).offset(),i=e()(this.options.container).offset(),r={};this.options.popatmouse?(r.left=o.pageX-20,r.top=o.pageY):r=n,r.top-=i.top,r.left-=i.left,this.$popover.css({display:"block",left:r.left,top:r.top})}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}],n&&pe(o.prototype,n),i&&pe(o,i),t}();function me(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var ge=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.options=o.options,this.events={"summernote.mousedown":function(t,e){n.update(e.target)},"summernote.keyup summernote.scroll summernote.change":function(){n.update()},"summernote.disable summernote.dialog.shown":function(){n.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&n.$popover[0].contains(e.originalEvent.relatedTarget)||n.hide()}}}var o,n,i;return o=t,n=[{key:"shouldInitialize",value:function(){return!y.isEmpty(this.options.popover.table)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-table-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.table),f.isFF&&document.execCommand("enableInlineTableEditing",!1,!1),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){if(this.context.isDisabled())return!1;var o=ht.isCell(t)||ht.isCell(null==t?void 0:t.parentElement);if(o){var n=ht.posFromPlaceholder(t),i=e()(this.options.container).offset();n.top-=i.top,n.left-=i.left,this.$popover.css({display:"block",left:n.left,top:n.top})}else this.hide();return o}},{key:"hide",value:function(){this.$popover.hide()}}],n&&me(o.prototype,n),i&&me(o,i),t}();function be(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var ke=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=o.layoutInfo.editor,this.options=o.options,this.lang=this.options.langInfo}var o,n,i;return o=t,(n=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<div class="form-group note-form-group row-fluid">','<label for="note-dialog-video-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.video.url,' <small class="text-muted">').concat(this.lang.video.providers,"</small></label>"),'<input id="note-dialog-video-url-'.concat(this.options.id,'" class="note-video-url form-control note-form-control note-input" type="text"/>'),"</div>"].join(""),o='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-video-btn",'" value="').concat(this.lang.video.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.video.insert,fade:this.options.dialogsFade,body:e,footer:o}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"createVideoNode",value:function(t){var o,n=t.match(/\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/),i=t.match(/(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/),r=t.match(/(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/),a=t.match(/\/\/vine\.co\/v\/([a-zA-Z0-9]+)/),s=t.match(/\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/),l=t.match(/.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/),c=t.match(/\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/),u=t.match(/\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/),d=t.match(/\/\/v\.qq\.com.*?vid=(.+)/),h=t.match(/\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/),f=t.match(/^.+.(mp4|m4v)$/),p=t.match(/^.+.(ogg|ogv)$/),v=t.match(/^.+.(webm)$/),m=t.match(/(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/);if(n&&11===n[1].length){var g=n[1],b=0;if(void 0!==n[2]){var k=n[2].match(/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/);if(k)for(var y=[3600,60,1],w=0,C=y.length;w<C;w++)b+=void 0!==k[w+1]?y[w]*parseInt(k[w+1],10):0}o=e()("<iframe>").attr("frameborder",0).attr("src","//www.youtube.com/embed/"+g+(b>0?"?start="+b:"")).attr("width","640").attr("height","360")}else if(i&&i[0].length)o=e()("<iframe>").attr("frameborder",0).attr("src","https://drive.google.com/file/d/"+i[1]+"/preview").attr("width","640").attr("height","480");else if(r&&r[0].length)o=e()("<iframe>").attr("frameborder",0).attr("src","https://instagram.com/p/"+r[1]+"/embed/").attr("width","612").attr("height","710").attr("scrolling","no").attr("allowtransparency","true");else if(a&&a[0].length)o=e()("<iframe>").attr("frameborder",0).attr("src",a[0]+"/embed/simple").attr("width","600").attr("height","600").attr("class","vine-embed");else if(s&&s[3].length)o=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("src","//player.vimeo.com/video/"+s[3]).attr("width","640").attr("height","360");else if(l&&l[2].length)o=e()("<iframe>").attr("frameborder",0).attr("src","//www.dailymotion.com/embed/video/"+l[2]).attr("width","640").attr("height","360");else if(c&&c[1].length)o=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","498").attr("width","510").attr("src","//player.youku.com/embed/"+c[1]);else if(u&&u[0].length){var x=0;"undefined"!==u[2]&&(x=u[2]);var S=0;"undefined"!==u[3]&&(S=u[3]);var T=0;"undefined"!==u[4]&&(T=u[4]);var E=0;"undefined"!==u[5]&&(E=u[5]);var $=0;"undefined"!==u[6]&&($=u[6]),o=e()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr("frameborder",0).attr("src","//"+u[1]+"/videos/embed/"+u[2]+"?loop="+T+"&autoplay="+E+"&muted="+$+(x>0?"&start="+x:"")+(S>0?"&end="+b:"")).attr("width","560").attr("height","315")}else if(d&&d[1].length||h&&h[2].length){var N=d&&d[1].length?d[1]:h[2];o=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","310").attr("width","500").attr("src","https://v.qq.com/txp/iframe/player.html?vid="+N+"&amp;auto=0")}else if(f||p||v)o=e()("<video controls>").attr("src",t).attr("width","640").attr("height","360");else{if(!m||!m[0].length)return!1;o=e()("<iframe>").attr("frameborder",0).attr("src","https://www.facebook.com/plugins/video.php?href="+encodeURIComponent(m[0])+"&show_text=0&width=560").attr("width","560").attr("height","301").attr("scrolling","no").attr("allowtransparency","true")}return o.addClass("note-video-clip"),o[0]}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getSelectedText");this.context.invoke("editor.saveRange"),this.showVideoDialog(e).then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange");var o=t.createVideoNode(e);o&&t.context.invoke("editor.insertNode",o)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showVideoDialog",value:function(){var t=this;return e().Deferred((function(e){var o=t.$dialog.find(".note-video-url"),n=t.$dialog.find(".note-video-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),o.on("input paste propertychange",(function(){t.ui.toggleBtn(n,o.val())})),f.isSupportTouch||o.trigger("focus"),n.click((function(t){t.preventDefault(),e.resolve(o.val())})),t.bindEnterKey(o,n)})),t.ui.onDialogHidden(t.$dialog,(function(){o.off(),n.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&be(o.prototype,n),i&&be(o,i),t}();function ye(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var we=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=o.layoutInfo.editor,this.options=o.options,this.lang=this.options.langInfo}var o,n,i;return o=t,n=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<p class="text-center">','<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ','<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ','<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>',"</p>"].join("");this.$dialog=this.ui.dialog({title:this.lang.options.help,fade:this.options.dialogsFade,body:this.createShortcutList(),footer:e,callback:function(t){t.find(".modal-body,.note-modal-body").css({"max-height":300,overflow:"scroll"})}}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"createShortcutList",value:function(){var t=this,o=this.options.keyMap[f.isMac?"mac":"pc"];return Object.keys(o).map((function(n){var i=o[n],r=e()('<div><div class="help-list-item"></div></div>');return r.append(e()("<label><kbd>"+n+"</kdb></label>").css({width:180,"margin-right":10})).append(e()("<span></span>").html(t.context.memo("help."+i)||i)),r.html()})).join("")}},{key:"showHelpDialog",value:function(){var t=this;return e().Deferred((function(e){t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),e.resolve()})),t.ui.showDialog(t.$dialog)})).promise()}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showHelpDialog().then((function(){t.context.invoke("editor.restoreRange")}))}}],n&&ye(o.prototype,n),i&&ye(o,i),t}();function Ce(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var xe=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.options=o.options,this.hidable=!0,this.onContextmenu=!1,this.pageX=null,this.pageY=null,this.events={"summernote.contextmenu":function(t){n.options.editing&&(t.preventDefault(),t.stopPropagation(),n.onContextmenu=!0,n.update(!0))},"summernote.mousedown":function(t,e){n.pageX=e.pageX,n.pageY=e.pageY},"summernote.keyup summernote.mouseup summernote.scroll":function(t,e){n.options.editing&&!n.onContextmenu&&(n.pageX=e.pageX,n.pageY=e.pageY,n.update()),n.onContextmenu=!1},"summernote.disable summernote.change summernote.dialog.shown summernote.blur":function(){n.hide()},"summernote.focusout":function(){n.$popover.is(":active,:focus")||n.hide()}}}var o,n,i;return o=t,(n=[{key:"shouldInitialize",value:function(){return this.options.airMode&&!y.isEmpty(this.options.popover.air)}},{key:"initialize",value:function(){var t=this;this.$popover=this.ui.popover({className:"note-air-popover"}).render().appendTo(this.options.container);var e=this.$popover.find(".popover-content");this.context.invoke("buttons.build",e,this.options.popover.air),this.$popover.on("mousedown",(function(){t.hidable=!1})),this.$popover.on("mouseup",(function(){t.hidable=!0}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){var o=this.context.invoke("editor.currentStyle");if(!o.range||o.range.isCollapsed()&&!t)this.hide();else{var n={left:this.pageX,top:this.pageY},i=e()(this.options.container).offset();n.top-=i.top,n.left-=i.left,this.$popover.css({display:"block",left:Math.max(n.left,0)+-5,top:n.top+5}),this.context.invoke("buttons.updateCurrentStyle",this.$popover)}}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$popover.find(".btn-codeview"),t),t&&this.hide()}},{key:"hide",value:function(){this.hidable&&this.$popover.hide()}}])&&Ce(o.prototype,n),i&&Ce(o,i),t}();function Se(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Te=function(){function t(o){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=o,this.ui=e().summernote.ui,this.$editable=o.layoutInfo.editable,this.options=o.options,this.hint=this.options.hint||[],this.direction=this.options.hintDirection||"bottom",this.hints=Array.isArray(this.hint)?this.hint:[this.hint],this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||n.handleKeyup(e)},"summernote.keydown":function(t,e){n.handleKeydown(e)},"summernote.disable summernote.dialog.shown summernote.blur":function(){n.hide()}}}var o,n,i;return o=t,n=[{key:"shouldInitialize",value:function(){return this.hints.length>0}},{key:"initialize",value:function(){var t=this;this.lastWordRange=null,this.matchingWord=null,this.$popover=this.ui.popover({className:"note-hint-popover",hideArrow:!0,direction:""}).render().appendTo(this.options.container),this.$popover.hide(),this.$content=this.$popover.find(".popover-content,.note-popover-content"),this.$content.on("click",".note-hint-item",(function(o){t.$content.find(".active").removeClass("active"),e()(o.currentTarget).addClass("active"),t.replace()})),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"selectItem",value:function(t){this.$content.find(".active").removeClass("active"),t.addClass("active"),this.$content[0].scrollTop=t[0].offsetTop-this.$content.innerHeight()/2}},{key:"moveDown",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.next();if(e.length)this.selectItem(e);else{var o=t.parent().next();o.length||(o=this.$content.find(".note-hint-group").first()),this.selectItem(o.find(".note-hint-item").first())}}},{key:"moveUp",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.prev();if(e.length)this.selectItem(e);else{var o=t.parent().prev();o.length||(o=this.$content.find(".note-hint-group").last()),this.selectItem(o.find(".note-hint-item").last())}}},{key:"replace",value:function(){var t=this.$content.find(".note-hint-item.active");if(t.length){var o=this.nodeFromItem(t);if(null!==this.matchingWord&&0===this.matchingWord.length)this.lastWordRange.so=this.lastWordRange.eo;else if(null!==this.matchingWord&&this.matchingWord.length>0&&!this.lastWordRange.isCollapsed()){var n=this.lastWordRange.eo-this.lastWordRange.so-this.matchingWord.length;n>0&&(this.lastWordRange.so+=n)}if(this.lastWordRange.insertNode(o),"next"===this.options.hintSelect){var i=document.createTextNode("");e()(o).after(i),kt.createFromNodeBefore(i).select()}else kt.createFromNodeAfter(o).select();this.lastWordRange=null,this.hide(),this.context.invoke("editor.focus"),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}}},{key:"nodeFromItem",value:function(t){var e=this.hints[t.data("index")],o=t.data("item"),n=e.content?e.content(o):o;return"string"==typeof n&&(n=ht.createText(n)),n}},{key:"createItemTemplates",value:function(t,o){var n=this.hints[t];return o.map((function(o){var i=e()('<div class="note-hint-item"></div>');return i.append(n.template?n.template(o):o+""),i.data({index:t,item:o}),i}))}},{key:"handleKeydown",value:function(t){this.$popover.is(":visible")&&(t.keyCode===wt.code.ENTER?(t.preventDefault(),this.replace()):t.keyCode===wt.code.UP?(t.preventDefault(),this.moveUp()):t.keyCode===wt.code.DOWN&&(t.preventDefault(),this.moveDown()))}},{key:"searchKeyword",value:function(t,e,o){var n=this.hints[t];if(n&&n.match.test(e)&&n.search){var i=n.match.exec(e);this.matchingWord=i[0],n.search(i[1],o)}else o()}},{key:"createGroup",value:function(t,o){var n=this,i=e()('<div class="note-hint-group note-hint-group-'+t+'"></div>');return this.searchKeyword(t,o,(function(e){(e=e||[]).length&&(i.html(n.createItemTemplates(t,e)),n.show())})),i}},{key:"handleKeyup",value:function(t){var o=this;if(!y.contains([wt.code.ENTER,wt.code.UP,wt.code.DOWN],t.keyCode)){var n,i,r=this.context.invoke("editor.getLastRange");if("words"===this.options.hintMode){if(n=r.getWordsRange(r),i=n.toString(),this.hints.forEach((function(t){if(t.match.test(i))return n=r.getWordsMatchRange(t.match),!1})),!n)return void this.hide();i=n.toString()}else n=r.getWordRange(),i=n.toString();if(this.hints.length&&i){this.$content.empty();var a=v.rect2bnd(y.last(n.getClientRects())),s=e()(this.options.container).offset();a&&(a.top-=s.top,a.left-=s.left,this.$popover.hide(),this.lastWordRange=n,this.hints.forEach((function(t,e){t.match.test(i)&&o.createGroup(e,i).appendTo(o.$content)})),this.$content.find(".note-hint-item:first").addClass("active"),"top"===this.direction?this.$popover.css({left:a.left,top:a.top-this.$popover.outerHeight()-5}):this.$popover.css({left:a.left,top:a.top+a.height+5}))}else this.hide()}}},{key:"show",value:function(){this.$popover.show()}},{key:"hide",value:function(){this.$popover.hide()}}],n&&Se(o.prototype,n),i&&Se(o,i),t}();function Ee(t){return Ee="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ee(t)}function $e(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}e().summernote=e().extend(e().summernote,{version:"0.8.20",plugins:{},dom:ht,range:kt,lists:y,options:{langInfo:e().summernote.lang["en-US"],editing:!0,modules:{editor:Ft,clipboard:Ht,dropzone:zt,codeview:Ut,statusbar:Kt,fullscreen:qt,handle:Gt,hintPopover:Te,autoLink:Xt,autoSync:Jt,autoReplace:ee,placeholder:ne,buttons:re,toolbar:se,linkDialog:ce,linkPopover:de,imageDialog:fe,imagePopover:ve,tablePopover:ge,videoDialog:ke,helpDialog:we,airPopover:xe},buttons:{},lang:"en-US",followingToolbar:!1,toolbarPosition:"top",otherStaticBar:"",codeviewKeepButton:!1,toolbar:[["style",["style"]],["font",["bold","underline","clear"]],["fontname",["fontname"]],["color",["color"]],["para",["ul","ol","paragraph"]],["table",["table"]],["insert",["link","picture","video"]],["view",["fullscreen","codeview","help"]]],popatmouse:!0,popover:{image:[["resize",["resizeFull","resizeHalf","resizeQuarter","resizeNone"]],["float",["floatLeft","floatRight","floatNone"]],["remove",["removeMedia"]]],link:[["link",["linkDialogShow","unlink"]]],table:[["add",["addRowDown","addRowUp","addColLeft","addColRight"]],["delete",["deleteRow","deleteCol","deleteTable"]]],air:[["color",["color"]],["font",["bold","underline","clear"]],["para",["ul","paragraph"]],["table",["table"]],["insert",["link","picture"]],["view",["fullscreen","codeview"]]]},airMode:!1,overrideContextMenu:!1,width:null,height:null,linkTargetBlank:!0,useProtocol:!0,defaultProtocol:"http://",focus:!1,tabDisabled:!1,tabSize:4,styleWithCSS:!1,shortcuts:!0,textareaAutoSync:!0,tooltip:"auto",container:null,maxTextLength:0,blockquoteBreakingLevel:2,spellCheck:!0,disableGrammar:!1,placeholder:null,inheritPlaceholder:!1,recordEveryKeystroke:!1,historyLimit:200,showDomainOnlyForAutolink:!1,hintMode:"word",hintSelect:"after",hintDirection:"bottom",styleTags:["p","blockquote","pre","h1","h2","h3","h4","h5","h6"],fontNames:["Arial","Arial Black","Comic Sans MS","Courier New","Helvetica Neue","Helvetica","Impact","Lucida Grande","Tahoma","Times New Roman","Verdana"],fontNamesIgnoreCheck:[],addDefaultFonts:!0,fontSizes:["8","9","10","11","12","14","18","24","36"],fontSizeUnits:["px","pt"],colors:[["#000000","#424242","#636363","#9C9C94","#CEC6CE","#EFEFEF","#F7F7F7","#FFFFFF"],["#FF0000","#FF9C00","#FFFF00","#00FF00","#00FFFF","#0000FF","#9C00FF","#FF00FF"],["#F7C6CE","#FFE7CE","#FFEFC6","#D6EFD6","#CEDEE7","#CEE7F7","#D6D6E7","#E7D6DE"],["#E79C9C","#FFC69C","#FFE79C","#B5D6A5","#A5C6CE","#9CC6EF","#B5A5D6","#D6A5BD"],["#E76363","#F7AD6B","#FFD663","#94BD7B","#73A5AD","#6BADDE","#8C7BC6","#C67BA5"],["#CE0000","#E79439","#EFC631","#6BA54A","#4A7B8C","#3984C6","#634AA5","#A54A7B"],["#9C0000","#B56308","#BD9400","#397B21","#104A5A","#085294","#311873","#731842"],["#630000","#7B3900","#846300","#295218","#083139","#003163","#21104A","#4A1031"]],colorsName:[["Black","Tundora","Dove Gray","Star Dust","Pale Slate","Gallery","Alabaster","White"],["Red","Orange Peel","Yellow","Green","Cyan","Blue","Electric Violet","Magenta"],["Azalea","Karry","Egg White","Zanah","Botticelli","Tropical Blue","Mischka","Twilight"],["Tonys Pink","Peach Orange","Cream Brulee","Sprout","Casper","Perano","Cold Purple","Careys Pink"],["Mandy","Rajah","Dandelion","Olivine","Gulf Stream","Viking","Blue Marguerite","Puce"],["Guardsman Red","Fire Bush","Golden Dream","Chelsea Cucumber","Smalt Blue","Boston Blue","Butterfly Bush","Cadillac"],["Sangria","Mai Tai","Buddha Gold","Forest Green","Eden","Venice Blue","Meteorite","Claret"],["Rosewood","Cinnamon","Olive","Parsley","Tiber","Midnight Blue","Valentino","Loulou"]],colorButton:{foreColor:"#000000",backColor:"#FFFF00"},lineHeights:["1.0","1.2","1.4","1.5","1.6","1.8","2.0","3.0"],tableClassName:"table table-bordered",insertTableMaxSize:{col:10,row:10},dialogsInBody:!1,dialogsFade:!1,maximumImageFileSize:null,acceptImageFileTypes:"image/*",callbacks:{onBeforeCommand:null,onBlur:null,onBlurCodeview:null,onChange:null,onChangeCodeview:null,onDialogShown:null,onEnter:null,onFocus:null,onImageLinkInsert:null,onImageUpload:null,onImageUploadError:null,onInit:null,onKeydown:null,onKeyup:null,onMousedown:null,onMouseup:null,onPaste:null,onScroll:null},codemirror:{mode:"text/html",htmlMode:!0,lineNumbers:!0},codeviewFilter:!0,codeviewFilterRegex:/<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,codeviewIframeFilter:!0,codeviewIframeWhitelistSrc:[],codeviewIframeWhitelistSrcBase:["www.youtube.com","www.youtube-nocookie.com","www.facebook.com","vine.co","instagram.com","player.vimeo.com","www.dailymotion.com","player.youku.com","jumpingbean.tv","v.qq.com"],keyMap:{pc:{ESC:"escape",ENTER:"insertParagraph","CTRL+Z":"undo","CTRL+Y":"redo",TAB:"tab","SHIFT+TAB":"untab","CTRL+B":"bold","CTRL+I":"italic","CTRL+U":"underline","CTRL+SHIFT+S":"strikethrough","CTRL+BACKSLASH":"removeFormat","CTRL+SHIFT+L":"justifyLeft","CTRL+SHIFT+E":"justifyCenter","CTRL+SHIFT+R":"justifyRight","CTRL+SHIFT+J":"justifyFull","CTRL+SHIFT+NUM7":"insertUnorderedList","CTRL+SHIFT+NUM8":"insertOrderedList","CTRL+LEFTBRACKET":"outdent","CTRL+RIGHTBRACKET":"indent","CTRL+NUM0":"formatPara","CTRL+NUM1":"formatH1","CTRL+NUM2":"formatH2","CTRL+NUM3":"formatH3","CTRL+NUM4":"formatH4","CTRL+NUM5":"formatH5","CTRL+NUM6":"formatH6","CTRL+ENTER":"insertHorizontalRule","CTRL+K":"linkDialog.show"},mac:{ESC:"escape",ENTER:"insertParagraph","CMD+Z":"undo","CMD+SHIFT+Z":"redo",TAB:"tab","SHIFT+TAB":"untab","CMD+B":"bold","CMD+I":"italic","CMD+U":"underline","CMD+SHIFT+S":"strikethrough","CMD+BACKSLASH":"removeFormat","CMD+SHIFT+L":"justifyLeft","CMD+SHIFT+E":"justifyCenter","CMD+SHIFT+R":"justifyRight","CMD+SHIFT+J":"justifyFull","CMD+SHIFT+NUM7":"insertUnorderedList","CMD+SHIFT+NUM8":"insertOrderedList","CMD+LEFTBRACKET":"outdent","CMD+RIGHTBRACKET":"indent","CMD+NUM0":"formatPara","CMD+NUM1":"formatH1","CMD+NUM2":"formatH2","CMD+NUM3":"formatH3","CMD+NUM4":"formatH4","CMD+NUM5":"formatH5","CMD+NUM6":"formatH6","CMD+ENTER":"insertHorizontalRule","CMD+K":"linkDialog.show"}},icons:{align:"note-icon-align",alignCenter:"note-icon-align-center",alignJustify:"note-icon-align-justify",alignLeft:"note-icon-align-left",alignRight:"note-icon-align-right",rowBelow:"note-icon-row-below",colBefore:"note-icon-col-before",colAfter:"note-icon-col-after",rowAbove:"note-icon-row-above",rowRemove:"note-icon-row-remove",colRemove:"note-icon-col-remove",indent:"note-icon-align-indent",outdent:"note-icon-align-outdent",arrowsAlt:"note-icon-arrows-alt",bold:"note-icon-bold",caret:"note-icon-caret",circle:"note-icon-circle",close:"note-icon-close",code:"note-icon-code",eraser:"note-icon-eraser",floatLeft:"note-icon-float-left",floatRight:"note-icon-float-right",font:"note-icon-font",frame:"note-icon-frame",italic:"note-icon-italic",link:"note-icon-link",unlink:"note-icon-chain-broken",magic:"note-icon-magic",menuCheck:"note-icon-menu-check",minus:"note-icon-minus",orderedlist:"note-icon-orderedlist",pencil:"note-icon-pencil",picture:"note-icon-picture",question:"note-icon-question",redo:"note-icon-redo",rollback:"note-icon-rollback",square:"note-icon-square",strikethrough:"note-icon-strikethrough",subscript:"note-icon-subscript",superscript:"note-icon-superscript",table:"note-icon-table",textHeight:"note-icon-text-height",trash:"note-icon-trash",underline:"note-icon-underline",undo:"note-icon-undo",unorderedlist:"note-icon-unorderedlist",video:"note-icon-video"}}});var Ne=function(){function t(e,o,n,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.markup=e,this.children=o,this.options=n,this.callback=i}var o,n,i;return o=t,(n=[{key:"render",value:function(t){var o=e()(this.markup);if(this.options&&this.options.contents&&o.html(this.options.contents),this.options&&this.options.className&&o.addClass(this.options.className),this.options&&this.options.data&&e().each(this.options.data,(function(t,e){o.attr("data-"+t,e)})),this.options&&this.options.click&&o.on("click",this.options.click),this.children){var n=o.find(".note-children-container");this.children.forEach((function(t){t.render(n.length?n:o)}))}return this.callback&&this.callback(o,this.options),this.options&&this.options.callback&&this.options.callback(o),t&&t.append(o),o}}])&&$e(o.prototype,n),i&&$e(o,i),t}();const Ie=function(t,e){return function(){var o="object"===Ee(arguments[1])?arguments[1]:arguments[0],n=Array.isArray(arguments[0])?arguments[0]:[];return o&&o.children&&(n=o.children),new Ne(t,n,o,e)}};function Pe(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}const Re=function(){function t(o,n){if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$node=o,this.options=e().extend({},{title:"",target:n.container,trigger:"hover focus",placement:"bottom"},n),this.$tooltip=e()(['<div class="note-tooltip">','<div class="note-tooltip-arrow"></div>','<div class="note-tooltip-content"></div>',"</div>"].join("")),"manual"!==this.options.trigger){var i=this.show.bind(this),r=this.hide.bind(this),a=this.toggle.bind(this);this.options.trigger.split(" ").forEach((function(t){"hover"===t?(o.off("mouseenter mouseleave"),o.on("mouseenter",i).on("mouseleave",r)):"click"===t?o.on("click",a):"focus"===t&&o.on("focus",i).on("blur",r)}))}}var o,n,i;return o=t,(n=[{key:"show",value:function(){var t=this.$node,o=t.offset(),n=e()(this.options.target).offset();o.top-=n.top,o.left-=n.left;var i=this.$tooltip,r=this.options.title||t.attr("title")||t.data("title"),a=this.options.placement||t.data("placement");i.addClass(a),i.find(".note-tooltip-content").text(r),i.appendTo(this.options.target);var s=t.outerWidth(),l=t.outerHeight(),c=i.outerWidth(),u=i.outerHeight();"bottom"===a?i.css({top:o.top+l,left:o.left+(s/2-c/2)}):"top"===a?i.css({top:o.top-u,left:o.left+(s/2-c/2)}):"left"===a?i.css({top:o.top+(l/2-u/2),left:o.left-c}):"right"===a&&i.css({top:o.top+(l/2-u/2),left:o.left+s}),i.addClass("in")}},{key:"hide",value:function(){var t=this;this.$tooltip.removeClass("in"),setTimeout((function(){t.$tooltip.remove()}),200)}},{key:"toggle",value:function(){this.$tooltip.hasClass("in")?this.hide():this.show()}}])&&Pe(o.prototype,n),i&&Pe(o,i),t}();function Le(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var Ae=function(){function t(o,n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$button=o,this.options=e().extend({},{target:n.container},n),this.setEvent()}var o,n,i;return o=t,(n=[{key:"setEvent",value:function(){var t=this;this.$button.on("click",(function(e){t.toggle(),e.stopImmediatePropagation()}))}},{key:"clear",value:function(){var t=e()(".note-btn-group.open");t.find(".note-btn.active").removeClass("active"),t.removeClass("open")}},{key:"show",value:function(){this.$button.addClass("active"),this.$button.parent().addClass("open");var t=this.$button.next(),o=t.offset(),n=t.outerWidth(),i=e()(window).width(),r=parseFloat(e()(this.options.target).css("margin-right"));o.left+n>i-r?t.css("margin-left",i-r-(o.left+n)):t.css("margin-left","")}},{key:"hide",value:function(){this.$button.removeClass("active"),this.$button.parent().removeClass("open")}},{key:"toggle",value:function(){var t=this.$button.parent().hasClass("open");this.clear(),t?this.hide():this.show()}}])&&Le(o.prototype,n),i&&Le(o,i),t}();e()(document).on("click",(function(t){e()(t.target).closest(".note-btn-group").length||(e()(".note-btn-group.open").removeClass("open"),e()(".note-btn-group .note-btn.active").removeClass("active"))})),e()(document).on("click.note-dropdown-menu",(function(t){e()(t.target).closest(".note-dropdown-menu").parent().removeClass("open"),e()(t.target).closest(".note-dropdown-menu").parent().find(".note-btn.active").removeClass("active")}));const Fe=Ae;function De(t,e){for(var o=0;o<e.length;o++){var n=e[o];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}const He=function(){function t(o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$modal=o,this.$backdrop=e()('<div class="note-modal-backdrop"></div>')}var o,n,i;return o=t,(n=[{key:"show",value:function(){var t=this;this.$backdrop.appendTo(document.body).show(),this.$modal.addClass("open").show(),this.$modal.trigger("note.modal.show"),this.$modal.off("click",".close").on("click",".close",this.hide.bind(this)),this.$modal.on("keydown",(function(e){27===e.which&&(e.preventDefault(),t.hide())}))}},{key:"hide",value:function(){this.$modal.removeClass("open").hide(),this.$backdrop.hide(),this.$modal.trigger("note.modal.hide"),this.$modal.off("keydown")}}])&&De(o.prototype,n),i&&De(o,i),t}();var Be=Ie('<div class="note-editor note-frame"></div>'),ze=Ie('<div class="note-toolbar" role="toolbar"></div>'),Me=Ie('<div class="note-editing-area"></div>'),Oe=Ie('<textarea class="note-codable" aria-multiline="true"></textarea>'),je=Ie('<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>'),Ue=Ie(['<output class="note-status-output" role="status" aria-live="polite"></output>','<div class="note-statusbar" role="status">','<div class="note-resizebar" aria-label="resize">','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>',"</div>","</div>"].join("")),We=Ie('<div class="note-editor note-airframe"></div>'),Ke=Ie(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>','<output class="note-status-output" role="status" aria-live="polite"></output>'].join("")),Ve=Ie('<div class="note-btn-group"></div>'),qe=Ie('<button type="button" class="note-btn" tabindex="-1"></button>',(function(t,o){o&&o.tooltip&&(t.attr({"aria-label":o.tooltip}),t.data("_lite_tooltip",new Re(t,{title:o.tooltip,container:o.container})).on("click",(function(t){e()(t.currentTarget).data("_lite_tooltip").hide()}))),o.contents&&t.html(o.contents),o&&o.data&&"dropdown"===o.data.toggle&&t.data("_lite_dropdown",new Fe(t,{container:o.container})),o&&o.codeviewKeepButton&&t.addClass("note-codeview-keep")})),_e=Ie('<div class="note-dropdown-menu" role="list"></div>',(function(t,o){var n=Array.isArray(o.items)?o.items.map((function(t){var n="string"==typeof t?t:t.value||"",i=o.template?o.template(t):t,r=e()('<a class="note-dropdown-item" href="#" data-value="'+n+'" role="listitem" aria-label="'+n+'"></a>');return r.html(i).data("item",t),r})):o.items;t.html(n).attr({"aria-label":o.title}),t.on("click","> .note-dropdown-item",(function(t){var n=e()(this),i=n.data("item"),r=n.data("value");i.click?i.click(n):o.itemClick&&o.itemClick(t,i,r)})),o&&o.codeviewKeepButton&&t.addClass("note-codeview-keep")})),Ge=Ie('<div class="note-dropdown-menu note-check" role="list"></div>',(function(t,o){var n=Array.isArray(o.items)?o.items.map((function(t){var n="string"==typeof t?t:t.value||"",i=o.template?o.template(t):t,r=e()('<a class="note-dropdown-item" href="#" data-value="'+n+'" role="listitem" aria-label="'+t+'"></a>');return r.html([lo(o.checkClassName)," ",i]).data("item",t),r})):o.items;t.html(n).attr({"aria-label":o.title}),t.on("click","> .note-dropdown-item",(function(t){var n=e()(this),i=n.data("item"),r=n.data("value");i.click?i.click(n):o.itemClick&&o.itemClick(t,i,r)})),o&&o.codeviewKeepButton&&t.addClass("note-codeview-keep")})),Ye=function(t,e){return t+" "+lo(e.icons.caret,"span")},Ze=function(t,e){return Ve([qe({className:"dropdown-toggle",contents:t.title+" "+lo("note-icon-caret"),tooltip:t.tooltip,data:{toggle:"dropdown"}}),_e({className:t.className,items:t.items,template:t.template,itemClick:t.itemClick})],{callback:e}).render()},Xe=function(t,e){return Ve([qe({className:"dropdown-toggle",contents:t.title+" "+lo("note-icon-caret"),tooltip:t.tooltip,data:{toggle:"dropdown"}}),Ge({className:t.className,checkClassName:t.checkClassName,items:t.items,template:t.template,itemClick:t.itemClick})],{callback:e}).render()},Qe=function(t){return Ve([qe({className:"dropdown-toggle",contents:t.title+" "+lo("note-icon-caret"),tooltip:t.tooltip,data:{toggle:"dropdown"}}),_e([Ve({className:"note-align",children:t.items[0]}),Ve({className:"note-list",children:t.items[1]})])]).render()},Je=function(t){return Ve([qe({className:"dropdown-toggle",contents:t.title+" "+lo("note-icon-caret"),tooltip:t.tooltip,data:{toggle:"dropdown"}}),_e({className:"note-table",items:['<div class="note-dimension-picker">','<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>','<div class="note-dimension-picker-highlighted"></div>','<div class="note-dimension-picker-unhighlighted"></div>',"</div>",'<div class="note-dimension-display">1 x 1</div>'].join("")})],{callback:function(o){o.find(".note-dimension-picker-mousecatcher").css({width:t.col+"em",height:t.row+"em"}).mouseup(t.itemClick).mousemove((function(o){!function(t,o,n){var i,r=e()(t.target.parentNode),a=r.next(),s=r.find(".note-dimension-picker-mousecatcher"),l=r.find(".note-dimension-picker-highlighted"),c=r.find(".note-dimension-picker-unhighlighted");if(void 0===t.offsetX){var u=e()(t.target).offset();i={x:t.pageX-u.left,y:t.pageY-u.top}}else i={x:t.offsetX,y:t.offsetY};var d=Math.ceil(i.x/18)||1,h=Math.ceil(i.y/18)||1;l.css({width:d+"em",height:h+"em"}),s.data("value",d+"x"+h),d>3&&d<o&&c.css({width:d+1+"em"}),h>3&&h<n&&c.css({height:h+1+"em"}),a.html(d+" x "+h)}(o,t.col,t.row)}))}}).render()},to=Ie('<div class="note-color-palette"></div>',(function(t,o){for(var n=[],i=0,r=o.colors.length;i<r;i++){for(var a=o.eventName,s=o.colors[i],l=o.colorsName[i],c=[],u=0,d=s.length;u<d;u++){var h=s[u],f=l[u];c.push(['<button type="button" class="note-btn note-color-btn"','style="background-color:',h,'" ','data-event="',a,'" ','data-value="',h,'" ','data-title="',f,'" ','aria-label="',f,'" ','data-toggle="button" tabindex="-1"></button>'].join(""))}n.push('<div class="note-color-row">'+c.join("")+"</div>")}t.html(n.join("")),t.find(".note-color-btn").each((function(){e()(this).data("_lite_tooltip",new Re(e()(this),{container:o.container}))}))})),eo=function(t,o){return Ve({className:"note-color",children:[qe({className:"note-current-color-button",contents:t.title,tooltip:t.lang.color.recent,click:t.currentClick,callback:function(t){var e=t.find(".note-recent-color");"foreColor"!==o&&(e.css("background-color","#FFFF00"),t.attr("data-backColor","#FFFF00"))}}),qe({className:"dropdown-toggle",contents:lo("note-icon-caret"),tooltip:t.lang.color.more,data:{toggle:"dropdown"}}),_e({items:["<div>",'<div class="note-btn-group btn-background-color">','<div class="note-palette-title">'+t.lang.color.background+"</div>","<div>",'<button type="button" class="note-color-reset note-btn note-btn-block" data-event="backColor" data-value="transparent">',t.lang.color.transparent,"</button>","</div>",'<div class="note-holder" data-event="backColor"></div>','<div class="btn-sm">','<input type="color" id="html5bcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">','<button type="button" class="note-color-reset btn" data-event="backColor" data-value="cpbackColor">',t.lang.color.cpSelect,"</button>","</div>","</div>",'<div class="note-btn-group btn-foreground-color">','<div class="note-palette-title">'+t.lang.color.foreground+"</div>","<div>",'<button type="button" class="note-color-reset note-btn note-btn-block" data-event="removeFormat" data-value="foreColor">',t.lang.color.resetToDefault,"</button>","</div>",'<div class="note-holder" data-event="foreColor"></div>','<div class="btn-sm">','<input type="color" id="html5fcp" class="note-btn btn-default" value="#21104A" style="width:100%;" data-value="cp">','<button type="button" class="note-color-reset btn" data-event="foreColor" data-value="cpforeColor">',t.lang.color.cpSelect,"</button>","</div>","</div>","</div>"].join(""),callback:function(n){n.find(".note-holder").each((function(){var o=e()(this);o.append(to({colors:t.colors,eventName:o.data("event")}).render())})),"fore"===o?(n.find(".btn-background-color").hide(),n.css({"min-width":"210px"})):"back"===o&&(n.find(".btn-foreground-color").hide(),n.css({"min-width":"210px"}))},click:function(n){var i=e()(n.target),r=i.data("event"),a=i.data("value"),s=document.getElementById("html5fcp").value,l=document.getElementById("html5bcp").value;if("cp"===a?n.stopPropagation():"cpbackColor"===a?a=l:"cpforeColor"===a&&(a=s),r&&a){var c="backColor"===r?"background-color":"color",u=i.closest(".note-color").find(".note-recent-color"),d=i.closest(".note-color").find(".note-current-color-button");u.css(c,a),d.attr("data-"+r,a),"fore"===o?t.itemClick("foreColor",a):"back"===o?t.itemClick("backColor",a):t.itemClick(r,a)}}})]}).render()},oo=Ie('<div class="note-modal" aria-hidden="false" tabindex="-1" role="dialog"></div>',(function(t,e){e.fade&&t.addClass("fade"),t.attr({"aria-label":e.title}),t.html(['<div class="note-modal-content">',e.title?'<div class="note-modal-header"><button type="button" class="close" aria-label="Close" aria-hidden="true"><i class="note-icon-close"></i></button><h4 class="note-modal-title">'+e.title+"</h4></div>":"",'<div class="note-modal-body">'+e.body+"</div>",e.footer?'<div class="note-modal-footer">'+e.footer+"</div>":"","</div>"].join("")),t.data("modal",new He(t,e))})),no=function(t){var e='<div class="note-form-group"><label for="note-dialog-video-url-'+t.id+'" class="note-form-label">'+t.lang.video.url+' <small class="text-muted">'+t.lang.video.providers+'</small></label><input id="note-dialog-video-url-'+t.id+'" class="note-video-url note-input" type="text"/></div>',o=['<button type="button" href="#" class="note-btn note-btn-primary note-video-btn disabled" disabled>',t.lang.video.insert,"</button>"].join("");return oo({title:t.lang.video.insert,fade:t.fade,body:e,footer:o}).render()},io=function(t){var e='<div class="note-form-group note-group-select-from-files"><label for="note-dialog-image-file-'+t.id+'" class="note-form-label">'+t.lang.image.selectFromFiles+'</label><input id="note-dialog-image-file-'+t.id+'" class="note-note-image-input note-input" type="file" name="files" accept="image/*" multiple="multiple"/>'+t.imageLimitation+'</div><div class="note-form-group"><label for="note-dialog-image-url-'+t.id+'" class="note-form-label">'+t.lang.image.url+'</label><input id="note-dialog-image-url-'+t.id+'" class="note-image-url note-input" type="text"/></div>',o=['<button href="#" type="button" class="note-btn note-btn-primary note-btn-large note-image-btn disabled" disabled>',t.lang.image.insert,"</button>"].join("");return oo({title:t.lang.image.insert,fade:t.fade,body:e,footer:o}).render()},ro=function(t){var e='<div class="note-form-group"><label for="note-dialog-link-txt-'+t.id+'" class="note-form-label">'+t.lang.link.textToDisplay+'</label><input id="note-dialog-link-txt-'+t.id+'" class="note-link-text note-input" type="text"/></div><div class="note-form-group"><label for="note-dialog-link-url-'+t.id+'" class="note-form-label">'+t.lang.link.url+'</label><input id="note-dialog-link-url-'+t.id+'" class="note-link-url note-input" type="text" value="http://"/></div>'+(t.disableLinkTarget?"":'<div class="checkbox"><label for="note-dialog-link-nw-'+t.id+'"><input id="note-dialog-link-nw-'+t.id+'" type="checkbox" checked> '+t.lang.link.openInNewWindow+"</label></div>")+'<div class="checkbox"><label for="note-dialog-link-up-'+t.id+'"><input id="note-dialog-link-up-'+t.id+'" type="checkbox" checked> '+t.lang.link.useProtocol+"</label></div>",o=['<button href="#" type="button" class="note-btn note-btn-primary note-link-btn disabled" disabled>',t.lang.link.insert,"</button>"].join("");return oo({className:"link-dialog",title:t.lang.link.insert,fade:t.fade,body:e,footer:o}).render()},ao=Ie(['<div class="note-popover bottom">','<div class="note-popover-arrow"></div>','<div class="popover-content note-children-container"></div>',"</div>"].join(""),(function(t,e){var o=void 0!==e.direction?e.direction:"bottom";t.addClass(o).hide(),e.hideArrow&&t.find(".note-popover-arrow").hide()})),so=Ie('<div class="checkbox"></div>',(function(t,e){t.html(["<label"+(e.id?' for="note-'+e.id+'"':"")+">",'<input role="checkbox" type="checkbox"'+(e.id?' id="note-'+e.id+'"':""),e.checked?" checked":"",' aria-checked="'+(e.checked?"true":"false")+'"/>',e.text?e.text:"","</label>"].join(""))})),lo=function(t,e){return t.match(/^</)?t:"<"+(e=e||"i")+' class="'+t+'"></'+e+">"};e().summernote=e().extend(e().summernote,{ui_template:function(t){return{editor:Be,toolbar:ze,editingArea:Me,codable:Oe,editable:je,statusbar:Ue,airEditor:We,airEditable:Ke,buttonGroup:Ve,button:qe,dropdown:_e,dropdownCheck:Ge,dropdownButton:Ze,dropdownButtonContents:Ye,dropdownCheckButton:Xe,paragraphDropdownButton:Qe,tableDropdownButton:Je,colorDropdownButton:eo,palette:to,dialog:oo,videoDialog:no,imageDialog:io,linkDialog:ro,popover:ao,checkbox:so,icon:lo,options:t,toggleBtn:function(t,e){t.toggleClass("disabled",!e),t.attr("disabled",!e)},toggleBtnActive:function(t,e){t.toggleClass("active",e)},check:function(t,e){t.find(".checked").removeClass("checked"),t.find('[data-value="'+e+'"]').addClass("checked")},onDialogShown:function(t,e){t.one("note.modal.show",e)},onDialogHidden:function(t,e){t.one("note.modal.hide",e)},showDialog:function(t){t.data("modal").show()},hideDialog:function(t){t.data("modal").hide()},getPopoverContent:function(t){return t.find(".note-popover-content")},getDialogBody:function(t){return t.find(".note-modal-body")},createLayout:function(e){var o=(t.airMode?We([Me([Oe(),Ke()])]):"bottom"===t.toolbarPosition?Be([Me([Oe(),je()]),ze(),Ue()]):Be([ze(),Me([Oe(),je()]),Ue()])).render();return o.insertAfter(e),{note:e,editor:o,toolbar:o.find(".note-toolbar"),editingArea:o.find(".note-editing-area"),editable:o.find(".note-editable"),codable:o.find(".note-codable"),statusbar:o.find(".note-statusbar")}},removeLayout:function(t,e){t.html(e.editable.html()),e.editor.remove(),t.off("summernote"),t.show()}}},interface:"lite"})})(),i})()}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.map b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.map
new file mode 100644
index 0000000..f1dd721
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote-lite.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///external {\"root\":\"jQuery\",\"commonjs2\":\"jquery\",\"commonjs\":\"jquery\",\"amd\":\"jquery\"}","webpack:///./src/js/base/renderer.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///./src/js/base/summernote-en-US.js","webpack:///./src/js/base/core/env.js","webpack:///./src/js/base/core/func.js","webpack:///./src/js/base/core/lists.js","webpack:///./src/js/base/core/dom.js","webpack:///./src/js/base/Context.js","webpack:///./src/js/base/core/range.js","webpack:///./src/js/summernote.js","webpack:///./src/js/base/core/key.js","webpack:///./src/js/base/editing/History.js","webpack:///./src/js/base/editing/Style.js","webpack:///./src/js/base/editing/Bullet.js","webpack:///./src/js/base/editing/Typing.js","webpack:///./src/js/base/editing/Table.js","webpack:///./src/js/base/module/Editor.js","webpack:///./src/js/base/core/async.js","webpack:///./src/js/base/module/Clipboard.js","webpack:///./src/js/base/module/Dropzone.js","webpack:///./src/js/base/module/Codeview.js","webpack:///./src/js/base/module/Statusbar.js","webpack:///./src/js/base/module/Fullscreen.js","webpack:///./src/js/base/module/Handle.js","webpack:///./src/js/base/module/AutoLink.js","webpack:///./src/js/base/module/AutoSync.js","webpack:///./src/js/base/module/AutoReplace.js","webpack:///./src/js/base/module/Placeholder.js","webpack:///./src/js/base/module/Buttons.js","webpack:///./src/js/base/module/Toolbar.js","webpack:///./src/js/base/module/LinkDialog.js","webpack:///./src/js/base/module/LinkPopover.js","webpack:///./src/js/base/module/ImageDialog.js","webpack:///./src/js/base/module/ImagePopover.js","webpack:///./src/js/base/module/TablePopover.js","webpack:///./src/js/base/module/VideoDialog.js","webpack:///./src/js/base/module/HelpDialog.js","webpack:///./src/js/base/module/AirPopover.js","webpack:///./src/js/base/module/HintPopover.js","webpack:///./src/js/base/settings.js","webpack:///./src/js/lite/ui/TooltipUI.js","webpack:///./src/js/lite/ui/DropdownUI.js","webpack:///./src/js/lite/ui/ModalUI.js","webpack:///./src/js/lite/ui.js","webpack:///./src/js/lite/settings.js"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__0__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Renderer","markup","children","options","callback","this","$parent","$node","$","contents","html","className","addClass","data","each","k","v","attr","click","on","$container","find","forEach","child","render","length","append","arguments","Array","isArray","__webpack_amd_options__","summernote","lang","extend","font","bold","italic","underline","clear","height","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","isSupportAmd","genericFontFamilies","validFontName","fontName","inArray","toLowerCase","browserVersion","userAgent","navigator","isMSIE","test","matches","exec","parseFloat","isEdge","isSupportTouch","MaxTouchPoints","msMaxTouchPoints","inputEventName","isMac","appVersion","indexOf","isFF","isPhantom","isWebkit","isChrome","isSafari","jqueryVersion","fn","jquery","isFontInstalled","testFontName","context","document","createElement","getContext","testSize","originalWidth","measureText","width","isW3CRangeSupport","createRange","idCounter","eq","itemA","itemB","eq2","peq2","propName","ok","fail","self","not","f","apply","and","fA","fB","item","invoke","obj","method","resetUniqueId","uniqueId","prefix","id","rect2bnd","rect","$document","top","scrollTop","scrollLeft","bottom","invertObject","inverted","namespaceToCamel","namespace","split","map","substring","toUpperCase","join","debounce","func","wait","immediate","timeout","args","later","callNow","clearTimeout","setTimeout","isValidUrl","head","array","last","tail","slice","contains","initial","prev","idx","next","pred","len","all","sum","reduce","memo","from","collection","result","isEmpty","clusterBy","aLast","compact","aResult","push","unique","results","NBSP_CHAR","String","fromCharCode","isEditable","node","hasClass","makePredByNodeName","nodeName","isText","nodeType","isVoid","isPara","isPre","isLi","isTable","isData","isInline","isBodyContainer","isList","isHr","isBlockquote","isCell","isAnchor","isBody","blankHTML","env","nodeLength","nodeValue","childNodes","innerHTML","paddingBlankHTML","ancestor","parentNode","listAncestor","ancestors","el","listNext","nodes","nextSibling","insertAfter","preceding","parent","insertBefore","appendChild","appendChildNodes","aChild","isLeftEdgePoint","point","offset","isRightEdgePoint","isEdgePoint","isLeftEdgeOf","position","isRightEdgeOf","previousSibling","hasChildren","prevPoint","isSkipInnerOffset","nextPoint","nextTextNode","getNextTextNode","nextPointWithEmptyNode","actual","isSamePoint","pointA","pointB","splitNode","isSkipPaddingBlankHTML","isNotSplitEdgePoint","isDiscardEmptySplits","splitText","childNode","clone","cloneNode","splitTree","isRemoveChild","removeNode","removeChild","isTextarea","stripLinebreaks","val","replace","ZERO_WIDTH_NBSP_CHAR","blank","emptyPara","isControlSizing","isElement","isPurePara","isHeading","isBlock","isBodyInline","isParaInline","isDiv","isBR","isSpan","isB","isU","isS","isI","isImg","deepestChildIsEmpty","firstElementChild","isEmptyAnchor","isClosestSibling","nodeA","nodeB","withClosestSiblings","siblings","isLeftEdgePointOf","isRightEdgePointOf","isVisiblePoint","leftNode","rightNode","prevPointUntil","nextPointUntil","isCharPoint","ch","charAt","isSpacePoint","walkPoint","startPoint","endPoint","handler","singleChildAncestor","lastAncestor","filter","listPrev","listDescendant","descendants","fnWalk","current","commonAncestor","wrap","wrapperName","wrapper","makeOffsetPath","reverse","fromOffsetPath","offsets","splitPoint","splitRoot","container","topAncestor","pivot","createText","text","createTextNode","removeWhile","newNode","cssText","isNewlineOnBlock","match","endSlash","isEndOfInlineContainer","isBlockNode","trim","posFromPlaceholder","placeholder","$placeholder","pos","outerHeight","attachEvents","events","keys","detachEvents","off","isCustomStyleTag","classList","Context","$note","memos","layoutInfo","ui","ui_template","initialize","createLayout","_initialize","hide","_destroy","removeData","removeLayout","disabled","isDisabled","code","dom","disable","now","editor","buttons","plugins","initializeModule","removeModule","removeMemo","triggerEvent","isActivated","undefined","codable","editable","editing","callbacks","trigger","shouldInitialize","ModuleClass","withoutIntialize","destroy","event","createInvokeHandler","preventDefault","$target","target","closest","splits","hasSeparator","moduleName","methodName","textRangeToPoint","textRange","isStart","prevContainer","parentElement","tester","body","createTextRange","moveToElementText","compareEndPoints","textRangeStart","curTextNode","collapse","firstChild","pointTester","duplicate","setEndPoint","textCount","cont","pointToTextRange","info","textRangeInfo","isCollapseToStart","prevTextNodes","collapseToStart","moveStart","type","isExternalAPICalled","hasInitOptions","langInfo","icons","tooltip","note","first","focus","WrappedRange","sc","so","ec","eo","isOnEditable","makeIsOn","isOnList","isOnAnchor","isOnCell","isOnData","w3cRange","setStart","setEnd","nativeRng","nativeRange","selection","getSelection","rangeCount","removeAllRanges","addRange","offsetTop","Math","abs","getVisiblePoint","isLeftToRight","block","hasRightNode","hasLeftNode","getEndPoint","isCollapsed","getStartPoint","includeAncestor","fullyContains","leftEdgeNodes","startAncestor","endAncestor","boundaryPoints","getPoints","isSameContainer","rng","emptyParents","normalize","inlineSiblings","concat","para","wrapBodyInlineWithPara","deleteContents","contentsContainer","reversed","insertNode","toString","findAfter","isNotTextPoint","regex","index","path","e","paras","getClientRects","wrappedRange","createFromSelection","bodyElement","lastChild","createFromBodyElement","createFromNode","anchorNode","getRangeAt","startContainer","startOffset","endContainer","endOffset","textRangeEnd","isTextNode","createFromNodeBefore","createFromNodeAfter","createFromBookmark","bookmark","createFromParaBookmark","KEY_MAP","isEdit","keyCode","BACKSPACE","TAB","ENTER","SPACE","DELETE","isMove","LEFT","UP","RIGHT","DOWN","isNavigation","HOME","END","PAGEUP","PAGEDOWN","nameFromCode","History","stack","stackOffset","$editable","range","snapshot","recordUndo","applySnapshot","makeSnapshot","historyLimit","shift","Style","$obj","propertyNames","propertyName","css","styleInfo","jQueryCSS","fontSize","parseInt","expandClosestSibling","onlyPartialContains","nodesInRange","tails","elem","$cont","fromNode","queryCommandState","queryCommandValue","isUnordered","lineHeight","toFixed","anchor","Bullet","toggleList","clustereds","previousList","findList","wrapList","appendToPrevious","releaseList","listName","paraBookmark","wrappedParas","diffLists","listNode","prevList","nextList","isEscapseToBody","releasedParas","headList","parentItem","newList","findNextSiblings","lastList","middleList","rootLists","rootList","listNodes","Typing","bullet","tabsize","tab","nextPara","blockquoteBreakingLevel","emptyAnchors","scrollIntoView","TableResultAction","where","domTable","_startPoint","_virtualTable","_actionCellList","setVirtualTablePosition","rowIndex","cellIndex","baseRow","baseCell","isRowSpan","isColSpan","isVirtualCell","objPosition","getActionCell","virtualTableCellObj","resultAction","virtualRowPosition","virtualColPosition","recoverCellIndex","newCellIndex","addCellInfoToVirtual","row","cell","cellHasColspan","colSpan","cellHasRowspan","rowSpan","isThisSelectedCell","rowPos","colPos","rowspanNumber","attributes","rp","rowspanIndex","adjustStartPoint","colspanNumber","cp","cellspanIndex","isSelectedCell","getDeleteResultActionToCell","Column","SubtractSpanCount","Row","isVirtual","AddCell","RemoveCell","getAddResultActionToCell","SumSpanCount","Ignore","getActionList","fixedRow","fixedCol","actualPosition","canContinue","rowPosition","colPosition","requestAction","Add","Delete","tagName","rows","cells","createVirtualTable","Table","isShift","nextCell","currentTr","trAttributes","recoverAttributes","actions","idCell","currentCell","tdAttributes","newTd","removeAttr","setAttribute","before","lastTrIndex","after","actionIndex","resultStr","attrList","specified","cellPos","virtualPosition","virtualTable","hasRowspan","nextRow","cloneRow","removeAttribute","colCount","rowCount","tdHTML","tds","idxCol","trHTML","trs","idxRow","$table","tableClassName","Editor","$editor","lastRange","typing","escape","untab","insertParagraph","insertOrderedList","insertUnorderedList","formatPara","insertHorizontalRule","commands","sCmd","beforeCommand","execCommand","afterCommand","wrapCommand","fontStyling","unit","currentStyle","fontSizeUnit","formatBlock","isLimited","getLastRange","setLastRange","insertText","textNode","pasteHTML","onApplyCustomStyle","onFormatBlock","hrNode","stylePara","createLink","linkInfo","linkUrl","linkText","isNewWindow","checkProtocol","additionalTextLength","isTextChanged","onCreateLink","defaultProtocol","anchors","styleNodes","createRangeFromList","colorInfo","foreColor","backColor","insertTable","dim","dimension","createTable","removeMedia","restoreTarget","detach","floatMe","toggleClass","resize","hasKeyShortCut","isDefaultPrevented","handleKeyMap","preventDefaultEditableShortCuts","recordEveryKeystroke","spellCheck","disableGrammar","airMode","overrideContextMenu","outerWidth","maxHeight","minHeight","keyMap","metaKey","ctrlKey","altKey","shiftKey","keyName","eventName","tabDisable","pad","maxTextLength","lst","thenCollapse","commit","styleWithCSS","isPreventTrigger","normalizeContent","tabSize","insertTab","src","param","Deferred","deferred","$img","one","resolve","reject","display","appendTo","promise","then","$image","min","show","files","file","filename","maximumImageFileSize","FileReader","onload","dataURL","onerror","err","readAsDataURL","readFileAsDataURL","insertImage","onImageUpload","insertImagesAsDataURL","currentRange","spans","firstSpan","noteStatusOutput","expand","$anchor","addRow","addCol","deleteRow","deleteCol","deleteTable","bKeepRatio","imageSize","newRatio","y","x","ratio","is","hasFocus","Clipboard","pasteByEvent","clipboardData","originalEvent","items","kind","getAsFile","getData","Dropzone","$eventListener","documentEventHandlers","$dropzone","prependTo","disableDragAndDrop","onDrop","attachDragAndDropEvent","$dropzoneMessage","onDragenter","isCodeview","hasEditorSize","add","onDragleave","removeClass","dataTransfer","types","content","substr","CodeView","$codable","CodeMirrorConstructor","CodeMirror","codemirror","getDoc","setValue","save","ESCAPE","deactivate","activate","codeviewFilter","codeviewFilterRegex","codeviewIframeFilter","whitelist","codeviewIframeWhitelistSrc","codeviewIframeWhitelistSrcBase","tag","RegExp","prettifyHtml","cmEditor","fromTextArea","tern","server","TernServer","ternServer","cm","updateArgHints","getValue","setSize","toTextArea","purify","isChange","Statusbar","$statusbar","statusbar","disableResizeEditor","stopPropagation","editableTop","onMouseMove","clientY","minheight","max","Fullscreen","$toolbar","toolbar","$window","$scrollbar","onResize","resizeTo","h","setsize","isFullscreen","Handle","$editingArea","editingArea","we","update","$handle","disableResizeImage","posStart","clientX","isImage","$selection","w","origImageObj","Image","sizingText","linkPattern","AutoLink","handleKeyup","handleKeydown","lastWordRange","keyword","urlText","showDomainOnlyForAutolink","linkTargetBlank","wordRange","getWordRange","AutoSync","AutoReplace","PERIOD","COMMA","SEMICOLON","SLASH","previousKeydownCode","lastWord","jQuery","Node","Placeholder","inheritPlaceholder","isShow","toggle","Buttons","invertedKeyMap","editorMethod","button","addToolbarButtons","addImagePopoverButtons","addLinkPopoverButtons","addTablePopoverButtons","fontInstalledMap","fontNamesIgnoreCheck","buttonGroup","icon","$button","currentTarget","$recentColor","colorButton","dropdownButtonContents","dropdown","$dropdown","$holder","palette","colors","colorsName","customColors","change","$chip","$picker","$palette","prepend","$color","$currentButton","magic","styleTags","title","template","styleIdx","styleLen","representShortcut","createInvokeHandlerAndUpdateState","eraser","addDefaultFonts","fontname","isFontDeservedToAdd","fontNames","dropdownCheck","checkClassName","menuCheck","fontSizes","fontSizeUnits","colorPalette","unorderedlist","orderedlist","justifyLeft","alignLeft","justifyCenter","alignCenter","justifyRight","alignRight","justifyFull","alignJustify","textHeight","lineHeights","insertTableMaxSize","col","mousedown","tableMoveHandler","picture","minus","arrowsAlt","question","rollback","trash","rowAbove","rowBelow","colBefore","colAfter","rowRemove","colRemove","groups","groupIdx","groupLen","group","groupName","$group","btn","updateBtnStates","$item","isChecked","infos","selector","toggleBtnActive","posOffset","$dimensionDisplay","$catcher","$highlighted","$unhighlighted","offsetX","posCatcher","pageX","pageY","offsetY","ceil","Toolbar","isFollowing","followScroll","toolbarContainer","changeContainer","followingToolbar","editorHeight","editorWidth","toolbarHeight","statusbarHeight","otherBarHeight","otherStaticBar","currentOffset","editorOffsetTop","activateOffset","deactivateOffsetBottom","marginTop","zIndex","isIncludeCodeview","$btn","toggleBtn","LinkDialog","$body","dialogsInBody","disableLinkTarget","checkbox","checked","footer","$dialog","dialog","fade","dialogsFade","hideDialog","$input","$linkBtn","$linkText","$linkUrl","$openInNewWindow","$useProtocol","onDialogShown","toggleLinkBtn","bindEnterKey","isNewWindowChecked","prop","useProtocolChecked","onDialogHidden","state","showDialog","showLinkDialog","LinkPopover","popover","$popover","$content","href","containerOffset","ImageDialog","imageLimitation","floor","log","readableSize","pow","showImageDialog","onImageLinkInsert","$imageInput","$imageUrl","$imageBtn","replaceWith","ImagePopover","popatmouse","TablePopover","VideoDialog","$video","ytMatch","igMatch","vMatch","vimMatch","dmMatch","youkuMatch","qqMatch","qqMatch2","mp4Match","oggMatch","webmMatch","fbMatch","youtubeId","start","ytMatchForStart","vid","encodeURIComponent","showVideoDialog","createVideoNode","$videoUrl","$videoBtn","HelpDialog","createShortcutList","command","$row","showHelpDialog","AirPopover","hidable","onContextmenu","air","forcelyOpen","HintPopover","hint","direction","hintDirection","hints","matchingWord","hideArrow","innerHeight","$current","$next","selectItem","$nextGroup","$prev","$prevGroup","nodeFromItem","rangeCompute","hintSelect","hintIdx","moveUp","moveDown","search","searchKeyword","createItemTemplates","hintMode","getWordsRange","getWordsMatchRange","empty","bnd","createGroup","version","Codeview","toolbarPosition","codeviewKeepButton","tabDisabled","textareaAutoSync","onBeforeCommand","onBlur","onBlurCodeview","onChange","onChangeCodeview","onEnter","onFocus","onImageUploadError","onInit","onKeydown","onKeyup","onMousedown","onMouseup","onPaste","onScroll","htmlMode","lineNumbers","pc","mac","TooltipUI","placement","$tooltip","showCallback","hideCallback","toggleCallback","targetOffset","nodeWidth","nodeHeight","tooltipWidth","tooltipHeight","DropdownUI","setEvent","stopImmediatePropagation","windowWidth","targetMarginRight","isOpened","ModalUI","$modal","$backdrop","which","renderer","airEditor","airEditable","$temp","$a","itemClick","caret","dropdownButton","opt","dropdownCheckButton","paragraphDropdownButton","tableDropdownButton","mousemove","rowSize","colSize","colorName","colorDropdownButton","currentClick","foreinput","getElementById","backinput","videoDialog","imageDialog","linkDialog","iconClassName","editorOptions","isEnable","isActive","check","$dom","getPopoverContent","getDialogBody","interface"],"mappings":"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","file":"summernote-lite.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jquery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jquery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jquery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 51);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__0__;","import $ from 'jquery';\n\nclass Renderer {\n  constructor(markup, children, options, callback) {\n    this.markup = markup;\n    this.children = children;\n    this.options = options;\n    this.callback = callback;\n  }\n\n  render($parent) {\n    const $node = $(this.markup);\n\n    if (this.options && this.options.contents) {\n      $node.html(this.options.contents);\n    }\n\n    if (this.options && this.options.className) {\n      $node.addClass(this.options.className);\n    }\n\n    if (this.options && this.options.data) {\n      $.each(this.options.data, (k, v) => {\n        $node.attr('data-' + k, v);\n      });\n    }\n\n    if (this.options && this.options.click) {\n      $node.on('click', this.options.click);\n    }\n\n    if (this.children) {\n      const $container = $node.find('.note-children-container');\n      this.children.forEach((child) => {\n        child.render($container.length ? $container : $node);\n      });\n    }\n\n    if (this.callback) {\n      this.callback($node, this.options);\n    }\n\n    if (this.options && this.options.callback) {\n      this.options.callback($node);\n    }\n\n    if ($parent) {\n      $parent.append($node);\n    }\n\n    return $node;\n  }\n}\n\nexport default {\n  create: (markup, callback) => {\n    return function() {\n      const options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];\n      let children = Array.isArray(arguments[0]) ? arguments[0] : [];\n      if (options && options.children) {\n        children = options.children;\n      }\n      return new Renderer(markup, children, options, callback);\n    };\n  },\n};\n","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n","import $ from 'jquery';\nconst isSupportAmd = typeof define === 'function' && define.amd; // eslint-disable-line\n\n/**\n * returns whether font is installed or not.\n *\n * @param {String} fontName\n * @return {Boolean}\n */\nconst genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];\n\nfunction validFontName(fontName) {\n  return ($.inArray(fontName.toLowerCase(), genericFontFamilies) === -1) ? `'${fontName}'` : fontName;\n}\n\nfunction isFontInstalled(fontName) {\n  const testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';\n  const testText = 'mmmmmmmmmmwwwww';\n  const testSize = '200px';\n\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n\n  context.font = testSize + \" '\" + testFontName + \"'\";\n  const originalWidth = context.measureText(testText).width;\n\n  context.font = testSize + ' ' + validFontName(fontName) + ', \"' + testFontName + '\"';\n  const width = context.measureText(testText).width;\n\n  return originalWidth !== width;\n}\n\nconst userAgent = navigator.userAgent;\nconst isMSIE = /MSIE|Trident/i.test(userAgent);\nlet browserVersion;\nif (isMSIE) {\n  let matches = /MSIE (\\d+[.]\\d+)/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n  matches = /Trident\\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n}\n\nconst isEdge = /Edge\\/\\d+/.test(userAgent);\n\nconst isSupportTouch =\n  (('ontouchstart' in window) ||\n   (navigator.MaxTouchPoints > 0) ||\n   (navigator.msMaxTouchPoints > 0));\n\n// [workaround] IE doesn't have input events for contentEditable\n// - see: https://goo.gl/4bfIvA\nconst inputEventName = (isMSIE) ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';\n\n/**\n * @class core.env\n *\n * Object which check platform and agent\n *\n * @singleton\n * @alternateClassName env\n */\nexport default {\n  isMac: navigator.appVersion.indexOf('Mac') > -1,\n  isMSIE,\n  isEdge,\n  isFF: !isEdge && /firefox/i.test(userAgent),\n  isPhantom: /PhantomJS/i.test(userAgent),\n  isWebkit: !isEdge && /webkit/i.test(userAgent),\n  isChrome: !isEdge && /chrome/i.test(userAgent),\n  isSafari: !isEdge && /safari/i.test(userAgent) && (!/chrome/i.test(userAgent)),\n  browserVersion,\n  jqueryVersion: parseFloat($.fn.jquery),\n  isSupportAmd,\n  isSupportTouch,\n  isFontInstalled,\n  isW3CRangeSupport: !!document.createRange,\n  inputEventName,\n  genericFontFamilies,\n  validFontName,\n};\n","import $ from 'jquery';\n\n/**\n * @class core.func\n *\n * func utils (for high-order func's arg)\n *\n * @singleton\n * @alternateClassName func\n */\nfunction eq(itemA) {\n  return function(itemB) {\n    return itemA === itemB;\n  };\n}\n\nfunction eq2(itemA, itemB) {\n  return itemA === itemB;\n}\n\nfunction peq2(propName) {\n  return function(itemA, itemB) {\n    return itemA[propName] === itemB[propName];\n  };\n}\n\nfunction ok() {\n  return true;\n}\n\nfunction fail() {\n  return false;\n}\n\nfunction not(f) {\n  return function() {\n    return !f.apply(f, arguments);\n  };\n}\n\nfunction and(fA, fB) {\n  return function(item) {\n    return fA(item) && fB(item);\n  };\n}\n\nfunction self(a) {\n  return a;\n}\n\nfunction invoke(obj, method) {\n  return function() {\n    return obj[method].apply(obj, arguments);\n  };\n}\n\nlet idCounter = 0;\n\n/**\n * reset globally-unique id\n *\n */\nfunction resetUniqueId() {\n  idCounter = 0;\n}\n\n/**\n * generate a globally-unique id\n *\n * @param {String} [prefix]\n */\nfunction uniqueId(prefix) {\n  const id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n/**\n * returns bnd (bounds) from rect\n *\n * - IE Compatibility Issue: http://goo.gl/sRLOAo\n * - Scroll Issue: http://goo.gl/sNjUc\n *\n * @param {Rect} rect\n * @return {Object} bounds\n * @return {Number} bounds.top\n * @return {Number} bounds.left\n * @return {Number} bounds.width\n * @return {Number} bounds.height\n */\nfunction rect2bnd(rect) {\n  const $document = $(document);\n  return {\n    top: rect.top + $document.scrollTop(),\n    left: rect.left + $document.scrollLeft(),\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n}\n\n/**\n * returns a copy of the object where the keys have become the values and the values the keys.\n * @param {Object} obj\n * @return {Object}\n */\nfunction invertObject(obj) {\n  const inverted = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      inverted[obj[key]] = key;\n    }\n  }\n  return inverted;\n}\n\n/**\n * @param {String} namespace\n * @param {String} [prefix]\n * @return {String}\n */\nfunction namespaceToCamel(namespace, prefix) {\n  prefix = prefix || '';\n  return prefix + namespace.split('.').map(function(name) {\n    return name.substring(0, 1).toUpperCase() + name.substring(1);\n  }).join('');\n}\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param {Function} func\n * @param {Number} wait\n * @param {Boolean} immediate\n * @return {Function}\n */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function() {\n    const context = this;\n    const args = arguments;\n    const later = () => {\n      timeout = null;\n      if (!immediate) {\n        func.apply(context, args);\n      }\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) {\n      func.apply(context, args);\n    }\n  };\n}\n\n/**\n *\n * @param {String} url\n * @return {Boolean}\n */\nfunction isValidUrl(url) {\n  const expression = /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/gi;\n  return expression.test(url);\n}\n\nexport default {\n  eq,\n  eq2,\n  peq2,\n  ok,\n  fail,\n  self,\n  not,\n  and,\n  invoke,\n  resetUniqueId,\n  uniqueId,\n  rect2bnd,\n  invertObject,\n  namespaceToCamel,\n  debounce,\n  isValidUrl,\n};\n","import func from './func';\n\n/**\n * returns the first item of an array.\n *\n * @param {Array} array\n */\nfunction head(array) {\n  return array[0];\n}\n\n/**\n * returns the last item of an array.\n *\n * @param {Array} array\n */\nfunction last(array) {\n  return array[array.length - 1];\n}\n\n/**\n * returns everything but the last entry of the array.\n *\n * @param {Array} array\n */\nfunction initial(array) {\n  return array.slice(0, array.length - 1);\n}\n\n/**\n * returns the rest of the items in an array.\n *\n * @param {Array} array\n */\nfunction tail(array) {\n  return array.slice(1);\n}\n\n/**\n * returns item of array\n */\nfunction find(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    const item = array[idx];\n    if (pred(item)) {\n      return item;\n    }\n  }\n}\n\n/**\n * returns true if all of the values in the array pass the predicate truth test.\n */\nfunction all(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!pred(array[idx])) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * returns true if the value is present in the list.\n */\nfunction contains(array, item) {\n  if (array && array.length && item) {\n    if (array.indexOf) {\n      return array.indexOf(item) !== -1;\n    } else if (array.contains) {\n      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`\n      return array.contains(item);\n    }\n  }\n  return false;\n}\n\n/**\n * get sum from a list\n *\n * @param {Array} array - array\n * @param {Function} fn - iterator\n */\nfunction sum(array, fn) {\n  fn = fn || func.self;\n  return array.reduce(function(memo, v) {\n    return memo + fn(v);\n  }, 0);\n}\n\n/**\n * returns a copy of the collection with array type.\n * @param {Collection} collection - collection eg) node.childNodes, ...\n */\nfunction from(collection) {\n  const result = [];\n  const length = collection.length;\n  let idx = -1;\n  while (++idx < length) {\n    result[idx] = collection[idx];\n  }\n  return result;\n}\n\n/**\n * returns whether list is empty or not\n */\nfunction isEmpty(array) {\n  return !array || !array.length;\n}\n\n/**\n * cluster elements by predicate function.\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n * @param {Array[]}\n */\nfunction clusterBy(array, fn) {\n  if (!array.length) { return []; }\n  const aTail = tail(array);\n  return aTail.reduce(function(memo, v) {\n    const aLast = last(memo);\n    if (fn(last(aLast), v)) {\n      aLast[aLast.length] = v;\n    } else {\n      memo[memo.length] = [v];\n    }\n    return memo;\n  }, [[head(array)]]);\n}\n\n/**\n * returns a copy of the array with all false values removed\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n */\nfunction compact(array) {\n  const aResult = [];\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (array[idx]) { aResult.push(array[idx]); }\n  }\n  return aResult;\n}\n\n/**\n * produces a duplicate-free version of the array\n *\n * @param {Array} array\n */\nfunction unique(array) {\n  const results = [];\n\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!contains(results, array[idx])) {\n      results.push(array[idx]);\n    }\n  }\n\n  return results;\n}\n\n/**\n * returns next item.\n * @param {Array} array\n */\nfunction next(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx + 1];\n  }\n  return null;\n}\n\n/**\n * returns prev item.\n * @param {Array} array\n */\nfunction prev(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx - 1];\n  }\n  return null;\n}\n\n/**\n * @class core.list\n *\n * list utils\n *\n * @singleton\n * @alternateClassName list\n */\nexport default {\n  head,\n  last,\n  initial,\n  tail,\n  prev,\n  next,\n  find,\n  contains,\n  all,\n  sum,\n  from,\n  isEmpty,\n  clusterBy,\n  compact,\n  unique,\n};\n","import $ from 'jquery';\nimport func from './func';\nimport lists from './lists';\nimport env from './env';\n\nconst NBSP_CHAR = String.fromCharCode(160);\nconst ZERO_WIDTH_NBSP_CHAR = '\\ufeff';\n\n/**\n * @method isEditable\n *\n * returns whether node is `note-editable` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEditable(node) {\n  return node && $(node).hasClass('note-editable');\n}\n\n/**\n * @method isControlSizing\n *\n * returns whether node is `note-control-sizing` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isControlSizing(node) {\n  return node && $(node).hasClass('note-control-sizing');\n}\n\n/**\n * @method makePredByNodeName\n *\n * returns predicate which judge whether nodeName is same\n *\n * @param {String} nodeName\n * @return {Function}\n */\nfunction makePredByNodeName(nodeName) {\n  nodeName = nodeName.toUpperCase();\n  return function(node) {\n    return node && node.nodeName.toUpperCase() === nodeName;\n  };\n}\n\n/**\n * @method isText\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is text(3)\n */\nfunction isText(node) {\n  return node && node.nodeType === 3;\n}\n\n/**\n * @method isElement\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is element(1)\n */\nfunction isElement(node) {\n  return node && node.nodeType === 1;\n}\n\n/**\n * ex) br, col, embed, hr, img, input, ...\n * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n */\nfunction isVoid(node) {\n  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());\n}\n\nfunction isPara(node) {\n  if (isEditable(node)) {\n    return false;\n  }\n\n  // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph\n  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nfunction isHeading(node) {\n  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nconst isPre = makePredByNodeName('PRE');\n\nconst isLi = makePredByNodeName('LI');\n\nfunction isPurePara(node) {\n  return isPara(node) && !isLi(node);\n}\n\nconst isTable = makePredByNodeName('TABLE');\n\nconst isData = makePredByNodeName('DATA');\n\nfunction isInline(node) {\n  return !isBodyContainer(node) &&\n         !isList(node) &&\n         !isHr(node) &&\n         !isPara(node) &&\n         !isTable(node) &&\n         !isBlockquote(node) &&\n         !isData(node);\n}\n\nfunction isList(node) {\n  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());\n}\n\nconst isHr = makePredByNodeName('HR');\n\nfunction isCell(node) {\n  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());\n}\n\nconst isBlockquote = makePredByNodeName('BLOCKQUOTE');\n\nfunction isBodyContainer(node) {\n  return isCell(node) || isBlockquote(node) || isEditable(node);\n}\n\nconst isAnchor = makePredByNodeName('A');\n\nfunction isParaInline(node) {\n  return isInline(node) && !!ancestor(node, isPara);\n}\n\nfunction isBodyInline(node) {\n  return isInline(node) && !ancestor(node, isPara);\n}\n\nconst isBody = makePredByNodeName('BODY');\n\n/**\n * returns whether nodeB is closest sibling of nodeA\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @return {Boolean}\n */\nfunction isClosestSibling(nodeA, nodeB) {\n  return nodeA.nextSibling === nodeB ||\n         nodeA.previousSibling === nodeB;\n}\n\n/**\n * returns array of closest siblings with node\n *\n * @param {Node} node\n * @param {function} [pred] - predicate function\n * @return {Node[]}\n */\nfunction withClosestSiblings(node, pred) {\n  pred = pred || func.ok;\n\n  const siblings = [];\n  if (node.previousSibling && pred(node.previousSibling)) {\n    siblings.push(node.previousSibling);\n  }\n  siblings.push(node);\n  if (node.nextSibling && pred(node.nextSibling)) {\n    siblings.push(node.nextSibling);\n  }\n  return siblings;\n}\n\n/**\n * blank HTML for cursor position\n * - [workaround] old IE only works with &nbsp;\n * - [workaround] IE11 and other browser works with bogus br\n */\nconst blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';\n\n/**\n * @method nodeLength\n *\n * returns #text's text size or element's childNodes size\n *\n * @param {Node} node\n */\nfunction nodeLength(node) {\n  if (isText(node)) {\n    return node.nodeValue.length;\n  }\n\n  if (node) {\n    return node.childNodes.length;\n  }\n\n  return 0;\n}\n\n/**\n * returns whether deepest child node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction deepestChildIsEmpty(node) {\n  do {\n    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;\n  } while ((node = node.firstElementChild));\n\n  return isEmpty(node);\n}\n\n/**\n * returns whether node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEmpty(node) {\n  const len = nodeLength(node);\n\n  if (len === 0) {\n    return true;\n  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {\n    // ex) <p><br></p>, <span><br></span>\n    return true;\n  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {\n    // ex) <p></p>, <span></span>\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * padding blankHTML if node is empty (for cursor position)\n */\nfunction paddingBlankHTML(node) {\n  if (!isVoid(node) && !nodeLength(node)) {\n    node.innerHTML = blankHTML;\n  }\n}\n\n/**\n * find nearest ancestor predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction ancestor(node, pred) {\n  while (node) {\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * find nearest ancestor only single child blood line and predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction singleChildAncestor(node, pred) {\n  node = node.parentNode;\n\n  while (node) {\n    if (nodeLength(node) !== 1) { break; }\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * returns new array of ancestor nodes (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listAncestor(node, pred) {\n  pred = pred || func.fail;\n\n  const ancestors = [];\n  ancestor(node, function(el) {\n    if (!isEditable(el)) {\n      ancestors.push(el);\n    }\n\n    return pred(el);\n  });\n  return ancestors;\n}\n\n/**\n * find farthest ancestor predicate hit\n */\nfunction lastAncestor(node, pred) {\n  const ancestors = listAncestor(node);\n  return lists.last(ancestors.filter(pred));\n}\n\n/**\n * returns common ancestor node between two nodes.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n */\nfunction commonAncestor(nodeA, nodeB) {\n  const ancestors = listAncestor(nodeA);\n  for (let n = nodeB; n; n = n.parentNode) {\n    if (ancestors.indexOf(n) > -1) return n;\n  }\n  return null; // difference document area\n}\n\n/**\n * listing all previous siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listPrev(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.previousSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing next siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listNext(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.nextSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing descendant nodes\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listDescendant(node, pred) {\n  const descendants = [];\n  pred = pred || func.ok;\n\n  // start DFS(depth first search) with node\n  (function fnWalk(current) {\n    if (node !== current && pred(current)) {\n      descendants.push(current);\n    }\n    for (let idx = 0, len = current.childNodes.length; idx < len; idx++) {\n      fnWalk(current.childNodes[idx]);\n    }\n  })(node);\n\n  return descendants;\n}\n\n/**\n * wrap node with new tag.\n *\n * @param {Node} node\n * @param {Node} tagName of wrapper\n * @return {Node} - wrapper\n */\nfunction wrap(node, wrapperName) {\n  const parent = node.parentNode;\n  const wrapper = $('<' + wrapperName + '>')[0];\n\n  parent.insertBefore(wrapper, node);\n  wrapper.appendChild(node);\n\n  return wrapper;\n}\n\n/**\n * insert node after preceding\n *\n * @param {Node} node\n * @param {Node} preceding - predicate function\n */\nfunction insertAfter(node, preceding) {\n  const next = preceding.nextSibling;\n  let parent = preceding.parentNode;\n  if (next) {\n    parent.insertBefore(node, next);\n  } else {\n    parent.appendChild(node);\n  }\n  return node;\n}\n\n/**\n * append elements.\n *\n * @param {Node} node\n * @param {Collection} aChild\n */\nfunction appendChildNodes(node, aChild) {\n  $.each(aChild, function(idx, child) {\n    node.appendChild(child);\n  });\n  return node;\n}\n\n/**\n * returns whether boundaryPoint is left edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isLeftEdgePoint(point) {\n  return point.offset === 0;\n}\n\n/**\n * returns whether boundaryPoint is right edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isRightEdgePoint(point) {\n  return point.offset === nodeLength(point.node);\n}\n\n/**\n * returns whether boundaryPoint is edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isEdgePoint(point) {\n  return isLeftEdgePoint(point) || isRightEdgePoint(point);\n}\n\n/**\n * returns whether node is left edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgeOf(node, ancestor) {\n  while (node && node !== ancestor) {\n    if (position(node) !== 0) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether node is right edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgeOf(node, ancestor) {\n  if (!ancestor) {\n    return false;\n  }\n  while (node && node !== ancestor) {\n    if (position(node) !== nodeLength(node.parentNode) - 1) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether point is left edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgePointOf(point, ancestor) {\n  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns whether point is right edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgePointOf(point, ancestor) {\n  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns offset from parent.\n *\n * @param {Node} node\n */\nfunction position(node) {\n  let offset = 0;\n  while ((node = node.previousSibling)) {\n    offset += 1;\n  }\n  return offset;\n}\n\nfunction hasChildren(node) {\n  return !!(node && node.childNodes && node.childNodes.length);\n}\n\n/**\n * returns previous boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction prevPoint(point, isSkipInnerOffset) {\n  let node;\n  let offset;\n\n  if (point.offset === 0) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node);\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset - 1];\n    offset = nodeLength(node);\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? 0 : point.offset - 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPoint(point, isSkipInnerOffset) {\n  let node, offset;\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint with empty node\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPointWithEmptyNode(point, isSkipInnerOffset) {\n  let node, offset;\n\n  // if node is empty string node, return current node's sibling.\n  if (isEmpty(point.node)) {\n    node = point.node.nextSibling;\n    offset = 0;\n\n    return {\n      node: node,\n      offset: offset,\n    };\n  }\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n\n    // if next node is editable, return current node's sibling node.\n    if (isEditable(node)) {\n      node = point.node.nextSibling;\n      offset = 0;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n    if (isEmpty(node)) {\n      return null;\n    }\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n\n    if (isEmpty(node)) {\n      return null;\n    }\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/*\n* returns the next Text node index or 0 if not found.\n*/\nfunction getNextTextNode(actual) {\n  if (!actual.nextSibling) return undefined;\n  if (actual.parent !== actual.nextSibling.parent) return undefined;\n  if (isText(actual.nextSibling)) return actual.nextSibling;\n  return getNextTextNode(actual.nextSibling);\n}\n\n/**\n * returns whether pointA and pointB is same or not.\n *\n * @param {BoundaryPoint} pointA\n * @param {BoundaryPoint} pointB\n * @return {Boolean}\n */\nfunction isSamePoint(pointA, pointB) {\n  return pointA.node === pointB.node && pointA.offset === pointB.offset;\n}\n\n/**\n * returns whether point is visible (can set cursor) or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isVisiblePoint(point) {\n  if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {\n    return true;\n  }\n\n  const leftNode = point.node.childNodes[point.offset - 1];\n  const rightNode = point.node.childNodes[point.offset];\n  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * @method prevPointUtil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction prevPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = prevPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * @method nextPointUntil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction nextPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = nextPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * returns whether point has character or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isCharPoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch && (ch !== ' ' && ch !== NBSP_CHAR);\n}\n\n/**\n * returns whether point has space or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isSpacePoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch === ' ' || ch === NBSP_CHAR;\n}\n\n/**\n * @method walkPoint\n *\n * @param {BoundaryPoint} startPoint\n * @param {BoundaryPoint} endPoint\n * @param {Function} handler\n * @param {Boolean} isSkipInnerOffset\n */\nfunction walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {\n  let point = startPoint;\n\n  while (point) {\n    handler(point);\n\n    if (isSamePoint(point, endPoint)) {\n      break;\n    }\n\n    const isSkipOffset = isSkipInnerOffset &&\n                       startPoint.node !== point.node &&\n                       endPoint.node !== point.node;\n    point = nextPointWithEmptyNode(point, isSkipOffset);\n  }\n}\n\n/**\n * @method makeOffsetPath\n *\n * return offsetPath(array of offset) from ancestor\n *\n * @param {Node} ancestor - ancestor node\n * @param {Node} node\n */\nfunction makeOffsetPath(ancestor, node) {\n  const ancestors = listAncestor(node, func.eq(ancestor));\n  return ancestors.map(position).reverse();\n}\n\n/**\n * @method fromOffsetPath\n *\n * return element from offsetPath(array of offset)\n *\n * @param {Node} ancestor - ancestor node\n * @param {array} offsets - offsetPath\n */\nfunction fromOffsetPath(ancestor, offsets) {\n  let current = ancestor;\n  for (let i = 0, len = offsets.length; i < len; i++) {\n    if (current.childNodes.length <= offsets[i]) {\n      current = current.childNodes[current.childNodes.length - 1];\n    } else {\n      current = current.childNodes[offsets[i]];\n    }\n  }\n  return current;\n}\n\n/**\n * @method splitNode\n *\n * split element or #text\n *\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @param {Boolean} [options.isDiscardEmptySplits] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitNode(point, options) {\n  let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;\n  const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;\n  const isDiscardEmptySplits = options && options.isDiscardEmptySplits;\n\n  if (isDiscardEmptySplits) {\n    isSkipPaddingBlankHTML = true;\n  }\n\n  // edge case\n  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {\n    if (isLeftEdgePoint(point)) {\n      return point.node;\n    } else if (isRightEdgePoint(point)) {\n      return point.node.nextSibling;\n    }\n  }\n\n  // split #text\n  if (isText(point.node)) {\n    return point.node.splitText(point.offset);\n  } else {\n    const childNode = point.node.childNodes[point.offset];\n    const clone = insertAfter(point.node.cloneNode(false), point.node);\n    appendChildNodes(clone, listNext(childNode));\n\n    if (!isSkipPaddingBlankHTML) {\n      paddingBlankHTML(point.node);\n      paddingBlankHTML(clone);\n    }\n\n    if (isDiscardEmptySplits) {\n      if (isEmpty(point.node)) {\n        remove(point.node);\n      }\n      if (isEmpty(clone)) {\n        remove(clone);\n        return point.node.nextSibling;\n      }\n    }\n\n    return clone;\n  }\n}\n\n/**\n * @method splitTree\n *\n * split tree by point\n *\n * @param {Node} root - split root\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitTree(root, point, options) {\n  // ex) [#text, <span>, <p>]\n  const ancestors = listAncestor(point.node, func.eq(root));\n\n  if (!ancestors.length) {\n    return null;\n  } else if (ancestors.length === 1) {\n    return splitNode(point, options);\n  }\n\n  return ancestors.reduce(function(node, parent) {\n    if (node === point.node) {\n      node = splitNode(point, options);\n    }\n\n    return splitNode({\n      node: parent,\n      offset: node ? position(node) : nodeLength(parent),\n    }, options);\n  });\n}\n\n/**\n * split point\n *\n * @param {Point} point\n * @param {Boolean} isInline\n * @return {Object}\n */\nfunction splitPoint(point, isInline) {\n  // find splitRoot, container\n  //  - inline: splitRoot is a child of paragraph\n  //  - block: splitRoot is a child of bodyContainer\n  const pred = isInline ? isPara : isBodyContainer;\n  const ancestors = listAncestor(point.node, pred);\n  const topAncestor = lists.last(ancestors) || point.node;\n\n  let splitRoot, container;\n  if (pred(topAncestor)) {\n    splitRoot = ancestors[ancestors.length - 2];\n    container = topAncestor;\n  } else {\n    splitRoot = topAncestor;\n    container = splitRoot.parentNode;\n  }\n\n  // if splitRoot is exists, split with splitTree\n  let pivot = splitRoot && splitTree(splitRoot, point, {\n    isSkipPaddingBlankHTML: isInline,\n    isNotSplitEdgePoint: isInline,\n  });\n\n  // if container is point.node, find pivot with point.offset\n  if (!pivot && container === point.node) {\n    pivot = point.node.childNodes[point.offset];\n  }\n\n  return {\n    rightNode: pivot,\n    container: container,\n  };\n}\n\nfunction create(nodeName) {\n  return document.createElement(nodeName);\n}\n\nfunction createText(text) {\n  return document.createTextNode(text);\n}\n\n/**\n * @method remove\n *\n * remove node, (isRemoveChild: remove child or not)\n *\n * @param {Node} node\n * @param {Boolean} isRemoveChild\n */\nfunction remove(node, isRemoveChild) {\n  if (!node || !node.parentNode) { return; }\n  if (node.removeNode) { return node.removeNode(isRemoveChild); }\n\n  const parent = node.parentNode;\n  if (!isRemoveChild) {\n    const nodes = [];\n    for (let i = 0, len = node.childNodes.length; i < len; i++) {\n      nodes.push(node.childNodes[i]);\n    }\n\n    for (let i = 0, len = nodes.length; i < len; i++) {\n      parent.insertBefore(nodes[i], node);\n    }\n  }\n\n  parent.removeChild(node);\n}\n\n/**\n * @method removeWhile\n *\n * @param {Node} node\n * @param {Function} pred\n */\nfunction removeWhile(node, pred) {\n  while (node) {\n    if (isEditable(node) || !pred(node)) {\n      break;\n    }\n\n    const parent = node.parentNode;\n    remove(node);\n    node = parent;\n  }\n}\n\n/**\n * @method replace\n *\n * replace node with provided nodeName\n *\n * @param {Node} node\n * @param {String} nodeName\n * @return {Node} - new node\n */\nfunction replace(node, nodeName) {\n  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {\n    return node;\n  }\n\n  const newNode = create(nodeName);\n\n  if (node.style.cssText) {\n    newNode.style.cssText = node.style.cssText;\n  }\n\n  appendChildNodes(newNode, lists.from(node.childNodes));\n  insertAfter(newNode, node);\n  remove(node);\n\n  return newNode;\n}\n\nconst isTextarea = makePredByNodeName('TEXTAREA');\n\n/**\n * @param {jQuery} $node\n * @param {Boolean} [stripLinebreaks] - default: false\n */\nfunction value($node, stripLinebreaks) {\n  const val = isTextarea($node[0]) ? $node.val() : $node.html();\n  if (stripLinebreaks) {\n    return val.replace(/[\\n\\r]/g, '');\n  }\n  return val;\n}\n\n/**\n * @method html\n *\n * get the HTML contents of node\n *\n * @param {jQuery} $node\n * @param {Boolean} [isNewlineOnBlock]\n */\nfunction html($node, isNewlineOnBlock) {\n  let markup = value($node);\n\n  if (isNewlineOnBlock) {\n    const regexTag = /<(\\/?)(\\b(?!!)[^>\\s]*)(.*?)(\\s*\\/?>)/g;\n    markup = markup.replace(regexTag, function(match, endSlash, name) {\n      name = name.toUpperCase();\n      const isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&\n                                   !!endSlash;\n      const isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);\n\n      return match + ((isEndOfInlineContainer || isBlockNode) ? '\\n' : '');\n    });\n    markup = markup.trim();\n  }\n\n  return markup;\n}\n\nfunction posFromPlaceholder(placeholder) {\n  const $placeholder = $(placeholder);\n  const pos = $placeholder.offset();\n  const height = $placeholder.outerHeight(true); // include margin\n\n  return {\n    left: pos.left,\n    top: pos.top + height,\n  };\n}\n\nfunction attachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.on(key, events[key]);\n  });\n}\n\nfunction detachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.off(key, events[key]);\n  });\n}\n\n/**\n * @method isCustomStyleTag\n *\n * assert if a node contains a \"note-styletag\" class,\n * which implies that's a custom-made style tag node\n *\n * @param {Node} an HTML DOM node\n */\nfunction isCustomStyleTag(node) {\n  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');\n}\n\nexport default {\n  /** @property {String} NBSP_CHAR */\n  NBSP_CHAR,\n  /** @property {String} ZERO_WIDTH_NBSP_CHAR */\n  ZERO_WIDTH_NBSP_CHAR,\n  /** @property {String} blank */\n  blank: blankHTML,\n  /** @property {String} emptyPara */\n  emptyPara: `<p>${blankHTML}</p>`,\n  makePredByNodeName,\n  isEditable,\n  isControlSizing,\n  isText,\n  isElement,\n  isVoid,\n  isPara,\n  isPurePara,\n  isHeading,\n  isInline,\n  isBlock: func.not(isInline),\n  isBodyInline,\n  isBody,\n  isParaInline,\n  isPre,\n  isList,\n  isTable,\n  isData,\n  isCell,\n  isBlockquote,\n  isBodyContainer,\n  isAnchor,\n  isDiv: makePredByNodeName('DIV'),\n  isLi,\n  isBR: makePredByNodeName('BR'),\n  isSpan: makePredByNodeName('SPAN'),\n  isB: makePredByNodeName('B'),\n  isU: makePredByNodeName('U'),\n  isS: makePredByNodeName('S'),\n  isI: makePredByNodeName('I'),\n  isImg: makePredByNodeName('IMG'),\n  isTextarea,\n  deepestChildIsEmpty,\n  isEmpty,\n  isEmptyAnchor: func.and(isAnchor, isEmpty),\n  isClosestSibling,\n  withClosestSiblings,\n  nodeLength,\n  isLeftEdgePoint,\n  isRightEdgePoint,\n  isEdgePoint,\n  isLeftEdgeOf,\n  isRightEdgeOf,\n  isLeftEdgePointOf,\n  isRightEdgePointOf,\n  prevPoint,\n  nextPoint,\n  nextPointWithEmptyNode,\n  isSamePoint,\n  isVisiblePoint,\n  prevPointUntil,\n  nextPointUntil,\n  isCharPoint,\n  isSpacePoint,\n  walkPoint,\n  ancestor,\n  singleChildAncestor,\n  listAncestor,\n  lastAncestor,\n  listNext,\n  listPrev,\n  listDescendant,\n  commonAncestor,\n  wrap,\n  insertAfter,\n  appendChildNodes,\n  position,\n  hasChildren,\n  makeOffsetPath,\n  fromOffsetPath,\n  splitTree,\n  splitPoint,\n  create,\n  createText,\n  remove,\n  removeWhile,\n  replace,\n  html,\n  value,\n  posFromPlaceholder,\n  attachEvents,\n  detachEvents,\n  isCustomStyleTag,\n};\n","import $ from 'jquery';\nimport func from './core/func';\nimport lists from './core/lists';\nimport dom from './core/dom';\n\nexport default class Context {\n  /**\n   * @param {jQuery} $note\n   * @param {Object} options\n   */\n  constructor($note, options) {\n    this.$note = $note;\n\n    this.memos = {};\n    this.modules = {};\n    this.layoutInfo = {};\n    this.options = $.extend(true, {}, options);\n\n    // init ui with options\n    $.summernote.ui = $.summernote.ui_template(this.options);\n    this.ui = $.summernote.ui;\n\n    this.initialize();\n  }\n\n  /**\n   * create layout and initialize modules and other resources\n   */\n  initialize() {\n    this.layoutInfo = this.ui.createLayout(this.$note);\n    this._initialize();\n    this.$note.hide();\n    return this;\n  }\n\n  /**\n   * destroy modules and other resources and remove layout\n   */\n  destroy() {\n    this._destroy();\n    this.$note.removeData('summernote');\n    this.ui.removeLayout(this.$note, this.layoutInfo);\n  }\n\n  /**\n   * destory modules and other resources and initialize it again\n   */\n  reset() {\n    const disabled = this.isDisabled();\n    this.code(dom.emptyPara);\n    this._destroy();\n    this._initialize();\n\n    if (disabled) {\n      this.disable();\n    }\n  }\n\n  _initialize() {\n    // set own id\n    this.options.id = func.uniqueId($.now());\n    // set default container for tooltips, popovers, and dialogs\n    this.options.container = this.options.container || this.layoutInfo.editor;\n\n    // add optional buttons\n    const buttons = $.extend({}, this.options.buttons);\n    Object.keys(buttons).forEach((key) => {\n      this.memo('button.' + key, buttons[key]);\n    });\n\n    const modules = $.extend({}, this.options.modules, $.summernote.plugins || {});\n\n    // add and initialize modules\n    Object.keys(modules).forEach((key) => {\n      this.module(key, modules[key], true);\n    });\n\n    Object.keys(this.modules).forEach((key) => {\n      this.initializeModule(key);\n    });\n  }\n\n  _destroy() {\n    // destroy modules with reversed order\n    Object.keys(this.modules).reverse().forEach((key) => {\n      this.removeModule(key);\n    });\n\n    Object.keys(this.memos).forEach((key) => {\n      this.removeMemo(key);\n    });\n    // trigger custom onDestroy callback\n    this.triggerEvent('destroy', this);\n  }\n\n  code(html) {\n    const isActivated = this.invoke('codeview.isActivated');\n\n    if (html === undefined) {\n      this.invoke('codeview.sync');\n      return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();\n    } else {\n      if (isActivated) {\n        this.invoke('codeview.sync', html);\n      } else {\n        this.layoutInfo.editable.html(html);\n      }\n      this.$note.val(html);\n      this.triggerEvent('change', html, this.layoutInfo.editable);\n    }\n  }\n\n  isDisabled() {\n    return this.layoutInfo.editable.attr('contenteditable') === 'false';\n  }\n\n  enable() {\n    this.layoutInfo.editable.attr('contenteditable', true);\n    this.invoke('toolbar.activate', true);\n    this.triggerEvent('disable', false);\n    this.options.editing = true;\n  }\n\n  disable() {\n    // close codeview if codeview is opend\n    if (this.invoke('codeview.isActivated')) {\n      this.invoke('codeview.deactivate');\n    }\n    this.layoutInfo.editable.attr('contenteditable', false);\n    this.options.editing = false;\n    this.invoke('toolbar.deactivate', true);\n\n    this.triggerEvent('disable', true);\n  }\n\n  triggerEvent() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];\n    if (callback) {\n      callback.apply(this.$note[0], args);\n    }\n    this.$note.trigger('summernote.' + namespace, args);\n  }\n\n  initializeModule(key) {\n    const module = this.modules[key];\n    module.shouldInitialize = module.shouldInitialize || func.ok;\n    if (!module.shouldInitialize()) {\n      return;\n    }\n\n    // initialize module\n    if (module.initialize) {\n      module.initialize();\n    }\n\n    // attach events\n    if (module.events) {\n      dom.attachEvents(this.$note, module.events);\n    }\n  }\n\n  module(key, ModuleClass, withoutIntialize) {\n    if (arguments.length === 1) {\n      return this.modules[key];\n    }\n\n    this.modules[key] = new ModuleClass(this);\n\n    if (!withoutIntialize) {\n      this.initializeModule(key);\n    }\n  }\n\n  removeModule(key) {\n    const module = this.modules[key];\n    if (module.shouldInitialize()) {\n      if (module.events) {\n        dom.detachEvents(this.$note, module.events);\n      }\n\n      if (module.destroy) {\n        module.destroy();\n      }\n    }\n\n    delete this.modules[key];\n  }\n\n  memo(key, obj) {\n    if (arguments.length === 1) {\n      return this.memos[key];\n    }\n    this.memos[key] = obj;\n  }\n\n  removeMemo(key) {\n    if (this.memos[key] && this.memos[key].destroy) {\n      this.memos[key].destroy();\n    }\n\n    delete this.memos[key];\n  }\n\n  /**\n   * Some buttons need to change their visual style immediately once they get pressed\n   */\n  createInvokeHandlerAndUpdateState(namespace, value) {\n    return (event) => {\n      this.createInvokeHandler(namespace, value)(event);\n      this.invoke('buttons.updateCurrentStyle');\n    };\n  }\n\n  createInvokeHandler(namespace, value) {\n    return (event) => {\n      event.preventDefault();\n      const $target = $(event.target);\n      this.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);\n    };\n  }\n\n  invoke() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const splits = namespace.split('.');\n    const hasSeparator = splits.length > 1;\n    const moduleName = hasSeparator && lists.head(splits);\n    const methodName = hasSeparator ? lists.last(splits) : lists.head(splits);\n\n    const module = this.modules[moduleName || 'editor'];\n    if (!moduleName && this[methodName]) {\n      return this[methodName].apply(this, args);\n    } else if (module && module[methodName] && module.shouldInitialize()) {\n      return module[methodName].apply(module, args);\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from './env';\nimport func from './func';\nimport lists from './lists';\nimport dom from './dom';\n\n/**\n * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js\n *\n * @param {TextRange} textRange\n * @param {Boolean} isStart\n * @return {BoundaryPoint}\n *\n * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx\n */\nfunction textRangeToPoint(textRange, isStart) {\n  let container = textRange.parentElement();\n  let offset;\n\n  const tester = document.body.createTextRange();\n  let prevContainer;\n  const childNodes = lists.from(container.childNodes);\n  for (offset = 0; offset < childNodes.length; offset++) {\n    if (dom.isText(childNodes[offset])) {\n      continue;\n    }\n    tester.moveToElementText(childNodes[offset]);\n    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {\n      break;\n    }\n    prevContainer = childNodes[offset];\n  }\n\n  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {\n    const textRangeStart = document.body.createTextRange();\n    let curTextNode = null;\n    textRangeStart.moveToElementText(prevContainer || container);\n    textRangeStart.collapse(!prevContainer);\n    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;\n\n    const pointTester = textRange.duplicate();\n    pointTester.setEndPoint('StartToStart', textRangeStart);\n    let textCount = pointTester.text.replace(/[\\r\\n]/g, '').length;\n\n    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    // [workaround] enforce IE to re-reference curTextNode, hack\n    const dummy = curTextNode.nodeValue; // eslint-disable-line\n\n    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&\n      textCount === curTextNode.nodeValue.length) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    container = curTextNode;\n    offset = textCount;\n  }\n\n  return {\n    cont: container,\n    offset: offset,\n  };\n}\n\n/**\n * return TextRange from boundary point (inspired by google closure-library)\n * @param {BoundaryPoint} point\n * @return {TextRange}\n */\nfunction pointToTextRange(point) {\n  const textRangeInfo = function(container, offset) {\n    let node, isCollapseToStart;\n\n    if (dom.isText(container)) {\n      const prevTextNodes = dom.listPrev(container, func.not(dom.isText));\n      const prevContainer = lists.last(prevTextNodes).previousSibling;\n      node = prevContainer || container.parentNode;\n      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);\n      isCollapseToStart = !prevContainer;\n    } else {\n      node = container.childNodes[offset] || container;\n      if (dom.isText(node)) {\n        return textRangeInfo(node, 0);\n      }\n\n      offset = 0;\n      isCollapseToStart = false;\n    }\n\n    return {\n      node: node,\n      collapseToStart: isCollapseToStart,\n      offset: offset,\n    };\n  };\n\n  const textRange = document.body.createTextRange();\n  const info = textRangeInfo(point.node, point.offset);\n\n  textRange.moveToElementText(info.node);\n  textRange.collapse(info.collapseToStart);\n  textRange.moveStart('character', info.offset);\n  return textRange;\n}\n\n/**\n   * Wrapped Range\n   *\n   * @constructor\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   */\nclass WrappedRange {\n  constructor(sc, so, ec, eo) {\n    this.sc = sc;\n    this.so = so;\n    this.ec = ec;\n    this.eo = eo;\n\n    // isOnEditable: judge whether range is on editable or not\n    this.isOnEditable = this.makeIsOn(dom.isEditable);\n    // isOnList: judge whether range is on list node or not\n    this.isOnList = this.makeIsOn(dom.isList);\n    // isOnAnchor: judge whether range is on anchor node or not\n    this.isOnAnchor = this.makeIsOn(dom.isAnchor);\n    // isOnCell: judge whether range is on cell node or not\n    this.isOnCell = this.makeIsOn(dom.isCell);\n    // isOnData: judge whether range is on data node or not\n    this.isOnData = this.makeIsOn(dom.isData);\n  }\n\n  // nativeRange: get nativeRange from sc, so, ec, eo\n  nativeRange() {\n    if (env.isW3CRangeSupport) {\n      const w3cRange = document.createRange();\n      w3cRange.setStart(this.sc, this.so);\n      w3cRange.setEnd(this.ec, this.eo);\n\n      return w3cRange;\n    } else {\n      const textRange = pointToTextRange({\n        node: this.sc,\n        offset: this.so,\n      });\n\n      textRange.setEndPoint('EndToEnd', pointToTextRange({\n        node: this.ec,\n        offset: this.eo,\n      }));\n\n      return textRange;\n    }\n  }\n\n  getPoints() {\n    return {\n      sc: this.sc,\n      so: this.so,\n      ec: this.ec,\n      eo: this.eo,\n    };\n  }\n\n  getStartPoint() {\n    return {\n      node: this.sc,\n      offset: this.so,\n    };\n  }\n\n  getEndPoint() {\n    return {\n      node: this.ec,\n      offset: this.eo,\n    };\n  }\n\n  /**\n   * select update visible range\n   */\n  select() {\n    const nativeRng = this.nativeRange();\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (selection.rangeCount > 0) {\n        selection.removeAllRanges();\n      }\n      selection.addRange(nativeRng);\n    } else {\n      nativeRng.select();\n    }\n\n    return this;\n  }\n\n  /**\n   * Moves the scrollbar to start container(sc) of current range\n   *\n   * @return {WrappedRange}\n   */\n  scrollIntoView(container) {\n    const height = $(container).height();\n    if (container.scrollTop + height < this.sc.offsetTop) {\n      container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);\n    }\n\n    return this;\n  }\n\n  /**\n   * @return {WrappedRange}\n   */\n  normalize() {\n    /**\n     * @param {BoundaryPoint} point\n     * @param {Boolean} isLeftToRight - true: prefer to choose right node\n     *                                - false: prefer to choose left node\n     * @return {BoundaryPoint}\n     */\n    const getVisiblePoint = function(point, isLeftToRight) {\n      if (!point) {\n        return point;\n      }\n\n      // Just use the given point [XXX:Adhoc]\n      //  - case 01. if the point is on the middle of the node\n      //  - case 02. if the point is on the right edge and prefer to choose left node\n      //  - case 03. if the point is on the left edge and prefer to choose right node\n      //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void\n      //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void\n      //  - case 06. if the point is on the block node and there is no children\n      if (dom.isVisiblePoint(point)) {\n        if (!dom.isEdgePoint(point) ||\n            (dom.isRightEdgePoint(point) && !isLeftToRight) ||\n            (dom.isLeftEdgePoint(point) && isLeftToRight) ||\n            (dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling)) ||\n            (dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling)) ||\n            (dom.isBlock(point.node) && dom.isEmpty(point.node))) {\n          return point;\n        }\n      }\n\n      // point on block's edge\n      const block = dom.ancestor(point.node, dom.isBlock);\n      let hasRightNode = false;\n\n      if (!hasRightNode) {\n        const prevPoint = dom.prevPoint(point) || { node: null };\n        hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;\n      }\n\n      let hasLeftNode = false;\n      if (!hasLeftNode) {\n        const nextPoint = dom.nextPoint(point) || { node: null };\n        hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(nextPoint.node)) && isLeftToRight;\n      }\n\n      if (hasRightNode || hasLeftNode) {\n        // returns point already on visible point\n        if (dom.isVisiblePoint(point)) {\n          return point;\n        }\n        // reverse direction\n        isLeftToRight = !isLeftToRight;\n      }\n\n      const nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint)\n        : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);\n      return nextPoint || point;\n    };\n\n    const endPoint = getVisiblePoint(this.getEndPoint(), false);\n    const startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns matched nodes on range\n   *\n   * @param {Function} [pred] - predicate function\n   * @param {Object} [options]\n   * @param {Boolean} [options.includeAncestor]\n   * @param {Boolean} [options.fullyContains]\n   * @return {Node[]}\n   */\n  nodes(pred, options) {\n    pred = pred || func.ok;\n\n    const includeAncestor = options && options.includeAncestor;\n    const fullyContains = options && options.fullyContains;\n\n    // TODO compare points and sort\n    const startPoint = this.getStartPoint();\n    const endPoint = this.getEndPoint();\n\n    const nodes = [];\n    const leftEdgeNodes = [];\n\n    dom.walkPoint(startPoint, endPoint, function(point) {\n      if (dom.isEditable(point.node)) {\n        return;\n      }\n\n      let node;\n      if (fullyContains) {\n        if (dom.isLeftEdgePoint(point)) {\n          leftEdgeNodes.push(point.node);\n        }\n        if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {\n          node = point.node;\n        }\n      } else if (includeAncestor) {\n        node = dom.ancestor(point.node, pred);\n      } else {\n        node = point.node;\n      }\n\n      if (node && pred(node)) {\n        nodes.push(node);\n      }\n    }, true);\n\n    return lists.unique(nodes);\n  }\n\n  /**\n   * returns commonAncestor of range\n   * @return {Element} - commonAncestor\n   */\n  commonAncestor() {\n    return dom.commonAncestor(this.sc, this.ec);\n  }\n\n  /**\n   * returns expanded range by pred\n   *\n   * @param {Function} pred - predicate function\n   * @return {WrappedRange}\n   */\n  expand(pred) {\n    const startAncestor = dom.ancestor(this.sc, pred);\n    const endAncestor = dom.ancestor(this.ec, pred);\n\n    if (!startAncestor && !endAncestor) {\n      return new WrappedRange(this.sc, this.so, this.ec, this.eo);\n    }\n\n    const boundaryPoints = this.getPoints();\n\n    if (startAncestor) {\n      boundaryPoints.sc = startAncestor;\n      boundaryPoints.so = 0;\n    }\n\n    if (endAncestor) {\n      boundaryPoints.ec = endAncestor;\n      boundaryPoints.eo = dom.nodeLength(endAncestor);\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * @param {Boolean} isCollapseToStart\n   * @return {WrappedRange}\n   */\n  collapse(isCollapseToStart) {\n    if (isCollapseToStart) {\n      return new WrappedRange(this.sc, this.so, this.sc, this.so);\n    } else {\n      return new WrappedRange(this.ec, this.eo, this.ec, this.eo);\n    }\n  }\n\n  /**\n   * splitText on range\n   */\n  splitText() {\n    const isSameContainer = this.sc === this.ec;\n    const boundaryPoints = this.getPoints();\n\n    if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {\n      this.ec.splitText(this.eo);\n    }\n\n    if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {\n      boundaryPoints.sc = this.sc.splitText(this.so);\n      boundaryPoints.so = 0;\n\n      if (isSameContainer) {\n        boundaryPoints.ec = boundaryPoints.sc;\n        boundaryPoints.eo = this.eo - this.so;\n      }\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * delete contents on range\n   * @return {WrappedRange}\n   */\n  deleteContents() {\n    if (this.isCollapsed()) {\n      return this;\n    }\n\n    const rng = this.splitText();\n    const nodes = rng.nodes(null, {\n      fullyContains: true,\n    });\n\n    // find new cursor point\n    const point = dom.prevPointUntil(rng.getStartPoint(), function(point) {\n      return !lists.contains(nodes, point.node);\n    });\n\n    const emptyParents = [];\n    $.each(nodes, function(idx, node) {\n      // find empty parents\n      const parent = node.parentNode;\n      if (point.node !== parent && dom.nodeLength(parent) === 1) {\n        emptyParents.push(parent);\n      }\n      dom.remove(node, false);\n    });\n\n    // remove empty parents\n    $.each(emptyParents, function(idx, node) {\n      dom.remove(node, false);\n    });\n\n    return new WrappedRange(\n      point.node,\n      point.offset,\n      point.node,\n      point.offset\n    ).normalize();\n  }\n\n  /**\n   * makeIsOn: return isOn(pred) function\n   */\n  makeIsOn(pred) {\n    return function() {\n      const ancestor = dom.ancestor(this.sc, pred);\n      return !!ancestor && (ancestor === dom.ancestor(this.ec, pred));\n    };\n  }\n\n  /**\n   * @param {Function} pred\n   * @return {Boolean}\n   */\n  isLeftEdgeOf(pred) {\n    if (!dom.isLeftEdgePoint(this.getStartPoint())) {\n      return false;\n    }\n\n    const node = dom.ancestor(this.sc, pred);\n    return node && dom.isLeftEdgeOf(this.sc, node);\n  }\n\n  /**\n   * returns whether range was collapsed or not\n   */\n  isCollapsed() {\n    return this.sc === this.ec && this.so === this.eo;\n  }\n\n  /**\n   * wrap inline nodes which children of body with paragraph\n   *\n   * @return {WrappedRange}\n   */\n  wrapBodyInlineWithPara() {\n    if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {\n      this.sc.innerHTML = dom.emptyPara;\n      return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);\n    }\n\n    /**\n     * [workaround] firefox often create range on not visible point. so normalize here.\n     *  - firefox: |<p>text</p>|\n     *  - chrome: <p>|text|</p>\n     */\n    const rng = this.normalize();\n    if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {\n      return rng;\n    }\n\n    // find inline top ancestor\n    let topAncestor;\n    if (dom.isInline(rng.sc)) {\n      const ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));\n      topAncestor = lists.last(ancestors);\n      if (!dom.isInline(topAncestor)) {\n        topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];\n      }\n    } else {\n      topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];\n    }\n\n    if (topAncestor) {\n      // siblings not in paragraph\n      let inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();\n      inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));\n\n      // wrap with paragraph\n      if (inlineSiblings.length) {\n        const para = dom.wrap(lists.head(inlineSiblings), 'p');\n        dom.appendChildNodes(para, lists.tail(inlineSiblings));\n      }\n    }\n\n    return this.normalize();\n  }\n\n  /**\n   * insert node at current cursor\n   *\n   * @param {Node} node\n   * @return {Node}\n   */\n  insertNode(node) {\n    let rng = this;\n\n    if (dom.isText(node) || dom.isInline(node)) {\n      rng = this.wrapBodyInlineWithPara().deleteContents();\n    }\n\n    const info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));\n    if (info.rightNode) {\n      info.rightNode.parentNode.insertBefore(node, info.rightNode);\n      if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {\n        info.rightNode.parentNode.removeChild(info.rightNode);\n      }\n    } else {\n      info.container.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * insert html at current cursor\n   */\n  pasteHTML(markup) {\n    markup = $.trim(markup);\n\n    const contentsContainer = $('<div></div>').html(markup)[0];\n    let childNodes = lists.from(contentsContainer.childNodes);\n\n    // const rng = this.wrapBodyInlineWithPara().deleteContents();\n    const rng = this;\n    let reversed = false;\n\n    if (rng.so >= 0) {\n      childNodes = childNodes.reverse();\n      reversed = true;\n    }\n\n    childNodes = childNodes.map(function(childNode) {\n      return rng.insertNode(childNode);\n    });\n\n    if (reversed) {\n      childNodes = childNodes.reverse();\n    }\n    return childNodes;\n  }\n\n  /**\n   * returns text in range\n   *\n   * @return {String}\n   */\n  toString() {\n    const nativeRng = this.nativeRange();\n    return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;\n  }\n\n  /**\n   * returns range for word before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordRange(findAfter) {\n    let endPoint = this.getEndPoint();\n\n    if (!dom.isCharPoint(endPoint)) {\n      return this;\n    }\n\n    const startPoint = dom.prevPointUntil(endPoint, function(point) {\n      return !dom.isCharPoint(point);\n    });\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, function(point) {\n        return !dom.isCharPoint(point);\n      });\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordsRange(findAfter) {\n    var endPoint = this.getEndPoint();\n\n    var isNotTextPoint = function(point) {\n      return !dom.isCharPoint(point) && !dom.isSpacePoint(point);\n    };\n\n    if (isNotTextPoint(endPoint)) {\n      return this;\n    }\n\n    var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor that match with a Regex\n   *\n   * example:\n   *  range: 'hi @Peter Pan'\n   *  regex: '/@[a-z ]+/i'\n   *  return range: '@Peter Pan'\n   *\n   * @param {RegExp} [regex]\n   * @return {WrappedRange|null}\n   */\n  getWordsMatchRange(regex) {\n    var endPoint = this.getEndPoint();\n\n    var startPoint = dom.prevPointUntil(endPoint, function(point) {\n      if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {\n        return true;\n      }\n      var rng = new WrappedRange(\n        point.node,\n        point.offset,\n        endPoint.node,\n        endPoint.offset\n      );\n      var result = regex.exec(rng.toString());\n      return result && result.index === 0;\n    });\n\n    var rng = new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n\n    var text = rng.toString();\n    var result = regex.exec(text);\n\n    if (result && result[0].length === text.length) {\n      return rng;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * create offsetPath bookmark\n   *\n   * @param {Node} editable\n   */\n  bookmark(editable) {\n    return {\n      s: {\n        path: dom.makeOffsetPath(editable, this.sc),\n        offset: this.so,\n      },\n      e: {\n        path: dom.makeOffsetPath(editable, this.ec),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * create offsetPath bookmark base on paragraph\n   *\n   * @param {Node[]} paras\n   */\n  paraBookmark(paras) {\n    return {\n      s: {\n        path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),\n        offset: this.so,\n      },\n      e: {\n        path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * getClientRects\n   * @return {Rect[]}\n   */\n  getClientRects() {\n    const nativeRng = this.nativeRange();\n    return nativeRng.getClientRects();\n  }\n}\n\n/**\n * Data structure\n *  * BoundaryPoint: a point of dom tree\n *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range\n *\n * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position\n */\nexport default {\n  /**\n   * create Range Object From arguments or Browser Selection\n   *\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   * @return {WrappedRange}\n   */\n  create: function(sc, so, ec, eo) {\n    if (arguments.length === 4) {\n      return new WrappedRange(sc, so, ec, eo);\n    } else if (arguments.length === 2) { // collapsed\n      ec = sc;\n      eo = so;\n      return new WrappedRange(sc, so, ec, eo);\n    } else {\n      let wrappedRange = this.createFromSelection();\n\n      if (!wrappedRange && arguments.length === 1) {\n        let bodyElement = arguments[0];\n        if (dom.isEditable(bodyElement)) {\n          bodyElement = bodyElement.lastChild;\n        }\n        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);\n      }\n      return wrappedRange;\n    }\n  },\n\n  createFromBodyElement: function(bodyElement, isCollapseToStart = false) {\n    var wrappedRange = this.createFromNode(bodyElement);\n    return wrappedRange.collapse(isCollapseToStart);\n  },\n\n  createFromSelection: function() {\n    let sc, so, ec, eo;\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (!selection || selection.rangeCount === 0) {\n        return null;\n      } else if (dom.isBody(selection.anchorNode)) {\n        // Firefox: returns entire body as range on initialization.\n        // We won't never need it.\n        return null;\n      }\n\n      const nativeRng = selection.getRangeAt(0);\n      sc = nativeRng.startContainer;\n      so = nativeRng.startOffset;\n      ec = nativeRng.endContainer;\n      eo = nativeRng.endOffset;\n    } else { // IE8: TextRange\n      const textRange = document.selection.createRange();\n      const textRangeEnd = textRange.duplicate();\n      textRangeEnd.collapse(false);\n      const textRangeStart = textRange;\n      textRangeStart.collapse(true);\n\n      let startPoint = textRangeToPoint(textRangeStart, true);\n      let endPoint = textRangeToPoint(textRangeEnd, false);\n\n      // same visible point case: range was collapsed.\n      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&\n        dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&\n        endPoint.node.nextSibling === startPoint.node) {\n        startPoint = endPoint;\n      }\n\n      sc = startPoint.cont;\n      so = startPoint.offset;\n      ec = endPoint.cont;\n      eo = endPoint.offset;\n    }\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from node\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNode: function(node) {\n    let sc = node;\n    let so = 0;\n    let ec = node;\n    let eo = dom.nodeLength(ec);\n\n    // browsers can't target a picture or void node\n    if (dom.isVoid(sc)) {\n      so = dom.listPrev(sc).length - 1;\n      sc = sc.parentNode;\n    }\n    if (dom.isBR(ec)) {\n      eo = dom.listPrev(ec).length - 1;\n      ec = ec.parentNode;\n    } else if (dom.isVoid(ec)) {\n      eo = dom.listPrev(ec).length;\n      ec = ec.parentNode;\n    }\n\n    return this.create(sc, so, ec, eo);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeBefore: function(node) {\n    return this.createFromNode(node).collapse(true);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeAfter: function(node) {\n    return this.createFromNode(node).collapse();\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from bookmark\n   *\n   * @param {Node} editable\n   * @param {Object} bookmark\n   * @return {WrappedRange}\n   */\n  createFromBookmark: function(editable, bookmark) {\n    const sc = dom.fromOffsetPath(editable, bookmark.s.path);\n    const so = bookmark.s.offset;\n    const ec = dom.fromOffsetPath(editable, bookmark.e.path);\n    const eo = bookmark.e.offset;\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from paraBookmark\n   *\n   * @param {Object} bookmark\n   * @param {Node[]} paras\n   * @return {WrappedRange}\n   */\n  createFromParaBookmark: function(bookmark, paras) {\n    const so = bookmark.s.offset;\n    const eo = bookmark.e.offset;\n    const sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);\n    const ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n};\n","import $ from 'jquery';\nimport env from './base/core/env';\nimport lists from './base/core/lists';\nimport Context from './base/Context';\n\n$.fn.extend({\n  /**\n   * Summernote API\n   *\n   * @param {Object|String}\n   * @return {this}\n   */\n  summernote: function() {\n    const type = $.type(lists.head(arguments));\n    const isExternalAPICalled = type === 'string';\n    const hasInitOptions = type === 'object';\n\n    const options = $.extend({}, $.summernote.options, hasInitOptions ? lists.head(arguments) : {});\n\n    // Update options\n    options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);\n    options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons);\n    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;\n\n    this.each((idx, note) => {\n      const $note = $(note);\n      if (!$note.data('summernote')) {\n        const context = new Context($note, options);\n        $note.data('summernote', context);\n        $note.data('summernote').triggerEvent('init', context.layoutInfo);\n      }\n    });\n\n    const $note = this.first();\n    if ($note.length) {\n      const context = $note.data('summernote');\n      if (isExternalAPICalled) {\n        return context.invoke.apply(context, lists.from(arguments));\n      } else if (options.focus) {\n        context.invoke('editor.focus');\n      }\n    }\n\n    return this;\n  },\n});\n","import lists from './lists';\nimport func from './func';\n\nconst KEY_MAP = {\n  'BACKSPACE': 8,\n  'TAB': 9,\n  'ENTER': 13,\n  'ESCAPE': 27,\n  'SPACE': 32,\n  'DELETE': 46,\n\n  // Arrow\n  'LEFT': 37,\n  'UP': 38,\n  'RIGHT': 39,\n  'DOWN': 40,\n\n  // Number: 0-9\n  'NUM0': 48,\n  'NUM1': 49,\n  'NUM2': 50,\n  'NUM3': 51,\n  'NUM4': 52,\n  'NUM5': 53,\n  'NUM6': 54,\n  'NUM7': 55,\n  'NUM8': 56,\n\n  // Alphabet: a-z\n  'B': 66,\n  'E': 69,\n  'I': 73,\n  'J': 74,\n  'K': 75,\n  'L': 76,\n  'R': 82,\n  'S': 83,\n  'U': 85,\n  'V': 86,\n  'Y': 89,\n  'Z': 90,\n\n  'SLASH': 191,\n  'LEFTBRACKET': 219,\n  'BACKSLASH': 220,\n  'RIGHTBRACKET': 221,\n\n  // Navigation\n  'HOME': 36,\n  'END': 35,\n  'PAGEUP': 33,\n  'PAGEDOWN': 34,\n};\n\n/**\n * @class core.key\n *\n * Object for keycodes.\n *\n * @singleton\n * @alternateClassName key\n */\nexport default {\n  /**\n   * @method isEdit\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isEdit: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.BACKSPACE,\n      KEY_MAP.TAB,\n      KEY_MAP.ENTER,\n      KEY_MAP.SPACE,\n      KEY_MAP.DELETE,\n    ], keyCode);\n  },\n  /**\n   * @method isMove\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isMove: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.LEFT,\n      KEY_MAP.UP,\n      KEY_MAP.RIGHT,\n      KEY_MAP.DOWN,\n    ], keyCode);\n  },\n  /**\n   * @method isNavigation\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isNavigation: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.HOME,\n      KEY_MAP.END,\n      KEY_MAP.PAGEUP,\n      KEY_MAP.PAGEDOWN,\n    ], keyCode);\n  },\n  /**\n   * @property {Object} nameFromCode\n   * @property {String} nameFromCode.8 \"BACKSPACE\"\n   */\n  nameFromCode: func.invertObject(KEY_MAP),\n  code: KEY_MAP,\n};\n","import range from '../core/range';\n\nexport default class History {\n  constructor(context) {\n    this.stack = [];\n    this.stackOffset = -1;\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n    this.editable = this.$editable[0];\n  }\n\n  makeSnapshot() {\n    const rng = range.create(this.editable);\n    const emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };\n\n    return {\n      contents: this.$editable.html(),\n      bookmark: ((rng && rng.isOnEditable()) ? rng.bookmark(this.editable) : emptyBookmark),\n    };\n  }\n\n  applySnapshot(snapshot) {\n    if (snapshot.contents !== null) {\n      this.$editable.html(snapshot.contents);\n    }\n    if (snapshot.bookmark !== null) {\n      range.createFromBookmark(this.editable, snapshot.bookmark).select();\n    }\n  }\n\n  /**\n  * @method rewind\n  * Rewinds the history stack back to the first snapshot taken.\n  * Leaves the stack intact, so that \"Redo\" can still be used.\n  */\n  rewind() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    // Return to the first available snapshot.\n    this.stackOffset = 0;\n\n    // Apply that snapshot.\n    this.applySnapshot(this.stack[this.stackOffset]);\n  }\n\n  /**\n  *  @method commit\n  *  Resets history stack, but keeps current editor's content.\n  */\n  commit() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n  * @method reset\n  * Resets the history stack completely; reverting to an empty editor.\n  */\n  reset() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Clear the editable area.\n    this.$editable.html('');\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    if (this.stackOffset > 0) {\n      this.stackOffset--;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    if (this.stack.length - 1 > this.stackOffset) {\n      this.stackOffset++;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * recorded undo\n   */\n  recordUndo() {\n    this.stackOffset++;\n\n    // Wash out stack after stackOffset\n    if (this.stack.length > this.stackOffset) {\n      this.stack = this.stack.slice(0, this.stackOffset);\n    }\n\n    // Create new snapshot and push it to the end\n    this.stack.push(this.makeSnapshot());\n\n    // If the stack size reachs to the limit, then slice it\n    if (this.stack.length > this.context.options.historyLimit) {\n      this.stack.shift();\n      this.stackOffset -= 1;\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class Style {\n  /**\n   * @method jQueryCSS\n   *\n   * [workaround] for old jQuery\n   * passing an array of style properties to .css()\n   * will result in an object of property-value pairs.\n   * (compability with version < 1.9)\n   *\n   * @private\n   * @param  {jQuery} $obj\n   * @param  {Array} propertyNames - An array of one or more CSS properties.\n   * @return {Object}\n   */\n  jQueryCSS($obj, propertyNames) {\n    if (env.jqueryVersion < 1.9) {\n      const result = {};\n      $.each(propertyNames, (idx, propertyName) => {\n        result[propertyName] = $obj.css(propertyName);\n      });\n      return result;\n    }\n    return $obj.css(propertyNames);\n  }\n\n  /**\n   * returns style object from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  fromNode($node) {\n    const properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];\n    const styleInfo = this.jQueryCSS($node, properties) || {};\n\n    const fontSize = $node[0].style.fontSize || styleInfo['font-size'];\n\n    styleInfo['font-size'] = parseInt(fontSize, 10);\n    styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);\n\n    return styleInfo;\n  }\n\n  /**\n   * paragraph level style\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} styleInfo\n   */\n  stylePara(rng, styleInfo) {\n    $.each(rng.nodes(dom.isPara, {\n      includeAncestor: true,\n    }), (idx, para) => {\n      $(para).css(styleInfo);\n    });\n  }\n\n  /**\n   * insert and returns styleNodes on range.\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} [options] - options for styleNodes\n   * @param {String} [options.nodeName] - default: `SPAN`\n   * @param {Boolean} [options.expandClosestSibling] - default: `false`\n   * @param {Boolean} [options.onlyPartialContains] - default: `false`\n   * @return {Node[]}\n   */\n  styleNodes(rng, options) {\n    rng = rng.splitText();\n\n    const nodeName = (options && options.nodeName) || 'SPAN';\n    const expandClosestSibling = !!(options && options.expandClosestSibling);\n    const onlyPartialContains = !!(options && options.onlyPartialContains);\n\n    if (rng.isCollapsed()) {\n      return [rng.insertNode(dom.create(nodeName))];\n    }\n\n    let pred = dom.makePredByNodeName(nodeName);\n    const nodes = rng.nodes(dom.isText, {\n      fullyContains: true,\n    }).map((text) => {\n      return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);\n    });\n\n    if (expandClosestSibling) {\n      if (onlyPartialContains) {\n        const nodesInRange = rng.nodes();\n        // compose with partial contains predication\n        pred = func.and(pred, (node) => {\n          return lists.contains(nodesInRange, node);\n        });\n      }\n\n      return nodes.map((node) => {\n        const siblings = dom.withClosestSiblings(node, pred);\n        const head = lists.head(siblings);\n        const tails = lists.tail(siblings);\n        $.each(tails, (idx, elem) => {\n          dom.appendChildNodes(head, elem.childNodes);\n          dom.remove(elem);\n        });\n        return lists.head(siblings);\n      });\n    } else {\n      return nodes;\n    }\n  }\n\n  /**\n   * get current style on cursor\n   *\n   * @param {WrappedRange} rng\n   * @return {Object} - object contains style properties.\n   */\n  current(rng) {\n    const $cont = $(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);\n    let styleInfo = this.fromNode($cont);\n\n    // document.queryCommandState for toggle state\n    // [workaround] prevent Firefox nsresult: \"0x80004005 (NS_ERROR_FAILURE)\"\n    try {\n      styleInfo = $.extend(styleInfo, {\n        'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',\n        'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',\n        'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',\n        'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',\n        'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',\n        'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',\n        'font-family': document.queryCommandValue('fontname') || styleInfo['font-family'],\n      });\n    } catch (e) {\n      // eslint-disable-next-line\n    }\n\n    // list-style-type to list-style(unordered, ordered)\n    if (!rng.isOnList()) {\n      styleInfo['list-style'] = 'none';\n    } else {\n      const orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];\n      const isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;\n      styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';\n    }\n\n    const para = dom.ancestor(rng.sc, dom.isPara);\n    if (para && para.style['line-height']) {\n      styleInfo['line-height'] = para.style.lineHeight;\n    } else {\n      const lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);\n      styleInfo['line-height'] = lineHeight.toFixed(1);\n    }\n\n    styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);\n    styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);\n    styleInfo.range = rng;\n\n    return styleInfo;\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport func from '../core/func';\nimport dom from '../core/dom';\nimport range from '../core/range';\n\nexport default class Bullet {\n  /**\n   * toggle ordered list\n   */\n  insertOrderedList(editable) {\n    this.toggleList('OL', editable);\n  }\n\n  /**\n   * toggle unordered list\n   */\n  insertUnorderedList(editable) {\n    this.toggleList('UL', editable);\n  }\n\n  /**\n   * indent\n   */\n  indent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        const previousList = this.findList(head.previousSibling);\n        if (previousList) {\n          paras\n            .map(para => previousList.appendChild(para));\n        } else {\n          this.wrapList(paras, head.parentNode.nodeName);\n          paras\n            .map((para) => para.parentNode)\n            .map((para) => this.appendToPrevious(para));\n        }\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            return (parseInt(val, 10) || 0) + 25;\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * outdent\n   */\n  outdent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        this.releaseList([paras]);\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            val = (parseInt(val, 10) || 0);\n            return val > 25 ? val - 25 : '';\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * toggle list\n   *\n   * @param {String} listName - OL or UL\n   */\n  toggleList(listName, editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    let paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const bookmark = rng.paraBookmark(paras);\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    // paragraph to list\n    if (lists.find(paras, dom.isPurePara)) {\n      let wrappedParas = [];\n      $.each(clustereds, (idx, paras) => {\n        wrappedParas = wrappedParas.concat(this.wrapList(paras, listName));\n      });\n      paras = wrappedParas;\n    // list to paragraph or change list style\n    } else {\n      const diffLists = rng.nodes(dom.isList, {\n        includeAncestor: true,\n      }).filter((listNode) => {\n        return !$.nodeName(listNode, listName);\n      });\n\n      if (diffLists.length) {\n        $.each(diffLists, (idx, listNode) => {\n          dom.replace(listNode, listName);\n        });\n      } else {\n        paras = this.releaseList(clustereds, true);\n      }\n    }\n\n    range.createFromParaBookmark(bookmark, paras).select();\n  }\n\n  /**\n   * @param {Node[]} paras\n   * @param {String} listName\n   * @return {Node[]}\n   */\n  wrapList(paras, listName) {\n    const head = lists.head(paras);\n    const last = lists.last(paras);\n\n    const prevList = dom.isList(head.previousSibling) && head.previousSibling;\n    const nextList = dom.isList(last.nextSibling) && last.nextSibling;\n\n    const listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);\n\n    // P to LI\n    paras = paras.map((para) => {\n      return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;\n    });\n\n    // append to list(<ul>, <ol>)\n    dom.appendChildNodes(listNode, paras);\n\n    if (nextList) {\n      dom.appendChildNodes(listNode, lists.from(nextList.childNodes));\n      dom.remove(nextList);\n    }\n\n    return paras;\n  }\n\n  /**\n   * @method releaseList\n   *\n   * @param {Array[]} clustereds\n   * @param {Boolean} isEscapseToBody\n   * @return {Node[]}\n   */\n  releaseList(clustereds, isEscapseToBody) {\n    let releasedParas = [];\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      const last = lists.last(paras);\n\n      const headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;\n      const parentItem = headList.parentNode;\n\n      if (headList.parentNode.nodeName === 'LI') {\n        paras.map(para => {\n          const newList = this.findNextSiblings(para);\n\n          if (parentItem.nextSibling) {\n            parentItem.parentNode.insertBefore(\n              para,\n              parentItem.nextSibling\n            );\n          } else {\n            parentItem.parentNode.appendChild(para);\n          }\n\n          if (newList.length) {\n            this.wrapList(newList, headList.nodeName);\n            para.appendChild(newList[0].parentNode);\n          }\n        });\n\n        if (headList.children.length === 0) {\n          parentItem.removeChild(headList);\n        }\n\n        if (parentItem.childNodes.length === 0) {\n          parentItem.parentNode.removeChild(parentItem);\n        }\n      } else {\n        const lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {\n          node: last.parentNode,\n          offset: dom.position(last) + 1,\n        }, {\n          isSkipPaddingBlankHTML: true,\n        }) : null;\n\n        const middleList = dom.splitTree(headList, {\n          node: head.parentNode,\n          offset: dom.position(head),\n        }, {\n          isSkipPaddingBlankHTML: true,\n        });\n\n        paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi)\n          : lists.from(middleList.childNodes).filter(dom.isLi);\n\n        // LI to P\n        if (isEscapseToBody || !dom.isList(headList.parentNode)) {\n          paras = paras.map((para) => {\n            return dom.replace(para, 'P');\n          });\n        }\n\n        $.each(lists.from(paras).reverse(), (idx, para) => {\n          dom.insertAfter(para, headList);\n        });\n\n        // remove empty lists\n        const rootLists = lists.compact([headList, middleList, lastList]);\n        $.each(rootLists, (idx, rootList) => {\n          const listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));\n          $.each(listNodes.reverse(), (idx, listNode) => {\n            if (!dom.nodeLength(listNode)) {\n              dom.remove(listNode, true);\n            }\n          });\n        });\n      }\n\n      releasedParas = releasedParas.concat(paras);\n    });\n\n    return releasedParas;\n  }\n\n  /**\n   * @method appendToPrevious\n   *\n   * Appends list to previous list item, if\n   * none exist it wraps the list in a new list item.\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  appendToPrevious(node) {\n    return node.previousSibling\n      ? dom.appendChildNodes(node.previousSibling, [node])\n      : this.wrapList([node], 'LI');\n  }\n\n  /**\n   * @method findList\n   *\n   * Finds an existing list in list item\n   *\n   * @param {HTMLNode} ListItem\n   * @return {Array[]}\n   */\n  findList(node) {\n    return node\n      ? lists.find(node.children, child => ['OL', 'UL'].indexOf(child.nodeName) > -1)\n      : null;\n  }\n\n  /**\n   * @method findNextSiblings\n   *\n   * Finds all list item siblings that follow it\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  findNextSiblings(node) {\n    const siblings = [];\n    while (node.nextSibling) {\n      siblings.push(node.nextSibling);\n      node = node.nextSibling;\n    }\n    return siblings;\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport Bullet from '../editing/Bullet';\n\n/**\n * @class editing.Typing\n *\n * Typing\n *\n */\nexport default class Typing {\n  constructor(context) {\n    // a Bullet instance to toggle lists off\n    this.bullet = new Bullet();\n    this.options = context.options;\n  }\n\n  /**\n   * insert tab\n   *\n   * @param {WrappedRange} rng\n   * @param {Number} tabsize\n   */\n  insertTab(rng, tabsize) {\n    const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));\n    rng = rng.deleteContents();\n    rng.insertNode(tab, true);\n\n    rng = range.create(tab, tabsize);\n    rng.select();\n  }\n\n  /**\n   * insert paragraph\n   *\n   * @param {jQuery} $editable\n   * @param {WrappedRange} rng Can be used in unit tests to \"mock\" the range\n   *\n   * blockquoteBreakingLevel\n   *   0 - No break, the new paragraph remains inside the quote\n   *   1 - Break the first blockquote in the ancestors list\n   *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)\n   */\n  insertParagraph(editable, rng) {\n    rng = rng || range.create(editable);\n\n    // deleteContents on range.\n    rng = rng.deleteContents();\n\n    // Wrap range if it needs to be wrapped by paragraph\n    rng = rng.wrapBodyInlineWithPara();\n\n    // finding paragraph\n    const splitRoot = dom.ancestor(rng.sc, dom.isPara);\n\n    let nextPara;\n    // on paragraph: split paragraph\n    if (splitRoot) {\n      // if it is an empty line with li\n      if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {\n        // toggle UL/OL and escape\n        this.bullet.toggleList(splitRoot.parentNode.nodeName);\n        return;\n      } else {\n        let blockquote = null;\n        if (this.options.blockquoteBreakingLevel === 1) {\n          blockquote = dom.ancestor(splitRoot, dom.isBlockquote);\n        } else if (this.options.blockquoteBreakingLevel === 2) {\n          blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);\n        }\n\n        if (blockquote) {\n          // We're inside a blockquote and options ask us to break it\n          nextPara = $(dom.emptyPara)[0];\n          // If the split is right before a <br>, remove it so that there's no \"empty line\"\n          // after the split in the new blockquote created\n          if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {\n            $(rng.sc.nextSibling).remove();\n          }\n          const split = dom.splitTree(blockquote, rng.getStartPoint(), { isDiscardEmptySplits: true });\n          if (split) {\n            split.parentNode.insertBefore(nextPara, split);\n          } else {\n            dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote\n          }\n        } else {\n          nextPara = dom.splitTree(splitRoot, rng.getStartPoint());\n\n          // not a blockquote, just insert the paragraph\n          let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);\n          emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));\n\n          $.each(emptyAnchors, (idx, anchor) => {\n            dom.remove(anchor);\n          });\n\n          // replace empty heading, pre or custom-made styleTag with P tag\n          if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {\n            nextPara = dom.replace(nextPara, 'p');\n          }\n        }\n      }\n    // no paragraph: insert empty paragraph\n    } else {\n      const next = rng.sc.childNodes[rng.so];\n      nextPara = $(dom.emptyPara)[0];\n      if (next) {\n        rng.sc.insertBefore(nextPara, next);\n      } else {\n        rng.sc.appendChild(nextPara);\n      }\n    }\n\n    range.create(nextPara, 0).normalize().select().scrollIntoView(editable);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport lists from '../core/lists';\n\n/**\n * @class Create a virtual table to create what actions to do in change.\n * @param {object} startPoint Cell selected to apply change.\n * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where\n * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction\n * @param {object} domTable Dom element of table to make changes.\n */\nconst TableResultAction = function(startPoint, where, action, domTable) {\n  const _startPoint = { 'colPos': 0, 'rowPos': 0 };\n  const _virtualTable = [];\n  const _actionCellList = [];\n\n  /// ///////////////////////////////////////////\n  // Private functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Set the startPoint of action.\n   */\n  function setStartPoint() {\n    if (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {\n      // Impossible to identify start Cell point\n      return;\n    }\n    _startPoint.colPos = startPoint.cellIndex;\n    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {\n      // Impossible to identify start Row point\n      return;\n    }\n    _startPoint.rowPos = startPoint.parentElement.rowIndex;\n  }\n\n  /**\n   * Define virtual table position info object.\n   *\n   * @param {int} rowIndex Index position in line of virtual table.\n   * @param {int} cellIndex Index position in column of virtual table.\n   * @param {object} baseRow Row affected by this position.\n   * @param {object} baseCell Cell affected by this position.\n   * @param {bool} isSpan Inform if it is an span cell/row.\n   */\n  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {\n    const objPosition = {\n      'baseRow': baseRow,\n      'baseCell': baseCell,\n      'isRowSpan': isRowSpan,\n      'isColSpan': isColSpan,\n      'isVirtual': isVirtualCell,\n    };\n    if (!_virtualTable[rowIndex]) {\n      _virtualTable[rowIndex] = [];\n    }\n    _virtualTable[rowIndex][cellIndex] = objPosition;\n  }\n\n  /**\n   * Create action cell object.\n   *\n   * @param {object} virtualTableCellObj Object of specific position on virtual table.\n   * @param {enum} resultAction Action to be applied in that item.\n   */\n  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {\n    return {\n      'baseCell': virtualTableCellObj.baseCell,\n      'action': resultAction,\n      'virtualTable': {\n        'rowIndex': virtualRowPosition,\n        'cellIndex': virtualColPosition,\n      },\n    };\n  }\n\n  /**\n   * Recover free index of row to append Cell.\n   *\n   * @param {int} rowIndex Index of row to find free space.\n   * @param {int} cellIndex Index of cell to find free space in table.\n   */\n  function recoverCellIndex(rowIndex, cellIndex) {\n    if (!_virtualTable[rowIndex]) {\n      return cellIndex;\n    }\n    if (!_virtualTable[rowIndex][cellIndex]) {\n      return cellIndex;\n    }\n\n    let newCellIndex = cellIndex;\n    while (_virtualTable[rowIndex][newCellIndex]) {\n      newCellIndex++;\n      if (!_virtualTable[rowIndex][newCellIndex]) {\n        return newCellIndex;\n      }\n    }\n  }\n\n  /**\n   * Recover info about row and cell and add information to virtual table.\n   *\n   * @param {object} row Row to recover information.\n   * @param {object} cell Cell to recover information.\n   */\n  function addCellInfoToVirtual(row, cell) {\n    const cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);\n    const cellHasColspan = (cell.colSpan > 1);\n    const cellHasRowspan = (cell.rowSpan > 1);\n    const isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);\n    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);\n\n    // Add span rows to virtual Table.\n    const rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;\n    if (rowspanNumber > 1) {\n      for (let rp = 1; rp < rowspanNumber; rp++) {\n        const rowspanIndex = row.rowIndex + rp;\n        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);\n      }\n    }\n\n    // Add span cols to virtual table.\n    const colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;\n    if (colspanNumber > 1) {\n      for (let cp = 1; cp < colspanNumber; cp++) {\n        const cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));\n        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);\n      }\n    }\n  }\n\n  /**\n   * Process validation and adjust of start point if needed\n   *\n   * @param {int} rowIndex\n   * @param {int} cellIndex\n   * @param {object} cell\n   * @param {bool} isSelectedCell\n   */\n  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {\n    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {\n      _startPoint.colPos++;\n    }\n  }\n\n  /**\n   * Create virtual table of cells with all cells, including span cells.\n   */\n  function createVirtualTable() {\n    const rows = domTable.rows;\n    for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      const cells = rows[rowIndex].cells;\n      for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);\n      }\n    }\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getDeleteResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (!cell.isVirtual && cell.isRowSpan) {\n          return TableResultAction.resultAction.AddCell;\n        } else if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.RemoveCell;\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getAddResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isRowSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isColSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.AddCell;\n  }\n\n  function init() {\n    setStartPoint();\n    createVirtualTable();\n  }\n\n  /// ///////////////////////////////////////////\n  // Public functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Recover array os what to do in table.\n   */\n  this.getActionList = function() {\n    const fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;\n    const fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;\n\n    let actualPosition = 0;\n    let canContinue = true;\n    while (canContinue) {\n      const rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;\n      const colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;\n      const row = _virtualTable[rowPosition];\n      if (!row) {\n        canContinue = false;\n        return _actionCellList;\n      }\n      const cell = row[colPosition];\n      if (!cell) {\n        canContinue = false;\n        return _actionCellList;\n      }\n\n      // Define action to be applied in this cell\n      let resultAction = TableResultAction.resultAction.Ignore;\n      switch (action) {\n        case TableResultAction.requestAction.Add:\n          resultAction = getAddResultActionToCell(cell);\n          break;\n        case TableResultAction.requestAction.Delete:\n          resultAction = getDeleteResultActionToCell(cell);\n          break;\n      }\n      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));\n      actualPosition++;\n    }\n\n    return _actionCellList;\n  };\n\n  init();\n};\n/**\n*\n* Where action occours enum.\n*/\nTableResultAction.where = { 'Row': 0, 'Column': 1 };\n/**\n*\n* Requested action to apply enum.\n*/\nTableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };\n/**\n*\n* Result action to be executed enum.\n*/\nTableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };\n\n/**\n *\n * @class editing.Table\n *\n * Table\n *\n */\nexport default class Table {\n  /**\n   * handle tab key\n   *\n   * @param {WrappedRange} rng\n   * @param {Boolean} isShift\n   */\n  tab(rng, isShift) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const table = dom.ancestor(cell, dom.isTable);\n    const cells = dom.listDescendant(table, dom.isCell);\n\n    const nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);\n    if (nextCell) {\n      range.create(nextCell, 0).select();\n    }\n  }\n\n  /**\n   * Add a new row\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (top/bottom)\n   * @return {Node}\n   */\n  addRow(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n\n    const currentTr = $(cell).closest('tr');\n    const trAttributes = this.recoverAttributes(currentTr);\n    const html = $('<tr' + trAttributes + '></tr>');\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Add, $(currentTr).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let idCell = 0; idCell < actions.length; idCell++) {\n      const currentCell = actions[idCell];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          {\n            if (position === 'top') {\n              const baseCellTr = currentCell.baseCell.parent;\n              const isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;\n              if (isTopFromRowSpan) {\n                const newTd = $('<div></div>').append($('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();\n                html.append(newTd);\n                break;\n              }\n            }\n            let rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);\n            rowspanNumber++;\n            currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);\n          }\n          break;\n      }\n    }\n\n    if (position === 'top') {\n      currentTr.before(html);\n    } else {\n      const cellHasRowspan = (cell.rowSpan > 1);\n      if (cellHasRowspan) {\n        const lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);\n        $($(currentTr).parent().find('tr')[lastTrIndex]).after($(html));\n        return;\n      }\n      currentTr.after(html);\n    }\n  }\n\n  /**\n   * Add a new col\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (left/right)\n   * @return {Node}\n   */\n  addCol(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const rowsGroup = $(row).siblings();\n    rowsGroup.push(row);\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Add, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      const currentCell = actions[actionIndex];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          if (position === 'right') {\n            $(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          if (position === 'right') {\n            let colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);\n            colspanNumber++;\n            currentCell.baseCell.setAttribute('colSpan', colspanNumber);\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n      }\n    }\n  }\n\n  /*\n  * Copy attributes from element.\n  *\n  * @param {object} Element to recover attributes.\n  * @return {string} Copied string elements.\n  */\n  recoverAttributes(el) {\n    let resultStr = '';\n\n    if (!el) {\n      return resultStr;\n    }\n\n    const attrList = el.attributes || [];\n\n    for (let i = 0; i < attrList.length; i++) {\n      if (attrList[i].name.toLowerCase() === 'id') {\n        continue;\n      }\n\n      if (attrList[i].specified) {\n        resultStr += ' ' + attrList[i].name + '=\\'' + attrList[i].value + '\\'';\n      }\n    }\n\n    return resultStr;\n  }\n\n  /**\n   * Delete current row\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteRow(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n    const rowPos = row[0].rowIndex;\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n\n      const baseCell = actions[actionIndex].baseCell;\n      const virtualPosition = actions[actionIndex].virtualTable;\n      const hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);\n      let rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.AddCell:\n          {\n            const nextRow = row.next('tr')[0];\n            if (!nextRow) { continue; }\n            const cloneRow = row[0].cells[cellPos];\n            if (hasRowspan) {\n              if (rowspanNumber > 2) {\n                rowspanNumber--;\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);\n                nextRow.cells[cellPos].innerHTML = '';\n              } else if (rowspanNumber === 2) {\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].removeAttribute('rowSpan');\n                nextRow.cells[cellPos].innerHTML = '';\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          if (hasRowspan) {\n            if (rowspanNumber > 2) {\n              rowspanNumber--;\n              baseCell.setAttribute('rowSpan', rowspanNumber);\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            } else if (rowspanNumber === 2) {\n              baseCell.removeAttribute('rowSpan');\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          // Do not need remove cell because row will be deleted.\n          continue;\n      }\n    }\n    row.remove();\n  }\n\n  /**\n   * Delete current col\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteCol(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          {\n            const baseCell = actions[actionIndex].baseCell;\n            const hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);\n            if (hasColspan) {\n              let colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;\n              if (colspanNumber > 2) {\n                colspanNumber--;\n                baseCell.setAttribute('colSpan', colspanNumber);\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              } else if (colspanNumber === 2) {\n                baseCell.removeAttribute('colSpan');\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          dom.remove(actions[actionIndex].baseCell, true);\n          continue;\n      }\n    }\n  }\n\n  /**\n   * create empty table element\n   *\n   * @param {Number} rowCount\n   * @param {Number} colCount\n   * @return {Node}\n   */\n  createTable(colCount, rowCount, options) {\n    const tds = [];\n    let tdHTML;\n    for (let idxCol = 0; idxCol < colCount; idxCol++) {\n      tds.push('<td>' + dom.blank + '</td>');\n    }\n    tdHTML = tds.join('');\n\n    const trs = [];\n    let trHTML;\n    for (let idxRow = 0; idxRow < rowCount; idxRow++) {\n      trs.push('<tr>' + tdHTML + '</tr>');\n    }\n    trHTML = trs.join('');\n    const $table = $('<table>' + trHTML + '</table>');\n    if (options && options.tableClassName) {\n      $table.addClass(options.tableClassName);\n    }\n\n    return $table[0];\n  }\n\n  /**\n   * Delete current table\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteTable(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    $(cell).closest('table').remove();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport { readFileAsDataURL, createImage } from '../core/async';\nimport History from '../editing/History';\nimport Style from '../editing/Style';\nimport Typing from '../editing/Typing';\nimport Table from '../editing/Table';\nimport Bullet from '../editing/Bullet';\n\nconst KEY_BOGUS = 'bogus';\n\n/**\n * @class Editor\n */\nexport default class Editor {\n  constructor(context) {\n    this.context = context;\n\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.editable = this.$editable[0];\n    this.lastRange = null;\n    this.snapshot = null;\n\n    this.style = new Style();\n    this.table = new Table();\n    this.typing = new Typing(context);\n    this.bullet = new Bullet();\n    this.history = new History(context);\n\n    this.context.memo('help.escape', this.lang.help.escape);\n    this.context.memo('help.undo', this.lang.help.undo);\n    this.context.memo('help.redo', this.lang.help.redo);\n    this.context.memo('help.tab', this.lang.help.tab);\n    this.context.memo('help.untab', this.lang.help.untab);\n    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);\n    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);\n    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);\n    this.context.memo('help.indent', this.lang.help.indent);\n    this.context.memo('help.outdent', this.lang.help.outdent);\n    this.context.memo('help.formatPara', this.lang.help.formatPara);\n    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);\n    this.context.memo('help.fontName', this.lang.help.fontName);\n\n    // native commands(with execCommand), generate function for execCommand\n    const commands = [\n      'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',\n      'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n      'formatBlock', 'removeFormat', 'backColor',\n    ];\n\n    for (let idx = 0, len = commands.length; idx < len; idx++) {\n      this[commands[idx]] = ((sCmd) => {\n        return (value) => {\n          this.beforeCommand();\n          document.execCommand(sCmd, false, value);\n          this.afterCommand(true);\n        };\n      })(commands[idx]);\n      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);\n    }\n\n    this.fontName = this.wrapCommand((value) => {\n      return this.fontStyling('font-family', env.validFontName(value));\n    });\n\n    this.fontSize = this.wrapCommand((value) => {\n      const unit = this.currentStyle()['font-size-unit'];\n      return this.fontStyling('font-size', value + unit);\n    });\n\n    this.fontSizeUnit = this.wrapCommand((value) => {\n      const size = this.currentStyle()['font-size'];\n      return this.fontStyling('font-size', size + value);\n    });\n\n    for (let idx = 1; idx <= 6; idx++) {\n      this['formatH' + idx] = ((idx) => {\n        return () => {\n          this.formatBlock('H' + idx);\n        };\n      })(idx);\n      this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);\n    }\n\n    this.insertParagraph = this.wrapCommand(() => {\n      this.typing.insertParagraph(this.editable);\n    });\n\n    this.insertOrderedList = this.wrapCommand(() => {\n      this.bullet.insertOrderedList(this.editable);\n    });\n\n    this.insertUnorderedList = this.wrapCommand(() => {\n      this.bullet.insertUnorderedList(this.editable);\n    });\n\n    this.indent = this.wrapCommand(() => {\n      this.bullet.indent(this.editable);\n    });\n\n    this.outdent = this.wrapCommand(() => {\n      this.bullet.outdent(this.editable);\n    });\n\n    /**\n     * insertNode\n     * insert node\n     * @param {Node} node\n     */\n    this.insertNode = this.wrapCommand((node) => {\n      if (this.isLimited($(node).text().length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      rng.insertNode(node);\n      this.setLastRange(range.createFromNodeAfter(node).select());\n    });\n\n    /**\n     * insert text\n     * @param {String} text\n     */\n    this.insertText = this.wrapCommand((text) => {\n      if (this.isLimited(text.length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      const textNode = rng.insertNode(dom.createText(text));\n      this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());\n    });\n\n    /**\n     * paste HTML\n     * @param {String} markup\n     */\n    this.pasteHTML = this.wrapCommand((markup) => {\n      if (this.isLimited(markup.length)) {\n        return;\n      }\n      markup = this.context.invoke('codeview.purify', markup);\n      const contents = this.getLastRange().pasteHTML(markup);\n      this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());\n    });\n\n    /**\n     * formatBlock\n     *\n     * @param {String} tagName\n     */\n    this.formatBlock = this.wrapCommand((tagName, $target) => {\n      const onApplyCustomStyle = this.options.callbacks.onApplyCustomStyle;\n      if (onApplyCustomStyle) {\n        onApplyCustomStyle.call(this, $target, this.context, this.onFormatBlock);\n      } else {\n        this.onFormatBlock(tagName, $target);\n      }\n    });\n\n    /**\n     * insert horizontal rule\n     */\n    this.insertHorizontalRule = this.wrapCommand(() => {\n      const hrNode = this.getLastRange().insertNode(dom.create('HR'));\n      if (hrNode.nextSibling) {\n        this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());\n      }\n    });\n\n    /**\n     * lineHeight\n     * @param {String} value\n     */\n    this.lineHeight = this.wrapCommand((value) => {\n      this.style.stylePara(this.getLastRange(), {\n        lineHeight: value,\n      });\n    });\n\n    /**\n     * create link (command)\n     *\n     * @param {Object} linkInfo\n     */\n    this.createLink = this.wrapCommand((linkInfo) => {\n      let linkUrl = linkInfo.url;\n      const linkText = linkInfo.text;\n      const isNewWindow = linkInfo.isNewWindow;\n      const checkProtocol = linkInfo.checkProtocol;\n      let rng = linkInfo.range || this.getLastRange();\n      const additionalTextLength = linkText.length - rng.toString().length;\n      if (additionalTextLength > 0 && this.isLimited(additionalTextLength)) {\n        return;\n      }\n      const isTextChanged = rng.toString() !== linkText;\n\n      // handle spaced urls from input\n      if (typeof linkUrl === 'string') {\n        linkUrl = linkUrl.trim();\n      }\n\n      if (this.options.onCreateLink) {\n        linkUrl = this.options.onCreateLink(linkUrl);\n      } else if (checkProtocol) {\n        // if url doesn't have any protocol and not even a relative or a label, use http:// as default\n        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\\:|#|\\/)/.test(linkUrl)\n          ? linkUrl : this.options.defaultProtocol + linkUrl;\n      }\n\n      let anchors = [];\n      if (isTextChanged) {\n        rng = rng.deleteContents();\n        const anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);\n        anchors.push(anchor);\n      } else {\n        anchors = this.style.styleNodes(rng, {\n          nodeName: 'A',\n          expandClosestSibling: true,\n          onlyPartialContains: true,\n        });\n      }\n\n      $.each(anchors, (idx, anchor) => {\n        $(anchor).attr('href', linkUrl);\n        if (isNewWindow) {\n          $(anchor).attr('target', '_blank');\n        } else {\n          $(anchor).removeAttr('target');\n        }\n      });\n\n      this.setLastRange(\n        this.createRangeFromList(anchors).select()\n      );\n    });\n\n    /**\n     * setting color\n     *\n     * @param {Object} sObjColor  color code\n     * @param {String} sObjColor.foreColor foreground color\n     * @param {String} sObjColor.backColor background color\n     */\n    this.color = this.wrapCommand((colorInfo) => {\n      const foreColor = colorInfo.foreColor;\n      const backColor = colorInfo.backColor;\n\n      if (foreColor) { document.execCommand('foreColor', false, foreColor); }\n      if (backColor) { document.execCommand('backColor', false, backColor); }\n    });\n\n    /**\n     * Set foreground color\n     *\n     * @param {String} colorCode foreground color code\n     */\n    this.foreColor = this.wrapCommand((colorInfo) => {\n      document.execCommand('foreColor', false, colorInfo);\n    });\n\n    /**\n     * insert Table\n     *\n     * @param {String} dimension of table (ex : \"5x5\")\n     */\n    this.insertTable = this.wrapCommand((dim) => {\n      const dimension = dim.split('x');\n\n      const rng = this.getLastRange().deleteContents();\n      rng.insertNode(this.table.createTable(dimension[0], dimension[1], this.options));\n    });\n\n    /**\n     * remove media object and Figure Elements if media object is img with Figure.\n     */\n    this.removeMedia = this.wrapCommand(() => {\n      let $target = $(this.restoreTarget()).parent();\n      if ($target.closest('figure').length) {\n        $target.closest('figure').remove();\n      } else {\n        $target = $(this.restoreTarget()).detach();\n      }\n      this.context.triggerEvent('media.delete', $target, this.$editable);\n    });\n\n    /**\n     * float me\n     *\n     * @param {String} value\n     */\n    this.floatMe = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      $target.toggleClass('note-float-left', value === 'left');\n      $target.toggleClass('note-float-right', value === 'right');\n      $target.css('float', (value === 'none' ? '' : value));\n    });\n\n    /**\n     * resize overlay element\n     * @param {String} value\n     */\n    this.resize = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      value = parseFloat(value);\n      if (value === 0) {\n        $target.css('width', '');\n      } else {\n        $target.css({\n          width: value * 100 + '%',\n          height: '',\n        });\n      }\n    });\n  }\n\n  initialize() {\n    // bind custom events\n    this.$editable.on('keydown', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        this.context.triggerEvent('enter', event);\n      }\n      this.context.triggerEvent('keydown', event);\n\n      // keep a snapshot to limit text on input event\n      this.snapshot = this.history.makeSnapshot();\n      this.hasKeyShortCut = false;\n      if (!event.isDefaultPrevented()) {\n        if (this.options.shortcuts) {\n          this.hasKeyShortCut = this.handleKeyMap(event);\n        } else {\n          this.preventDefaultEditableShortCuts(event);\n        }\n      }\n      if (this.isLimited(1, event)) {\n        const lastRange = this.getLastRange();\n        if (lastRange.eo - lastRange.so === 0) {\n          return false;\n        }\n      }\n      this.setLastRange();\n\n      // record undo in the key event except keyMap.\n      if (this.options.recordEveryKeystroke) {\n        if (this.hasKeyShortCut === false) {\n          this.history.recordUndo();\n        }\n      }\n    }).on('keyup', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('keyup', event);\n    }).on('focus', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('focus', event);\n    }).on('blur', (event) => {\n      this.context.triggerEvent('blur', event);\n    }).on('mousedown', (event) => {\n      this.context.triggerEvent('mousedown', event);\n    }).on('mouseup', (event) => {\n      this.setLastRange();\n      this.history.recordUndo();\n      this.context.triggerEvent('mouseup', event);\n    }).on('scroll', (event) => {\n      this.context.triggerEvent('scroll', event);\n    }).on('paste', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('paste', event);\n    }).on('input', () => {\n      // To limit composition characters (e.g. Korean)\n      if (this.isLimited(0) && this.snapshot) {\n        this.history.applySnapshot(this.snapshot);\n      }\n    });\n\n    this.$editable.attr('spellcheck', this.options.spellCheck);\n\n    this.$editable.attr('autocorrect', this.options.spellCheck);\n\n    if (this.options.disableGrammar) {\n      this.$editable.attr('data-gramm', false);\n    }\n\n    // init content before set event\n    this.$editable.html(dom.html(this.$note) || dom.emptyPara);\n\n    this.$editable.on(env.inputEventName, func.debounce(() => {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }, 10));\n\n    this.$editable.on('focusin', (event) => {\n      this.context.triggerEvent('focusin', event);\n    }).on('focusout', (event) => {\n      this.context.triggerEvent('focusout', event);\n    });\n\n    if (this.options.airMode) {\n      if (this.options.overrideContextMenu) {\n        this.$editor.on('contextmenu', (event) => {\n          this.context.triggerEvent('contextmenu', event);\n          return false;\n        });\n      }\n    } else {\n      if (this.options.width) {\n        this.$editor.outerWidth(this.options.width);\n      }\n      if (this.options.height) {\n        this.$editable.outerHeight(this.options.height);\n      }\n      if (this.options.maxHeight) {\n        this.$editable.css('max-height', this.options.maxHeight);\n      }\n      if (this.options.minHeight) {\n        this.$editable.css('min-height', this.options.minHeight);\n      }\n    }\n\n    this.history.recordUndo();\n    this.setLastRange();\n  }\n\n  destroy() {\n    this.$editable.off();\n  }\n\n  handleKeyMap(event) {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    const keys = [];\n\n    if (event.metaKey) { keys.push('CMD'); }\n    if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }\n    if (event.shiftKey) { keys.push('SHIFT'); }\n\n    const keyName = key.nameFromCode[event.keyCode];\n    if (keyName) {\n      keys.push(keyName);\n    }\n\n    const eventName = keyMap[keys.join('+')];\n\n    if (keyName === 'TAB' && !this.options.tabDisable) {\n      this.afterCommand();\n    } else if (eventName) {\n      if (this.context.invoke(eventName) !== false) {\n        event.preventDefault();\n        // if keyMap action was invoked\n        return true;\n      }\n    } else if (key.isEdit(event.keyCode)) {\n      this.afterCommand();\n    }\n    return false;\n  }\n\n  preventDefaultEditableShortCuts(event) {\n    // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)\n    if ((event.ctrlKey || event.metaKey) &&\n      lists.contains([66, 73, 85], event.keyCode)) {\n      event.preventDefault();\n    }\n  }\n\n  isLimited(pad, event) {\n    pad = pad || 0;\n\n    if (typeof event !== 'undefined') {\n      if (key.isMove(event.keyCode) ||\n          key.isNavigation(event.keyCode) ||\n          (event.ctrlKey || event.metaKey) ||\n          lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {\n        return false;\n      }\n    }\n\n    if (this.options.maxTextLength > 0) {\n      if ((this.$editable.text().length + pad) > this.options.maxTextLength) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * create range\n   * @return {WrappedRange}\n   */\n  createRange() {\n    this.focus();\n    this.setLastRange();\n    return this.getLastRange();\n  }\n\n  /**\n   * create a new range from the list of elements\n   *\n   * @param {list} dom element list\n   * @return {WrappedRange}\n   */\n  createRangeFromList(lst) {\n    const startRange = range.createFromNodeBefore(lists.head(lst));\n    const startPoint = startRange.getStartPoint();\n    const endRange = range.createFromNodeAfter(lists.last(lst));\n    const endPoint = endRange.getEndPoint();\n\n    return range.create(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * set the last range\n   *\n   * if given rng is exist, set rng as the last range\n   * or create a new range at the end of the document\n   *\n   * @param {WrappedRange} rng\n   */\n  setLastRange(rng) {\n    if (rng) {\n      this.lastRange = rng;\n    } else {\n      this.lastRange = range.create(this.editable);\n\n      if ($(this.lastRange.sc).closest('.note-editable').length === 0) {\n        this.lastRange = range.createFromBodyElement(this.editable);\n      }\n    }\n  }\n\n  /**\n   * get the last range\n   *\n   * if there is a saved last range, return it\n   * or create a new range and return it\n   *\n   * @return {WrappedRange}\n   */\n  getLastRange() {\n    if (!this.lastRange) {\n      this.setLastRange();\n    }\n    return this.lastRange;\n  }\n\n  /**\n   * saveRange\n   *\n   * save current range\n   *\n   * @param {Boolean} [thenCollapse=false]\n   */\n  saveRange(thenCollapse) {\n    if (thenCollapse) {\n      this.getLastRange().collapse().select();\n    }\n  }\n\n  /**\n   * restoreRange\n   *\n   * restore lately range\n   */\n  restoreRange() {\n    if (this.lastRange) {\n      this.lastRange.select();\n      this.focus();\n    }\n  }\n\n  saveTarget(node) {\n    this.$editable.data('target', node);\n  }\n\n  clearTarget() {\n    this.$editable.removeData('target');\n  }\n\n  restoreTarget() {\n    return this.$editable.data('target');\n  }\n\n  /**\n   * currentStyle\n   *\n   * current style\n   * @return {Object|Boolean} unfocus\n   */\n  currentStyle() {\n    let rng = range.create();\n    if (rng) {\n      rng = rng.normalize();\n    }\n    return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);\n  }\n\n  /**\n   * style from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  styleFromNode($node) {\n    return this.style.fromNode($node);\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.undo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /*\n  * commit\n  */\n  commit() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.commit();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.redo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * before command\n   */\n  beforeCommand() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n\n    // Set styleWithCSS before run a command\n    document.execCommand('styleWithCSS', false, this.options.styleWithCSS);\n\n    // keep focus on editable before command execution\n    this.focus();\n  }\n\n  /**\n   * after command\n   * @param {Boolean} isPreventTrigger\n   */\n  afterCommand(isPreventTrigger) {\n    this.normalizeContent();\n    this.history.recordUndo();\n    if (!isPreventTrigger) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  /**\n   * handle tab key\n   */\n  tab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n\n      if (!this.isLimited(this.options.tabSize)) {\n        this.beforeCommand();\n        this.typing.insertTab(rng, this.options.tabSize);\n        this.afterCommand();\n      }\n    }\n  }\n\n  /**\n   * handle shift+tab key\n   */\n  untab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng, true);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * run given function between beforeCommand and afterCommand\n   */\n  wrapCommand(fn) {\n    return function() {\n      this.beforeCommand();\n      fn.apply(this, arguments);\n      this.afterCommand();\n    };\n  }\n\n  /**\n   * insert image\n   *\n   * @param {String} src\n   * @param {String|Function} param\n   * @return {Promise}\n   */\n  insertImage(src, param) {\n    return createImage(src, param).then(($image) => {\n      this.beforeCommand();\n\n      if (typeof param === 'function') {\n        param($image);\n      } else {\n        if (typeof param === 'string') {\n          $image.attr('data-filename', param);\n        }\n        $image.css('width', Math.min(this.$editable.width(), $image.width()));\n      }\n\n      $image.show();\n      this.getLastRange().insertNode($image[0]);\n      this.setLastRange(range.createFromNodeAfter($image[0]).select());\n      this.afterCommand();\n    }).fail((e) => {\n      this.context.triggerEvent('image.upload.error', e);\n    });\n  }\n\n  /**\n   * insertImages\n   * @param {File[]} files\n   */\n  insertImagesAsDataURL(files) {\n    $.each(files, (idx, file) => {\n      const filename = file.name;\n      if (this.options.maximumImageFileSize && this.options.maximumImageFileSize < file.size) {\n        this.context.triggerEvent('image.upload.error', this.lang.image.maximumFileSizeError);\n      } else {\n        readFileAsDataURL(file).then((dataURL) => {\n          return this.insertImage(dataURL, filename);\n        }).fail(() => {\n          this.context.triggerEvent('image.upload.error');\n        });\n      }\n    });\n  }\n\n  /**\n   * insertImagesOrCallback\n   * @param {File[]} files\n   */\n  insertImagesOrCallback(files) {\n    const callbacks = this.options.callbacks;\n    // If onImageUpload set,\n    if (callbacks.onImageUpload) {\n      this.context.triggerEvent('image.upload', files);\n      // else insert Image as dataURL\n    } else {\n      this.insertImagesAsDataURL(files);\n    }\n  }\n\n  /**\n   * return selected plain text\n   * @return {String} text\n   */\n  getSelectedText() {\n    let rng = this.getLastRange();\n\n    // if range on anchor, expand range with anchor\n    if (rng.isOnAnchor()) {\n      rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));\n    }\n\n    return rng.toString();\n  }\n\n  onFormatBlock(tagName, $target) {\n    // [workaround] for MSIE, IE need `<`\n    document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName);\n\n    // support custom class\n    if ($target && $target.length) {\n      // find the exact element has given tagName\n      if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {\n        $target = $target.find(tagName);\n      }\n\n      if ($target && $target.length) {\n        const className = $target[0].className || '';\n        if (className) {\n          const currentRange = this.createRange();\n\n          const $parent = $([currentRange.sc, currentRange.ec]).closest(tagName);\n          $parent.addClass(className);\n        }\n      }\n    }\n  }\n\n  formatPara() {\n    this.formatBlock('P');\n  }\n\n  fontStyling(target, value) {\n    const rng = this.getLastRange();\n\n    if (rng !== '') {\n      const spans = this.style.styleNodes(rng);\n      this.$editor.find('.note-status-output').html('');\n      $(spans).css(target, value);\n\n      // [workaround] added styled bogus span for style\n      //  - also bogus character needed for cursor position\n      if (rng.isCollapsed()) {\n        const firstSpan = lists.head(spans);\n        if (firstSpan && !dom.nodeLength(firstSpan)) {\n          firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;\n          range.createFromNode(firstSpan.firstChild).select();\n          this.setLastRange();\n          this.$editable.data(KEY_BOGUS, firstSpan);\n        }\n      } else {\n        this.setLastRange(\n          this.createRangeFromList(spans).select()\n        );\n      }\n    } else {\n      const noteStatusOutput = $.now();\n      this.$editor.find('.note-status-output').html('<div id=\"note-status-output-' + noteStatusOutput + '\" class=\"alert alert-info\">' + this.lang.output.noSelection + '</div>');\n      setTimeout(function() { $('#note-status-output-' + noteStatusOutput).remove(); }, 5000);\n    }\n  }\n\n  /**\n   * unlink\n   *\n   * @type command\n   */\n  unlink() {\n    let rng = this.getLastRange();\n    if (rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      rng = range.createFromNode(anchor);\n      rng.select();\n      this.setLastRange();\n\n      this.beforeCommand();\n      document.execCommand('unlink');\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * returns link info\n   *\n   * @return {Object}\n   * @return {WrappedRange} return.range\n   * @return {String} return.text\n   * @return {Boolean} [return.isNewWindow=true]\n   * @return {String} [return.url=\"\"]\n   */\n  getLinkInfo() {\n    const rng = this.getLastRange().expand(dom.isAnchor);\n    // Get the first anchor on range(for edit).\n    const $anchor = $(lists.head(rng.nodes(dom.isAnchor)));\n    const linkInfo = {\n      range: rng,\n      text: rng.toString(),\n      url: $anchor.length ? $anchor.attr('href') : '',\n    };\n\n    // When anchor exists,\n    if ($anchor.length) {\n      // Set isNewWindow by checking its target.\n      linkInfo.isNewWindow = $anchor.attr('target') === '_blank';\n    }\n\n    return linkInfo;\n  }\n\n  addRow(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addRow(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  addCol(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addCol(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  deleteRow() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteRow(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteCol() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteCol(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteTable() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteTable(rng);\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * @param {Position} pos\n   * @param {jQuery} $target - target element\n   * @param {Boolean} [bKeepRatio] - keep ratio\n   */\n  resizeTo(pos, $target, bKeepRatio) {\n    let imageSize;\n    if (bKeepRatio) {\n      const newRatio = pos.y / pos.x;\n      const ratio = $target.data('ratio');\n      imageSize = {\n        width: ratio > newRatio ? pos.x : pos.y / ratio,\n        height: ratio > newRatio ? pos.x * ratio : pos.y,\n      };\n    } else {\n      imageSize = {\n        width: pos.x,\n        height: pos.y,\n      };\n    }\n\n    $target.css(imageSize);\n  }\n\n  /**\n   * returns whether editable area has focus or not.\n   */\n  hasFocus() {\n    return this.$editable.is(':focus');\n  }\n\n  /**\n   * set focus\n   */\n  focus() {\n    // [workaround] Screen will move when page is scolled in IE.\n    //  - do focus when not focused\n    if (!this.hasFocus()) {\n      this.$editable.focus();\n    }\n  }\n\n  /**\n   * returns whether contents is empty or not.\n   * @return {Boolean}\n   */\n  isEmpty() {\n    return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();\n  }\n\n  /**\n   * Removes all contents and restores the editable instance to an _emptyPara_.\n   */\n  empty() {\n    this.context.invoke('code', dom.emptyPara);\n  }\n\n  /**\n   * normalize content\n   */\n  normalizeContent() {\n    this.$editable[0].normalize();\n  }\n}\n","import $ from 'jquery';\n\n/**\n * @method readFileAsDataURL\n *\n * read contents of file as representing URL\n *\n * @param {File} file\n * @return {Promise} - then: dataUrl\n */\nexport function readFileAsDataURL(file) {\n  return $.Deferred((deferred) => {\n    $.extend(new FileReader(), {\n      onload: (e) => {\n        const dataURL = e.target.result;\n        deferred.resolve(dataURL);\n      },\n      onerror: (err) => {\n        deferred.reject(err);\n      },\n    }).readAsDataURL(file);\n  }).promise();\n}\n\n/**\n * @method createImage\n *\n * create `<image>` from url string\n *\n * @param {String} url\n * @return {Promise} - then: $image\n */\nexport function createImage(url) {\n  return $.Deferred((deferred) => {\n    const $img = $('<img>');\n\n    $img.one('load', () => {\n      $img.off('error abort');\n      deferred.resolve($img);\n    }).one('error abort', () => {\n      $img.off('load').detach();\n      deferred.reject($img);\n    }).css({\n      display: 'none',\n    }).appendTo(document.body).attr('src', url);\n  }).promise();\n}\n","import lists from '../core/lists';\n\nexport default class Clipboard {\n  constructor(context) {\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n  }\n\n  initialize() {\n    this.$editable.on('paste', this.pasteByEvent.bind(this));\n  }\n\n  /**\n   * paste by clipboard event\n   *\n   * @param {Event} event\n   */\n  pasteByEvent(event) {\n    const clipboardData = event.originalEvent.clipboardData;\n\n    if (clipboardData && clipboardData.items && clipboardData.items.length) {\n      const item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);\n      if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {\n        // paste img file\n        this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);\n        event.preventDefault();\n      } else if (item.kind === 'string') {\n        // paste text with maxTextLength check\n        if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {\n          event.preventDefault();\n        }\n      }\n    } else if (window.clipboardData) {\n      // for IE\n      let text = window.clipboardData.getData('text');\n      if (this.context.invoke('editor.isLimited', text.length)) {\n        event.preventDefault();\n      }\n    }\n    // Call editor.afterCommand after proceeding default event handler\n    setTimeout(() => {\n      this.context.invoke('editor.afterCommand');\n    }, 10);\n  }\n}\n","import $ from 'jquery';\n\nexport default class Dropzone {\n  constructor(context) {\n    this.context = context;\n    this.$eventListener = $(document);\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.documentEventHandlers = {};\n\n    this.$dropzone = $([\n      '<div class=\"note-dropzone\">',\n        '<div class=\"note-dropzone-message\"></div>',\n      '</div>',\n    ].join('')).prependTo(this.$editor);\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  initialize() {\n    if (this.options.disableDragAndDrop) {\n      // prevent default drop event\n      this.documentEventHandlers.onDrop = (e) => {\n        e.preventDefault();\n      };\n      // do not consider outside of dropzone\n      this.$eventListener = this.$dropzone;\n      this.$eventListener.on('drop', this.documentEventHandlers.onDrop);\n    } else {\n      this.attachDragAndDropEvent();\n    }\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  attachDragAndDropEvent() {\n    let collection = $();\n    const $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');\n\n    this.documentEventHandlers.onDragenter = (e) => {\n      const isCodeview = this.context.invoke('codeview.isActivated');\n      const hasEditorSize = this.$editor.width() > 0 && this.$editor.height() > 0;\n      if (!isCodeview && !collection.length && hasEditorSize) {\n        this.$editor.addClass('dragover');\n        this.$dropzone.width(this.$editor.width());\n        this.$dropzone.height(this.$editor.height());\n        $dropzoneMessage.text(this.lang.image.dragImageHere);\n      }\n      collection = collection.add(e.target);\n    };\n\n    this.documentEventHandlers.onDragleave = (e) => {\n      collection = collection.not(e.target);\n\n      // If nodeName is BODY, then just make it over (fix for IE)\n      if (!collection.length || e.target.nodeName === 'BODY') {\n        collection = $();\n        this.$editor.removeClass('dragover');\n      }\n    };\n\n    this.documentEventHandlers.onDrop = () => {\n      collection = $();\n      this.$editor.removeClass('dragover');\n    };\n\n    // show dropzone on dragenter when dragging a object to document\n    // -but only if the editor is visible, i.e. has a positive width and height\n    this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter)\n      .on('dragleave', this.documentEventHandlers.onDragleave)\n      .on('drop', this.documentEventHandlers.onDrop);\n\n    // change dropzone's message on hover.\n    this.$dropzone.on('dragenter', () => {\n      this.$dropzone.addClass('hover');\n      $dropzoneMessage.text(this.lang.image.dropImage);\n    }).on('dragleave', () => {\n      this.$dropzone.removeClass('hover');\n      $dropzoneMessage.text(this.lang.image.dragImageHere);\n    });\n\n    // attach dropImage\n    this.$dropzone.on('drop', (event) => {\n      const dataTransfer = event.originalEvent.dataTransfer;\n\n      // stop the browser from opening the dropped content\n      event.preventDefault();\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        this.$editable.focus();\n        this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);\n      } else {\n        $.each(dataTransfer.types, (idx, type) => {\n          // skip moz-specific types\n          if (type.toLowerCase().indexOf('_moz_') > -1) {\n            return;\n          }\n          const content = dataTransfer.getData(type);\n\n          if (type.toLowerCase().indexOf('text') > -1) {\n            this.context.invoke('editor.pasteHTML', content);\n          } else {\n            $(content).each((idx, item) => {\n              this.context.invoke('editor.insertNode', item);\n            });\n          }\n        });\n      }\n    }).on('dragover', false); // prevent default dragover event\n  }\n\n  destroy() {\n    Object.keys(this.documentEventHandlers).forEach((key) => {\n      this.$eventListener.off(key.substr(2).toLowerCase(), this.documentEventHandlers[key]);\n    });\n    this.documentEventHandlers = {};\n  }\n}\n","import dom from '../core/dom';\nimport key from '../core/key';\n\n/**\n * @class Codeview\n */\nexport default class CodeView {\n  constructor(context) {\n    this.context = context;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n    this.CodeMirrorConstructor = window.CodeMirror;\n\n    if (this.options.codemirror.CodeMirrorConstructor) {\n      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;\n    }\n  }\n\n  sync(html) {\n    const isCodeview = this.isActivated();\n    const CodeMirror = this.CodeMirrorConstructor;\n\n    if (isCodeview) {\n      if (html) {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').getDoc().setValue(html);\n        } else {\n          this.$codable.val(html);\n        }\n      } else {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').save();\n        }\n      }\n    }\n  }\n\n  initialize() {\n    this.$codable.on('keyup', (event) => {\n      if (event.keyCode === key.code.ESCAPE) {\n        this.deactivate();\n      }\n    });\n  }\n\n  /**\n   * @return {Boolean}\n   */\n  isActivated() {\n    return this.$editor.hasClass('codeview');\n  }\n\n  /**\n   * toggle codeview\n   */\n  toggle() {\n    if (this.isActivated()) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n    this.context.triggerEvent('codeview.toggled');\n  }\n\n  /**\n   * purify input value\n   * @param value\n   * @returns {*}\n   */\n  purify(value) {\n    if (this.options.codeviewFilter) {\n      // filter code view regex\n      value = value.replace(this.options.codeviewFilterRegex, '');\n      // allow specific iframe tag\n      if (this.options.codeviewIframeFilter) {\n        const whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);\n        value = value.replace(/(<iframe.*?>.*?(?:<\\/iframe>)?)/gi, function(tag) {\n          // remove if src attribute is duplicated\n          if (/<.+src(?==?('|\"|\\s)?)[\\s\\S]+src(?=('|\"|\\s)?)[^>]*?>/i.test(tag)) {\n            return '';\n          }\n          for (const src of whitelist) {\n            // pass if src is trusted\n            if ((new RegExp('src=\"(https?:)?\\/\\/' + src.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '\\/(.+)\"')).test(tag)) {\n              return tag;\n            }\n          }\n          return '';\n        });\n      }\n    }\n    return value;\n  }\n\n  /**\n   * activate code view\n   */\n  activate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));\n    this.$codable.height(this.$editable.height());\n\n    this.context.invoke('toolbar.updateCodeview', true);\n    this.context.invoke('airPopover.updateCodeview', true);\n\n    this.$editor.addClass('codeview');\n    this.$codable.focus();\n\n    // activate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror);\n\n      // CodeMirror TernServer\n      if (this.options.codemirror.tern) {\n        const server = new CodeMirror.TernServer(this.options.codemirror.tern);\n        cmEditor.ternServer = server;\n        cmEditor.on('cursorActivity', (cm) => {\n          server.updateArgHints(cm);\n        });\n      }\n\n      cmEditor.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);\n      });\n      cmEditor.on('change', () => {\n        this.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);\n      });\n\n      // CodeMirror hasn't Padding.\n      cmEditor.setSize(null, this.$editable.outerHeight());\n      this.$codable.data('cmEditor', cmEditor);\n    } else {\n      this.$codable.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', this.$codable.val(), event);\n      });\n      this.$codable.on('input', () => {\n        this.context.triggerEvent('change.codeview', this.$codable.val(), this.$codable);\n      });\n    }\n  }\n\n  /**\n   * deactivate code view\n   */\n  deactivate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    // deactivate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = this.$codable.data('cmEditor');\n      this.$codable.val(cmEditor.getValue());\n      cmEditor.toTextArea();\n    }\n\n    const value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);\n    const isChange = this.$editable.html() !== value;\n\n    this.$editable.html(value);\n    this.$editable.height(this.options.height ? this.$codable.height() : 'auto');\n    this.$editor.removeClass('codeview');\n\n    if (isChange) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n\n    this.$editable.focus();\n\n    this.context.invoke('toolbar.updateCodeview', false);\n    this.context.invoke('airPopover.updateCodeview', false);\n  }\n\n  destroy() {\n    if (this.isActivated()) {\n      this.deactivate();\n    }\n  }\n}\n","import $ from 'jquery';\nconst EDITABLE_PADDING = 24;\n\nexport default class Statusbar {\n  constructor(context) {\n    this.$document = $(document);\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n  }\n\n  initialize() {\n    if (this.options.airMode || this.options.disableResizeEditor) {\n      this.destroy();\n      return;\n    }\n\n    this.$statusbar.on('mousedown', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const editableTop = this.$editable.offset().top - this.$document.scrollTop();\n      const onMouseMove = (event) => {\n        let height = event.clientY - (editableTop + EDITABLE_PADDING);\n\n        height = (this.options.minheight > 0) ? Math.max(height, this.options.minheight) : height;\n        height = (this.options.maxHeight > 0) ? Math.min(height, this.options.maxHeight) : height;\n\n        this.$editable.height(height);\n      };\n\n      this.$document.on('mousemove', onMouseMove).one('mouseup', () => {\n        this.$document.off('mousemove', onMouseMove);\n      });\n    });\n  }\n\n  destroy() {\n    this.$statusbar.off();\n    this.$statusbar.addClass('locked');\n  }\n}\n","import $ from 'jquery';\n\nexport default class Fullscreen {\n  constructor(context) {\n    this.context = context;\n\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n\n    this.$window = $(window);\n    this.$scrollbar = $('html, body');\n\n    this.onResize = () => {\n      this.resizeTo({\n        h: this.$window.height() - this.$toolbar.outerHeight(),\n      });\n    };\n  }\n\n  resizeTo(size) {\n    this.$editable.css('height', size.h);\n    this.$codable.css('height', size.h);\n    if (this.$codable.data('cmeditor')) {\n      this.$codable.data('cmeditor').setsize(null, size.h);\n    }\n  }\n\n  /**\n   * toggle fullscreen\n   */\n  toggle() {\n    this.$editor.toggleClass('fullscreen');\n    if (this.isFullscreen()) {\n      this.$editable.data('orgHeight', this.$editable.css('height'));\n      this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));\n      this.$editable.css('maxHeight', '');\n      this.$window.on('resize', this.onResize).trigger('resize');\n      this.$scrollbar.css('overflow', 'hidden');\n    } else {\n      this.$window.off('resize', this.onResize);\n      this.resizeTo({ h: this.$editable.data('orgHeight') });\n      this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));\n      this.$scrollbar.css('overflow', 'visible');\n    }\n\n    this.context.invoke('toolbar.updateFullscreen', this.isFullscreen());\n  }\n\n  isFullscreen() {\n    return this.$editor.hasClass('fullscreen');\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\n\nexport default class Handle {\n  constructor(context) {\n    this.context = context;\n    this.$document = $(document);\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        if (this.update(e.target, e)) {\n          e.preventDefault();\n        }\n      },\n      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  initialize() {\n    this.$handle = $([\n      '<div class=\"note-handle\">',\n        '<div class=\"note-control-selection\">',\n          '<div class=\"note-control-selection-bg\"></div>',\n          '<div class=\"note-control-holder note-control-nw\"></div>',\n          '<div class=\"note-control-holder note-control-ne\"></div>',\n          '<div class=\"note-control-holder note-control-sw\"></div>',\n          '<div class=\"',\n            (this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),\n          ' note-control-se\"></div>',\n          (this.options.disableResizeImage ? '' : '<div class=\"note-control-selection-info\"></div>'),\n        '</div>',\n      '</div>',\n    ].join('')).prependTo(this.$editingArea);\n\n    this.$handle.on('mousedown', (event) => {\n      if (dom.isControlSizing(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const $target = this.$handle.find('.note-control-selection').data('target');\n        const posStart = $target.offset();\n        const scrollTop = this.$document.scrollTop();\n\n        const onMouseMove = (event) => {\n          this.context.invoke('editor.resizeTo', {\n            x: event.clientX - posStart.left,\n            y: event.clientY - (posStart.top - scrollTop),\n          }, $target, !event.shiftKey);\n\n          this.update($target[0], event);\n        };\n\n        this.$document\n          .on('mousemove', onMouseMove)\n          .one('mouseup', (e) => {\n            e.preventDefault();\n            this.$document.off('mousemove', onMouseMove);\n            this.context.invoke('editor.afterCommand');\n          });\n\n        if (!$target.data('ratio')) { // original ratio.\n          $target.data('ratio', $target.height() / $target.width());\n        }\n      }\n    });\n\n    // Listen for scrolling on the handle overlay.\n    this.$handle.on('wheel', (e) => {\n      e.preventDefault();\n      this.update();\n    });\n  }\n\n  destroy() {\n    this.$handle.remove();\n  }\n\n  update(target, event) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isImage = dom.isImg(target);\n    const $selection = this.$handle.find('.note-control-selection');\n\n    this.context.invoke('imagePopover.update', target, event);\n\n    if (isImage) {\n      const $image = $(target);\n      const position = $image.position();\n      const pos = {\n        left: position.left + parseInt($image.css('marginLeft'), 10),\n        top: position.top + parseInt($image.css('marginTop'), 10),\n      };\n\n      // exclude margin\n      const imageSize = {\n        w: $image.outerWidth(false),\n        h: $image.outerHeight(false),\n      };\n\n      $selection.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n        width: imageSize.w,\n        height: imageSize.h,\n      }).data('target', $image); // save current image element.\n\n      const origImageObj = new Image();\n      origImageObj.src = $image.attr('src');\n\n      const sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';\n      $selection.find('.note-control-selection-info').text(sizingText);\n      this.context.invoke('editor.saveTarget', target);\n    } else {\n      this.hide();\n    }\n\n    return isImage;\n  }\n\n  /**\n   * hide\n   *\n   * @param {jQuery} $handle\n   */\n  hide() {\n    this.context.invoke('editor.clearTarget');\n    this.$handle.children().hide();\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport key from '../core/key';\n\nconst defaultScheme = 'http://';\nconst linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\\:[\\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@)?(www\\.)?(.+)$/i;\n\nexport default class AutoLink {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n  }\n\n  destroy() {\n    this.lastWordRange = null;\n  }\n\n  replace() {\n    if (!this.lastWordRange) {\n      return;\n    }\n\n    const keyword = this.lastWordRange.toString();\n    const match = keyword.match(linkPattern);\n\n    if (match && (match[1] || match[2])) {\n      const link = match[1] ? keyword : defaultScheme + keyword;\n      const urlText = this.options.showDomainOnlyForAutolink ?\n        keyword.replace(/^(?:https?:\\/\\/)?(?:tel?:?)?(?:mailto?:?)?(?:www\\.)?/i, '').split('/')[0]\n        : keyword;\n      const node = $('<a />').html(urlText).attr('href', link)[0];\n      if (this.context.options.linkTargetBlank) {\n        $(node).attr('target', '_blank');\n      }\n\n      this.lastWordRange.insertNode(node);\n      this.lastWordRange = null;\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  handleKeydown(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWordRange = wordRange;\n    }\n  }\n\n  handleKeyup(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import dom from '../core/dom';\n\n/**\n * textarea auto sync.\n */\nexport default class AutoSync {\n  constructor(context) {\n    this.$note = context.layoutInfo.note;\n    this.events = {\n      'summernote.change': () => {\n        this.$note.val(context.invoke('code'));\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return dom.isTextarea(this.$note[0]);\n  }\n}\n","import lists from '../core/lists';\nimport dom from '../core/dom';\nimport key from '../core/key';\n\nexport default class AutoReplace {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options.replace || {};\n\n    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];\n    this.previousKeydownCode = null;\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.match;\n  }\n\n  initialize() {\n    this.lastWord = null;\n  }\n\n  destroy() {\n    this.lastWord = null;\n  }\n\n  replace() {\n    if (!this.lastWord) {\n      return;\n    }\n\n    const self = this;\n    const keyword = this.lastWord.toString();\n    this.options.match(keyword, function(match) {\n      if (match) {\n        let node = '';\n\n        if (typeof match === 'string') {\n          node = dom.createText(match);\n        } else if (match instanceof jQuery) {\n          node = match[0];\n        } else if (match instanceof Node) {\n          node = match;\n        }\n\n        if (!node) return;\n        self.lastWord.insertNode(node);\n        self.lastWord = null;\n        self.context.invoke('editor.focus');\n      }\n    });\n  }\n\n  handleKeydown(e) {\n    // this forces it to remember the last whole word, even if multiple termination keys are pressed\n    // before the previous key is let go.\n    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {\n      this.previousKeydownCode = e.keyCode;\n      return;\n    }\n\n    if (lists.contains(this.keys, e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWord = wordRange;\n    }\n    this.previousKeydownCode = e.keyCode;\n  }\n\n  handleKeyup(e) {\n    if (lists.contains(this.keys, e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import $ from 'jquery';\nexport default class Placeholder {\n  constructor(context) {\n    this.context = context;\n\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n\n    if (this.options.inheritPlaceholder === true) {\n      // get placeholder value from the original element\n      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;\n    }\n\n    this.events = {\n      'summernote.init summernote.change': () => {\n        this.update();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.placeholder;\n  }\n\n  initialize() {\n    this.$placeholder = $('<div class=\"note-placeholder\">');\n    this.$placeholder.on('click', () => {\n      this.context.invoke('focus');\n    }).html(this.options.placeholder).prependTo(this.$editingArea);\n\n    this.update();\n  }\n\n  destroy() {\n    this.$placeholder.remove();\n  }\n\n  update() {\n    const isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');\n    this.$placeholder.toggle(isShow);\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport env from '../core/env';\n\nexport default class Buttons {\n  constructor(context) {\n    this.ui = $.summernote.ui;\n    this.context = context;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.invertedKeyMap = func.invertObject(\n      this.options.keyMap[env.isMac ? 'mac' : 'pc']\n    );\n  }\n\n  representShortcut(editorMethod) {\n    let shortcut = this.invertedKeyMap[editorMethod];\n    if (!this.options.shortcuts || !shortcut) {\n      return '';\n    }\n\n    if (env.isMac) {\n      shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');\n    }\n\n    shortcut = shortcut.replace('BACKSLASH', '\\\\')\n      .replace('SLASH', '/')\n      .replace('LEFTBRACKET', '[')\n      .replace('RIGHTBRACKET', ']');\n\n    return ' (' + shortcut + ')';\n  }\n\n  button(o) {\n    if (!this.options.tooltip && o.tooltip) {\n      delete o.tooltip;\n    }\n    o.container = this.options.container;\n    return this.ui.button(o);\n  }\n\n  initialize() {\n    this.addToolbarButtons();\n    this.addImagePopoverButtons();\n    this.addLinkPopoverButtons();\n    this.addTablePopoverButtons();\n    this.fontInstalledMap = {};\n  }\n\n  destroy() {\n    delete this.fontInstalledMap;\n  }\n\n  isFontInstalled(name) {\n    if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {\n      this.fontInstalledMap[name] = env.isFontInstalled(name) ||\n        lists.contains(this.options.fontNamesIgnoreCheck, name);\n    }\n    return this.fontInstalledMap[name];\n  }\n\n  isFontDeservedToAdd(name) {\n    name = name.toLowerCase();\n    return (name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1);\n  }\n\n  colorPalette(className, tooltip, backColor, foreColor) {\n    return this.ui.buttonGroup({\n      className: 'note-color ' + className,\n      children: [\n        this.button({\n          className: 'note-current-color-button',\n          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),\n          tooltip: tooltip,\n          click: (e) => {\n            const $button = $(e.currentTarget);\n            if (backColor && foreColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n                foreColor: $button.attr('data-foreColor'),\n              });\n            } else if (backColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n              });\n            } else if (foreColor) {\n              this.context.invoke('editor.color', {\n                foreColor: $button.attr('data-foreColor'),\n              });\n            }\n          },\n          callback: ($button) => {\n            const $recentColor = $button.find('.note-recent-color');\n            if (backColor) {\n              $recentColor.css('background-color', this.options.colorButton.backColor);\n              $button.attr('data-backColor', this.options.colorButton.backColor);\n            }\n            if (foreColor) {\n              $recentColor.css('color', this.options.colorButton.foreColor);\n              $button.attr('data-foreColor', this.options.colorButton.foreColor);\n            } else {\n              $recentColor.css('color', 'transparent');\n            }\n          },\n        }),\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('', this.options),\n          tooltip: this.lang.color.more,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          items: (backColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.background + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"backColor\" data-value=\"transparent\">',\n                  this.lang.color.transparent,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"backColor\"><!-- back colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"backColorPicker\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"backColorPicker\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.backColor + '\" data-event=\"backColorPalette\">',\n              '</div>',\n              '<div class=\"note-holder-custom\" id=\"backColorPalette\" data-event=\"backColor\"></div>',\n            '</div>',\n          ].join('') : '') +\n          (foreColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.foreground + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                  this.lang.color.resetToDefault,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"foreColor\"><!-- fore colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"foreColorPicker\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"foreColorPicker\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.foreColor + '\" data-event=\"foreColorPalette\">',\n              '</div>', // Fix missing Div, Commented to find easily if it's wrong\n              '<div class=\"note-holder-custom\" id=\"foreColorPalette\" data-event=\"foreColor\"></div>',\n            '</div>',\n          ].join('') : ''),\n          callback: ($dropdown) => {\n            $dropdown.find('.note-holder').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: this.options.colors,\n                colorsName: this.options.colorsName,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            /* TODO: do we have to record recent custom colors within cookies? */\n            var customColors = [\n              ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF'],\n            ];\n            $dropdown.find('.note-holder-custom').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: customColors,\n                colorsName: customColors,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            $dropdown.find('input[type=color]').each((idx, item) => {\n              $(item).change(function() {\n                const $chip = $dropdown.find('#' + $(this).data('event')).find('.note-color-btn').first();\n                const color = this.value.toUpperCase();\n                $chip.css('background-color', color)\n                  .attr('aria-label', color)\n                  .attr('data-value', color)\n                  .attr('data-original-title', color);\n                $chip.click();\n              });\n            });\n          },\n          click: (event) => {\n            event.stopPropagation();\n\n            const $parent = $('.' + className).find('.note-dropdown-menu');\n            const $button = $(event.target);\n            const eventName = $button.data('event');\n            const value = $button.attr('data-value');\n\n            if (eventName === 'openPalette') {\n              const $picker = $parent.find('#' + value);\n              const $palette = $($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]);\n\n              // Shift palette chips\n              const $chip = $palette.find('.note-color-btn').last().detach();\n\n              // Set chip attributes\n              const color = $picker.val();\n              $chip.css('background-color', color)\n                .attr('aria-label', color)\n                .attr('data-value', color)\n                .attr('data-original-title', color);\n              $palette.prepend($chip);\n              $picker.click();\n            } else {\n              if (lists.contains(['backColor', 'foreColor'], eventName)) {\n                const key = eventName === 'backColor' ? 'background-color' : 'color';\n                const $color = $button.closest('.note-color').find('.note-recent-color');\n                const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n                $color.css(key, value);\n                $currentButton.attr('data-' + eventName, value);\n              }\n              this.context.invoke('editor.' + eventName, value);\n            }\n          },\n        }),\n      ],\n    }).render();\n  }\n\n  addToolbarButtons() {\n    this.context.memo('button.style', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            this.ui.icon(this.options.icons.magic), this.options\n          ),\n          tooltip: this.lang.style.style,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          className: 'dropdown-style',\n          items: this.options.styleTags,\n          title: this.lang.style.style,\n          template: (item) => {\n            // TBD: need to be simplified\n            if (typeof item === 'string') {\n              item = {\n                tag: item,\n                title: (Object.prototype.hasOwnProperty.call(this.lang.style, item) ? this.lang.style[item] : item),\n              };\n            }\n\n            const tag = item.tag;\n            const title = item.title;\n            const style = item.style ? ' style=\"' + item.style + '\" ' : '';\n            const className = item.className ? ' class=\"' + item.className + '\"' : '';\n\n            return '<' + tag + style + className + '>' + title + '</' + tag + '>';\n          },\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }),\n      ]).render();\n    });\n\n    for (let styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {\n      const item = this.options.styleTags[styleIdx];\n\n      this.context.memo('button.style.' + item, () => {\n        return this.button({\n          className: 'note-btn-style-' + item,\n          contents: '<div data-value=\"' + item + '\">' + item.toUpperCase() + '</div>',\n          tooltip: this.lang.style[item],\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }).render();\n      });\n    }\n\n    this.context.memo('button.bold', () => {\n      return this.button({\n        className: 'note-btn-bold',\n        contents: this.ui.icon(this.options.icons.bold),\n        tooltip: this.lang.font.bold + this.representShortcut('bold'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.bold'),\n      }).render();\n    });\n\n    this.context.memo('button.italic', () => {\n      return this.button({\n        className: 'note-btn-italic',\n        contents: this.ui.icon(this.options.icons.italic),\n        tooltip: this.lang.font.italic + this.representShortcut('italic'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.italic'),\n      }).render();\n    });\n\n    this.context.memo('button.underline', () => {\n      return this.button({\n        className: 'note-btn-underline',\n        contents: this.ui.icon(this.options.icons.underline),\n        tooltip: this.lang.font.underline + this.representShortcut('underline'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.underline'),\n      }).render();\n    });\n\n    this.context.memo('button.clear', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.eraser),\n        tooltip: this.lang.font.clear + this.representShortcut('removeFormat'),\n        click: this.context.createInvokeHandler('editor.removeFormat'),\n      }).render();\n    });\n\n    this.context.memo('button.strikethrough', () => {\n      return this.button({\n        className: 'note-btn-strikethrough',\n        contents: this.ui.icon(this.options.icons.strikethrough),\n        tooltip: this.lang.font.strikethrough + this.representShortcut('strikethrough'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.strikethrough'),\n      }).render();\n    });\n\n    this.context.memo('button.superscript', () => {\n      return this.button({\n        className: 'note-btn-superscript',\n        contents: this.ui.icon(this.options.icons.superscript),\n        tooltip: this.lang.font.superscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.superscript'),\n      }).render();\n    });\n\n    this.context.memo('button.subscript', () => {\n      return this.button({\n        className: 'note-btn-subscript',\n        contents: this.ui.icon(this.options.icons.subscript),\n        tooltip: this.lang.font.subscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.subscript'),\n      }).render();\n    });\n\n    this.context.memo('button.fontname', () => {\n      const styleInfo = this.context.invoke('editor.currentStyle');\n\n      if (this.options.addDefaultFonts) {\n        // Add 'default' fonts into the fontnames array if not exist\n        $.each(styleInfo['font-family'].split(','), (idx, fontname) => {\n          fontname = fontname.trim().replace(/['\"]+/g, '');\n          if (this.isFontDeservedToAdd(fontname)) {\n            if (this.options.fontNames.indexOf(fontname) === -1) {\n              this.options.fontNames.push(fontname);\n            }\n          }\n        });\n      }\n\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            '<span class=\"note-current-fontname\"></span>', this.options\n          ),\n          tooltip: this.lang.font.name,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontname',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontNames.filter(this.isFontInstalled.bind(this)),\n          title: this.lang.font.name,\n          template: (item) => {\n            return '<span style=\"font-family: ' + env.validFontName(item) + '\">' + item + '</span>';\n          },\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontName'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsize', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsize\"></span>', this.options),\n          tooltip: this.lang.font.size,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsize',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizes,\n          title: this.lang.font.size,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSize'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsizeunit', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsizeunit\"></span>', this.options),\n          tooltip: this.lang.font.sizeunit,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsizeunit',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizeUnits,\n          title: this.lang.font.sizeunit,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.color', () => {\n      return this.colorPalette('note-color-all', this.lang.color.recent, true, true);\n    });\n\n    this.context.memo('button.forecolor', () => {\n      return this.colorPalette('note-color-fore', this.lang.color.foreground, false, true);\n    });\n\n    this.context.memo('button.backcolor', () => {\n      return this.colorPalette('note-color-back', this.lang.color.background, true, false);\n    });\n\n    this.context.memo('button.ul', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unorderedlist),\n        tooltip: this.lang.lists.unordered + this.representShortcut('insertUnorderedList'),\n        click: this.context.createInvokeHandler('editor.insertUnorderedList'),\n      }).render();\n    });\n\n    this.context.memo('button.ol', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.orderedlist),\n        tooltip: this.lang.lists.ordered + this.representShortcut('insertOrderedList'),\n        click: this.context.createInvokeHandler('editor.insertOrderedList'),\n      }).render();\n    });\n\n    const justifyLeft = this.button({\n      contents: this.ui.icon(this.options.icons.alignLeft),\n      tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),\n      click: this.context.createInvokeHandler('editor.justifyLeft'),\n    });\n\n    const justifyCenter = this.button({\n      contents: this.ui.icon(this.options.icons.alignCenter),\n      tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),\n      click: this.context.createInvokeHandler('editor.justifyCenter'),\n    });\n\n    const justifyRight = this.button({\n      contents: this.ui.icon(this.options.icons.alignRight),\n      tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),\n      click: this.context.createInvokeHandler('editor.justifyRight'),\n    });\n\n    const justifyFull = this.button({\n      contents: this.ui.icon(this.options.icons.alignJustify),\n      tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),\n      click: this.context.createInvokeHandler('editor.justifyFull'),\n    });\n\n    const outdent = this.button({\n      contents: this.ui.icon(this.options.icons.outdent),\n      tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),\n      click: this.context.createInvokeHandler('editor.outdent'),\n    });\n\n    const indent = this.button({\n      contents: this.ui.icon(this.options.icons.indent),\n      tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),\n      click: this.context.createInvokeHandler('editor.indent'),\n    });\n\n    this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));\n    this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));\n    this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));\n    this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));\n    this.context.memo('button.outdent', func.invoke(outdent, 'render'));\n    this.context.memo('button.indent', func.invoke(indent, 'render'));\n\n    this.context.memo('button.paragraph', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.alignLeft), this.options),\n          tooltip: this.lang.paragraph.paragraph,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown([\n          this.ui.buttonGroup({\n            className: 'note-align',\n            children: [justifyLeft, justifyCenter, justifyRight, justifyFull],\n          }),\n          this.ui.buttonGroup({\n            className: 'note-list',\n            children: [outdent, indent],\n          }),\n        ]),\n      ]).render();\n    });\n\n    this.context.memo('button.height', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.textHeight), this.options),\n          tooltip: this.lang.font.height,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          items: this.options.lineHeights,\n          checkClassName: this.options.icons.menuCheck,\n          className: 'dropdown-line-height',\n          title: this.lang.font.height,\n          click: this.context.createInvokeHandler('editor.lineHeight'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.table', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.table), this.options),\n          tooltip: this.lang.table.table,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          title: this.lang.table.table,\n          className: 'note-table',\n          items: [\n            '<div class=\"note-dimension-picker\">',\n              '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n              '<div class=\"note-dimension-picker-highlighted\"></div>',\n              '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n            '</div>',\n            '<div class=\"note-dimension-display\">1 x 1</div>',\n          ].join(''),\n        }),\n      ], {\n        callback: ($node) => {\n          const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n          $catcher.css({\n            width: this.options.insertTableMaxSize.col + 'em',\n            height: this.options.insertTableMaxSize.row + 'em',\n          }).mousedown(this.context.createInvokeHandler('editor.insertTable'))\n            .on('mousemove', this.tableMoveHandler.bind(this));\n        },\n      }).render();\n    });\n\n    this.context.memo('button.link', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.link + this.representShortcut('linkDialog.show'),\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.picture', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.picture),\n        tooltip: this.lang.image.image,\n        click: this.context.createInvokeHandler('imageDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.video', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.video),\n        tooltip: this.lang.video.video,\n        click: this.context.createInvokeHandler('videoDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.hr', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.minus),\n        tooltip: this.lang.hr.insert + this.representShortcut('insertHorizontalRule'),\n        click: this.context.createInvokeHandler('editor.insertHorizontalRule'),\n      }).render();\n    });\n\n    this.context.memo('button.fullscreen', () => {\n      return this.button({\n        className: 'btn-fullscreen note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.arrowsAlt),\n        tooltip: this.lang.options.fullscreen,\n        click: this.context.createInvokeHandler('fullscreen.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.codeview', () => {\n      return this.button({\n        className: 'btn-codeview note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.code),\n        tooltip: this.lang.options.codeview,\n        click: this.context.createInvokeHandler('codeview.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.redo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.redo),\n        tooltip: this.lang.history.redo + this.representShortcut('redo'),\n        click: this.context.createInvokeHandler('editor.redo'),\n      }).render();\n    });\n\n    this.context.memo('button.undo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.undo),\n        tooltip: this.lang.history.undo + this.representShortcut('undo'),\n        click: this.context.createInvokeHandler('editor.undo'),\n      }).render();\n    });\n\n    this.context.memo('button.help', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.question),\n        tooltip: this.lang.options.help,\n        click: this.context.createInvokeHandler('helpDialog.show'),\n      }).render();\n    });\n  }\n\n  /**\n   * image: [\n   *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n   *   ['float', ['floatLeft', 'floatRight', 'floatNone']],\n   *   ['remove', ['removeMedia']],\n   * ],\n   */\n  addImagePopoverButtons() {\n    // Image Size Buttons\n    this.context.memo('button.resizeFull', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">100%</span>',\n        tooltip: this.lang.image.resizeFull,\n        click: this.context.createInvokeHandler('editor.resize', '1'),\n      }).render();\n    });\n    this.context.memo('button.resizeHalf', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">50%</span>',\n        tooltip: this.lang.image.resizeHalf,\n        click: this.context.createInvokeHandler('editor.resize', '0.5'),\n      }).render();\n    });\n    this.context.memo('button.resizeQuarter', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">25%</span>',\n        tooltip: this.lang.image.resizeQuarter,\n        click: this.context.createInvokeHandler('editor.resize', '0.25'),\n      }).render();\n    });\n    this.context.memo('button.resizeNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.resizeNone,\n        click: this.context.createInvokeHandler('editor.resize', '0'),\n      }).render();\n    });\n\n    // Float Buttons\n    this.context.memo('button.floatLeft', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatLeft),\n        tooltip: this.lang.image.floatLeft,\n        click: this.context.createInvokeHandler('editor.floatMe', 'left'),\n      }).render();\n    });\n\n    this.context.memo('button.floatRight', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatRight),\n        tooltip: this.lang.image.floatRight,\n        click: this.context.createInvokeHandler('editor.floatMe', 'right'),\n      }).render();\n    });\n\n    this.context.memo('button.floatNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.floatNone,\n        click: this.context.createInvokeHandler('editor.floatMe', 'none'),\n      }).render();\n    });\n\n    // Remove Buttons\n    this.context.memo('button.removeMedia', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.image.remove,\n        click: this.context.createInvokeHandler('editor.removeMedia'),\n      }).render();\n    });\n  }\n\n  addLinkPopoverButtons() {\n    this.context.memo('button.linkDialogShow', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.edit,\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.unlink', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unlink),\n        tooltip: this.lang.link.unlink,\n        click: this.context.createInvokeHandler('editor.unlink'),\n      }).render();\n    });\n  }\n\n  /**\n   * table : [\n   *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n   *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]\n   * ],\n   */\n  addTablePopoverButtons() {\n    this.context.memo('button.addRowUp', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowAbove),\n        tooltip: this.lang.table.addRowAbove,\n        click: this.context.createInvokeHandler('editor.addRow', 'top'),\n      }).render();\n    });\n    this.context.memo('button.addRowDown', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowBelow),\n        tooltip: this.lang.table.addRowBelow,\n        click: this.context.createInvokeHandler('editor.addRow', 'bottom'),\n      }).render();\n    });\n    this.context.memo('button.addColLeft', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colBefore),\n        tooltip: this.lang.table.addColLeft,\n        click: this.context.createInvokeHandler('editor.addCol', 'left'),\n      }).render();\n    });\n    this.context.memo('button.addColRight', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colAfter),\n        tooltip: this.lang.table.addColRight,\n        click: this.context.createInvokeHandler('editor.addCol', 'right'),\n      }).render();\n    });\n    this.context.memo('button.deleteRow', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowRemove),\n        tooltip: this.lang.table.delRow,\n        click: this.context.createInvokeHandler('editor.deleteRow'),\n      }).render();\n    });\n    this.context.memo('button.deleteCol', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colRemove),\n        tooltip: this.lang.table.delCol,\n        click: this.context.createInvokeHandler('editor.deleteCol'),\n      }).render();\n    });\n    this.context.memo('button.deleteTable', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.table.delTable,\n        click: this.context.createInvokeHandler('editor.deleteTable'),\n      }).render();\n    });\n  }\n\n  build($container, groups) {\n    for (let groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {\n      const group = groups[groupIdx];\n      const groupName = Array.isArray(group) ? group[0] : group;\n      const buttons = Array.isArray(group) ? ((group.length === 1) ? [group[0]] : group[1]) : [group];\n\n      const $group = this.ui.buttonGroup({\n        className: 'note-' + groupName,\n      }).render();\n\n      for (let idx = 0, len = buttons.length; idx < len; idx++) {\n        const btn = this.context.memo('button.' + buttons[idx]);\n        if (btn) {\n          $group.append(typeof btn === 'function' ? btn(this.context) : btn);\n        }\n      }\n      $group.appendTo($container);\n    }\n  }\n\n  /**\n   * @param {jQuery} [$container]\n   */\n  updateCurrentStyle($container) {\n    const $cont = $container || this.$toolbar;\n\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    this.updateBtnStates($cont, {\n      '.note-btn-bold': () => {\n        return styleInfo['font-bold'] === 'bold';\n      },\n      '.note-btn-italic': () => {\n        return styleInfo['font-italic'] === 'italic';\n      },\n      '.note-btn-underline': () => {\n        return styleInfo['font-underline'] === 'underline';\n      },\n      '.note-btn-subscript': () => {\n        return styleInfo['font-subscript'] === 'subscript';\n      },\n      '.note-btn-superscript': () => {\n        return styleInfo['font-superscript'] === 'superscript';\n      },\n      '.note-btn-strikethrough': () => {\n        return styleInfo['font-strikethrough'] === 'strikethrough';\n      },\n    });\n\n    if (styleInfo['font-family']) {\n      const fontNames = styleInfo['font-family'].split(',').map((name) => {\n        return name.replace(/[\\'\\\"]/g, '')\n          .replace(/\\s+$/, '')\n          .replace(/^\\s+/, '');\n      });\n      const fontName = lists.find(fontNames, this.isFontInstalled.bind(this));\n\n      $cont.find('.dropdown-fontname a').each((idx, item) => {\n        const $item = $(item);\n        // always compare string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontName + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);\n    }\n\n    if (styleInfo['font-size']) {\n      const fontSize = styleInfo['font-size'];\n      $cont.find('.dropdown-fontsize a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontSize + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsize').text(fontSize);\n\n      const fontSizeUnit = styleInfo['font-size-unit'];\n      $cont.find('.dropdown-fontsizeunit a').each((idx, item) => {\n        const $item = $(item);\n        const isChecked = ($item.data('value') + '') === (fontSizeUnit + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);\n    }\n\n    if (styleInfo['line-height']) {\n      const lineHeight = styleInfo['line-height'];\n      $cont.find('.dropdown-line-height li a').each((idx, item) => {\n        // always compare with string to avoid creating another func.\n        const isChecked = ($(item).data('value') + '') === (lineHeight + '');\n        this.className = isChecked ? 'checked' : '';\n      });\n    }\n  }\n\n  updateBtnStates($container, infos) {\n    $.each(infos, (selector, pred) => {\n      this.ui.toggleBtnActive($container.find(selector), pred());\n    });\n  }\n\n  tableMoveHandler(event) {\n    const PX_PER_EM = 18;\n    const $picker = $(event.target.parentNode); // target is mousecatcher\n    const $dimensionDisplay = $picker.next();\n    const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n    const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n    const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n    let posOffset;\n    // HTML5 with jQuery - e.offsetX is undefined in Firefox\n    if (event.offsetX === undefined) {\n      const posCatcher = $(event.target).offset();\n      posOffset = {\n        x: event.pageX - posCatcher.left,\n        y: event.pageY - posCatcher.top,\n      };\n    } else {\n      posOffset = {\n        x: event.offsetX,\n        y: event.offsetY,\n      };\n    }\n\n    const dim = {\n      c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n      r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n    };\n\n    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n    $catcher.data('value', dim.c + 'x' + dim.r);\n\n    if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {\n      $unhighlighted.css({ width: dim.c + 1 + 'em' });\n    }\n\n    if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {\n      $unhighlighted.css({ height: dim.r + 1 + 'em' });\n    }\n\n    $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n  }\n}\n","import $ from 'jquery';\nexport default class Toolbar {\n  constructor(context) {\n    this.context = context;\n\n    this.$window = $(window);\n    this.$document = $(document);\n\n    this.ui = $.summernote.ui;\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.options = context.options;\n\n    this.isFollowing = false;\n    this.followScroll = this.followScroll.bind(this);\n  }\n\n  shouldInitialize() {\n    return !this.options.airMode;\n  }\n\n  initialize() {\n    this.options.toolbar = this.options.toolbar || [];\n\n    if (!this.options.toolbar.length) {\n      this.$toolbar.hide();\n    } else {\n      this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);\n    }\n\n    if (this.options.toolbarContainer) {\n      this.$toolbar.appendTo(this.options.toolbarContainer);\n    }\n\n    this.changeContainer(false);\n\n    this.$note.on('summernote.keyup summernote.mouseup summernote.change', () => {\n      this.context.invoke('buttons.updateCurrentStyle');\n    });\n\n    this.context.invoke('buttons.updateCurrentStyle');\n    if (this.options.followingToolbar) {\n      this.$window.on('scroll resize', this.followScroll);\n    }\n  }\n\n  destroy() {\n    this.$toolbar.children().remove();\n\n    if (this.options.followingToolbar) {\n      this.$window.off('scroll resize', this.followScroll);\n    }\n  }\n\n  followScroll() {\n    if (this.$editor.hasClass('fullscreen')) {\n      return false;\n    }\n\n    const editorHeight = this.$editor.outerHeight();\n    const editorWidth = this.$editor.width();\n    const toolbarHeight = this.$toolbar.height();\n    const statusbarHeight = this.$statusbar.height();\n\n    // check if the web app is currently using another static bar\n    let otherBarHeight = 0;\n    if (this.options.otherStaticBar) {\n      otherBarHeight = $(this.options.otherStaticBar).outerHeight();\n    }\n\n    const currentOffset = this.$document.scrollTop();\n    const editorOffsetTop = this.$editor.offset().top;\n    const editorOffsetBottom = editorOffsetTop + editorHeight;\n    const activateOffset = editorOffsetTop - otherBarHeight;\n    const deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;\n\n    if (!this.isFollowing &&\n      (currentOffset > activateOffset) && (currentOffset < deactivateOffsetBottom - toolbarHeight)) {\n      this.isFollowing = true;\n      this.$editable.css({\n        marginTop: this.$toolbar.outerHeight(),\n      });\n      this.$toolbar.css({\n        position: 'fixed',\n        top: otherBarHeight,\n        width: editorWidth,\n        zIndex: 1000,\n      });\n    } else if (this.isFollowing &&\n      ((currentOffset < activateOffset) || (currentOffset > deactivateOffsetBottom))) {\n      this.isFollowing = false;\n      this.$toolbar.css({\n        position: 'relative',\n        top: 0,\n        width: '100%',\n        zIndex: 'auto',\n      });\n      this.$editable.css({\n        marginTop: '',\n      });\n    }\n  }\n\n  changeContainer(isFullscreen) {\n    if (isFullscreen) {\n      this.$toolbar.prependTo(this.$editor);\n    } else {\n      if (this.options.toolbarContainer) {\n        this.$toolbar.appendTo(this.options.toolbarContainer);\n      }\n    }\n    if (this.options.followingToolbar) {\n      this.followScroll();\n    }\n  }\n\n  updateFullscreen(isFullscreen) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);\n\n    this.changeContainer(isFullscreen);\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  }\n\n  activate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, true);\n  }\n\n  deactivate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, false);\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\n\nexport default class LinkDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-txt-${this.options.id}\" class=\"note-form-label\">${this.lang.link.textToDisplay}</label>`,\n        `<input id=\"note-dialog-link-txt-${this.options.id}\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-url-${this.options.id}\" class=\"note-form-label\">${this.lang.link.url}</label>`,\n        `<input id=\"note-dialog-link-url-${this.options.id}\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>`,\n      '</div>',\n      !this.options.disableLinkTarget\n        ? $('<div/>').append(this.ui.checkbox({\n          className: 'sn-checkbox-open-in-new-window',\n          text: this.lang.link.openInNewWindow,\n          checked: true,\n        }).render()).html()\n        : '',\n      $('<div/>').append(this.ui.checkbox({\n        className: 'sn-checkbox-use-protocol',\n        text: this.lang.link.useProtocol,\n        checked: true,\n      }).render()).html(),\n    ].join('');\n\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.link.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      className: 'link-dialog',\n      title: this.lang.link.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  /**\n   * toggle update button\n   */\n  toggleLinkBtn($linkBtn, $linkText, $linkUrl) {\n    this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());\n  }\n\n  /**\n   * Show link dialog and set event handlers on dialog controls.\n   *\n   * @param {Object} linkInfo\n   * @return {Promise}\n   */\n  showLinkDialog(linkInfo) {\n    return $.Deferred((deferred) => {\n      const $linkText = this.$dialog.find('.note-link-text');\n      const $linkUrl = this.$dialog.find('.note-link-url');\n      const $linkBtn = this.$dialog.find('.note-link-btn');\n      const $openInNewWindow = this.$dialog\n        .find('.sn-checkbox-open-in-new-window input[type=checkbox]');\n      const $useProtocol = this.$dialog\n        .find('.sn-checkbox-use-protocol input[type=checkbox]');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // If no url was given and given text is valid URL then copy that into URL Field\n        if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {\n          linkInfo.url = linkInfo.text;\n        }\n\n        $linkText.on('input paste propertychange', () => {\n          // If linktext was modified by input events,\n          // cloning text from linkUrl will be stopped.\n          linkInfo.text = $linkText.val();\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.text);\n\n        $linkUrl.on('input paste propertychange', () => {\n          // Display same text on `Text to display` as default\n          // when linktext has no text\n          if (!linkInfo.text) {\n            $linkText.val($linkUrl.val());\n          }\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.url);\n\n        if (!env.isSupportTouch) {\n          $linkUrl.trigger('focus');\n        }\n\n        this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        this.bindEnterKey($linkUrl, $linkBtn);\n        this.bindEnterKey($linkText, $linkBtn);\n\n        const isNewWindowChecked = linkInfo.isNewWindow !== undefined\n          ? linkInfo.isNewWindow : this.context.options.linkTargetBlank;\n\n        $openInNewWindow.prop('checked', isNewWindowChecked);\n\n        const useProtocolChecked = linkInfo.url\n          ? false : this.context.options.useProtocol;\n\n        $useProtocol.prop('checked', useProtocolChecked);\n\n        $linkBtn.one('click', (event) => {\n          event.preventDefault();\n\n          deferred.resolve({\n            range: linkInfo.range,\n            url: $linkUrl.val(),\n            text: $linkText.val(),\n            isNewWindow: $openInNewWindow.is(':checked'),\n            checkProtocol: $useProtocol.is(':checked'),\n          });\n          this.ui.hideDialog(this.$dialog);\n        });\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        // detach events\n        $linkText.off();\n        $linkUrl.off();\n        $linkBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  /**\n   * @param {Object} layoutInfo\n   */\n  show() {\n    const linkInfo = this.context.invoke('editor.getLinkInfo');\n\n    this.context.invoke('editor.saveRange');\n    this.showLinkDialog(linkInfo).then((linkInfo) => {\n      this.context.invoke('editor.restoreRange');\n      this.context.invoke('editor.createLink', linkInfo);\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class LinkPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.link);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-link-popover',\n      callback: ($node) => {\n        const $content = $node.find('.popover-content,.note-popover-content');\n        $content.prepend('<span><a target=\"_blank\"></a>&nbsp;</span>');\n      },\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.link);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update() {\n    // Prevent focusing on editable when invoke('code') is executed\n    if (!this.context.invoke('editor.hasFocus')) {\n      this.hide();\n      return;\n    }\n\n    const rng = this.context.invoke('editor.getLastRange');\n    if (rng.isCollapsed() && rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      const href = $(anchor).attr('href');\n      this.$popover.find('a').attr('href', href).text(href);\n\n      const pos = dom.posFromPlaceholder(anchor);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class ImageDialog {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    let imageLimitation = '';\n    if (this.options.maximumImageFileSize) {\n      const unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));\n      const readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +\n                         ' ' + ' KMGTP'[unit] + 'B';\n      imageLimitation = `<small>${this.lang.image.maximumFileSize + ' : ' + readableSize}</small>`;\n    }\n\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group note-group-select-from-files\">',\n        '<label for=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.selectFromFiles + '</label>',\n        '<input id=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-image-input form-control-file note-form-control note-input\" ',\n        ' type=\"file\" name=\"files\" accept=\"image/*\" multiple=\"multiple\"/>',\n        imageLimitation,\n      '</div>',\n      '<div class=\"form-group note-group-image-url\">',\n        '<label for=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.url + '</label>',\n        '<input id=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-image-url form-control note-form-control note-input\" type=\"text\"/>',\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.image.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.image.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showImageDialog().then((data) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      if (typeof data === 'string') { // image url\n        // If onImageLinkInsert set,\n        if (this.options.callbacks.onImageLinkInsert) {\n          this.context.triggerEvent('image.link.insert', data);\n        } else {\n          this.context.invoke('editor.insertImage', data);\n        }\n      } else { // array of files\n        this.context.invoke('editor.insertImagesOrCallback', data);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show image dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showImageDialog() {\n    return $.Deferred((deferred) => {\n      const $imageInput = this.$dialog.find('.note-image-input');\n      const $imageUrl = this.$dialog.find('.note-image-url');\n      const $imageBtn = this.$dialog.find('.note-image-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // Cloning imageInput to clear element.\n        $imageInput.replaceWith($imageInput.clone().on('change', (event) => {\n          deferred.resolve(event.target.files || event.target.value);\n        }).val(''));\n\n        $imageUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($imageBtn, $imageUrl.val());\n        }).val('');\n\n        if (!env.isSupportTouch) {\n          $imageUrl.trigger('focus');\n        }\n\n        $imageBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($imageUrl.val());\n        });\n\n        this.bindEnterKey($imageUrl, $imageBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $imageInput.off();\n        $imageUrl.off();\n        $imageBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\n/**\n * Image popover module\n *  mouse events that show/hide popover will be handled by Handle.js.\n *  Handle.js will receive the events and invoke 'imagePopover.update'.\n */\nexport default class ImagePopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n\n    this.editable = context.layoutInfo.editable[0];\n    this.options = context.options;\n\n    this.events = {\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.image);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-image-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n    this.context.invoke('buttons.build', $content, this.options.popover.image);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target, event) {\n    if (dom.isImg(target)) {\n      const position = $(target).offset();\n      const containerOffset = $(this.options.container).offset();\n      let pos = {};\n      if (this.options.popatmouse) {\n        pos.left = event.pageX - 20;\n        pos.top = event.pageY;\n      } else {\n        pos = position;\n      }\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class TablePopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        this.update(e.target);\n      },\n      'summernote.keyup summernote.scroll summernote.change': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.table);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-table-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.table);\n\n    // [workaround] Disable Firefox's default table editor\n    if (env.isFF) {\n      document.execCommand('enableInlineTableEditing', false, false);\n    }\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isCell = dom.isCell(target);\n\n    if (isCell) {\n      const pos = dom.posFromPlaceholder(target);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n\n    return isCell;\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class VideoDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group row-fluid\">',\n        `<label for=\"note-dialog-video-url-${this.options.id}\" class=\"note-form-label\">${this.lang.video.url} <small class=\"text-muted\">${this.lang.video.providers}</small></label>`,\n        `<input id=\"note-dialog-video-url-${this.options.id}\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.video.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.video.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  createVideoNode(url) {\n    // video url patterns(youtube, instagram, vimeo, dailymotion, youku, mp4, ogg, webm)\n    const ytRegExp = /\\/\\/(?:(?:www|m)\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))([\\w|-]{11})(?:(?:[\\?&]t=)(\\S+))?$/;\n    const ytRegExpForStart = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n    const ytMatch = url.match(ytRegExp);\n\n    const igRegExp = /(?:www\\.|\\/\\/)instagram\\.com\\/p\\/(.[a-zA-Z0-9_-]*)/;\n    const igMatch = url.match(igRegExp);\n\n    const vRegExp = /\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9]+)/;\n    const vMatch = url.match(vRegExp);\n\n    const vimRegExp = /\\/\\/(player\\.)?vimeo\\.com\\/([a-z]*\\/)*(\\d+)[?]?.*/;\n    const vimMatch = url.match(vimRegExp);\n\n    const dmRegExp = /.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?/;\n    const dmMatch = url.match(dmRegExp);\n\n    const youkuRegExp = /\\/\\/v\\.youku\\.com\\/v_show\\/id_(\\w+)=*\\.html/;\n    const youkuMatch = url.match(youkuRegExp);\n\n    const qqRegExp = /\\/\\/v\\.qq\\.com.*?vid=(.+)/;\n    const qqMatch = url.match(qqRegExp);\n\n    const qqRegExp2 = /\\/\\/v\\.qq\\.com\\/x?\\/?(page|cover).*?\\/([^\\/]+)\\.html\\??.*/;\n    const qqMatch2 = url.match(qqRegExp2);\n\n    const mp4RegExp = /^.+.(mp4|m4v)$/;\n    const mp4Match = url.match(mp4RegExp);\n\n    const oggRegExp = /^.+.(ogg|ogv)$/;\n    const oggMatch = url.match(oggRegExp);\n\n    const webmRegExp = /^.+.(webm)$/;\n    const webmMatch = url.match(webmRegExp);\n\n    const fbRegExp = /(?:www\\.|\\/\\/)facebook\\.com\\/([^\\/]+)\\/videos\\/([0-9]+)/;\n    const fbMatch = url.match(fbRegExp);\n\n    let $video;\n    if (ytMatch && ytMatch[1].length === 11) {\n      const youtubeId = ytMatch[1];\n      var start = 0;\n      if (typeof ytMatch[2] !== 'undefined') {\n        const ytMatchForStart = ytMatch[2].match(ytRegExpForStart);\n        if (ytMatchForStart) {\n          for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {\n            start += (typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0);\n          }\n        }\n      }\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : ''))\n        .attr('width', '640').attr('height', '360');\n    } else if (igMatch && igMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/')\n        .attr('width', '612').attr('height', '710')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else if (vMatch && vMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', vMatch[0] + '/embed/simple')\n        .attr('width', '600').attr('height', '600')\n        .attr('class', 'vine-embed');\n    } else if (vimMatch && vimMatch[3].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('src', '//player.vimeo.com/video/' + vimMatch[3])\n        .attr('width', '640').attr('height', '360');\n    } else if (dmMatch && dmMatch[2].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2])\n        .attr('width', '640').attr('height', '360');\n    } else if (youkuMatch && youkuMatch[1].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '498')\n        .attr('width', '510')\n        .attr('src', '//player.youku.com/embed/' + youkuMatch[1]);\n    } else if ((qqMatch && qqMatch[1].length) || (qqMatch2 && qqMatch2[2].length)) {\n      const vid = ((qqMatch && qqMatch[1].length) ? qqMatch[1] : qqMatch2[2]);\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '310')\n        .attr('width', '500')\n        .attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');\n    } else if (mp4Match || oggMatch || webmMatch) {\n      $video = $('<video controls>')\n        .attr('src', url)\n        .attr('width', '640').attr('height', '360');\n    } else if (fbMatch && fbMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560')\n        .attr('width', '560').attr('height', '301')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else {\n      // this is not a known video link. Now what, Cat? Now what?\n      return false;\n    }\n\n    $video.addClass('note-video-clip');\n\n    return $video[0];\n  }\n\n  show() {\n    const text = this.context.invoke('editor.getSelectedText');\n    this.context.invoke('editor.saveRange');\n    this.showVideoDialog(text).then((url) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      // build node\n      const $node = this.createVideoNode(url);\n\n      if ($node) {\n        // insert video node\n        this.context.invoke('editor.insertNode', $node);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show video dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showVideoDialog(/* text */) {\n    return $.Deferred((deferred) => {\n      const $videoUrl = this.$dialog.find('.note-video-url');\n      const $videoBtn = this.$dialog.find('.note-video-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        $videoUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($videoBtn, $videoUrl.val());\n        });\n\n        if (!env.isSupportTouch) {\n          $videoUrl.trigger('focus');\n        }\n\n        $videoBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($videoUrl.val());\n        });\n\n        this.bindEnterKey($videoUrl, $videoBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $videoUrl.off();\n        $videoBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\n\nexport default class HelpDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<p class=\"text-center\">',\n        '<a href=\"http://summernote.org/\" target=\"_blank\">Summernote @@VERSION@@</a> · ',\n        '<a href=\"https://github.com/summernote/summernote\" target=\"_blank\">Project</a> · ',\n        '<a href=\"https://github.com/summernote/summernote/issues\" target=\"_blank\">Issues</a>',\n      '</p>',\n    ].join('');\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.options.help,\n      fade: this.options.dialogsFade,\n      body: this.createShortcutList(),\n      footer: body,\n      callback: ($node) => {\n        $node.find('.modal-body,.note-modal-body').css({\n          'max-height': 300,\n          'overflow': 'scroll',\n        });\n      },\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  createShortcutList() {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    return Object.keys(keyMap).map((key) => {\n      const command = keyMap[key];\n      const $row = $('<div><div class=\"help-list-item\"></div></div>');\n      $row.append($('<label><kbd>' + key + '</kdb></label>').css({\n        'width': 180,\n        'margin-right': 10,\n      })).append($('<span/>').html(this.context.memo('help.' + command) || command));\n      return $row.html();\n    }).join('');\n  }\n\n  /**\n   * show help dialog\n   *\n   * @return {Promise}\n   */\n  showHelpDialog() {\n    return $.Deferred((deferred) => {\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n        deferred.resolve();\n      });\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showHelpDialog().then(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\n\nconst AIRMODE_POPOVER_X_OFFSET = -5;\nconst AIRMODE_POPOVER_Y_OFFSET = 5;\n\nexport default class AirPopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n\n    this.hidable = true;\n    this.onContextmenu = false;\n    this.pageX = null;\n    this.pageY = null;\n\n    this.events = {\n      'summernote.contextmenu': (e) => {\n        if (this.options.editing) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.onContextmenu = true;\n          this.update(true);\n        }\n      },\n      'summernote.mousedown': (we, e) => {\n        this.pageX = e.pageX;\n        this.pageY = e.pageY;\n      },\n      'summernote.keyup summernote.mouseup summernote.scroll': (we, e) => {\n        if (this.options.editing && !this.onContextmenu) {\n          this.pageX = e.pageX;\n          this.pageY = e.pageY;\n          this.update();\n        }\n        this.onContextmenu = false;\n      },\n      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.focusout': () => {\n        if (!this.$popover.is(':active,:focus')) {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.options.airMode && !lists.isEmpty(this.options.popover.air);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-air-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.air);\n\n    // disable hiding this popover preemptively by 'summernote.blur' event.\n    this.$popover.on('mousedown', () => { this.hidable = false; });\n    // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).\n    this.$popover.on('mouseup', () => { this.hidable = true; });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(forcelyOpen) {\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {\n      let rect = {\n        left: this.pageX,\n        top: this.pageY,\n      };\n\n      const containerOffset = $(this.options.container).offset();\n      rect.top -= containerOffset.top;\n      rect.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,\n        top: rect.top + AIRMODE_POPOVER_Y_OFFSET,\n      });\n      this.context.invoke('buttons.updateCurrentStyle', this.$popover);\n    } else {\n      this.hide();\n    }\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.hide();\n    } \n  }\n\n  hide() {\n    if (this.hidable) {\n      this.$popover.hide();\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport key from '../core/key';\n\nconst POPOVER_DIST = 5;\n\nexport default class HintPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.hint = this.options.hint || [];\n    this.direction = this.options.hintDirection || 'bottom';\n    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.hints.length > 0;\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n    this.matchingWord = null;\n    this.$popover = this.ui.popover({\n      className: 'note-hint-popover',\n      hideArrow: true,\n      direction: '',\n    }).render().appendTo(this.options.container);\n\n    this.$popover.hide();\n    this.$content = this.$popover.find('.popover-content,.note-popover-content');\n    this.$content.on('click', '.note-hint-item', (e) => {\n      this.$content.find('.active').removeClass('active');\n      $(e.currentTarget).addClass('active');\n      this.replace();\n    });\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  selectItem($item) {\n    this.$content.find('.active').removeClass('active');\n    $item.addClass('active');\n\n    this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);\n  }\n\n  moveDown() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $next = $current.next();\n\n    if ($next.length) {\n      this.selectItem($next);\n    } else {\n      let $nextGroup = $current.parent().next();\n\n      if (!$nextGroup.length) {\n        $nextGroup = this.$content.find('.note-hint-group').first();\n      }\n\n      this.selectItem($nextGroup.find('.note-hint-item').first());\n    }\n  }\n\n  moveUp() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $prev = $current.prev();\n\n    if ($prev.length) {\n      this.selectItem($prev);\n    } else {\n      let $prevGroup = $current.parent().prev();\n\n      if (!$prevGroup.length) {\n        $prevGroup = this.$content.find('.note-hint-group').last();\n      }\n\n      this.selectItem($prevGroup.find('.note-hint-item').last());\n    }\n  }\n\n  replace() {\n    const $item = this.$content.find('.note-hint-item.active');\n\n    if ($item.length) {\n      var node = this.nodeFromItem($item);\n      // If matchingWord length = 0 -> capture OK / open hint / but as mention capture \"\" (\\w*)\n      if (this.matchingWord !== null && this.matchingWord.length === 0) {\n        this.lastWordRange.so = this.lastWordRange.eo;\n      // Else si > 0 and normal case -> adjust range \"before\" for correct position of insertion\n      } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {\n        let rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;\n        if (rangeCompute > 0) {\n          this.lastWordRange.so += rangeCompute;\n        }\n      }\n      this.lastWordRange.insertNode(node);\n\n      if (this.options.hintSelect === 'next') {\n        var blank = document.createTextNode('');\n        $(node).after(blank);\n        range.createFromNodeBefore(blank).select();\n      } else {\n        range.createFromNodeAfter(node).select();\n      }\n\n      this.lastWordRange = null;\n      this.hide();\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  nodeFromItem($item) {\n    const hint = this.hints[$item.data('index')];\n    const item = $item.data('item');\n    let node = hint.content ? hint.content(item) : item;\n    if (typeof node === 'string') {\n      node = dom.createText(node);\n    }\n    return node;\n  }\n\n  createItemTemplates(hintIdx, items) {\n    const hint = this.hints[hintIdx];\n    return items.map((item /*, idx */) => {\n      const $item = $('<div class=\"note-hint-item\"/>');\n      $item.append(hint.template ? hint.template(item) : item + '');\n      $item.data({\n        'index': hintIdx,\n        'item': item,\n      });\n      return $item;\n    });\n  }\n\n  handleKeydown(e) {\n    if (!this.$popover.is(':visible')) {\n      return;\n    }\n\n    if (e.keyCode === key.code.ENTER) {\n      e.preventDefault();\n      this.replace();\n    } else if (e.keyCode === key.code.UP) {\n      e.preventDefault();\n      this.moveUp();\n    } else if (e.keyCode === key.code.DOWN) {\n      e.preventDefault();\n      this.moveDown();\n    }\n  }\n\n  searchKeyword(index, keyword, callback) {\n    const hint = this.hints[index];\n    if (hint && hint.match.test(keyword) && hint.search) {\n      const matches = hint.match.exec(keyword);\n      this.matchingWord = matches[0];\n      hint.search(matches[1], callback);\n    } else {\n      callback();\n    }\n  }\n\n  createGroup(idx, keyword) {\n    const $group = $('<div class=\"note-hint-group note-hint-group-' + idx + '\"></div>');\n    this.searchKeyword(idx, keyword, (items) => {\n      items = items || [];\n      if (items.length) {\n        $group.html(this.createItemTemplates(idx, items));\n        this.show();\n      }\n    });\n\n    return $group;\n  }\n\n  handleKeyup(e) {\n    if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {\n      let range = this.context.invoke('editor.getLastRange');\n      let wordRange, keyword;\n      if (this.options.hintMode === 'words') {\n        wordRange = range.getWordsRange(range);\n        keyword = wordRange.toString();\n\n        this.hints.forEach((hint) => {\n          if (hint.match.test(keyword)) {\n            wordRange = range.getWordsMatchRange(hint.match);\n            return false;\n          }\n        });\n\n        if (!wordRange) {\n          this.hide();\n          return;\n        }\n\n        keyword = wordRange.toString();\n      } else {\n        wordRange = range.getWordRange();\n        keyword = wordRange.toString();\n      }\n\n      if (this.hints.length && keyword) {\n        this.$content.empty();\n\n        const bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));\n        const containerOffset = $(this.options.container).offset();\n        if (bnd) {\n          bnd.top -= containerOffset.top;\n          bnd.left -= containerOffset.left;\n\n          this.$popover.hide();\n          this.lastWordRange = wordRange;\n          this.hints.forEach((hint, idx) => {\n            if (hint.match.test(keyword)) {\n              this.createGroup(idx, keyword).appendTo(this.$content);\n            }\n          });\n          // select first .note-hint-item\n          this.$content.find('.note-hint-item:first').addClass('active');\n\n          // set position for popover after group is created\n          if (this.direction === 'top') {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST,\n            });\n          } else {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top + bnd.height + POPOVER_DIST,\n            });\n          }\n        }\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  show() {\n    this.$popover.show();\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport './summernote-en-US';\nimport '../summernote';\nimport dom from './core/dom';\nimport range from './core/range';\nimport lists from './core/lists';\nimport Editor from './module/Editor';\nimport Clipboard from './module/Clipboard';\nimport Dropzone from './module/Dropzone';\nimport Codeview from './module/Codeview';\nimport Statusbar from './module/Statusbar';\nimport Fullscreen from './module/Fullscreen';\nimport Handle from './module/Handle';\nimport AutoLink from './module/AutoLink';\nimport AutoSync from './module/AutoSync';\nimport AutoReplace from './module/AutoReplace';\nimport Placeholder from './module/Placeholder';\nimport Buttons from './module/Buttons';\nimport Toolbar from './module/Toolbar';\nimport LinkDialog from './module/LinkDialog';\nimport LinkPopover from './module/LinkPopover';\nimport ImageDialog from './module/ImageDialog';\nimport ImagePopover from './module/ImagePopover';\nimport TablePopover from './module/TablePopover';\nimport VideoDialog from './module/VideoDialog';\nimport HelpDialog from './module/HelpDialog';\nimport AirPopover from './module/AirPopover';\nimport HintPopover from './module/HintPopover';\n\n$.summernote = $.extend($.summernote, {\n  version: '@@VERSION@@',\n  plugins: {},\n\n  dom: dom,\n  range: range,\n  lists: lists,\n\n  options: {\n    langInfo: $.summernote.lang['en-US'],\n    editing: true,\n    modules: {\n      'editor': Editor,\n      'clipboard': Clipboard,\n      'dropzone': Dropzone,\n      'codeview': Codeview,\n      'statusbar': Statusbar,\n      'fullscreen': Fullscreen,\n      'handle': Handle,\n      // FIXME: HintPopover must be front of autolink\n      //  - Script error about range when Enter key is pressed on hint popover\n      'hintPopover': HintPopover,\n      'autoLink': AutoLink,\n      'autoSync': AutoSync,\n      'autoReplace': AutoReplace,\n      'placeholder': Placeholder,\n      'buttons': Buttons,\n      'toolbar': Toolbar,\n      'linkDialog': LinkDialog,\n      'linkPopover': LinkPopover,\n      'imageDialog': ImageDialog,\n      'imagePopover': ImagePopover,\n      'tablePopover': TablePopover,\n      'videoDialog': VideoDialog,\n      'helpDialog': HelpDialog,\n      'airPopover': AirPopover,\n    },\n\n    buttons: {},\n\n    lang: 'en-US',\n\n    followingToolbar: false,\n    toolbarPosition: 'top',\n    otherStaticBar: '',\n\n    // toolbar\n    codeviewKeepButton: false,\n    toolbar: [\n      ['style', ['style']],\n      ['font', ['bold', 'underline', 'clear']],\n      ['fontname', ['fontname']],\n      ['color', ['color']],\n      ['para', ['ul', 'ol', 'paragraph']],\n      ['table', ['table']],\n      ['insert', ['link', 'picture', 'video']],\n      ['view', ['fullscreen', 'codeview', 'help']],\n    ],\n\n    // popover\n    popatmouse: true,\n    popover: {\n      image: [\n        ['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n        ['float', ['floatLeft', 'floatRight', 'floatNone']],\n        ['remove', ['removeMedia']],\n      ],\n      link: [\n        ['link', ['linkDialogShow', 'unlink']],\n      ],\n      table: [\n        ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n        ['delete', ['deleteRow', 'deleteCol', 'deleteTable']],\n      ],\n      air: [\n        ['color', ['color']],\n        ['font', ['bold', 'underline', 'clear']],\n        ['para', ['ul', 'paragraph']],\n        ['table', ['table']],\n        ['insert', ['link', 'picture']],\n        ['view', ['fullscreen', 'codeview']],\n      ],\n    },\n\n    // air mode: inline editor\n    airMode: false,\n    overrideContextMenu: false, // TBD\n\n    width: null,\n    height: null,\n    linkTargetBlank: true,\n    useProtocol: true,\n    defaultProtocol: 'http://',\n\n    focus: false,\n    tabDisabled: false,\n    tabSize: 4,\n    styleWithCSS: false,\n    shortcuts: true,\n    textareaAutoSync: true,\n    tooltip: 'auto',\n    container: null,\n    maxTextLength: 0,\n    blockquoteBreakingLevel: 2,\n    spellCheck: true,\n    disableGrammar: false,\n    placeholder: null,\n    inheritPlaceholder: false,\n    // TODO: need to be documented\n    recordEveryKeystroke: false,\n    historyLimit: 200,\n\n    // TODO: need to be documented\n    showDomainOnlyForAutolink: false,\n\n    // TODO: need to be documented\n    hintMode: 'word',\n    hintSelect: 'after',\n    hintDirection: 'bottom',\n\n    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n\n    fontNames: [\n      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',\n      'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',\n      'Tahoma', 'Times New Roman', 'Verdana',\n    ],\n    fontNamesIgnoreCheck: [],\n    addDefaultFonts: true,\n\n    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],\n\n    fontSizeUnits: ['px', 'pt'],\n\n    // pallete colors(n x n)\n    colors: [\n      ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],\n      ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],\n      ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],\n      ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],\n      ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],\n      ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],\n      ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],\n      ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'],\n    ],\n\n    // http://chir.ag/projects/name-that-color/\n    colorsName: [\n      ['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'],\n      ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'],\n      ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'],\n      ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'],\n      ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'],\n      ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'],\n      ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'],\n      ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou'],\n    ],\n\n    colorButton: {\n      foreColor: '#000000',\n      backColor: '#FFFF00',\n    },\n\n    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],\n\n    tableClassName: 'table table-bordered',\n\n    insertTableMaxSize: {\n      col: 10,\n      row: 10,\n    },\n\n    // By default, dialogs are attached in container.\n    dialogsInBody: false,\n    dialogsFade: false,\n\n    maximumImageFileSize: null,\n\n    callbacks: {\n      onBeforeCommand: null,\n      onBlur: null,\n      onBlurCodeview: null,\n      onChange: null,\n      onChangeCodeview: null,\n      onDialogShown: null,\n      onEnter: null,\n      onFocus: null,\n      onImageLinkInsert: null,\n      onImageUpload: null,\n      onImageUploadError: null,\n      onInit: null,\n      onKeydown: null,\n      onKeyup: null,\n      onMousedown: null,\n      onMouseup: null,\n      onPaste: null,\n      onScroll: null,\n    },\n\n    codemirror: {\n      mode: 'text/html',\n      htmlMode: true,\n      lineNumbers: true,\n    },\n\n    codeviewFilter: false,\n    codeviewFilterRegex: /<\\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,\n    codeviewIframeFilter: true,\n    codeviewIframeWhitelistSrc: [],\n    codeviewIframeWhitelistSrcBase: [\n      'www.youtube.com',\n      'www.youtube-nocookie.com',\n      'www.facebook.com',\n      'vine.co',\n      'instagram.com',\n      'player.vimeo.com',\n      'www.dailymotion.com',\n      'player.youku.com',\n      'v.qq.com',\n    ],\n\n    keyMap: {\n      pc: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CTRL+Z': 'undo',\n        'CTRL+Y': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CTRL+B': 'bold',\n        'CTRL+I': 'italic',\n        'CTRL+U': 'underline',\n        'CTRL+SHIFT+S': 'strikethrough',\n        'CTRL+BACKSLASH': 'removeFormat',\n        'CTRL+SHIFT+L': 'justifyLeft',\n        'CTRL+SHIFT+E': 'justifyCenter',\n        'CTRL+SHIFT+R': 'justifyRight',\n        'CTRL+SHIFT+J': 'justifyFull',\n        'CTRL+SHIFT+NUM7': 'insertUnorderedList',\n        'CTRL+SHIFT+NUM8': 'insertOrderedList',\n        'CTRL+LEFTBRACKET': 'outdent',\n        'CTRL+RIGHTBRACKET': 'indent',\n        'CTRL+NUM0': 'formatPara',\n        'CTRL+NUM1': 'formatH1',\n        'CTRL+NUM2': 'formatH2',\n        'CTRL+NUM3': 'formatH3',\n        'CTRL+NUM4': 'formatH4',\n        'CTRL+NUM5': 'formatH5',\n        'CTRL+NUM6': 'formatH6',\n        'CTRL+ENTER': 'insertHorizontalRule',\n        'CTRL+K': 'linkDialog.show',\n      },\n\n      mac: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CMD+Z': 'undo',\n        'CMD+SHIFT+Z': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CMD+B': 'bold',\n        'CMD+I': 'italic',\n        'CMD+U': 'underline',\n        'CMD+SHIFT+S': 'strikethrough',\n        'CMD+BACKSLASH': 'removeFormat',\n        'CMD+SHIFT+L': 'justifyLeft',\n        'CMD+SHIFT+E': 'justifyCenter',\n        'CMD+SHIFT+R': 'justifyRight',\n        'CMD+SHIFT+J': 'justifyFull',\n        'CMD+SHIFT+NUM7': 'insertUnorderedList',\n        'CMD+SHIFT+NUM8': 'insertOrderedList',\n        'CMD+LEFTBRACKET': 'outdent',\n        'CMD+RIGHTBRACKET': 'indent',\n        'CMD+NUM0': 'formatPara',\n        'CMD+NUM1': 'formatH1',\n        'CMD+NUM2': 'formatH2',\n        'CMD+NUM3': 'formatH3',\n        'CMD+NUM4': 'formatH4',\n        'CMD+NUM5': 'formatH5',\n        'CMD+NUM6': 'formatH6',\n        'CMD+ENTER': 'insertHorizontalRule',\n        'CMD+K': 'linkDialog.show',\n      },\n    },\n    icons: {\n      'align': 'note-icon-align',\n      'alignCenter': 'note-icon-align-center',\n      'alignJustify': 'note-icon-align-justify',\n      'alignLeft': 'note-icon-align-left',\n      'alignRight': 'note-icon-align-right',\n      'rowBelow': 'note-icon-row-below',\n      'colBefore': 'note-icon-col-before',\n      'colAfter': 'note-icon-col-after',\n      'rowAbove': 'note-icon-row-above',\n      'rowRemove': 'note-icon-row-remove',\n      'colRemove': 'note-icon-col-remove',\n      'indent': 'note-icon-align-indent',\n      'outdent': 'note-icon-align-outdent',\n      'arrowsAlt': 'note-icon-arrows-alt',\n      'bold': 'note-icon-bold',\n      'caret': 'note-icon-caret',\n      'circle': 'note-icon-circle',\n      'close': 'note-icon-close',\n      'code': 'note-icon-code',\n      'eraser': 'note-icon-eraser',\n      'floatLeft': 'note-icon-float-left',\n      'floatRight': 'note-icon-float-right',\n      'font': 'note-icon-font',\n      'frame': 'note-icon-frame',\n      'italic': 'note-icon-italic',\n      'link': 'note-icon-link',\n      'unlink': 'note-icon-chain-broken',\n      'magic': 'note-icon-magic',\n      'menuCheck': 'note-icon-menu-check',\n      'minus': 'note-icon-minus',\n      'orderedlist': 'note-icon-orderedlist',\n      'pencil': 'note-icon-pencil',\n      'picture': 'note-icon-picture',\n      'question': 'note-icon-question',\n      'redo': 'note-icon-redo',\n      'rollback': 'note-icon-rollback',\n      'square': 'note-icon-square',\n      'strikethrough': 'note-icon-strikethrough',\n      'subscript': 'note-icon-subscript',\n      'superscript': 'note-icon-superscript',\n      'table': 'note-icon-table',\n      'textHeight': 'note-icon-text-height',\n      'trash': 'note-icon-trash',\n      'underline': 'note-icon-underline',\n      'undo': 'note-icon-undo',\n      'unorderedlist': 'note-icon-unorderedlist',\n      'video': 'note-icon-video',\n    },\n  },\n});\n","import $ from 'jquery';\n\nclass TooltipUI {\n  constructor($node, options) {\n    this.$node = $node;\n    this.options = $.extend({}, {\n      title: '',\n      target: options.container,\n      trigger: 'hover focus',\n      placement: 'bottom',\n    }, options);\n\n    // create tooltip node\n    this.$tooltip = $([\n      '<div class=\"note-tooltip\">',\n        '<div class=\"note-tooltip-arrow\"></div>',\n        '<div class=\"note-tooltip-content\"></div>',\n      '</div>',\n    ].join(''));\n\n    // define event\n    if (this.options.trigger !== 'manual') {\n      const showCallback = this.show.bind(this);\n      const hideCallback = this.hide.bind(this);\n      const toggleCallback = this.toggle.bind(this);\n\n      this.options.trigger.split(' ').forEach(function(eventName) {\n        if (eventName === 'hover') {\n          $node.off('mouseenter mouseleave');\n          $node.on('mouseenter', showCallback).on('mouseleave', hideCallback);\n        } else if (eventName === 'click') {\n          $node.on('click', toggleCallback);\n        } else if (eventName === 'focus') {\n          $node.on('focus', showCallback).on('blur', hideCallback);\n        }\n      });\n    }\n  }\n\n  show() {\n    const $node = this.$node;\n    const offset = $node.offset();\n    const targetOffset = $(this.options.target).offset();\n    offset.top -= targetOffset.top;\n    offset.left -= targetOffset.left;\n\n    const $tooltip = this.$tooltip;\n    const title = this.options.title || $node.attr('title') || $node.data('title');\n    const placement = this.options.placement || $node.data('placement');\n\n    $tooltip.addClass(placement);\n    $tooltip.find('.note-tooltip-content').text(title);\n    $tooltip.appendTo(this.options.target);\n\n    const nodeWidth = $node.outerWidth();\n    const nodeHeight = $node.outerHeight();\n    const tooltipWidth = $tooltip.outerWidth();\n    const tooltipHeight = $tooltip.outerHeight();\n\n    if (placement === 'bottom') {\n      $tooltip.css({\n        top: offset.top + nodeHeight,\n        left: offset.left + (nodeWidth / 2 - tooltipWidth / 2),\n      });\n    } else if (placement === 'top') {\n      $tooltip.css({\n        top: offset.top - tooltipHeight,\n        left: offset.left + (nodeWidth / 2 - tooltipWidth / 2),\n      });\n    } else if (placement === 'left') {\n      $tooltip.css({\n        top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),\n        left: offset.left - tooltipWidth,\n      });\n    } else if (placement === 'right') {\n      $tooltip.css({\n        top: offset.top + (nodeHeight / 2 - tooltipHeight / 2),\n        left: offset.left + nodeWidth,\n      });\n    }\n\n    $tooltip.addClass('in');\n  }\n\n  hide() {\n    this.$tooltip.removeClass('in');\n    setTimeout(() => {\n      this.$tooltip.remove();\n    }, 200);\n  }\n\n  toggle() {\n    if (this.$tooltip.hasClass('in')) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n}\n\nexport default TooltipUI;\n","import $ from 'jquery';\n\nclass DropdownUI {\n  constructor($node, options) {\n    this.$button = $node;\n    this.options = $.extend({}, {\n      target: options.container,\n    }, options);\n    this.setEvent();\n  }\n\n  setEvent() {\n    this.$button.on('click', (e) => {\n      this.toggle();\n      e.stopImmediatePropagation();\n    });\n  }\n\n  clear() {\n    var $parent = $('.note-btn-group.open');\n    $parent.find('.note-btn.active').removeClass('active');\n    $parent.removeClass('open');\n  }\n\n  show() {\n    this.$button.addClass('active');\n    this.$button.parent().addClass('open');\n\n    var $dropdown = this.$button.next();\n    var offset = $dropdown.offset();\n    var width = $dropdown.outerWidth();\n    var windowWidth = $(window).width();\n    var targetMarginRight = parseFloat($(this.options.target).css('margin-right'));\n\n    if (offset.left + width > windowWidth - targetMarginRight) {\n      $dropdown.css('margin-left', windowWidth - targetMarginRight - (offset.left + width));\n    } else {\n      $dropdown.css('margin-left', '');\n    }\n  }\n\n  hide() {\n    this.$button.removeClass('active');\n    this.$button.parent().removeClass('open');\n  }\n\n  toggle() {\n    var isOpened = this.$button.parent().hasClass('open');\n\n    this.clear();\n\n    if (isOpened) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n}\n\n$(document).on('click', function(e) {\n  if (!$(e.target).closest('.note-btn-group').length) {\n    $('.note-btn-group.open').removeClass('open');\n    $('.note-btn-group .note-btn.active').removeClass('active');\n  }\n});\n\n$(document).on('click.note-dropdown-menu', function(e) {\n  $(e.target).closest('.note-dropdown-menu').parent().removeClass('open');\n  $(e.target).closest('.note-dropdown-menu').parent().find('.note-btn.active').removeClass('active');\n});\n\nexport default DropdownUI;\n","import $ from 'jquery';\n\nclass ModalUI {\n  constructor($node /*, options */) {\n    this.$modal = $node;\n    this.$backdrop = $('<div class=\"note-modal-backdrop\"/>');\n  }\n\n  show() {\n    this.$backdrop.appendTo(document.body).show();\n    this.$modal.addClass('open').show();\n    this.$modal.trigger('note.modal.show');\n    this.$modal.off('click', '.close').on('click', '.close', this.hide.bind(this));\n    this.$modal.on('keydown', (event) => {\n      if (event.which === 27) {\n        event.preventDefault();\n        this.hide();\n      }\n    });\n  }\n\n  hide() {\n    this.$modal.removeClass('open').hide();\n    this.$backdrop.hide();\n    this.$modal.trigger('note.modal.hide');\n    this.$modal.off('keydown');\n  }\n}\n\nexport default ModalUI;\n","import $ from 'jquery';\nimport renderer from '../base/renderer';\nimport TooltipUI from './ui/TooltipUI';\nimport DropdownUI from './ui/DropdownUI';\nimport ModalUI from './ui/ModalUI';\n\nconst editor = renderer.create('<div class=\"note-editor note-frame\"/>');\nconst toolbar = renderer.create('<div class=\"note-toolbar\" role=\"toolbar\"/>');\nconst editingArea = renderer.create('<div class=\"note-editing-area\"/>');\nconst codable = renderer.create('<textarea class=\"note-codable\" aria-multiline=\"true\"/>');\nconst editable = renderer.create('<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"/>');\nconst statusbar = renderer.create([\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n  '<div class=\"note-statusbar\" role=\"status\">',\n    '<div class=\"note-resizebar\" aria-label=\"resize\">',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n    '</div>',\n  '</div>',\n].join(''));\n\nconst airEditor = renderer.create('<div class=\"note-editor note-airframe\"/>');\nconst airEditable = renderer.create([\n  '<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>',\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n].join(''));\n\nconst buttonGroup = renderer.create('<div class=\"note-btn-group\">');\nconst button = renderer.create('<button type=\"button\" class=\"note-btn\" tabindex=\"-1\">', function($node, options) {\n  // set button type\n  if (options && options.tooltip) {\n    $node.attr({\n      'aria-label': options.tooltip,\n    });\n    $node.data('_lite_tooltip', new TooltipUI($node, {\n      title: options.tooltip,\n      container: options.container,\n    })).on('click', (e) => {\n      $(e.currentTarget).data('_lite_tooltip').hide();\n    });\n  }\n  if (options.contents) {\n    $node.html(options.contents);\n  }\n\n  if (options && options.data && options.data.toggle === 'dropdown') {\n    $node.data('_lite_dropdown', new DropdownUI($node, {\n      container: options.container,\n    }));\n  }\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdown = renderer.create('<div class=\"note-dropdown-menu\" role=\"list\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    const $temp = $('<a class=\"note-dropdown-item\" href=\"#\" data-value=\"' + value + '\" role=\"listitem\" aria-label=\"' + value + '\"></a>');\n\n    $temp.html(content).data('item', item);\n\n    return $temp;\n  }) : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  $node.on('click', '> .note-dropdown-item', function(e) {\n    const $a = $(this);\n\n    const item = $a.data('item');\n    const value = $a.data('value');\n\n    if (item.click) {\n      item.click($a);\n    } else if (options.itemClick) {\n      options.itemClick(e, item, value);\n    }\n  });\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownCheck = renderer.create('<div class=\"note-dropdown-menu note-check\" role=\"list\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n\n    const $temp = $('<a class=\"note-dropdown-item\" href=\"#\" data-value=\"' + value + '\" role=\"listitem\" aria-label=\"' + item + '\"></a>');\n    $temp.html([icon(options.checkClassName), ' ', content]).data('item', item);\n    return $temp;\n  }) : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  $node.on('click', '> .note-dropdown-item', function(e) {\n    const $a = $(this);\n\n    const item = $a.data('item');\n    const value = $a.data('value');\n\n    if (item.click) {\n      item.click($a);\n    } else if (options.itemClick) {\n      options.itemClick(e, item, value);\n    }\n  });\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownButtonContents = function(contents, options) {\n  return contents + ' ' + icon(options.icons.caret, 'span');\n};\n\nconst dropdownButton = function(opt, callback) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdown({\n      className: opt.className,\n      items: opt.items,\n      template: opt.template,\n      itemClick: opt.itemClick,\n    }),\n  ], { callback: callback }).render();\n};\n\nconst dropdownCheckButton = function(opt, callback) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdownCheck({\n      className: opt.className,\n      checkClassName: opt.checkClassName,\n      items: opt.items,\n      template: opt.template,\n      itemClick: opt.itemClick,\n    }),\n  ], { callback: callback }).render();\n};\n\nconst paragraphDropdownButton = function(opt) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdown([\n      buttonGroup({\n        className: 'note-align',\n        children: opt.items[0],\n      }),\n      buttonGroup({\n        className: 'note-list',\n        children: opt.items[1],\n      }),\n    ]),\n  ]).render();\n};\n\nconst tableMoveHandler = function(event, col, row) {\n  const PX_PER_EM = 18;\n  const $picker = $(event.target.parentNode); // target is mousecatcher\n  const $dimensionDisplay = $picker.next();\n  const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n  const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n  const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n  let posOffset;\n  // HTML5 with jQuery - e.offsetX is undefined in Firefox\n  if (event.offsetX === undefined) {\n    const posCatcher = $(event.target).offset();\n    posOffset = {\n      x: event.pageX - posCatcher.left,\n      y: event.pageY - posCatcher.top,\n    };\n  } else {\n    posOffset = {\n      x: event.offsetX,\n      y: event.offsetY,\n    };\n  }\n\n  const dim = {\n    c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n    r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n  };\n\n  $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n  $catcher.data('value', dim.c + 'x' + dim.r);\n\n  if (dim.c > 3 && dim.c < col) {\n    $unhighlighted.css({ width: dim.c + 1 + 'em' });\n  }\n\n  if (dim.r > 3 && dim.r < row) {\n    $unhighlighted.css({ height: dim.r + 1 + 'em' });\n  }\n\n  $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n};\n\nconst tableDropdownButton = function(opt) {\n  return buttonGroup([\n    button({\n      className: 'dropdown-toggle',\n      contents: opt.title + ' ' + icon('note-icon-caret'),\n      tooltip: opt.tooltip,\n      data: {\n        toggle: 'dropdown',\n      },\n    }),\n    dropdown({\n      className: 'note-table',\n      items: [\n        '<div class=\"note-dimension-picker\">',\n          '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n          '<div class=\"note-dimension-picker-highlighted\"></div>',\n          '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n        '</div>',\n        '<div class=\"note-dimension-display\">1 x 1</div>',\n      ].join(''),\n    }),\n  ], {\n    callback: function($node) {\n      const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n      $catcher.css({\n        width: opt.col + 'em',\n        height: opt.row + 'em',\n      })\n        .mousedown(opt.itemClick)\n        .mousemove(function(e) {\n          tableMoveHandler(e, opt.col, opt.row);\n        });\n    },\n  }).render();\n};\n\nconst palette = renderer.create('<div class=\"note-color-palette\"/>', function($node, options) {\n  const contents = [];\n  for (let row = 0, rowSize = options.colors.length; row < rowSize; row++) {\n    const eventName = options.eventName;\n    const colors = options.colors[row];\n    const colorsName = options.colorsName[row];\n    const buttons = [];\n    for (let col = 0, colSize = colors.length; col < colSize; col++) {\n      const color = colors[col];\n      const colorName = colorsName[col];\n      buttons.push([\n        '<button type=\"button\" class=\"note-btn note-color-btn\"',\n        'style=\"background-color:', color, '\" ',\n        'data-event=\"', eventName, '\" ',\n        'data-value=\"', color, '\" ',\n        'data-title=\"', colorName, '\" ',\n        'aria-label=\"', colorName, '\" ',\n        'data-toggle=\"button\" tabindex=\"-1\"></button>',\n      ].join(''));\n    }\n    contents.push('<div class=\"note-color-row\">' + buttons.join('') + '</div>');\n  }\n  $node.html(contents.join(''));\n\n  $node.find('.note-color-btn').each(function() {\n    $(this).data('_lite_tooltip', new TooltipUI($(this), {\n      container: options.container,\n    }));\n  });\n});\n\nconst colorDropdownButton = function(opt, type) {\n  return buttonGroup({\n    className: 'note-color',\n    children: [\n      button({\n        className: 'note-current-color-button',\n        contents: opt.title,\n        tooltip: opt.lang.color.recent,\n        click: opt.currentClick,\n        callback: function($button) {\n          const $recentColor = $button.find('.note-recent-color');\n\n          if (type !== 'foreColor') {\n            $recentColor.css('background-color', '#FFFF00');\n            $button.attr('data-backColor', '#FFFF00');\n          }\n        },\n      }),\n      button({\n        className: 'dropdown-toggle',\n        contents: icon('note-icon-caret'),\n        tooltip: opt.lang.color.more,\n        data: {\n          toggle: 'dropdown',\n        },\n      }),\n      dropdown({\n        items: [\n          '<div>',\n            '<div class=\"note-btn-group btn-background-color\">',\n              '<div class=\"note-palette-title\">' + opt.lang.color.background + '</div>',\n            '<div>',\n            '<button type=\"button\" class=\"note-color-reset note-btn note-btn-block\" data-event=\"backColor\" data-value=\"transparent\">',\n              opt.lang.color.transparent,\n            '</button>',\n          '</div>',\n          '<div class=\"note-holder\" data-event=\"backColor\"></div>',\n            '<div class=\"btn-sm\">',\n              '<input type=\"color\" id=\"html5bcp\" class=\"note-btn btn-default\" value=\"#21104A\" style=\"width:100%;\" data-value=\"cp\">',\n              '<button type=\"button\" class=\"note-color-reset btn\" data-event=\"backColor\" data-value=\"cpbackColor\">',\n                opt.lang.color.cpSelect,\n              '</button>',\n            '</div>',\n          '</div>',\n          '<div class=\"note-btn-group btn-foreground-color\">',\n            '<div class=\"note-palette-title\">' + opt.lang.color.foreground + '</div>',\n            '<div>',\n              '<button type=\"button\" class=\"note-color-reset note-btn note-btn-block\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                opt.lang.color.resetToDefault,\n              '</button>',\n            '</div>',\n            '<div class=\"note-holder\" data-event=\"foreColor\"></div>',\n              '<div class=\"btn-sm\">',\n                '<input type=\"color\" id=\"html5fcp\" class=\"note-btn btn-default\" value=\"#21104A\" style=\"width:100%;\" data-value=\"cp\">',\n                '<button type=\"button\" class=\"note-color-reset btn\" data-event=\"foreColor\" data-value=\"cpforeColor\">',\n                  opt.lang.color.cpSelect,\n                '</button>',\n              '</div>',\n            '</div>',\n          '</div>',\n        ].join(''),\n        callback: function($dropdown) {\n          $dropdown.find('.note-holder').each(function() {\n            const $holder = $(this);\n            $holder.append(palette({\n              colors: opt.colors,\n              eventName: $holder.data('event'),\n            }).render());\n          });\n\n          if (type === 'fore') {\n            $dropdown.find('.btn-background-color').hide();\n            $dropdown.css({ 'min-width': '210px' });\n          } else if (type === 'back') {\n            $dropdown.find('.btn-foreground-color').hide();\n            $dropdown.css({ 'min-width': '210px' });\n          }\n        },\n        click: function(event) {\n          const $button = $(event.target);\n          const eventName = $button.data('event');\n          let value = $button.data('value');\n          const foreinput = document.getElementById('html5fcp').value;\n          const backinput = document.getElementById('html5bcp').value;\n          if (value === 'cp') {\n            event.stopPropagation();\n          } else if (value === 'cpbackColor') {\n            value = backinput;\n          } else if (value === 'cpforeColor') {\n            value = foreinput;\n          }\n\n          if (eventName && value) {\n            const key = eventName === 'backColor' ? 'background-color' : 'color';\n            const $color = $button.closest('.note-color').find('.note-recent-color');\n            const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n            $color.css(key, value);\n            $currentButton.attr('data-' + eventName, value);\n\n            if (type === 'fore') {\n              opt.itemClick('foreColor', value);\n            } else if (type === 'back') {\n              opt.itemClick('backColor', value);\n            } else {\n              opt.itemClick(eventName, value);\n            }\n          }\n        },\n      }),\n    ],\n  }).render();\n};\n\nconst dialog = renderer.create('<div class=\"note-modal\" aria-hidden=\"false\" tabindex=\"-1\" role=\"dialog\"/>', function($node, options) {\n  if (options.fade) {\n    $node.addClass('fade');\n  }\n  $node.attr({\n    'aria-label': options.title,\n  });\n  $node.html([\n    '<div class=\"note-modal-content\">',\n      (options.title ? '<div class=\"note-modal-header\"><button type=\"button\" class=\"close\" aria-label=\"Close\" aria-hidden=\"true\"><i class=\"note-icon-close\"></i></button><h4 class=\"note-modal-title\">' + options.title + '</h4></div>' : ''),\n      '<div class=\"note-modal-body\">' + options.body + '</div>',\n      (options.footer ? '<div class=\"note-modal-footer\">' + options.footer + '</div>' : ''),\n    '</div>',\n  ].join(''));\n\n  $node.data('modal', new ModalUI($node, options));\n});\n\nconst videoDialog = function(opt) {\n  const body = '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-video-url-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.video.url + ' <small class=\"text-muted\">' + opt.lang.video.providers + '</small></label>' +\n    '<input id=\"note-dialog-video-url-' + opt.id + '\" class=\"note-video-url note-input\" type=\"text\"/>' +\n  '</div>';\n  const footer = [\n    '<button type=\"button\" href=\"#\" class=\"note-btn note-btn-primary note-video-btn disabled\" disabled>',\n      opt.lang.video.insert,\n    '</button>',\n  ].join('');\n\n  return dialog({\n    title: opt.lang.video.insert,\n    fade: opt.fade,\n    body: body,\n    footer: footer,\n  }).render();\n};\n\nconst imageDialog = function(opt) {\n  const body = '<div class=\"note-form-group note-group-select-from-files\">' +\n    '<label for=\"note-dialog-image-file-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.image.selectFromFiles + '</label>' +\n    '<input id=\"note-dialog-image-file-' + opt.id + '\" class=\"note-note-image-input note-input\" type=\"file\" name=\"files\" accept=\"image/*\" multiple=\"multiple\"/>' +\n    opt.imageLimitation +\n  '</div>' +\n  '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-image-url-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.image.url + '</label>' +\n    '<input id=\"note-dialog-image-url-' + opt.id + '\" class=\"note-image-url note-input\" type=\"text\"/>' +\n  '</div>';\n  const footer = [\n    '<button href=\"#\" type=\"button\" class=\"note-btn note-btn-primary note-btn-large note-image-btn disabled\" disabled>',\n      opt.lang.image.insert,\n    '</button>',\n  ].join('');\n\n  return dialog({\n    title: opt.lang.image.insert,\n    fade: opt.fade,\n    body: body,\n    footer: footer,\n  }).render();\n};\n\nconst linkDialog = function(opt) {\n  const body = '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-link-txt-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.link.textToDisplay + '</label>' +\n    '<input id=\"note-dialog-link-txt-' + opt.id + '\" class=\"note-link-text note-input\" type=\"text\"/>' +\n  '</div>' +\n  '<div class=\"note-form-group\">' +\n    '<label for=\"note-dialog-link-url-' + opt.id + '\" class=\"note-form-label\">' + opt.lang.link.url + '</label>' +\n    '<input id=\"note-dialog-link-url-' + opt.id + '\" class=\"note-link-url note-input\" type=\"text\" value=\"http://\"/>' +\n  '</div>' +\n  (!opt.disableLinkTarget ? '<div class=\"checkbox\"><label for=\"note-dialog-link-nw-' + opt.id + '\"><input id=\"note-dialog-link-nw-' + opt.id + '\" type=\"checkbox\" checked> ' + opt.lang.link.openInNewWindow + '</label></div>' : '') +\n  '<div class=\"checkbox\"><label for=\"note-dialog-link-up-' + opt.id + '\"><input id=\"note-dialog-link-up-' + opt.id + '\" type=\"checkbox\" checked> ' + opt.lang.link.useProtocol + '</label></div>';\n  const footer = [\n    '<button href=\"#\" type=\"button\" class=\"note-btn note-btn-primary note-link-btn disabled\" disabled>',\n      opt.lang.link.insert,\n    '</button>',\n  ].join('');\n\n  return dialog({\n    className: 'link-dialog',\n    title: opt.lang.link.insert,\n    fade: opt.fade,\n    body: body,\n    footer: footer,\n  }).render();\n};\n\nconst popover = renderer.create([\n  '<div class=\"note-popover bottom\">',\n    '<div class=\"note-popover-arrow\"></div>',\n    '<div class=\"popover-content note-children-container\"></div>',\n  '</div>',\n].join(''), function($node, options) {\n  const direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';\n\n  $node.addClass(direction).hide();\n\n  if (options.hideArrow) {\n    $node.find('.note-popover-arrow').hide();\n  }\n});\n\nconst checkbox = renderer.create('<div class=\"checkbox\"></div>', function($node, options) {\n  $node.html([\n    '<label' + (options.id ? ' for=\"note-' + options.id + '\"' : '') + '>',\n      '<input role=\"checkbox\" type=\"checkbox\"' + (options.id ? ' id=\"note-' + options.id + '\"' : ''),\n      (options.checked ? ' checked' : ''),\n      ' aria-checked=\"' + (options.checked ? 'true' : 'false') + '\"/>',\n      (options.text ? options.text : ''),\n    '</label>',\n  ].join(''));\n});\n\nconst icon = function(iconClassName, tagName) {\n  tagName = tagName || 'i';\n  return '<' + tagName + ' class=\"' + iconClassName + '\"/>';\n};\n\nconst ui = function(editorOptions) {\n  return {\n    editor: editor,\n    toolbar: toolbar,\n    editingArea: editingArea,\n    codable: codable,\n    editable: editable,\n    statusbar: statusbar,\n    airEditor: airEditor,\n    airEditable: airEditable,\n    buttonGroup: buttonGroup,\n    button: button,\n    dropdown: dropdown,\n    dropdownCheck: dropdownCheck,\n    dropdownButton: dropdownButton,\n    dropdownButtonContents: dropdownButtonContents,\n    dropdownCheckButton: dropdownCheckButton,\n    paragraphDropdownButton: paragraphDropdownButton,\n    tableDropdownButton: tableDropdownButton,\n    colorDropdownButton: colorDropdownButton,\n    palette: palette,\n    dialog: dialog,\n    videoDialog: videoDialog,\n    imageDialog: imageDialog,\n    linkDialog: linkDialog,\n    popover: popover,\n    checkbox: checkbox,\n    icon: icon,\n    options: editorOptions,\n\n    toggleBtn: function($btn, isEnable) {\n      $btn.toggleClass('disabled', !isEnable);\n      $btn.attr('disabled', !isEnable);\n    },\n\n    toggleBtnActive: function($btn, isActive) {\n      $btn.toggleClass('active', isActive);\n    },\n\n    check: function($dom, value) {\n      $dom.find('.checked').removeClass('checked');\n      $dom.find('[data-value=\"' + value + '\"]').addClass('checked');\n    },\n\n    onDialogShown: function($dialog, handler) {\n      $dialog.one('note.modal.show', handler);\n    },\n\n    onDialogHidden: function($dialog, handler) {\n      $dialog.one('note.modal.hide', handler);\n    },\n\n    showDialog: function($dialog) {\n      $dialog.data('modal').show();\n    },\n\n    hideDialog: function($dialog) {\n      $dialog.data('modal').hide();\n    },\n\n    /**\n     * get popover content area\n     *\n     * @param $popover\n     * @returns {*}\n     */\n    getPopoverContent: function($popover) {\n      return $popover.find('.note-popover-content');\n    },\n\n    /**\n     * get dialog's body area\n     *\n     * @param $dialog\n     * @returns {*}\n     */\n    getDialogBody: function($dialog) {\n      return $dialog.find('.note-modal-body');\n    },\n\n    createLayout: function($note) {\n      const $editor = (editorOptions.airMode ? airEditor([\n        editingArea([\n          codable(),\n          airEditable(),\n        ]),\n      ]) : (editorOptions.toolbarPosition === 'bottom'\n        ? editor([\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          toolbar(),\n          statusbar(),\n        ])\n        : editor([\n          toolbar(),\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          statusbar(),\n        ])\n      )).render();\n\n      $editor.insertAfter($note);\n\n      return {\n        note: $note,\n        editor: $editor,\n        toolbar: $editor.find('.note-toolbar'),\n        editingArea: $editor.find('.note-editing-area'),\n        editable: $editor.find('.note-editable'),\n        codable: $editor.find('.note-codable'),\n        statusbar: $editor.find('.note-statusbar'),\n      };\n    },\n\n    removeLayout: function($note, layoutInfo) {\n      $note.html(layoutInfo.editable.html());\n      layoutInfo.editor.remove();\n      $note.off('summernote'); // remove summernote custom event\n      $note.show();\n    },\n  };\n};\n\nexport default ui;\n","import $ from 'jquery';\nimport ui from './ui';\nimport '../base/settings.js';\n\nimport '../../styles/summernote-lite.scss';\n\n$.summernote = $.extend($.summernote, {\n  ui_template: ui,\n  interface: 'lite',\n});\n"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.css b/public_html/vendor/admin-lte-plugins/summernote/summernote.css
new file mode 100644
index 0000000..a2f1f73
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.css
@@ -0,0 +1,812 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+@font-face {
+    font-family: "summernote";
+    font-style: normal;
+    font-weight: 400;
+    font-display: auto;
+    src: url("./font/summernote.eot?#iefix") format("embedded-opentype"), url("./font/summernote.woff2") format("woff2"), url("./font/summernote.woff") format("woff"), url("./font/summernote.ttf") format("truetype");
+}
+[class^=note-icon]:before,
+[class*=" note-icon"]:before {
+    display: inline-block;
+    font-family: "summernote";
+    font-style: normal;
+    font-size: inherit;
+    text-decoration: inherit;
+    text-rendering: auto;
+    text-transform: none;
+    vertical-align: middle;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    speak: none;
+}
+
+.note-icon-fw {
+    text-align: center;
+    width: 1.25em;
+}
+
+.note-icon-border {
+    border: solid 0.08em #eee;
+    border-radius: 0.1em;
+    padding: 0.2em 0.25em 0.15em;
+}
+
+.note-icon-pull-left {
+    float: left;
+}
+
+.note-icon-pull-right {
+    float: right;
+}
+
+.note-icon.note-icon-pull-left {
+    margin-right: 0.3em;
+}
+.note-icon.note-icon-pull-right {
+    margin-left: 0.3em;
+}
+
+.note-icon-align::before {
+    content: "\ea01";
+}
+
+.note-icon-align-center::before {
+    content: "\ea02";
+}
+
+.note-icon-align-indent::before {
+    content: "\ea03";
+}
+
+.note-icon-align-justify::before {
+    content: "\ea04";
+}
+
+.note-icon-align-left::before {
+    content: "\ea05";
+}
+
+.note-icon-align-outdent::before {
+    content: "\ea06";
+}
+
+.note-icon-align-right::before {
+    content: "\ea07";
+}
+
+.note-icon-arrow-circle-down::before {
+    content: "\ea08";
+}
+
+.note-icon-arrow-circle-left::before {
+    content: "\ea09";
+}
+
+.note-icon-arrow-circle-right::before {
+    content: "\ea0a";
+}
+
+.note-icon-arrow-circle-up::before {
+    content: "\ea0b";
+}
+
+.note-icon-arrows-alt::before {
+    content: "\ea0c";
+}
+
+.note-icon-arrows-h::before {
+    content: "\ea0d";
+}
+
+.note-icon-arrows-v::before {
+    content: "\ea0e";
+}
+
+.note-icon-bold::before {
+    content: "\ea0f";
+}
+
+.note-icon-caret::before {
+    content: "\ea10";
+}
+
+.note-icon-chain-broken::before {
+    content: "\ea11";
+}
+
+.note-icon-circle::before {
+    content: "\ea12";
+}
+
+.note-icon-close::before {
+    content: "\ea13";
+}
+
+.note-icon-code::before {
+    content: "\ea14";
+}
+
+.note-icon-col-after::before {
+    content: "\ea15";
+}
+
+.note-icon-col-before::before {
+    content: "\ea16";
+}
+
+.note-icon-col-remove::before {
+    content: "\ea17";
+}
+
+.note-icon-eraser::before {
+    content: "\ea18";
+}
+
+.note-icon-float-left::before {
+    content: "\ea19";
+}
+
+.note-icon-float-none::before {
+    content: "\ea1a";
+}
+
+.note-icon-float-right::before {
+    content: "\ea1b";
+}
+
+.note-icon-font::before {
+    content: "\ea1c";
+}
+
+.note-icon-frame::before {
+    content: "\ea1d";
+}
+
+.note-icon-italic::before {
+    content: "\ea1e";
+}
+
+.note-icon-link::before {
+    content: "\ea1f";
+}
+
+.note-icon-magic::before {
+    content: "\ea20";
+}
+
+.note-icon-menu-check::before {
+    content: "\ea21";
+}
+
+.note-icon-minus::before {
+    content: "\ea22";
+}
+
+.note-icon-orderedlist::before {
+    content: "\ea23";
+}
+
+.note-icon-pencil::before {
+    content: "\ea24";
+}
+
+.note-icon-picture::before {
+    content: "\ea25";
+}
+
+.note-icon-question::before {
+    content: "\ea26";
+}
+
+.note-icon-redo::before {
+    content: "\ea27";
+}
+
+.note-icon-rollback::before {
+    content: "\ea28";
+}
+
+.note-icon-row-above::before {
+    content: "\ea29";
+}
+
+.note-icon-row-below::before {
+    content: "\ea2a";
+}
+
+.note-icon-row-remove::before {
+    content: "\ea2b";
+}
+
+.note-icon-special-character::before {
+    content: "\ea2c";
+}
+
+.note-icon-square::before {
+    content: "\ea2d";
+}
+
+.note-icon-strikethrough::before {
+    content: "\ea2e";
+}
+
+.note-icon-subscript::before {
+    content: "\ea2f";
+}
+
+.note-icon-summernote::before {
+    content: "\ea30";
+}
+
+.note-icon-superscript::before {
+    content: "\ea31";
+}
+
+.note-icon-table::before {
+    content: "\ea32";
+}
+
+.note-icon-text-height::before {
+    content: "\ea33";
+}
+
+.note-icon-trash::before {
+    content: "\ea34";
+}
+
+.note-icon-underline::before {
+    content: "\ea35";
+}
+
+.note-icon-undo::before {
+    content: "\ea36";
+}
+
+.note-icon-unorderedlist::before {
+    content: "\ea37";
+}
+
+.note-icon-video::before {
+    content: "\ea38";
+}
+
+/* Theme Variables
+ ------------------------------------------ */
+/* Layout
+ ------------------------------------------ */
+.note-editor {
+    position: relative;
+}
+.note-editor .note-dropzone {
+    position: absolute;
+    display: none;
+    z-index: 100;
+    color: lightskyblue;
+    background-color: #fff;
+    opacity: 0.95;
+}
+.note-editor .note-dropzone .note-dropzone-message {
+    display: table-cell;
+    vertical-align: middle;
+    text-align: center;
+    font-size: 28px;
+    font-weight: 700;
+}
+.note-editor .note-dropzone.hover {
+    color: #098ddf;
+}
+.note-editor.dragover .note-dropzone {
+    display: table;
+}
+.note-editor .note-editing-area {
+    position: relative;
+}
+.note-editor .note-editing-area .note-editable {
+    outline: none;
+}
+.note-editor .note-editing-area .note-editable sup {
+    vertical-align: super;
+}
+.note-editor .note-editing-area .note-editable sub {
+    vertical-align: sub;
+}
+.note-editor .note-editing-area .note-editable img.note-float-left {
+    margin-right: 10px;
+}
+.note-editor .note-editing-area .note-editable img.note-float-right {
+    margin-left: 10px;
+}
+
+/* Frame mode layout
+ ------------------------------------------ */
+.note-editor.note-frame,
+.note-editor.note-airframe {
+    border: 1px solid #00000032;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-editable,
+.note-editor.note-airframe.codeview .note-editing-area .note-editable {
+    display: none;
+}
+.note-editor.note-frame.codeview .note-editing-area .note-codable,
+.note-editor.note-airframe.codeview .note-editing-area .note-codable {
+    display: block;
+}
+.note-editor.note-frame .note-editing-area,
+.note-editor.note-airframe .note-editing-area {
+    overflow: hidden;
+}
+.note-editor.note-frame .note-editing-area .note-editable,
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 10px;
+    overflow: auto;
+    word-wrap: break-word;
+}
+.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],
+.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false] {
+    background-color: #8080801d;
+}
+.note-editor.note-frame .note-editing-area .note-codable,
+.note-editor.note-airframe .note-editing-area .note-codable {
+    display: none;
+    width: 100%;
+    padding: 10px;
+    border: none;
+    box-shadow: none;
+    font-family: Menlo, Monaco, monospace, sans-serif;
+    font-size: 14px;
+    color: #ccc;
+    background-color: #222;
+    resize: none;
+    outline: none;
+    -ms-box-sizing: border-box;
+    box-sizing: border-box;
+    border-radius: 0;
+    margin-bottom: 0;
+}
+.note-editor.note-frame.fullscreen,
+.note-editor.note-airframe.fullscreen {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100% !important;
+    z-index: 1050;
+}
+.note-editor.note-frame.fullscreen .note-resizebar,
+.note-editor.note-airframe.fullscreen .note-resizebar {
+    display: none;
+}
+.note-editor.note-frame .note-status-output,
+.note-editor.note-airframe .note-status-output {
+    display: block;
+    width: 100%;
+    font-size: 14px;
+    line-height: 1.42857143;
+    height: 20px;
+    margin-bottom: 0;
+    color: #000;
+    border: 0;
+    border-top: 1px solid #e2e2e2;
+}
+.note-editor.note-frame .note-status-output:empty,
+.note-editor.note-airframe .note-status-output:empty {
+    height: 0;
+    border-top: 0 solid transparent;
+}
+.note-editor.note-frame .note-status-output .pull-right,
+.note-editor.note-airframe .note-status-output .pull-right {
+    float: right !important;
+}
+.note-editor.note-frame .note-status-output .text-muted,
+.note-editor.note-airframe .note-status-output .text-muted {
+    color: #777;
+}
+.note-editor.note-frame .note-status-output .text-primary,
+.note-editor.note-airframe .note-status-output .text-primary {
+    color: #286090;
+}
+.note-editor.note-frame .note-status-output .text-success,
+.note-editor.note-airframe .note-status-output .text-success {
+    color: #3c763d;
+}
+.note-editor.note-frame .note-status-output .text-info,
+.note-editor.note-airframe .note-status-output .text-info {
+    color: #31708f;
+}
+.note-editor.note-frame .note-status-output .text-warning,
+.note-editor.note-airframe .note-status-output .text-warning {
+    color: #8a6d3b;
+}
+.note-editor.note-frame .note-status-output .text-danger,
+.note-editor.note-airframe .note-status-output .text-danger {
+    color: #a94442;
+}
+.note-editor.note-frame .note-status-output .alert,
+.note-editor.note-airframe .note-status-output .alert {
+    margin: -7px 0 0 0;
+    padding: 7px 10px 2px 10px;
+    border-radius: 0;
+    color: #000;
+    background-color: #f5f5f5;
+}
+.note-editor.note-frame .note-status-output .alert .note-icon,
+.note-editor.note-airframe .note-status-output .alert .note-icon {
+    margin-right: 5px;
+}
+.note-editor.note-frame .note-status-output .alert-success,
+.note-editor.note-airframe .note-status-output .alert-success {
+    color: #3c763d !important;
+    background-color: #dff0d8 !important;
+}
+.note-editor.note-frame .note-status-output .alert-info,
+.note-editor.note-airframe .note-status-output .alert-info {
+    color: #31708f !important;
+    background-color: #d9edf7 !important;
+}
+.note-editor.note-frame .note-status-output .alert-warning,
+.note-editor.note-airframe .note-status-output .alert-warning {
+    color: #8a6d3b !important;
+    background-color: #fcf8e3 !important;
+}
+.note-editor.note-frame .note-status-output .alert-danger,
+.note-editor.note-airframe .note-status-output .alert-danger {
+    color: #a94442 !important;
+    background-color: #f2dede !important;
+}
+.note-editor.note-frame .note-statusbar,
+.note-editor.note-airframe .note-statusbar {
+    background-color: #8080801d;
+    border-bottom-left-radius: 4px;
+    border-bottom-right-radius: 4px;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar,
+.note-editor.note-airframe .note-statusbar .note-resizebar {
+    padding-top: 1px;
+    height: 9px;
+    width: 100%;
+    cursor: ns-resize;
+}
+.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar {
+    width: 20px;
+    margin: 1px auto;
+    border-top: 1px solid #00000032;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar {
+    cursor: default;
+}
+.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,
+.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar {
+    display: none;
+}
+.note-editor.note-frame .note-placeholder,
+.note-editor.note-airframe .note-placeholder {
+    padding: 10px;
+}
+
+.note-editor.note-airframe {
+    border: 0;
+}
+.note-editor.note-airframe .note-editing-area .note-editable {
+    padding: 0;
+}
+
+/* Popover
+ ------------------------------------------ */
+.note-popover.popover {
+    display: none;
+    max-width: none;
+}
+.note-popover.popover .popover-content a {
+    display: inline-block;
+    max-width: 200px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    vertical-align: middle;
+}
+.note-popover.popover .arrow {
+    left: 20px !important;
+}
+
+/* Popover and Toolbar (Button container)
+ ------------------------------------------ */
+.note-toolbar {
+    position: relative;
+}
+
+.note-popover .popover-content, .note-editor .note-toolbar {
+    margin: 0;
+    padding: 0 0 5px 5px;
+}
+.note-popover .popover-content > .note-btn-group, .note-editor .note-toolbar > .note-btn-group {
+    margin-top: 5px;
+    margin-left: 0;
+    margin-right: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table, .note-editor .note-toolbar .note-btn-group .note-table {
+    min-width: 0;
+    padding: 5px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker {
+    font-size: 18px;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher {
+    position: absolute !important;
+    z-index: 3;
+    width: 10em;
+    height: 10em;
+    cursor: pointer;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted {
+    position: relative !important;
+    z-index: 1;
+    width: 5em;
+    height: 5em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted {
+    position: absolute !important;
+    z-index: 2;
+    width: 1em;
+    height: 1em;
+    background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;
+}
+.note-popover .popover-content .note-style .dropdown-style blockquote, .note-popover .popover-content .note-style .dropdown-style pre, .note-editor .note-toolbar .note-style .dropdown-style blockquote, .note-editor .note-toolbar .note-style .dropdown-style pre {
+    margin: 0;
+    padding: 5px 10px;
+}
+.note-popover .popover-content .note-style .dropdown-style h1, .note-popover .popover-content .note-style .dropdown-style h2, .note-popover .popover-content .note-style .dropdown-style h3, .note-popover .popover-content .note-style .dropdown-style h4, .note-popover .popover-content .note-style .dropdown-style h5, .note-popover .popover-content .note-style .dropdown-style h6, .note-popover .popover-content .note-style .dropdown-style p, .note-editor .note-toolbar .note-style .dropdown-style h1, .note-editor .note-toolbar .note-style .dropdown-style h2, .note-editor .note-toolbar .note-style .dropdown-style h3, .note-editor .note-toolbar .note-style .dropdown-style h4, .note-editor .note-toolbar .note-style .dropdown-style h5, .note-editor .note-toolbar .note-style .dropdown-style h6, .note-editor .note-toolbar .note-style .dropdown-style p {
+    margin: 0;
+    padding: 0;
+}
+.note-popover .popover-content .note-color-all .note-dropdown-menu, .note-editor .note-toolbar .note-color-all .note-dropdown-menu {
+    min-width: 337px;
+}
+.note-popover .popover-content .note-color .dropdown-toggle, .note-editor .note-toolbar .note-color .dropdown-toggle {
+    width: 20px;
+    padding-left: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette {
+    display: inline-block;
+    margin: 0;
+    width: 160px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child {
+    margin: 0 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title {
+    font-size: 12px;
+    margin: 2px 7px;
+    text-align: center;
+    border-bottom: 1px solid #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select {
+    font-size: 11px;
+    margin: 3px;
+    padding: 0 3px;
+    cursor: pointer;
+    width: 100%;
+    border-radius: 5px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,
+.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover {
+    background: #eee;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row {
+    height: 20px;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn {
+    display: none;
+}
+.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn {
+    border: 1px solid #eee;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu, .note-editor .note-toolbar .note-para .note-dropdown-menu {
+    min-width: 228px;
+    padding: 5px;
+}
+.note-popover .popover-content .note-para .note-dropdown-menu > div + div, .note-editor .note-toolbar .note-para .note-dropdown-menu > div + div {
+    margin-left: 5px;
+}
+.note-popover .popover-content .note-dropdown-menu, .note-editor .note-toolbar .note-dropdown-menu {
+    min-width: 160px;
+}
+.note-popover .popover-content .note-dropdown-menu.right, .note-editor .note-toolbar .note-dropdown-menu.right {
+    right: 0;
+    left: auto;
+}
+.note-popover .popover-content .note-dropdown-menu.right::before, .note-editor .note-toolbar .note-dropdown-menu.right::before {
+    right: 9px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.right::after, .note-editor .note-toolbar .note-dropdown-menu.right::after {
+    right: 10px;
+    left: auto !important;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a i, .note-editor .note-toolbar .note-dropdown-menu.note-check a i {
+    color: deepskyblue;
+    visibility: hidden;
+}
+.note-popover .popover-content .note-dropdown-menu.note-check a.checked i, .note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i {
+    visibility: visible;
+}
+.note-popover .popover-content .note-fontsize-10, .note-editor .note-toolbar .note-fontsize-10 {
+    font-size: 10px;
+}
+.note-popover .popover-content .note-color-palette, .note-editor .note-toolbar .note-color-palette {
+    line-height: 1;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn, .note-editor .note-toolbar .note-color-palette div .note-color-btn {
+    width: 20px;
+    height: 20px;
+    padding: 0;
+    margin: 0;
+    border: 0;
+    border-radius: 0;
+}
+.note-popover .popover-content .note-color-palette div .note-color-btn:hover, .note-editor .note-toolbar .note-color-palette div .note-color-btn:hover {
+    transform: scale(1.2);
+    transition: all 0.2s;
+}
+
+/* Dialog
+ ------------------------------------------ */
+.note-modal .modal-dialog {
+    outline: 0;
+    border-radius: 5px;
+    box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+}
+.note-modal .form-group {
+    margin-left: 0;
+    margin-right: 0;
+}
+.note-modal .note-modal-form {
+    margin: 0;
+}
+.note-modal .note-image-dialog .note-dropzone {
+    min-height: 100px;
+    font-size: 30px;
+    line-height: 4;
+    color: lightgray;
+    text-align: center;
+    border: 4px dashed lightgray;
+    margin-bottom: 10px;
+}
+@-moz-document url-prefix() {
+    .note-modal .note-image-input {
+        height: auto;
+    }
+}
+
+/* Placeholder
+ ------------------------------------------ */
+.note-placeholder {
+    position: absolute;
+    display: none;
+    color: gray;
+}
+
+/* Handle
+ ------------------------------------------ */
+.note-handle .note-control-selection {
+    position: absolute;
+    display: none;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection > div {
+    position: absolute;
+}
+.note-handle .note-control-selection .note-control-selection-bg {
+    width: 100%;
+    height: 100%;
+    background-color: #000;
+    -webkit-opacity: 0.3;
+    -khtml-opacity: 0.3;
+    -moz-opacity: 0.3;
+    opacity: 0.3;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+    filter: alpha(opacity=30);
+}
+.note-handle .note-control-selection .note-control-handle, .note-handle .note-control-selection .note-control-sizing, .note-handle .note-control-selection .note-control-holder {
+    width: 7px;
+    height: 7px;
+    border: 1px solid #000;
+}
+.note-handle .note-control-selection .note-control-sizing {
+    background-color: #000;
+}
+.note-handle .note-control-selection .note-control-nw {
+    top: -5px;
+    left: -5px;
+    border-right: none;
+    border-bottom: none;
+}
+.note-handle .note-control-selection .note-control-ne {
+    top: -5px;
+    right: -5px;
+    border-bottom: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-sw {
+    bottom: -5px;
+    left: -5px;
+    border-top: none;
+    border-right: none;
+}
+.note-handle .note-control-selection .note-control-se {
+    right: -5px;
+    bottom: -5px;
+    cursor: se-resize;
+}
+.note-handle .note-control-selection .note-control-se.note-control-holder {
+    cursor: default;
+    border-top: none;
+    border-left: none;
+}
+.note-handle .note-control-selection .note-control-selection-info {
+    right: 0;
+    bottom: 0;
+    padding: 5px;
+    margin: 5px;
+    color: #fff;
+    background-color: #000;
+    font-size: 12px;
+    border-radius: 5px;
+    -webkit-opacity: 0.7;
+    -khtml-opacity: 0.7;
+    -moz-opacity: 0.7;
+    opacity: 0.7;
+    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=70);
+    filter: alpha(opacity=70);
+}
+
+.note-hint-popover {
+    min-width: 100px;
+    padding: 2px;
+}
+.note-hint-popover .popover-content {
+    padding: 3px;
+    max-height: 150px;
+    overflow: auto;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item {
+    display: block !important;
+    padding: 3px;
+}
+.note-hint-popover .popover-content .note-hint-group .note-hint-item.active, .note-hint-popover .popover-content .note-hint-group .note-hint-item:hover {
+    display: block;
+    clear: both;
+    font-weight: 400;
+    line-height: 1.4;
+    color: white;
+    white-space: nowrap;
+    text-decoration: none;
+    background-color: #428bca;
+    outline: 0;
+    cursor: pointer;
+}
+
+/* Handle
+ ------------------------------------------ */
+html .note-fullscreen-body, body .note-fullscreen-body {
+    overflow: hidden !important;
+}
+
+/*# sourceMappingURL=summernote.css.map*/
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.css.map b/public_html/vendor/admin-lte-plugins/summernote/summernote.css.map
new file mode 100644
index 0000000..2684b10
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote.css","mappings":";;;;;;;;;;;;AAMA;IACE;IACA;IACA;IACA;IACA;ACLF;ADSA;;IAEE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ACPF;;ADYA;IACE;IACA;ACTF;;ADYA;IACE;IACA;IACA;ACTF;;ADYA;IACE;ACTF;;ADYA;IACE;ACTF;;ADaE;IACE;ACVJ;ADYE;IACE;ACVJ;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;ADgCA;IACE;AC7BF;;AC5QA;6CAAA;AAQA;6CAAA;AAEA;IACE;ADyQF;ACpQE;IACE;IACA;IACA;IACA,mBANe;IAOf;IACA;ADsQJ;ACpQI;IACE;IACA;IACA;IACA;IACA;ADsQN;ACnQI;IACE,cAlBoB;ADuR1B;ACjQE;IACE;ADmQJ;AChQE;IACE;ADkQJ;AChQI;IACE;ADkQN;AChQM;IACE;ADkQR;AC/PM;IACE;ADiQR;AC9PM;IACE,kBAlDW;ADkTnB;AC7PM;IACE,iBAvDU;ADsTlB;;ACzPA;6CAAA;AAEA;;IAEE;AD4PF;ACvPM;;IACE;AD0PR;ACxPM;;IACE;AD2PR;ACtPE;;IACE;ADyPJ;ACtPI;;IACE;IACA;IACA;ADyPN;ACvPM;;IACE,2BA3FW;ADqVnB;ACrPI;;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ICFJ,0BDKwB;ICFxB,sBDEwB;ICnExB,gBDoEqB;IACjB;AD2PN;ACtPE;;IACE;IACA;IACA;IACA;IACA;ADyPJ;ACxPI;;IACE;AD2PN;ACtPE;;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ADyPJ;ACtPE;;IACE;IACA;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;IACA;IACA;IACA;IACA;ADyPJ;ACtPE;;IACE;ADyPJ;ACtPE;;IACE;IACA;ADyPJ;ACtPE;;IACE;IACA;ADyPJ;ACtPE;;IACE;IACA;ADyPJ;ACtPE;;IACE;IACA;ADyPJ;ACrPE;;IACE,2BAhNe;IAiNf;IACA;IACA;ADwPJ;ACvPI;;IACE;IACA;IACA;IACA;AD0PN;ACzPM;;IACE;IACA;IACA;AD4PR;ACvPM;;IACE;AD0PR;ACzPQ;;IACE;AD4PV;ACvPE;;IACE;AD0PJ;;ACtPA;IACE;ADyPF;ACtPI;IACE;ADwPN;;AClPA;6CAAA;AAEA;IACE;IACA;ADqPF;AClPI;IACE;IACA;IACA;IACA;IACA;IACA;ADoPN;ACjPE;IACE;ADmPJ;;AC/OA;6CAAA;AAEA;IACE;ADkPF;;AC/OA;IACE;IACA;ADkPF;AChPE;IACE;IACA;IACA;ADkPJ;AC9OI;IACE;IACA;ADgPN;AC/OM;IACE;ADiPR;AChPQ;IACE;IACA;IACA;IACA;IACA;ADkPV;AChPQ;IACE;IACA;IACA;IACA;IACA;ADkPV;AChPQ;IACE;IACA;IACA;IACA;IACA;ADkPV;AC1OM;IACE;IACA;AD4OR;AC1OM;IACE;IACA;AD4OR;ACtOI;IACE;ADwON;ACnOI;IACE;IACA;ADqON;AClOM;IACE;IACA;IACA;ADoOR;ACnOQ;IACE;ADqOV;AClOQ;IACE;IACA;IACA;IACA;ADoOV;ACjOQ;;;IAEE;IACA;IACA;IACA;IACA;IChUR,kBDiUyB;ADsO3B;ACpOU;;;IACE;ADwOZ;ACpOQ;IACE;ADsOV;ACnOQ;IACE;ADqOV;ACjOU;IACE;ADmOZ;AC3NI;IACE;IACA;AD6NN;AC5NM;IACE;AD8NR;ACxNE;IACE;AD0NJ;ACtNI;IACE;IACA;ADwNN;ACvNM;IACE;IACA;ADyNR;ACvNM;IACE;IACA;ADyNR;ACpNM;IACE;IACA;ADsNR;ACpNM;IACE;ADsNR;ACjNE;IACE;ADmNJ;AC/ME;IACE;ADiNJ;AC/MM;IACE;IACA;IACA;IACA;IACA;IACA;ADiNR;AC/MM;IACE;IACA;ADiNR;;AC3MA;6CAAA;AAGE;IACE;IACA;ICnWF,wCDoWsB;AD+MxB;AC7ME;IACE;IACA;AD+MJ;AC7ME;IACE;AD+MJ;AC5MI;IACE;IACA;IACA;IACA;IACA;IACA;IACA;AD8MN;ACzME;IACE;QACE;ID2MF;AACJ;;ACvMA;6CAAA;AAEA;IACE;IACA;IACA;AD0MF;;ACvMA;6CAAA;AAIE;IACE;IACA;IACA;ADwMJ;ACvMI;IACE;ADyMN;ACtMI;IACE;IACA;IACA;ICjcJ,oBDkcqB;ICjcrB,mBDicqB;IChcrB,iBDgcqB;IC/brB,YD+bqB;IC7brB;IACA;AFyoBF;AC1MI;IACE;IACA;IACA;AD4MN;ACrMI;IAEE;ADsMN;ACnMI;IACE;IACA;IACA;IACA;ADqMN;AClMI;IACE;IACA;IACA;IACA;ADoMN;ACjMI;IACE;IACA;IACA;IACA;ADmMN;AChMI;IACE;IACA;IACA;ADkMN;AC/LI;IACE;IACA;IACA;ADiMN;AC9LI;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IC9gBJ,kBD+gBqB;IC7frB,oBD8fqB;IC7frB,mBD6fqB;IC5frB,iBD4fqB;IC3frB,YD2fqB;ICzfrB;IACA;AF+rBF;;AClMA;IACE;IACA;ADqMF;ACnME;IACE;IACA;IACA;ADqMJ;AClMM;IACE;IACA;ADoMR;AClMQ;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;ADoMV;;AC7LA;6CAAA;AAGE;IACE;AD+LJ","sources":["webpack:///./src/styles/summernote/font.scss","webpack:///./src/styles/bs3/summernote-bs3.scss","webpack:///./src/styles/summernote/common.scss","webpack:///./src/styles/summernote/elements.scss"],"sourcesContent":["// Variables\n\n$sni-css-prefix: note-icon !default;\n\n// Path\n\n@font-face {\n  font-family: \"summernote\";\n  font-style: normal;\n  font-weight: 400;\n  font-display: auto;\n  src: url(\"./font/summernote.eot?#iefix\") format(\"embedded-opentype\"), url(\"./font/summernote.woff2\") format(\"woff2\"), url(\"./font/summernote.woff\") format(\"woff\"), url(\"./font/summernote.ttf\") format(\"truetype\");}\n\n// Core\n\n[class^=\"#{$sni-css-prefix}\"]:before,\n[class*=\" #{$sni-css-prefix}\"]:before {\n  display: inline-block;\n  font-family: \"summernote\";\n  font-style: normal;\n  font-size: inherit;\n  text-decoration: inherit;\n  text-rendering: auto;\n  text-transform: none;\n  vertical-align: middle;\n  -moz-osx-font-smoothing: grayscale;\n  -webkit-font-smoothing: antialiased;\n  speak: none;\n}\n\n// Extras\n\n.#{$sni-css-prefix}-fw {\n  text-align: center;\n  width: 1.25em;\n}\n\n.#{$sni-css-prefix}-border {\n  border: solid 0.08em #eee;\n  border-radius: 0.1em;\n  padding: 0.2em 0.25em 0.15em;\n}\n\n.#{$sni-css-prefix}-pull-left {\n  float: left;\n}\n\n.#{$sni-css-prefix}-pull-right {\n  float: right;\n}\n\n.#{$sni-css-prefix} {\n  &.#{$sni-css-prefix}-pull-left {\n    margin-right: 0.3em;\n  }\n  &.#{$sni-css-prefix}-pull-right {\n    margin-left: 0.3em;\n  }\n}\n\n// Functions\n\n@function char($character-code) {\n  @if function-exists(\"selector-append\") {\n    @return unquote(\"\\\"\\\\#{$character-code}\\\"\");\n  }\n\n  @if \"\\\\#{'x'}\" == \"\\\\x\" {\n    @return str-slice(\"\\x\", 1, 1) + $character-code;\n  }\n  @else {\n    @return #{\"\\\"\\\\\"}#{$character-code + \"\\\"\"};\n  }\n}\n\n// Icons\n\n\n.note-icon-align::before {\n  content: \"\\ea01\";\n}\n\n.note-icon-align-center::before {\n  content: \"\\ea02\";\n}\n\n.note-icon-align-indent::before {\n  content: \"\\ea03\";\n}\n\n.note-icon-align-justify::before {\n  content: \"\\ea04\";\n}\n\n.note-icon-align-left::before {\n  content: \"\\ea05\";\n}\n\n.note-icon-align-outdent::before {\n  content: \"\\ea06\";\n}\n\n.note-icon-align-right::before {\n  content: \"\\ea07\";\n}\n\n.note-icon-arrow-circle-down::before {\n  content: \"\\ea08\";\n}\n\n.note-icon-arrow-circle-left::before {\n  content: \"\\ea09\";\n}\n\n.note-icon-arrow-circle-right::before {\n  content: \"\\ea0a\";\n}\n\n.note-icon-arrow-circle-up::before {\n  content: \"\\ea0b\";\n}\n\n.note-icon-arrows-alt::before {\n  content: \"\\ea0c\";\n}\n\n.note-icon-arrows-h::before {\n  content: \"\\ea0d\";\n}\n\n.note-icon-arrows-v::before {\n  content: \"\\ea0e\";\n}\n\n.note-icon-bold::before {\n  content: \"\\ea0f\";\n}\n\n.note-icon-caret::before {\n  content: \"\\ea10\";\n}\n\n.note-icon-chain-broken::before {\n  content: \"\\ea11\";\n}\n\n.note-icon-circle::before {\n  content: \"\\ea12\";\n}\n\n.note-icon-close::before {\n  content: \"\\ea13\";\n}\n\n.note-icon-code::before {\n  content: \"\\ea14\";\n}\n\n.note-icon-col-after::before {\n  content: \"\\ea15\";\n}\n\n.note-icon-col-before::before {\n  content: \"\\ea16\";\n}\n\n.note-icon-col-remove::before {\n  content: \"\\ea17\";\n}\n\n.note-icon-eraser::before {\n  content: \"\\ea18\";\n}\n\n.note-icon-float-left::before {\n  content: \"\\ea19\";\n}\n\n.note-icon-float-none::before {\n  content: \"\\ea1a\";\n}\n\n.note-icon-float-right::before {\n  content: \"\\ea1b\";\n}\n\n.note-icon-font::before {\n  content: \"\\ea1c\";\n}\n\n.note-icon-frame::before {\n  content: \"\\ea1d\";\n}\n\n.note-icon-italic::before {\n  content: \"\\ea1e\";\n}\n\n.note-icon-link::before {\n  content: \"\\ea1f\";\n}\n\n.note-icon-magic::before {\n  content: \"\\ea20\";\n}\n\n.note-icon-menu-check::before {\n  content: \"\\ea21\";\n}\n\n.note-icon-minus::before {\n  content: \"\\ea22\";\n}\n\n.note-icon-orderedlist::before {\n  content: \"\\ea23\";\n}\n\n.note-icon-pencil::before {\n  content: \"\\ea24\";\n}\n\n.note-icon-picture::before {\n  content: \"\\ea25\";\n}\n\n.note-icon-question::before {\n  content: \"\\ea26\";\n}\n\n.note-icon-redo::before {\n  content: \"\\ea27\";\n}\n\n.note-icon-rollback::before {\n  content: \"\\ea28\";\n}\n\n.note-icon-row-above::before {\n  content: \"\\ea29\";\n}\n\n.note-icon-row-below::before {\n  content: \"\\ea2a\";\n}\n\n.note-icon-row-remove::before {\n  content: \"\\ea2b\";\n}\n\n.note-icon-special-character::before {\n  content: \"\\ea2c\";\n}\n\n.note-icon-square::before {\n  content: \"\\ea2d\";\n}\n\n.note-icon-strikethrough::before {\n  content: \"\\ea2e\";\n}\n\n.note-icon-subscript::before {\n  content: \"\\ea2f\";\n}\n\n.note-icon-summernote::before {\n  content: \"\\ea30\";\n}\n\n.note-icon-superscript::before {\n  content: \"\\ea31\";\n}\n\n.note-icon-table::before {\n  content: \"\\ea32\";\n}\n\n.note-icon-text-height::before {\n  content: \"\\ea33\";\n}\n\n.note-icon-trash::before {\n  content: \"\\ea34\";\n}\n\n.note-icon-underline::before {\n  content: \"\\ea35\";\n}\n\n.note-icon-undo::before {\n  content: \"\\ea36\";\n}\n\n.note-icon-unorderedlist::before {\n  content: \"\\ea37\";\n}\n\n.note-icon-video::before {\n  content: \"\\ea38\";\n}\n\n","@font-face {\n    font-family: \"summernote\";\n    font-style: normal;\n    font-weight: 400;\n    font-display: auto;\n    src: url(\"./font/summernote.eot?#iefix\") format(\"embedded-opentype\"), url(\"./font/summernote.woff2\") format(\"woff2\"), url(\"./font/summernote.woff\") format(\"woff\"), url(\"./font/summernote.ttf\") format(\"truetype\");\n}\n[class^=note-icon]:before,\n[class*=\" note-icon\"]:before {\n    display: inline-block;\n    font-family: \"summernote\";\n    font-style: normal;\n    font-size: inherit;\n    text-decoration: inherit;\n    text-rendering: auto;\n    text-transform: none;\n    vertical-align: middle;\n    -moz-osx-font-smoothing: grayscale;\n    -webkit-font-smoothing: antialiased;\n    speak: none;\n}\n\n.note-icon-fw {\n    text-align: center;\n    width: 1.25em;\n}\n\n.note-icon-border {\n    border: solid 0.08em #eee;\n    border-radius: 0.1em;\n    padding: 0.2em 0.25em 0.15em;\n}\n\n.note-icon-pull-left {\n    float: left;\n}\n\n.note-icon-pull-right {\n    float: right;\n}\n\n.note-icon.note-icon-pull-left {\n    margin-right: 0.3em;\n}\n.note-icon.note-icon-pull-right {\n    margin-left: 0.3em;\n}\n\n.note-icon-align::before {\n    content: \"\\ea01\";\n}\n\n.note-icon-align-center::before {\n    content: \"\\ea02\";\n}\n\n.note-icon-align-indent::before {\n    content: \"\\ea03\";\n}\n\n.note-icon-align-justify::before {\n    content: \"\\ea04\";\n}\n\n.note-icon-align-left::before {\n    content: \"\\ea05\";\n}\n\n.note-icon-align-outdent::before {\n    content: \"\\ea06\";\n}\n\n.note-icon-align-right::before {\n    content: \"\\ea07\";\n}\n\n.note-icon-arrow-circle-down::before {\n    content: \"\\ea08\";\n}\n\n.note-icon-arrow-circle-left::before {\n    content: \"\\ea09\";\n}\n\n.note-icon-arrow-circle-right::before {\n    content: \"\\ea0a\";\n}\n\n.note-icon-arrow-circle-up::before {\n    content: \"\\ea0b\";\n}\n\n.note-icon-arrows-alt::before {\n    content: \"\\ea0c\";\n}\n\n.note-icon-arrows-h::before {\n    content: \"\\ea0d\";\n}\n\n.note-icon-arrows-v::before {\n    content: \"\\ea0e\";\n}\n\n.note-icon-bold::before {\n    content: \"\\ea0f\";\n}\n\n.note-icon-caret::before {\n    content: \"\\ea10\";\n}\n\n.note-icon-chain-broken::before {\n    content: \"\\ea11\";\n}\n\n.note-icon-circle::before {\n    content: \"\\ea12\";\n}\n\n.note-icon-close::before {\n    content: \"\\ea13\";\n}\n\n.note-icon-code::before {\n    content: \"\\ea14\";\n}\n\n.note-icon-col-after::before {\n    content: \"\\ea15\";\n}\n\n.note-icon-col-before::before {\n    content: \"\\ea16\";\n}\n\n.note-icon-col-remove::before {\n    content: \"\\ea17\";\n}\n\n.note-icon-eraser::before {\n    content: \"\\ea18\";\n}\n\n.note-icon-float-left::before {\n    content: \"\\ea19\";\n}\n\n.note-icon-float-none::before {\n    content: \"\\ea1a\";\n}\n\n.note-icon-float-right::before {\n    content: \"\\ea1b\";\n}\n\n.note-icon-font::before {\n    content: \"\\ea1c\";\n}\n\n.note-icon-frame::before {\n    content: \"\\ea1d\";\n}\n\n.note-icon-italic::before {\n    content: \"\\ea1e\";\n}\n\n.note-icon-link::before {\n    content: \"\\ea1f\";\n}\n\n.note-icon-magic::before {\n    content: \"\\ea20\";\n}\n\n.note-icon-menu-check::before {\n    content: \"\\ea21\";\n}\n\n.note-icon-minus::before {\n    content: \"\\ea22\";\n}\n\n.note-icon-orderedlist::before {\n    content: \"\\ea23\";\n}\n\n.note-icon-pencil::before {\n    content: \"\\ea24\";\n}\n\n.note-icon-picture::before {\n    content: \"\\ea25\";\n}\n\n.note-icon-question::before {\n    content: \"\\ea26\";\n}\n\n.note-icon-redo::before {\n    content: \"\\ea27\";\n}\n\n.note-icon-rollback::before {\n    content: \"\\ea28\";\n}\n\n.note-icon-row-above::before {\n    content: \"\\ea29\";\n}\n\n.note-icon-row-below::before {\n    content: \"\\ea2a\";\n}\n\n.note-icon-row-remove::before {\n    content: \"\\ea2b\";\n}\n\n.note-icon-special-character::before {\n    content: \"\\ea2c\";\n}\n\n.note-icon-square::before {\n    content: \"\\ea2d\";\n}\n\n.note-icon-strikethrough::before {\n    content: \"\\ea2e\";\n}\n\n.note-icon-subscript::before {\n    content: \"\\ea2f\";\n}\n\n.note-icon-summernote::before {\n    content: \"\\ea30\";\n}\n\n.note-icon-superscript::before {\n    content: \"\\ea31\";\n}\n\n.note-icon-table::before {\n    content: \"\\ea32\";\n}\n\n.note-icon-text-height::before {\n    content: \"\\ea33\";\n}\n\n.note-icon-trash::before {\n    content: \"\\ea34\";\n}\n\n.note-icon-underline::before {\n    content: \"\\ea35\";\n}\n\n.note-icon-undo::before {\n    content: \"\\ea36\";\n}\n\n.note-icon-unorderedlist::before {\n    content: \"\\ea37\";\n}\n\n.note-icon-video::before {\n    content: \"\\ea38\";\n}\n\n/* Theme Variables\n ------------------------------------------ */\n/* Layout\n ------------------------------------------ */\n.note-editor {\n    position: relative;\n}\n.note-editor .note-dropzone {\n    position: absolute;\n    display: none;\n    z-index: 100;\n    color: lightskyblue;\n    background-color: #fff;\n    opacity: 0.95;\n}\n.note-editor .note-dropzone .note-dropzone-message {\n    display: table-cell;\n    vertical-align: middle;\n    text-align: center;\n    font-size: 28px;\n    font-weight: 700;\n}\n.note-editor .note-dropzone.hover {\n    color: #098ddf;\n}\n.note-editor.dragover .note-dropzone {\n    display: table;\n}\n.note-editor .note-editing-area {\n    position: relative;\n}\n.note-editor .note-editing-area .note-editable {\n    outline: none;\n}\n.note-editor .note-editing-area .note-editable sup {\n    vertical-align: super;\n}\n.note-editor .note-editing-area .note-editable sub {\n    vertical-align: sub;\n}\n.note-editor .note-editing-area .note-editable img.note-float-left {\n    margin-right: 10px;\n}\n.note-editor .note-editing-area .note-editable img.note-float-right {\n    margin-left: 10px;\n}\n\n/* Frame mode layout\n ------------------------------------------ */\n.note-editor.note-frame,\n.note-editor.note-airframe {\n    border: 1px solid #00000032;\n}\n.note-editor.note-frame.codeview .note-editing-area .note-editable,\n.note-editor.note-airframe.codeview .note-editing-area .note-editable {\n    display: none;\n}\n.note-editor.note-frame.codeview .note-editing-area .note-codable,\n.note-editor.note-airframe.codeview .note-editing-area .note-codable {\n    display: block;\n}\n.note-editor.note-frame .note-editing-area,\n.note-editor.note-airframe .note-editing-area {\n    overflow: hidden;\n}\n.note-editor.note-frame .note-editing-area .note-editable,\n.note-editor.note-airframe .note-editing-area .note-editable {\n    padding: 10px;\n    overflow: auto;\n    word-wrap: break-word;\n}\n.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false],\n.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false] {\n    background-color: #8080801d;\n}\n.note-editor.note-frame .note-editing-area .note-codable,\n.note-editor.note-airframe .note-editing-area .note-codable {\n    display: none;\n    width: 100%;\n    padding: 10px;\n    border: none;\n    box-shadow: none;\n    font-family: Menlo, Monaco, monospace, sans-serif;\n    font-size: 14px;\n    color: #ccc;\n    background-color: #222;\n    resize: none;\n    outline: none;\n    -ms-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    -webkit-box-sizing: border-box;\n    box-sizing: border-box;\n    -webkit-border-radius: 0;\n    -moz-border-radius: 0;\n    border-radius: 0;\n    margin-bottom: 0;\n}\n.note-editor.note-frame.fullscreen,\n.note-editor.note-airframe.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100% !important;\n    z-index: 1050;\n}\n.note-editor.note-frame.fullscreen .note-resizebar,\n.note-editor.note-airframe.fullscreen .note-resizebar {\n    display: none;\n}\n.note-editor.note-frame .note-status-output,\n.note-editor.note-airframe .note-status-output {\n    display: block;\n    width: 100%;\n    font-size: 14px;\n    line-height: 1.42857143;\n    height: 20px;\n    margin-bottom: 0;\n    color: #000;\n    border: 0;\n    border-top: 1px solid #e2e2e2;\n}\n.note-editor.note-frame .note-status-output:empty,\n.note-editor.note-airframe .note-status-output:empty {\n    height: 0;\n    border-top: 0 solid transparent;\n}\n.note-editor.note-frame .note-status-output .pull-right,\n.note-editor.note-airframe .note-status-output .pull-right {\n    float: right !important;\n}\n.note-editor.note-frame .note-status-output .text-muted,\n.note-editor.note-airframe .note-status-output .text-muted {\n    color: #777;\n}\n.note-editor.note-frame .note-status-output .text-primary,\n.note-editor.note-airframe .note-status-output .text-primary {\n    color: #286090;\n}\n.note-editor.note-frame .note-status-output .text-success,\n.note-editor.note-airframe .note-status-output .text-success {\n    color: #3c763d;\n}\n.note-editor.note-frame .note-status-output .text-info,\n.note-editor.note-airframe .note-status-output .text-info {\n    color: #31708f;\n}\n.note-editor.note-frame .note-status-output .text-warning,\n.note-editor.note-airframe .note-status-output .text-warning {\n    color: #8a6d3b;\n}\n.note-editor.note-frame .note-status-output .text-danger,\n.note-editor.note-airframe .note-status-output .text-danger {\n    color: #a94442;\n}\n.note-editor.note-frame .note-status-output .alert,\n.note-editor.note-airframe .note-status-output .alert {\n    margin: -7px 0 0 0;\n    padding: 7px 10px 2px 10px;\n    border-radius: 0;\n    color: #000;\n    background-color: #f5f5f5;\n}\n.note-editor.note-frame .note-status-output .alert .note-icon,\n.note-editor.note-airframe .note-status-output .alert .note-icon {\n    margin-right: 5px;\n}\n.note-editor.note-frame .note-status-output .alert-success,\n.note-editor.note-airframe .note-status-output .alert-success {\n    color: #3c763d !important;\n    background-color: #dff0d8 !important;\n}\n.note-editor.note-frame .note-status-output .alert-info,\n.note-editor.note-airframe .note-status-output .alert-info {\n    color: #31708f !important;\n    background-color: #d9edf7 !important;\n}\n.note-editor.note-frame .note-status-output .alert-warning,\n.note-editor.note-airframe .note-status-output .alert-warning {\n    color: #8a6d3b !important;\n    background-color: #fcf8e3 !important;\n}\n.note-editor.note-frame .note-status-output .alert-danger,\n.note-editor.note-airframe .note-status-output .alert-danger {\n    color: #a94442 !important;\n    background-color: #f2dede !important;\n}\n.note-editor.note-frame .note-statusbar,\n.note-editor.note-airframe .note-statusbar {\n    background-color: #8080801d;\n    border-bottom-left-radius: 4px;\n    border-bottom-right-radius: 4px;\n    border-top: 1px solid #00000032;\n}\n.note-editor.note-frame .note-statusbar .note-resizebar,\n.note-editor.note-airframe .note-statusbar .note-resizebar {\n    padding-top: 1px;\n    height: 9px;\n    width: 100%;\n    cursor: ns-resize;\n}\n.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar,\n.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar {\n    width: 20px;\n    margin: 1px auto;\n    border-top: 1px solid #00000032;\n}\n.note-editor.note-frame .note-statusbar.locked .note-resizebar,\n.note-editor.note-airframe .note-statusbar.locked .note-resizebar {\n    cursor: default;\n}\n.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar,\n.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar {\n    display: none;\n}\n.note-editor.note-frame .note-placeholder,\n.note-editor.note-airframe .note-placeholder {\n    padding: 10px;\n}\n\n.note-editor.note-airframe {\n    border: 0;\n}\n.note-editor.note-airframe .note-editing-area .note-editable {\n    padding: 0;\n}\n\n/* Popover\n ------------------------------------------ */\n.note-popover.popover {\n    display: none;\n    max-width: none;\n}\n.note-popover.popover .popover-content a {\n    display: inline-block;\n    max-width: 200px;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    vertical-align: middle;\n}\n.note-popover.popover .arrow {\n    left: 20px !important;\n}\n\n/* Popover and Toolbar (Button container)\n ------------------------------------------ */\n.note-toolbar {\n    position: relative;\n}\n\n.note-popover .popover-content, .note-editor .note-toolbar {\n    margin: 0;\n    padding: 0 0 5px 5px;\n}\n.note-popover .popover-content > .note-btn-group, .note-editor .note-toolbar > .note-btn-group {\n    margin-top: 5px;\n    margin-left: 0;\n    margin-right: 5px;\n}\n.note-popover .popover-content .note-btn-group .note-table, .note-editor .note-toolbar .note-btn-group .note-table {\n    min-width: 0;\n    padding: 5px;\n}\n.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker {\n    font-size: 18px;\n}\n.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher {\n    position: absolute !important;\n    z-index: 3;\n    width: 10em;\n    height: 10em;\n    cursor: pointer;\n}\n.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted {\n    position: relative !important;\n    z-index: 1;\n    width: 5em;\n    height: 5em;\n    background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n}\n.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted, .note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted {\n    position: absolute !important;\n    z-index: 2;\n    width: 1em;\n    height: 1em;\n    background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n}\n.note-popover .popover-content .note-style .dropdown-style blockquote, .note-popover .popover-content .note-style .dropdown-style pre, .note-editor .note-toolbar .note-style .dropdown-style blockquote, .note-editor .note-toolbar .note-style .dropdown-style pre {\n    margin: 0;\n    padding: 5px 10px;\n}\n.note-popover .popover-content .note-style .dropdown-style h1, .note-popover .popover-content .note-style .dropdown-style h2, .note-popover .popover-content .note-style .dropdown-style h3, .note-popover .popover-content .note-style .dropdown-style h4, .note-popover .popover-content .note-style .dropdown-style h5, .note-popover .popover-content .note-style .dropdown-style h6, .note-popover .popover-content .note-style .dropdown-style p, .note-editor .note-toolbar .note-style .dropdown-style h1, .note-editor .note-toolbar .note-style .dropdown-style h2, .note-editor .note-toolbar .note-style .dropdown-style h3, .note-editor .note-toolbar .note-style .dropdown-style h4, .note-editor .note-toolbar .note-style .dropdown-style h5, .note-editor .note-toolbar .note-style .dropdown-style h6, .note-editor .note-toolbar .note-style .dropdown-style p {\n    margin: 0;\n    padding: 0;\n}\n.note-popover .popover-content .note-color-all .note-dropdown-menu, .note-editor .note-toolbar .note-color-all .note-dropdown-menu {\n    min-width: 337px;\n}\n.note-popover .popover-content .note-color .dropdown-toggle, .note-editor .note-toolbar .note-color .dropdown-toggle {\n    width: 20px;\n    padding-left: 5px;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette {\n    display: inline-block;\n    margin: 0;\n    width: 160px;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child {\n    margin: 0 5px;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title {\n    font-size: 12px;\n    margin: 2px 7px;\n    text-align: center;\n    border-bottom: 1px solid #eee;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,\n.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select {\n    font-size: 11px;\n    margin: 3px;\n    padding: 0 3px;\n    cursor: pointer;\n    width: 100%;\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,\n.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover {\n    background: #eee;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row {\n    height: 20px;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn {\n    display: none;\n}\n.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn, .note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn {\n    border: 1px solid #eee;\n}\n.note-popover .popover-content .note-para .note-dropdown-menu, .note-editor .note-toolbar .note-para .note-dropdown-menu {\n    min-width: 228px;\n    padding: 5px;\n}\n.note-popover .popover-content .note-para .note-dropdown-menu > div + div, .note-editor .note-toolbar .note-para .note-dropdown-menu > div + div {\n    margin-left: 5px;\n}\n.note-popover .popover-content .note-dropdown-menu, .note-editor .note-toolbar .note-dropdown-menu {\n    min-width: 160px;\n}\n.note-popover .popover-content .note-dropdown-menu.right, .note-editor .note-toolbar .note-dropdown-menu.right {\n    right: 0;\n    left: auto;\n}\n.note-popover .popover-content .note-dropdown-menu.right::before, .note-editor .note-toolbar .note-dropdown-menu.right::before {\n    right: 9px;\n    left: auto !important;\n}\n.note-popover .popover-content .note-dropdown-menu.right::after, .note-editor .note-toolbar .note-dropdown-menu.right::after {\n    right: 10px;\n    left: auto !important;\n}\n.note-popover .popover-content .note-dropdown-menu.note-check a i, .note-editor .note-toolbar .note-dropdown-menu.note-check a i {\n    color: deepskyblue;\n    visibility: hidden;\n}\n.note-popover .popover-content .note-dropdown-menu.note-check a.checked i, .note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i {\n    visibility: visible;\n}\n.note-popover .popover-content .note-fontsize-10, .note-editor .note-toolbar .note-fontsize-10 {\n    font-size: 10px;\n}\n.note-popover .popover-content .note-color-palette, .note-editor .note-toolbar .note-color-palette {\n    line-height: 1;\n}\n.note-popover .popover-content .note-color-palette div .note-color-btn, .note-editor .note-toolbar .note-color-palette div .note-color-btn {\n    width: 20px;\n    height: 20px;\n    padding: 0;\n    margin: 0;\n    border: 0;\n    border-radius: 0;\n}\n.note-popover .popover-content .note-color-palette div .note-color-btn:hover, .note-editor .note-toolbar .note-color-palette div .note-color-btn:hover {\n    transform: scale(1.2);\n    transition: all 0.2s;\n}\n\n/* Dialog\n ------------------------------------------ */\n.note-modal .modal-dialog {\n    outline: 0;\n    border-radius: 5px;\n    -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n    -moz-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n}\n.note-modal .form-group {\n    margin-left: 0;\n    margin-right: 0;\n}\n.note-modal .note-modal-form {\n    margin: 0;\n}\n.note-modal .note-image-dialog .note-dropzone {\n    min-height: 100px;\n    font-size: 30px;\n    line-height: 4;\n    color: lightgray;\n    text-align: center;\n    border: 4px dashed lightgray;\n    margin-bottom: 10px;\n}\n@-moz-document url-prefix() {\n    .note-modal .note-image-input {\n        height: auto;\n    }\n}\n\n/* Placeholder\n ------------------------------------------ */\n.note-placeholder {\n    position: absolute;\n    display: none;\n    color: gray;\n}\n\n/* Handle\n ------------------------------------------ */\n.note-handle .note-control-selection {\n    position: absolute;\n    display: none;\n    border: 1px solid #000;\n}\n.note-handle .note-control-selection > div {\n    position: absolute;\n}\n.note-handle .note-control-selection .note-control-selection-bg {\n    width: 100%;\n    height: 100%;\n    background-color: #000;\n    -webkit-opacity: 0.3;\n    -khtml-opacity: 0.3;\n    -moz-opacity: 0.3;\n    opacity: 0.3;\n    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=30);\n    filter: alpha(opacity=30);\n}\n.note-handle .note-control-selection .note-control-handle, .note-handle .note-control-selection .note-control-sizing, .note-handle .note-control-selection .note-control-holder {\n    width: 7px;\n    height: 7px;\n    border: 1px solid #000;\n}\n.note-handle .note-control-selection .note-control-sizing {\n    background-color: #000;\n}\n.note-handle .note-control-selection .note-control-nw {\n    top: -5px;\n    left: -5px;\n    border-right: none;\n    border-bottom: none;\n}\n.note-handle .note-control-selection .note-control-ne {\n    top: -5px;\n    right: -5px;\n    border-bottom: none;\n    border-left: none;\n}\n.note-handle .note-control-selection .note-control-sw {\n    bottom: -5px;\n    left: -5px;\n    border-top: none;\n    border-right: none;\n}\n.note-handle .note-control-selection .note-control-se {\n    right: -5px;\n    bottom: -5px;\n    cursor: se-resize;\n}\n.note-handle .note-control-selection .note-control-se.note-control-holder {\n    cursor: default;\n    border-top: none;\n    border-left: none;\n}\n.note-handle .note-control-selection .note-control-selection-info {\n    right: 0;\n    bottom: 0;\n    padding: 5px;\n    margin: 5px;\n    color: #fff;\n    background-color: #000;\n    font-size: 12px;\n    -webkit-border-radius: 5px;\n    -moz-border-radius: 5px;\n    border-radius: 5px;\n    -webkit-opacity: 0.7;\n    -khtml-opacity: 0.7;\n    -moz-opacity: 0.7;\n    opacity: 0.7;\n    -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=70);\n    filter: alpha(opacity=70);\n}\n\n.note-hint-popover {\n    min-width: 100px;\n    padding: 2px;\n}\n.note-hint-popover .popover-content {\n    padding: 3px;\n    max-height: 150px;\n    overflow: auto;\n}\n.note-hint-popover .popover-content .note-hint-group .note-hint-item {\n    display: block !important;\n    padding: 3px;\n}\n.note-hint-popover .popover-content .note-hint-group .note-hint-item.active, .note-hint-popover .popover-content .note-hint-group .note-hint-item:hover {\n    display: block;\n    clear: both;\n    font-weight: 400;\n    line-height: 1.4;\n    color: white;\n    white-space: nowrap;\n    text-decoration: none;\n    background-color: #428bca;\n    outline: 0;\n    cursor: pointer;\n}\n\n/* Handle\n ------------------------------------------ */\nhtml .note-fullscreen-body, body .note-fullscreen-body {\n    overflow: hidden !important;\n}","@import \"elements.scss\";\n\n/* Theme Variables\n ------------------------------------------ */\n$border-color: #00000032;\n$background-color: #8080801d;\n\n$img-margin-left: 10px;\n$img-margin-right: 10px;\n\n/* Layout\n ------------------------------------------ */\n.note-editor {\n  position: relative;\n\n  // dropzone\n  $dropzone-color: lightskyblue;\n  $dropzone-active-color: darken($dropzone-color, 30);\n  .note-dropzone {\n    position: absolute;\n    display: none;\n    z-index: 100;\n    color: $dropzone-color;\n    background-color: #fff;\n    opacity: 0.95;\n\n    .note-dropzone-message {\n      display: table-cell;\n      vertical-align: middle;\n      text-align: center;\n      font-size: 28px;\n      font-weight: 700;\n    }\n\n    &.hover {\n      color: $dropzone-active-color;\n    }\n  }\n\n  &.dragover .note-dropzone {\n    display: table;\n  }\n\n  .note-editing-area {\n    position: relative;\n\n    .note-editable {\n      outline: none;\n\n      sup {\n        vertical-align: super;\n      }\n\n      sub {\n        vertical-align: sub;\n      }\n\n      img.note-float-left {\n        margin-right: $img-margin-right;\n      }\n\n      img.note-float-right {\n        margin-left: $img-margin-left;\n      }\n    }\n  }\n}\n\n/* Frame mode layout\n ------------------------------------------ */\n.note-editor.note-frame,\n.note-editor.note-airframe {\n  border: 1px solid $border-color;\n\n  // codeview mode\n  &.codeview {\n    .note-editing-area {\n      .note-editable {\n        display: none;\n      }\n      .note-codable {\n        display: block;\n      }\n    }\n  }\n\n  .note-editing-area {\n    overflow: hidden;\n\n    // editable\n    .note-editable {\n      padding: 10px;\n      overflow: auto;\n      word-wrap: break-word;\n\n      &[contenteditable=\"false\"] {\n        background-color: $background-color;\n      }\n    }\n\n    // codeable\n    .note-codable {\n      display: none;\n      width: 100%;\n      padding: 10px;\n      border: none;\n      box-shadow: none;\n      font-family: Menlo, Monaco, monospace, sans-serif;\n      font-size: 14px;\n      color: #ccc;\n      background-color: #222;\n      resize: none;\n      outline: none;\n\n      // override BS2 default style\n      @include box-sizing(border-box);\n      @include rounded(0);\n      margin-bottom: 0;\n    }\n  }\n\n  // fullscreen mode\n  &.fullscreen {\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100% !important;\n    z-index: 1050; // bs3 modal-backdrop: 1030, bs2: 1040\n    .note-resizebar {\n      display: none;\n    }\n  }\n\n  // Notifications\n  .note-status-output {\n    display: block;\n    width: 100%;\n    font-size: 14px;\n    line-height: 1.42857143;\n    height: 20px;\n    margin-bottom: 0;\n    color: #000;\n    border: 0;\n    border-top: 1px solid #e2e2e2;\n  }\n\n  .note-status-output:empty {\n    height: 0;\n    border-top: 0 solid transparent;\n  }\n\n  .note-status-output .pull-right {\n    float: right !important;\n  }\n\n  .note-status-output .text-muted {\n    color: #777;\n  }\n\n  .note-status-output .text-primary {\n    color: #286090;\n  }\n\n  .note-status-output .text-success {\n    color: #3c763d;\n  }\n\n  .note-status-output .text-info {\n    color: #31708f;\n  }\n\n  .note-status-output .text-warning {\n    color: #8a6d3b;\n  }\n\n  .note-status-output .text-danger {\n    color: #a94442;\n  }\n\n  .note-status-output .alert {\n    margin: -7px 0 0 0;\n    padding: 7px 10px 2px 10px;\n    border-radius: 0;\n    color: #000;\n    background-color: #f5f5f5;\n  }\n\n  .note-status-output .alert .note-icon {\n    margin-right: 5px;\n  }\n\n  .note-status-output .alert-success {\n    color: #3c763d !important;\n    background-color: #dff0d8 !important;\n  }\n\n  .note-status-output .alert-info {\n    color: #31708f !important;\n    background-color: #d9edf7 !important;\n  }\n\n  .note-status-output .alert-warning {\n    color: #8a6d3b !important;\n    background-color: #fcf8e3 !important;\n  }\n\n  .note-status-output .alert-danger {\n    color: #a94442 !important;\n    background-color: #f2dede !important;\n  }\n\n  // statusbar\n  .note-statusbar {\n    background-color: $background-color;\n    border-bottom-left-radius: 4px;\n    border-bottom-right-radius: 4px;\n    border-top: 1px solid $border-color;\n    .note-resizebar {\n      padding-top: 1px;\n      height: 9px;\n      width: 100%;\n      cursor: ns-resize;\n      .note-icon-bar {\n        width: 20px;\n        margin: 1px auto;\n        border-top: 1px solid $border-color;\n      }\n    }\n\n    &.locked {\n      .note-resizebar {\n        cursor: default;\n        .note-icon-bar {\n          display: none;\n        }\n      }\n    }\n  }\n  .note-placeholder {\n    padding: 10px;\n  }\n}\n\n.note-editor.note-airframe {\n  border: 0;\n\n  .note-editing-area {\n    .note-editable {\n      padding: 0;\n    }\n  }\n}\n\n\n/* Popover\n ------------------------------------------ */\n.note-popover.popover {\n  display: none;\n  max-width: none;\n\n  .popover-content {\n    a {\n      display: inline-block;\n      max-width: 200px;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap; // for FF\n      vertical-align: middle; // for FF\n    }\n  }\n  .arrow {\n    left: 20px !important;\n  }\n}\n\n/* Popover and Toolbar (Button container)\n ------------------------------------------ */\n.note-toolbar {\n  position: relative;\n}\n\n.note-popover .popover-content, .note-editor .note-toolbar {\n  margin: 0;\n  padding: 0 0 5px 5px;\n\n  & > .note-btn-group {\n    margin-top: 5px;\n    margin-left: 0;\n    margin-right: 5px;\n  }\n\n  .note-btn-group {\n    .note-table {\n      min-width: 0;\n      padding: 5px;\n      .note-dimension-picker {\n        font-size: 18px;\n        .note-dimension-picker-mousecatcher {\n          position: absolute !important;\n          z-index: 3;\n          width: 10em;\n          height: 10em;\n          cursor: pointer;\n        }\n        .note-dimension-picker-unhighlighted {\n          position: relative !important;\n          z-index: 1;\n          width: 5em;\n          height: 5em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n        .note-dimension-picker-highlighted {\n          position: absolute !important;\n          z-index: 2;\n          width: 1em;\n          height: 1em;\n          background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC\") repeat;\n        }\n      }\n    }\n  }\n\n  .note-style {\n    .dropdown-style {\n      blockquote, pre {\n        margin: 0;\n        padding: 5px 10px;\n      }\n      h1, h2, h3, h4, h5, h6, p {\n        margin: 0;\n        padding: 0;\n      }\n    }\n  }\n\n  .note-color-all {\n    .note-dropdown-menu {\n      min-width: 337px;\n    }\n  }\n\n  .note-color {\n    .dropdown-toggle {\n      width: 20px;\n      padding-left: 5px;\n    }\n    .note-dropdown-menu {\n      .note-palette {\n        display: inline-block;\n        margin: 0;\n        width: 160px;\n        &:first-child {\n          margin: 0 5px;\n        }\n\n        .note-palette-title {\n          font-size: 12px;\n          margin: 2px 7px;\n          text-align: center;\n          border-bottom: 1px solid #eee;\n        }\n\n        .note-color-reset,\n        .note-color-select {\n          font-size: 11px;\n          margin: 3px;\n          padding: 0 3px;\n          cursor: pointer;\n          width: 100%;\n          @include rounded(5px);\n\n          &:hover {\n            background: #eee;\n          }\n        }\n\n        .note-color-row {\n          height: 20px;\n        }\n\n        .note-color-select-btn {\n          display: none;\n        }\n\n        .note-holder-custom {\n          .note-color-btn {\n            border: 1px solid #eee;\n          }\n        }\n      }\n    }\n  }\n\n  .note-para {\n    .note-dropdown-menu {\n      min-width: 228px;\n      padding: 5px;\n      & > div + div {\n        margin-left: 5px;\n      }\n    }\n  }\n\n  // dropdown-menu for toolbar and popover\n  .note-dropdown-menu {\n    min-width: 160px;\n\n    // dropdown-menu right position\n    // http://forrst.com/posts/Bootstrap_right_positioned_dropdown-2KB\n    &.right {\n      right: 0;\n      left: auto;\n      &::before {\n        right: 9px;\n        left: auto !important;\n      }\n      &::after {\n        right: 10px;\n        left: auto !important;\n      }\n    }\n    // dropdown-menu for selectbox\n    &.note-check {\n      a i {\n        color: deepskyblue;\n        visibility: hidden;\n      }\n      a.checked i {\n        visibility: visible;\n      }\n    }\n  }\n\n  .note-fontsize-10 {\n    font-size: 10px;\n  }\n\n  // color palette for toolbar and popover\n  .note-color-palette {\n    line-height: 1;\n    div {\n      .note-color-btn {\n        width: 20px;\n        height: 20px;\n        padding: 0;\n        margin: 0;\n        border: 0;\n        border-radius: 0;\n      }\n      .note-color-btn:hover {\n        transform: scale(1.2);\n        transition: all 0.2s;\n      }\n    }\n  }\n}\n\n/* Dialog\n ------------------------------------------ */\n.note-modal {\n  .modal-dialog {\n    outline: 0;\n    border-radius: 5px;\n    @include box-shadow(0 3px 9px rgba(0,0,0,.5));\n  }\n  .form-group { // overwrite BS's form-horizontal minus margins\n    margin-left: 0;\n    margin-right: 0;\n  }\n  .note-modal-form {\n    margin: 0; // overwrite BS2's form margin bottom\n  }\n  .note-image-dialog {\n    .note-dropzone {\n      min-height: 100px;\n      font-size: 30px;\n      line-height: 4; // vertical-align\n      color: lightgray;\n      text-align: center;\n      border: 4px dashed lightgray;\n      margin-bottom: 10px;\n    }\n  }\n\n  // [workaround] firefox fileinput\n  @-moz-document url-prefix() {\n    .note-image-input {\n      height: auto;\n    }\n  }\n}\n\n/* Placeholder\n ------------------------------------------ */\n.note-placeholder {\n  position: absolute;\n  display: none;\n  color: gray;\n}\n\n/* Handle\n ------------------------------------------ */\n.note-handle {\n  // control selection\n  .note-control-selection {\n    position: absolute;\n    display: none;\n    border: 1px solid #000;\n    & > div {\n      position: absolute;\n    }\n\n    .note-control-selection-bg {\n      width: 100%;\n      height: 100%;\n      background-color: #000;\n      @include opacity(0.3);\n    }\n\n    .note-control-handle {\n      width: 7px;\n      height: 7px;\n      border: 1px solid #000;\n    }\n\n    .note-control-holder {\n      @extend .note-control-handle;\n    }\n\n    .note-control-sizing {\n      @extend .note-control-handle;\n      background-color: #000;\n    }\n\n    .note-control-nw {\n      top: -5px;\n      left: -5px;\n      border-right: none;\n      border-bottom: none;\n    }\n\n    .note-control-ne {\n      top: -5px;\n      right: -5px;\n      border-bottom: none;\n      border-left: none;\n    }\n\n    .note-control-sw {\n      bottom: -5px;\n      left: -5px;\n      border-top: none;\n      border-right: none;\n    }\n\n    .note-control-se {\n      right: -5px;\n      bottom: -5px;\n      cursor: se-resize;\n    }\n\n    .note-control-se.note-control-holder {\n      cursor: default;\n      border-top: none;\n      border-left: none;\n    }\n\n    .note-control-selection-info {\n      right: 0;\n      bottom: 0;\n      padding: 5px;\n      margin: 5px;\n      color: #fff;\n      background-color: #000;\n      font-size: 12px;\n      @include rounded(5px);\n      @include opacity(0.7);\n    }\n  }\n}\n\n.note-hint-popover {\n  min-width: 100px;\n  padding: 2px;\n\n  .popover-content {\n    padding: 3px;\n    max-height: 150px;\n    overflow: auto;\n\n    .note-hint-group {\n      .note-hint-item {\n        display: block !important;\n        padding: 3px;\n\n        &.active, &:hover {\n          display: block;\n          clear: both;\n          font-weight: 400;\n          line-height: 1.4;\n          color: white;\n          white-space: nowrap;\n          text-decoration: none;\n          background-color: #428bca;\n          outline: 0;\n          cursor: pointer;\n        }\n      }\n    }\n  }\n}\n\n/* Handle\n ------------------------------------------ */\nhtml, body {\n  .note-fullscreen-body {\n    overflow: hidden !important;\n  }\n}\n","@mixin gradient($color: #F5F5F5, $start: #EEE, $stop: #FFF) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, $start),\n                               color-stop(1, $stop));\n  background: -ms-linear-gradient(bottom,\n                                  $start,\n                                  $stop);\n  background: -moz-linear-gradient(center bottom,\n                                   $start 0%,\n                                   $stop 100%);\n  background: -o-linear-gradient($stop,\n                                 $start);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($stop)}', endColorstr='#{ie-hex-str($start)}', GradientType=0);\n}\n@mixin bw-gradient($color: #F5F5F5, $start: 0, $stop: 255) {\n  background: $color;\n  background: -webkit-gradient(linear,\n                               left bottom,\n                               left top,\n                               color-stop(0, rgb($start,$start,$start)),\n                               color-stop(1, rgb($stop,$stop,$stop)));\n  background: -ms-linear-gradient(bottom,\n                                  rgb($start,$start,$start) 0%,\n                                  rgb($stop,$stop,$stop) 100%);\n  background: -moz-linear-gradient(center bottom,\n                                   rgb($start,$start,$start) 0%,\n                                   rgb($stop,$stop,$stop) 100%);\n  background: -o-linear-gradient(rgb($stop,$stop,$stop),\n                                 rgb($start,$start,$start));\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str(rgb($stop,$stop,$stop))}', endColorstr='#{ie-hex-str(rgb($start,$start,$start))}', GradientType=0);\n}\n@mixin bordered($top-color: #EEE, $right-color: #EEE, $bottom-color: #EEE, $left-color: #EEE) {\n  border-top: solid 1px $top-color;\n  border-left: solid 1px $left-color;\n  border-right: solid 1px $right-color;\n  border-bottom: solid 1px $bottom-color;\n}\n@mixin drop-shadow($x-axis: 0, $y-axis: 1px, $blur: 2px, $alpha: 0.1) {\n  -webkit-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n  box-shadow: $x-axis $y-axis $blur rgba(0, 0, 0, $alpha);\n}\n@mixin rounded($radius: 2px) {\n  -webkit-border-radius: $radius;\n  -moz-border-radius: $radius;\n  border-radius: $radius;\n}\n@mixin border-radius($topright: 0, $bottomright: 0, $bottomleft: 0, $topleft: 0) {\n  -webkit-border-top-right-radius: $topright;\n  -webkit-border-bottom-right-radius: $bottomright;\n  -webkit-border-bottom-left-radius: $bottomleft;\n  -webkit-border-top-left-radius: $topleft;\n  -moz-border-radius-topright: $topright;\n  -moz-border-radius-bottomright: $bottomright;\n  -moz-border-radius-bottomleft: $bottomleft;\n  -moz-border-radius-topleft: $topleft;\n  border-top-right-radius: $topright;\n  border-bottom-right-radius: $bottomright;\n  border-bottom-left-radius: $bottomleft;\n  border-top-left-radius: $topleft;\n  @include background-clip(padding-box);\n}\n@mixin opacity($opacity: 0.5) {\n  -webkit-opacity: $opacity;\n  -khtml-opacity: $opacity;\n  -moz-opacity: $opacity;\n  opacity: $opacity;\n  $opperc: $opacity * 100;\n  -ms-filter: progid:DXImageTransform.Microsoft.Alpha(opacity=#{$opperc});\n  filter: alpha(opacity=$opperc);\n}\n@mixin transition-duration($duration: 0.2s) {\n  -moz-transition-duration: $duration;\n  -webkit-transition-duration: $duration;\n  -o-transition-duration: $duration;\n  transition-duration: $duration;\n}\n@mixin transform($arguments...) {\n  -webkit-transform: $arguments;\n  -moz-transform: $arguments;\n  -o-transform: $arguments;\n  -ms-transform: $arguments;\n  transform: $arguments;\n}\n@mixin rotation($deg:5deg) {\n  @include transform(rotate($deg));\n}\n@mixin scale($ratio:1.5) {\n  @include transform(scale($ratio));\n}\n@mixin transition($duration:0.2s, $ease:ease-out) {\n  -webkit-transition: all $duration $ease;\n  -moz-transition: all $duration $ease;\n  -o-transition: all $duration $ease;\n  transition: all $duration $ease;\n}\n@mixin inner-shadow($horizontal:0, $vertical:1px, $blur:2px, $alpha: 0.4) {\n  -webkit-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  -moz-box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n  box-shadow: inset $horizontal $vertical $blur rgba(0, 0, 0, $alpha);\n}\n@mixin box-shadow($arguments) {\n  -webkit-box-shadow: $arguments;\n  -moz-box-shadow: $arguments;\n  box-shadow: $arguments;\n}\n@mixin box-sizing($sizing: border-box) {\n  -ms-box-sizing: $sizing;\n  -moz-box-sizing: $sizing;\n  -webkit-box-sizing: $sizing;\n  box-sizing: $sizing;\n}\n@mixin user-select($argument: none) {\n  -webkit-user-select: $argument;\n  -moz-user-select: $argument;\n  -ms-user-select: $argument;\n  user-select: $argument;\n}\n@mixin columns($colwidth: 250px, $colcount: 0, $colgap: 50px, $columnRuleColor: #EEE, $columnRuleStyle: solid, $columnRuleWidth: 1px) {\n  -moz-column-width: $colwidth;\n  -moz-column-count: $colcount;\n  -moz-column-gap: $colgap;\n  -moz-column-rule-color: $columnRuleColor;\n  -moz-column-rule-style: $columnRuleStyle;\n  -moz-column-rule-width: $columnRuleWidth;\n  -webkit-column-width: $colwidth;\n  -webkit-column-count: $colcount;\n  -webkit-column-gap: $colgap;\n  -webkit-column-rule-color: $columnRuleColor;\n  -webkit-column-rule-style: $columnRuleStyle;\n  -webkit-column-rule-width: $columnRuleWidth;\n  column-width: $colwidth;\n  column-count: $colcount;\n  column-gap: $colgap;\n  column-rule-color: $columnRuleColor;\n  column-rule-style: $columnRuleStyle;\n  column-rule-width: $columnRuleWidth;\n}\n@mixin translate($x:0, $y:0) {\n  @include transform(translate($x, $y));\n}\n@mixin background-clip($argument: padding-box) {\n  -moz-background-clip: $argument;\n  -webkit-background-clip: $argument;\n  background-clip: $argument;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.js b/public_html/vendor/admin-lte-plugins/summernote/summernote.js
new file mode 100644
index 0000000..4b33b1d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.js
@@ -0,0 +1,10229 @@
+/*!
+ * 
+ * Super simple WYSIWYG editor v0.8.20
+ * https://summernote.org
+ *
+ *
+ * Copyright 2013- Alan Hong and contributors
+ * Summernote may be freely distributed under the MIT license.
+ *
+ * Date: 2021-10-14T21:15Z
+ *
+ */
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("jQuery"));
+	else if(typeof define === 'function' && define.amd)
+		define(["jQuery"], factory);
+	else {
+		var a = typeof exports === 'object' ? factory(require("jQuery")) : factory(root["jQuery"]);
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {
+return /******/ (() => { // webpackBootstrap
+/******/ 	"use strict";
+/******/ 	var __webpack_modules__ = ({
+
+/***/ 9770:
+/***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => {
+
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1145);
+/* harmony import */ var jquery__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(jquery__WEBPACK_IMPORTED_MODULE_0__);
+
+(jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) = (jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote) || {
+  lang: {}
+};
+jquery__WEBPACK_IMPORTED_MODULE_0___default().extend((jquery__WEBPACK_IMPORTED_MODULE_0___default().summernote.lang), {
+  'en-US': {
+    font: {
+      bold: 'Bold',
+      italic: 'Italic',
+      underline: 'Underline',
+      clear: 'Remove Font Style',
+      height: 'Line Height',
+      name: 'Font Family',
+      strikethrough: 'Strikethrough',
+      subscript: 'Subscript',
+      superscript: 'Superscript',
+      size: 'Font Size',
+      sizeunit: 'Font Size Unit'
+    },
+    image: {
+      image: 'Picture',
+      insert: 'Insert Image',
+      resizeFull: 'Resize full',
+      resizeHalf: 'Resize half',
+      resizeQuarter: 'Resize quarter',
+      resizeNone: 'Original size',
+      floatLeft: 'Float Left',
+      floatRight: 'Float Right',
+      floatNone: 'Remove float',
+      shapeRounded: 'Shape: Rounded',
+      shapeCircle: 'Shape: Circle',
+      shapeThumbnail: 'Shape: Thumbnail',
+      shapeNone: 'Shape: None',
+      dragImageHere: 'Drag image or text here',
+      dropImage: 'Drop image or Text',
+      selectFromFiles: 'Select from files',
+      maximumFileSize: 'Maximum file size',
+      maximumFileSizeError: 'Maximum file size exceeded.',
+      url: 'Image URL',
+      remove: 'Remove Image',
+      original: 'Original'
+    },
+    video: {
+      video: 'Video',
+      videoLink: 'Video Link',
+      insert: 'Insert Video',
+      url: 'Video URL',
+      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)'
+    },
+    link: {
+      link: 'Link',
+      insert: 'Insert Link',
+      unlink: 'Unlink',
+      edit: 'Edit',
+      textToDisplay: 'Text to display',
+      url: 'To what URL should this link go?',
+      openInNewWindow: 'Open in new window',
+      useProtocol: 'Use default protocol'
+    },
+    table: {
+      table: 'Table',
+      addRowAbove: 'Add row above',
+      addRowBelow: 'Add row below',
+      addColLeft: 'Add column left',
+      addColRight: 'Add column right',
+      delRow: 'Delete row',
+      delCol: 'Delete column',
+      delTable: 'Delete table'
+    },
+    hr: {
+      insert: 'Insert Horizontal Rule'
+    },
+    style: {
+      style: 'Style',
+      p: 'Normal',
+      blockquote: 'Quote',
+      pre: 'Code',
+      h1: 'Header 1',
+      h2: 'Header 2',
+      h3: 'Header 3',
+      h4: 'Header 4',
+      h5: 'Header 5',
+      h6: 'Header 6'
+    },
+    lists: {
+      unordered: 'Unordered list',
+      ordered: 'Ordered list'
+    },
+    options: {
+      help: 'Help',
+      fullscreen: 'Full Screen',
+      codeview: 'Code View'
+    },
+    paragraph: {
+      paragraph: 'Paragraph',
+      outdent: 'Outdent',
+      indent: 'Indent',
+      left: 'Align left',
+      center: 'Align center',
+      right: 'Align right',
+      justify: 'Justify full'
+    },
+    color: {
+      recent: 'Recent Color',
+      more: 'More Color',
+      background: 'Background Color',
+      foreground: 'Text Color',
+      transparent: 'Transparent',
+      setTransparent: 'Set transparent',
+      reset: 'Reset',
+      resetToDefault: 'Reset to default',
+      cpSelect: 'Select'
+    },
+    shortcut: {
+      shortcuts: 'Keyboard shortcuts',
+      close: 'Close',
+      textFormatting: 'Text formatting',
+      action: 'Action',
+      paragraphFormatting: 'Paragraph formatting',
+      documentStyle: 'Document Style',
+      extraKeys: 'Extra keys'
+    },
+    help: {
+      'escape': 'Escape',
+      'insertParagraph': 'Insert Paragraph',
+      'undo': 'Undo the last command',
+      'redo': 'Redo the last command',
+      'tab': 'Tab',
+      'untab': 'Untab',
+      'bold': 'Set a bold style',
+      'italic': 'Set a italic style',
+      'underline': 'Set a underline style',
+      'strikethrough': 'Set a strikethrough style',
+      'removeFormat': 'Clean a style',
+      'justifyLeft': 'Set left align',
+      'justifyCenter': 'Set center align',
+      'justifyRight': 'Set right align',
+      'justifyFull': 'Set full align',
+      'insertUnorderedList': 'Toggle unordered list',
+      'insertOrderedList': 'Toggle ordered list',
+      'outdent': 'Outdent on current paragraph',
+      'indent': 'Indent on current paragraph',
+      'formatPara': 'Change current block\'s format as a paragraph(P tag)',
+      'formatH1': 'Change current block\'s format as H1',
+      'formatH2': 'Change current block\'s format as H2',
+      'formatH3': 'Change current block\'s format as H3',
+      'formatH4': 'Change current block\'s format as H4',
+      'formatH5': 'Change current block\'s format as H5',
+      'formatH6': 'Change current block\'s format as H6',
+      'insertHorizontalRule': 'Insert horizontal rule',
+      'linkDialog.show': 'Show Link Dialog'
+    },
+    history: {
+      undo: 'Undo',
+      redo: 'Redo'
+    },
+    specialChar: {
+      specialChar: 'SPECIAL CHARACTERS',
+      select: 'Select Special characters'
+    },
+    output: {
+      noSelection: 'No Selection Made!'
+    }
+  }
+});
+
+/***/ }),
+
+/***/ 1145:
+/***/ ((module) => {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;
+
+/***/ })
+
+/******/ 	});
+/************************************************************************/
+/******/ 	// The module cache
+/******/ 	var __webpack_module_cache__ = {};
+/******/ 	
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/ 		// Check if module is in cache
+/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
+/******/ 		if (cachedModule !== undefined) {
+/******/ 			return cachedModule.exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = __webpack_module_cache__[moduleId] = {
+/******/ 			// no module.id needed
+/******/ 			// no module.loaded needed
+/******/ 			exports: {}
+/******/ 		};
+/******/ 	
+/******/ 		// Execute the module function
+/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/ 	
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/compat get default export */
+/******/ 	(() => {
+/******/ 		// getDefaultExport function for compatibility with non-harmony modules
+/******/ 		__webpack_require__.n = (module) => {
+/******/ 			var getter = module && module.__esModule ?
+/******/ 				() => (module['default']) :
+/******/ 				() => (module);
+/******/ 			__webpack_require__.d(getter, { a: getter });
+/******/ 			return getter;
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	(() => {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = (exports, definition) => {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	(() => {
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/make namespace object */
+/******/ 	(() => {
+/******/ 		// define __esModule on exports
+/******/ 		__webpack_require__.r = (exports) => {
+/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 			}
+/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+// ESM COMPAT FLAG
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: external "jQuery"
+var external_jQuery_ = __webpack_require__(1145);
+var external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_);
+// EXTERNAL MODULE: ./src/lang/summernote-en-US.js
+var summernote_en_US = __webpack_require__(9770);
+;// CONCATENATED MODULE: ./src/js/core/env.js
+
+/**
+ * returns whether font is installed or not.
+ *
+ * @param {String} fontName
+ * @return {Boolean}
+ */
+
+var genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];
+
+function validFontName(fontName) {
+  return external_jQuery_default().inArray(fontName.toLowerCase(), genericFontFamilies) === -1 ? "'".concat(fontName, "'") : fontName;
+}
+
+function isFontInstalled(fontName) {
+  var testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';
+  var testText = 'mmmmmmmmmmwwwww';
+  var testSize = '200px';
+  var canvas = document.createElement('canvas');
+  var context = canvas.getContext('2d');
+  context.font = testSize + " '" + testFontName + "'";
+  var originalWidth = context.measureText(testText).width;
+  context.font = testSize + ' ' + validFontName(fontName) + ', "' + testFontName + '"';
+  var width = context.measureText(testText).width;
+  return originalWidth !== width;
+}
+
+var userAgent = navigator.userAgent;
+var isMSIE = /MSIE|Trident/i.test(userAgent);
+var browserVersion;
+
+if (isMSIE) {
+  var matches = /MSIE (\d+[.]\d+)/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+
+  matches = /Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);
+
+  if (matches) {
+    browserVersion = parseFloat(matches[1]);
+  }
+}
+
+var isEdge = /Edge\/\d+/.test(userAgent);
+var isSupportTouch = 'ontouchstart' in window || navigator.MaxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; // [workaround] IE doesn't have input events for contentEditable
+// - see: https://goo.gl/4bfIvA
+
+var inputEventName = isMSIE ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';
+/**
+ * @class core.env
+ *
+ * Object which check platform and agent
+ *
+ * @singleton
+ * @alternateClassName env
+ */
+
+/* harmony default export */ const env = ({
+  isMac: navigator.appVersion.indexOf('Mac') > -1,
+  isMSIE: isMSIE,
+  isEdge: isEdge,
+  isFF: !isEdge && /firefox/i.test(userAgent),
+  isPhantom: /PhantomJS/i.test(userAgent),
+  isWebkit: !isEdge && /webkit/i.test(userAgent),
+  isChrome: !isEdge && /chrome/i.test(userAgent),
+  isSafari: !isEdge && /safari/i.test(userAgent) && !/chrome/i.test(userAgent),
+  browserVersion: browserVersion,
+  isSupportTouch: isSupportTouch,
+  isFontInstalled: isFontInstalled,
+  isW3CRangeSupport: !!document.createRange,
+  inputEventName: inputEventName,
+  genericFontFamilies: genericFontFamilies,
+  validFontName: validFontName
+});
+;// CONCATENATED MODULE: ./src/js/core/func.js
+
+/**
+ * @class core.func
+ *
+ * func utils (for high-order func's arg)
+ *
+ * @singleton
+ * @alternateClassName func
+ */
+
+function eq(itemA) {
+  return function (itemB) {
+    return itemA === itemB;
+  };
+}
+
+function eq2(itemA, itemB) {
+  return itemA === itemB;
+}
+
+function peq2(propName) {
+  return function (itemA, itemB) {
+    return itemA[propName] === itemB[propName];
+  };
+}
+
+function ok() {
+  return true;
+}
+
+function fail() {
+  return false;
+}
+
+function not(f) {
+  return function () {
+    return !f.apply(f, arguments);
+  };
+}
+
+function and(fA, fB) {
+  return function (item) {
+    return fA(item) && fB(item);
+  };
+}
+
+function func_self(a) {
+  return a;
+}
+
+function invoke(obj, method) {
+  return function () {
+    return obj[method].apply(obj, arguments);
+  };
+}
+
+var idCounter = 0;
+/**
+ * reset globally-unique id
+ *
+ */
+
+function resetUniqueId() {
+  idCounter = 0;
+}
+/**
+ * generate a globally-unique id
+ *
+ * @param {String} [prefix]
+ */
+
+
+function uniqueId(prefix) {
+  var id = ++idCounter + '';
+  return prefix ? prefix + id : id;
+}
+/**
+ * returns bnd (bounds) from rect
+ *
+ * - IE Compatibility Issue: http://goo.gl/sRLOAo
+ * - Scroll Issue: http://goo.gl/sNjUc
+ *
+ * @param {Rect} rect
+ * @return {Object} bounds
+ * @return {Number} bounds.top
+ * @return {Number} bounds.left
+ * @return {Number} bounds.width
+ * @return {Number} bounds.height
+ */
+
+
+function rect2bnd(rect) {
+  var $document = external_jQuery_default()(document);
+  return {
+    top: rect.top + $document.scrollTop(),
+    left: rect.left + $document.scrollLeft(),
+    width: rect.right - rect.left,
+    height: rect.bottom - rect.top
+  };
+}
+/**
+ * returns a copy of the object where the keys have become the values and the values the keys.
+ * @param {Object} obj
+ * @return {Object}
+ */
+
+
+function invertObject(obj) {
+  var inverted = {};
+
+  for (var key in obj) {
+    if (Object.prototype.hasOwnProperty.call(obj, key)) {
+      inverted[obj[key]] = key;
+    }
+  }
+
+  return inverted;
+}
+/**
+ * @param {String} namespace
+ * @param {String} [prefix]
+ * @return {String}
+ */
+
+
+function namespaceToCamel(namespace, prefix) {
+  prefix = prefix || '';
+  return prefix + namespace.split('.').map(function (name) {
+    return name.substring(0, 1).toUpperCase() + name.substring(1);
+  }).join('');
+}
+/**
+ * Returns a function, that, as long as it continues to be invoked, will not
+ * be triggered. The function will be called after it stops being called for
+ * N milliseconds. If `immediate` is passed, trigger the function on the
+ * leading edge, instead of the trailing.
+ * @param {Function} func
+ * @param {Number} wait
+ * @param {Boolean} immediate
+ * @return {Function}
+ */
+
+
+function debounce(func, wait, immediate) {
+  var timeout;
+  return function () {
+    var context = this;
+    var args = arguments;
+
+    var later = function later() {
+      timeout = null;
+
+      if (!immediate) {
+        func.apply(context, args);
+      }
+    };
+
+    var callNow = immediate && !timeout;
+    clearTimeout(timeout);
+    timeout = setTimeout(later, wait);
+
+    if (callNow) {
+      func.apply(context, args);
+    }
+  };
+}
+/**
+ *
+ * @param {String} url
+ * @return {Boolean}
+ */
+
+
+function isValidUrl(url) {
+  var expression = /[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
+  return expression.test(url);
+}
+
+/* harmony default export */ const func = ({
+  eq: eq,
+  eq2: eq2,
+  peq2: peq2,
+  ok: ok,
+  fail: fail,
+  self: func_self,
+  not: not,
+  and: and,
+  invoke: invoke,
+  resetUniqueId: resetUniqueId,
+  uniqueId: uniqueId,
+  rect2bnd: rect2bnd,
+  invertObject: invertObject,
+  namespaceToCamel: namespaceToCamel,
+  debounce: debounce,
+  isValidUrl: isValidUrl
+});
+;// CONCATENATED MODULE: ./src/js/core/lists.js
+
+/**
+ * returns the first item of an array.
+ *
+ * @param {Array} array
+ */
+
+function head(array) {
+  return array[0];
+}
+/**
+ * returns the last item of an array.
+ *
+ * @param {Array} array
+ */
+
+
+function last(array) {
+  return array[array.length - 1];
+}
+/**
+ * returns everything but the last entry of the array.
+ *
+ * @param {Array} array
+ */
+
+
+function initial(array) {
+  return array.slice(0, array.length - 1);
+}
+/**
+ * returns the rest of the items in an array.
+ *
+ * @param {Array} array
+ */
+
+
+function tail(array) {
+  return array.slice(1);
+}
+/**
+ * returns item of array
+ */
+
+
+function find(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    var item = array[idx];
+
+    if (pred(item)) {
+      return item;
+    }
+  }
+}
+/**
+ * returns true if all of the values in the array pass the predicate truth test.
+ */
+
+
+function lists_all(array, pred) {
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!pred(array[idx])) {
+      return false;
+    }
+  }
+
+  return true;
+}
+/**
+ * returns true if the value is present in the list.
+ */
+
+
+function contains(array, item) {
+  if (array && array.length && item) {
+    if (array.indexOf) {
+      return array.indexOf(item) !== -1;
+    } else if (array.contains) {
+      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`
+      return array.contains(item);
+    }
+  }
+
+  return false;
+}
+/**
+ * get sum from a list
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - iterator
+ */
+
+
+function sum(array, fn) {
+  fn = fn || func.self;
+  return array.reduce(function (memo, v) {
+    return memo + fn(v);
+  }, 0);
+}
+/**
+ * returns a copy of the collection with array type.
+ * @param {Collection} collection - collection eg) node.childNodes, ...
+ */
+
+
+function from(collection) {
+  var result = [];
+  var length = collection.length;
+  var idx = -1;
+
+  while (++idx < length) {
+    result[idx] = collection[idx];
+  }
+
+  return result;
+}
+/**
+ * returns whether list is empty or not
+ */
+
+
+function isEmpty(array) {
+  return !array || !array.length;
+}
+/**
+ * cluster elements by predicate function.
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ * @param {Array[]}
+ */
+
+
+function clusterBy(array, fn) {
+  if (!array.length) {
+    return [];
+  }
+
+  var aTail = tail(array);
+  return aTail.reduce(function (memo, v) {
+    var aLast = last(memo);
+
+    if (fn(last(aLast), v)) {
+      aLast[aLast.length] = v;
+    } else {
+      memo[memo.length] = [v];
+    }
+
+    return memo;
+  }, [[head(array)]]);
+}
+/**
+ * returns a copy of the array with all false values removed
+ *
+ * @param {Array} array - array
+ * @param {Function} fn - predicate function for cluster rule
+ */
+
+
+function compact(array) {
+  var aResult = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (array[idx]) {
+      aResult.push(array[idx]);
+    }
+  }
+
+  return aResult;
+}
+/**
+ * produces a duplicate-free version of the array
+ *
+ * @param {Array} array
+ */
+
+
+function unique(array) {
+  var results = [];
+
+  for (var idx = 0, len = array.length; idx < len; idx++) {
+    if (!contains(results, array[idx])) {
+      results.push(array[idx]);
+    }
+  }
+
+  return results;
+}
+/**
+ * returns next item.
+ * @param {Array} array
+ */
+
+
+function next(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx + 1];
+  }
+
+  return null;
+}
+/**
+ * returns prev item.
+ * @param {Array} array
+ */
+
+
+function prev(array, item) {
+  if (array && array.length && item) {
+    var idx = array.indexOf(item);
+    return idx === -1 ? null : array[idx - 1];
+  }
+
+  return null;
+}
+/**
+ * @class core.list
+ *
+ * list utils
+ *
+ * @singleton
+ * @alternateClassName list
+ */
+
+
+/* harmony default export */ const lists = ({
+  head: head,
+  last: last,
+  initial: initial,
+  tail: tail,
+  prev: prev,
+  next: next,
+  find: find,
+  contains: contains,
+  all: lists_all,
+  sum: sum,
+  from: from,
+  isEmpty: isEmpty,
+  clusterBy: clusterBy,
+  compact: compact,
+  unique: unique
+});
+;// CONCATENATED MODULE: ./src/js/core/dom.js
+
+
+
+
+var NBSP_CHAR = String.fromCharCode(160);
+var ZERO_WIDTH_NBSP_CHAR = "\uFEFF";
+/**
+ * @method isEditable
+ *
+ * returns whether node is `note-editable` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+function isEditable(node) {
+  return node && external_jQuery_default()(node).hasClass('note-editable');
+}
+/**
+ * @method isControlSizing
+ *
+ * returns whether node is `note-control-sizing` or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function isControlSizing(node) {
+  return node && external_jQuery_default()(node).hasClass('note-control-sizing');
+}
+/**
+ * @method makePredByNodeName
+ *
+ * returns predicate which judge whether nodeName is same
+ *
+ * @param {String} nodeName
+ * @return {Function}
+ */
+
+
+function makePredByNodeName(nodeName) {
+  nodeName = nodeName.toUpperCase();
+  return function (node) {
+    return node && node.nodeName.toUpperCase() === nodeName;
+  };
+}
+/**
+ * @method isText
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is text(3)
+ */
+
+
+function isText(node) {
+  return node && node.nodeType === 3;
+}
+/**
+ * @method isElement
+ *
+ *
+ *
+ * @param {Node} node
+ * @return {Boolean} true if node's type is element(1)
+ */
+
+
+function isElement(node) {
+  return node && node.nodeType === 1;
+}
+/**
+ * ex) br, col, embed, hr, img, input, ...
+ * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements
+ */
+
+
+function isVoid(node) {
+  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());
+}
+
+function isPara(node) {
+  if (isEditable(node)) {
+    return false;
+  } // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph
+
+
+  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+function isHeading(node) {
+  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());
+}
+
+var isPre = makePredByNodeName('PRE');
+var isLi = makePredByNodeName('LI');
+
+function isPurePara(node) {
+  return isPara(node) && !isLi(node);
+}
+
+var isTable = makePredByNodeName('TABLE');
+var isData = makePredByNodeName('DATA');
+
+function isInline(node) {
+  return !isBodyContainer(node) && !isList(node) && !isHr(node) && !isPara(node) && !isTable(node) && !isBlockquote(node) && !isData(node);
+}
+
+function isList(node) {
+  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());
+}
+
+var isHr = makePredByNodeName('HR');
+
+function isCell(node) {
+  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());
+}
+
+var isBlockquote = makePredByNodeName('BLOCKQUOTE');
+
+function isBodyContainer(node) {
+  return isCell(node) || isBlockquote(node) || isEditable(node);
+}
+
+var isAnchor = makePredByNodeName('A');
+
+function isParaInline(node) {
+  return isInline(node) && !!ancestor(node, isPara);
+}
+
+function isBodyInline(node) {
+  return isInline(node) && !ancestor(node, isPara);
+}
+
+var isBody = makePredByNodeName('BODY');
+/**
+ * returns whether nodeB is closest sibling of nodeA
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ * @return {Boolean}
+ */
+
+function isClosestSibling(nodeA, nodeB) {
+  return nodeA.nextSibling === nodeB || nodeA.previousSibling === nodeB;
+}
+/**
+ * returns array of closest siblings with node
+ *
+ * @param {Node} node
+ * @param {function} [pred] - predicate function
+ * @return {Node[]}
+ */
+
+
+function withClosestSiblings(node, pred) {
+  pred = pred || func.ok;
+  var siblings = [];
+
+  if (node.previousSibling && pred(node.previousSibling)) {
+    siblings.push(node.previousSibling);
+  }
+
+  siblings.push(node);
+
+  if (node.nextSibling && pred(node.nextSibling)) {
+    siblings.push(node.nextSibling);
+  }
+
+  return siblings;
+}
+/**
+ * blank HTML for cursor position
+ * - [workaround] old IE only works with &nbsp;
+ * - [workaround] IE11 and other browser works with bogus br
+ */
+
+
+var blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';
+/**
+ * @method nodeLength
+ *
+ * returns #text's text size or element's childNodes size
+ *
+ * @param {Node} node
+ */
+
+function nodeLength(node) {
+  if (isText(node)) {
+    return node.nodeValue.length;
+  }
+
+  if (node) {
+    return node.childNodes.length;
+  }
+
+  return 0;
+}
+/**
+ * returns whether deepest child node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function deepestChildIsEmpty(node) {
+  do {
+    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;
+  } while (node = node.firstElementChild);
+
+  return dom_isEmpty(node);
+}
+/**
+ * returns whether node is empty or not.
+ *
+ * @param {Node} node
+ * @return {Boolean}
+ */
+
+
+function dom_isEmpty(node) {
+  var len = nodeLength(node);
+
+  if (len === 0) {
+    return true;
+  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {
+    // ex) <p><br></p>, <span><br></span>
+    return true;
+  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {
+    // ex) <p></p>, <span></span>
+    return true;
+  }
+
+  return false;
+}
+/**
+ * padding blankHTML if node is empty (for cursor position)
+ */
+
+
+function paddingBlankHTML(node) {
+  if (!isVoid(node) && !nodeLength(node)) {
+    node.innerHTML = blankHTML;
+  }
+}
+/**
+ * find nearest ancestor predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function ancestor(node, pred) {
+  while (node) {
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * find nearest ancestor only single child blood line and predicate hit
+ *
+ * @param {Node} node
+ * @param {Function} pred - predicate function
+ */
+
+
+function singleChildAncestor(node, pred) {
+  node = node.parentNode;
+
+  while (node) {
+    if (nodeLength(node) !== 1) {
+      break;
+    }
+
+    if (pred(node)) {
+      return node;
+    }
+
+    if (isEditable(node)) {
+      break;
+    }
+
+    node = node.parentNode;
+  }
+
+  return null;
+}
+/**
+ * returns new array of ancestor nodes (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listAncestor(node, pred) {
+  pred = pred || func.fail;
+  var ancestors = [];
+  ancestor(node, function (el) {
+    if (!isEditable(el)) {
+      ancestors.push(el);
+    }
+
+    return pred(el);
+  });
+  return ancestors;
+}
+/**
+ * find farthest ancestor predicate hit
+ */
+
+
+function lastAncestor(node, pred) {
+  var ancestors = listAncestor(node);
+  return lists.last(ancestors.filter(pred));
+}
+/**
+ * returns common ancestor node between two nodes.
+ *
+ * @param {Node} nodeA
+ * @param {Node} nodeB
+ */
+
+
+function commonAncestor(nodeA, nodeB) {
+  var ancestors = listAncestor(nodeA);
+
+  for (var n = nodeB; n; n = n.parentNode) {
+    if (ancestors.indexOf(n) > -1) return n;
+  }
+
+  return null; // difference document area
+}
+/**
+ * listing all previous siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [optional] pred - predicate function
+ */
+
+
+function listPrev(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.previousSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing next siblings (until predicate hit).
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listNext(node, pred) {
+  pred = pred || func.fail;
+  var nodes = [];
+
+  while (node) {
+    if (pred(node)) {
+      break;
+    }
+
+    nodes.push(node);
+    node = node.nextSibling;
+  }
+
+  return nodes;
+}
+/**
+ * listing descendant nodes
+ *
+ * @param {Node} node
+ * @param {Function} [pred] - predicate function
+ */
+
+
+function listDescendant(node, pred) {
+  var descendants = [];
+  pred = pred || func.ok; // start DFS(depth first search) with node
+
+  (function fnWalk(current) {
+    if (node !== current && pred(current)) {
+      descendants.push(current);
+    }
+
+    for (var idx = 0, len = current.childNodes.length; idx < len; idx++) {
+      fnWalk(current.childNodes[idx]);
+    }
+  })(node);
+
+  return descendants;
+}
+/**
+ * wrap node with new tag.
+ *
+ * @param {Node} node
+ * @param {Node} tagName of wrapper
+ * @return {Node} - wrapper
+ */
+
+
+function wrap(node, wrapperName) {
+  var parent = node.parentNode;
+  var wrapper = external_jQuery_default()('<' + wrapperName + '>')[0];
+  parent.insertBefore(wrapper, node);
+  wrapper.appendChild(node);
+  return wrapper;
+}
+/**
+ * insert node after preceding
+ *
+ * @param {Node} node
+ * @param {Node} preceding - predicate function
+ */
+
+
+function insertAfter(node, preceding) {
+  var next = preceding.nextSibling;
+  var parent = preceding.parentNode;
+
+  if (next) {
+    parent.insertBefore(node, next);
+  } else {
+    parent.appendChild(node);
+  }
+
+  return node;
+}
+/**
+ * append elements.
+ *
+ * @param {Node} node
+ * @param {Collection} aChild
+ */
+
+
+function appendChildNodes(node, aChild) {
+  external_jQuery_default().each(aChild, function (idx, child) {
+    node.appendChild(child);
+  });
+  return node;
+}
+/**
+ * returns whether boundaryPoint is left edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePoint(point) {
+  return point.offset === 0;
+}
+/**
+ * returns whether boundaryPoint is right edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePoint(point) {
+  return point.offset === nodeLength(point.node);
+}
+/**
+ * returns whether boundaryPoint is edge or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isEdgePoint(point) {
+  return isLeftEdgePoint(point) || isRightEdgePoint(point);
+}
+/**
+ * returns whether node is left edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgeOf(node, ancestor) {
+  while (node && node !== ancestor) {
+    if (position(node) !== 0) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether node is right edge of ancestor or not.
+ *
+ * @param {Node} node
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgeOf(node, ancestor) {
+  if (!ancestor) {
+    return false;
+  }
+
+  while (node && node !== ancestor) {
+    if (position(node) !== nodeLength(node.parentNode) - 1) {
+      return false;
+    }
+
+    node = node.parentNode;
+  }
+
+  return true;
+}
+/**
+ * returns whether point is left edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isLeftEdgePointOf(point, ancestor) {
+  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);
+}
+/**
+ * returns whether point is right edge of ancestor or not.
+ * @param {BoundaryPoint} point
+ * @param {Node} ancestor
+ * @return {Boolean}
+ */
+
+
+function isRightEdgePointOf(point, ancestor) {
+  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);
+}
+/**
+ * returns offset from parent.
+ *
+ * @param {Node} node
+ */
+
+
+function position(node) {
+  var offset = 0;
+
+  while (node = node.previousSibling) {
+    offset += 1;
+  }
+
+  return offset;
+}
+
+function hasChildren(node) {
+  return !!(node && node.childNodes && node.childNodes.length);
+}
+/**
+ * returns previous boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPoint(point, isSkipInnerOffset) {
+  var node;
+  var offset;
+
+  if (point.offset === 0) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node);
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset - 1];
+    offset = nodeLength(node);
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? 0 : point.offset - 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPoint(point, isSkipInnerOffset) {
+  var node, offset;
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    var nextTextNode = getNextTextNode(point.node);
+
+    if (nextTextNode) {
+      node = nextTextNode;
+      offset = 0;
+    } else {
+      node = point.node.parentNode;
+      offset = position(point.node) + 1;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/**
+ * returns next boundaryPoint with empty node
+ *
+ * @param {BoundaryPoint} point
+ * @param {Boolean} isSkipInnerOffset
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointWithEmptyNode(point, isSkipInnerOffset) {
+  var node,
+      offset = 0; // if node is empty string node, return current node's sibling.
+
+  if (dom_isEmpty(point.node)) {
+    if (point.node === null) {
+      return null;
+    }
+
+    node = point.node.nextSibling;
+    offset = 0;
+    return {
+      node: node,
+      offset: offset
+    };
+  }
+
+  if (nodeLength(point.node) === point.offset) {
+    if (isEditable(point.node)) {
+      return null;
+    }
+
+    node = point.node.parentNode;
+    offset = position(point.node) + 1; // if next node is editable ,  return current node's sibling node.
+
+    if (isEditable(node)) {
+      node = point.node.nextSibling;
+      offset = 0;
+    }
+  } else if (hasChildren(point.node)) {
+    node = point.node.childNodes[point.offset];
+    offset = 0;
+
+    if (dom_isEmpty(node)) {
+      if (!dom_isEmpty(point.node.nextSibling)) {
+        return {
+          node: point.node.nextSibling,
+          offset: offset
+        };
+      }
+
+      return null;
+    }
+  } else {
+    node = point.node;
+    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;
+
+    if (dom_isEmpty(node)) {
+      return null;
+    }
+  }
+
+  return {
+    node: node,
+    offset: offset
+  };
+}
+/*
+* returns the next Text node index or 0 if not found.
+*/
+
+
+function getNextTextNode(actual) {
+  if (!actual.nextSibling) return undefined;
+  if (actual.parent !== actual.nextSibling.parent) return undefined;
+  if (isText(actual.nextSibling)) return actual.nextSibling;else return getNextTextNode(actual.nextSibling);
+}
+/**
+ * returns whether pointA and pointB is same or not.
+ *
+ * @param {BoundaryPoint} pointA
+ * @param {BoundaryPoint} pointB
+ * @return {Boolean}
+ */
+
+
+function isSamePoint(pointA, pointB) {
+  return pointA.node === pointB.node && pointA.offset === pointB.offset;
+}
+/**
+ * returns whether point is visible (can set cursor) or not.
+ *
+ * @param {BoundaryPoint} point
+ * @return {Boolean}
+ */
+
+
+function isVisiblePoint(point) {
+  if (isText(point.node) || !hasChildren(point.node) || dom_isEmpty(point.node)) {
+    return true;
+  }
+
+  var leftNode = point.node.childNodes[point.offset - 1];
+  var rightNode = point.node.childNodes[point.offset];
+
+  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {
+    return true;
+  }
+
+  return false;
+}
+/**
+ * @method prevPointUtil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function prevPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = prevPoint(point);
+  }
+
+  return null;
+}
+/**
+ * @method nextPointUntil
+ *
+ * @param {BoundaryPoint} point
+ * @param {Function} pred
+ * @return {BoundaryPoint}
+ */
+
+
+function nextPointUntil(point, pred) {
+  while (point) {
+    if (pred(point)) {
+      return point;
+    }
+
+    point = nextPoint(point);
+  }
+
+  return null;
+}
+/**
+ * returns whether point has character or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isCharPoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch && ch !== ' ' && ch !== NBSP_CHAR;
+}
+/**
+ * returns whether point has space or not.
+ *
+ * @param {Point} point
+ * @return {Boolean}
+ */
+
+
+function isSpacePoint(point) {
+  if (!isText(point.node)) {
+    return false;
+  }
+
+  var ch = point.node.nodeValue.charAt(point.offset - 1);
+  return ch === ' ' || ch === NBSP_CHAR;
+}
+/**
+ * @method walkPoint
+ *
+ * @param {BoundaryPoint} startPoint
+ * @param {BoundaryPoint} endPoint
+ * @param {Function} handler
+ * @param {Boolean} isSkipInnerOffset
+ */
+
+
+function walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {
+  var point = startPoint;
+
+  while (point) {
+    handler(point);
+
+    if (isSamePoint(point, endPoint)) {
+      break;
+    }
+
+    var isSkipOffset = isSkipInnerOffset && startPoint.node !== point.node && endPoint.node !== point.node;
+    point = nextPointWithEmptyNode(point, isSkipOffset);
+  }
+}
+/**
+ * @method makeOffsetPath
+ *
+ * return offsetPath(array of offset) from ancestor
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {Node} node
+ */
+
+
+function makeOffsetPath(ancestor, node) {
+  var ancestors = listAncestor(node, func.eq(ancestor));
+  return ancestors.map(position).reverse();
+}
+/**
+ * @method fromOffsetPath
+ *
+ * return element from offsetPath(array of offset)
+ *
+ * @param {Node} ancestor - ancestor node
+ * @param {array} offsets - offsetPath
+ */
+
+
+function fromOffsetPath(ancestor, offsets) {
+  var current = ancestor;
+
+  for (var i = 0, len = offsets.length; i < len; i++) {
+    if (current.childNodes.length <= offsets[i]) {
+      current = current.childNodes[current.childNodes.length - 1];
+    } else {
+      current = current.childNodes[offsets[i]];
+    }
+  }
+
+  return current;
+}
+/**
+ * @method splitNode
+ *
+ * split element or #text
+ *
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @param {Boolean} [options.isDiscardEmptySplits] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitNode(point, options) {
+  var isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;
+  var isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;
+  var isDiscardEmptySplits = options && options.isDiscardEmptySplits;
+
+  if (isDiscardEmptySplits) {
+    isSkipPaddingBlankHTML = true;
+  } // edge case
+
+
+  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {
+    if (isLeftEdgePoint(point)) {
+      return point.node;
+    } else if (isRightEdgePoint(point)) {
+      return point.node.nextSibling;
+    }
+  } // split #text
+
+
+  if (isText(point.node)) {
+    return point.node.splitText(point.offset);
+  } else {
+    var childNode = point.node.childNodes[point.offset];
+    var clone = insertAfter(point.node.cloneNode(false), point.node);
+    appendChildNodes(clone, listNext(childNode));
+
+    if (!isSkipPaddingBlankHTML) {
+      paddingBlankHTML(point.node);
+      paddingBlankHTML(clone);
+    }
+
+    if (isDiscardEmptySplits) {
+      if (dom_isEmpty(point.node)) {
+        remove(point.node);
+      }
+
+      if (dom_isEmpty(clone)) {
+        remove(clone);
+        return point.node.nextSibling;
+      }
+    }
+
+    return clone;
+  }
+}
+/**
+ * @method splitTree
+ *
+ * split tree by point
+ *
+ * @param {Node} root - split root
+ * @param {BoundaryPoint} point
+ * @param {Object} [options]
+ * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false
+ * @param {Boolean} [options.isNotSplitEdgePoint] - default: false
+ * @return {Node} right node of boundaryPoint
+ */
+
+
+function splitTree(root, point, options) {
+  // ex) [#text, <span>, <p>]
+  var ancestors = listAncestor(point.node, func.eq(root));
+
+  if (!ancestors.length) {
+    return null;
+  } else if (ancestors.length === 1) {
+    return splitNode(point, options);
+  }
+
+  return ancestors.reduce(function (node, parent) {
+    if (node === point.node) {
+      node = splitNode(point, options);
+    }
+
+    return splitNode({
+      node: parent,
+      offset: node ? position(node) : nodeLength(parent)
+    }, options);
+  });
+}
+/**
+ * split point
+ *
+ * @param {Point} point
+ * @param {Boolean} isInline
+ * @return {Object}
+ */
+
+
+function splitPoint(point, isInline) {
+  // find splitRoot, container
+  //  - inline: splitRoot is a child of paragraph
+  //  - block: splitRoot is a child of bodyContainer
+  var pred = isInline ? isPara : isBodyContainer;
+  var ancestors = listAncestor(point.node, pred);
+  var topAncestor = lists.last(ancestors) || point.node;
+  var splitRoot, container;
+
+  if (pred(topAncestor)) {
+    splitRoot = ancestors[ancestors.length - 2];
+    container = topAncestor;
+  } else {
+    splitRoot = topAncestor;
+    container = splitRoot.parentNode;
+  } // if splitRoot is exists, split with splitTree
+
+
+  var pivot = splitRoot && splitTree(splitRoot, point, {
+    isSkipPaddingBlankHTML: isInline,
+    isNotSplitEdgePoint: isInline
+  }); // if container is point.node, find pivot with point.offset
+
+  if (!pivot && container === point.node) {
+    pivot = point.node.childNodes[point.offset];
+  }
+
+  return {
+    rightNode: pivot,
+    container: container
+  };
+}
+
+function create(nodeName) {
+  return document.createElement(nodeName);
+}
+
+function createText(text) {
+  return document.createTextNode(text);
+}
+/**
+ * @method remove
+ *
+ * remove node, (isRemoveChild: remove child or not)
+ *
+ * @param {Node} node
+ * @param {Boolean} isRemoveChild
+ */
+
+
+function remove(node, isRemoveChild) {
+  if (!node || !node.parentNode) {
+    return;
+  }
+
+  if (node.removeNode) {
+    return node.removeNode(isRemoveChild);
+  }
+
+  var parent = node.parentNode;
+
+  if (!isRemoveChild) {
+    var nodes = [];
+
+    for (var i = 0, len = node.childNodes.length; i < len; i++) {
+      nodes.push(node.childNodes[i]);
+    }
+
+    for (var _i = 0, _len = nodes.length; _i < _len; _i++) {
+      parent.insertBefore(nodes[_i], node);
+    }
+  }
+
+  parent.removeChild(node);
+}
+/**
+ * @method removeWhile
+ *
+ * @param {Node} node
+ * @param {Function} pred
+ */
+
+
+function removeWhile(node, pred) {
+  while (node) {
+    if (isEditable(node) || !pred(node)) {
+      break;
+    }
+
+    var parent = node.parentNode;
+    remove(node);
+    node = parent;
+  }
+}
+/**
+ * @method replace
+ *
+ * replace node with provided nodeName
+ *
+ * @param {Node} node
+ * @param {String} nodeName
+ * @return {Node} - new node
+ */
+
+
+function replace(node, nodeName) {
+  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {
+    return node;
+  }
+
+  var newNode = create(nodeName);
+
+  if (node.style.cssText) {
+    newNode.style.cssText = node.style.cssText;
+  }
+
+  appendChildNodes(newNode, lists.from(node.childNodes));
+  insertAfter(newNode, node);
+  remove(node);
+  return newNode;
+}
+
+var isTextarea = makePredByNodeName('TEXTAREA');
+/**
+ * @param {jQuery} $node
+ * @param {Boolean} [stripLinebreaks] - default: false
+ */
+
+function value($node, stripLinebreaks) {
+  var val = isTextarea($node[0]) ? $node.val() : $node.html();
+
+  if (stripLinebreaks) {
+    return val.replace(/[\n\r]/g, '');
+  }
+
+  return val;
+}
+/**
+ * @method html
+ *
+ * get the HTML contents of node
+ *
+ * @param {jQuery} $node
+ * @param {Boolean} [isNewlineOnBlock]
+ */
+
+
+function html($node, isNewlineOnBlock) {
+  var markup = value($node);
+
+  if (isNewlineOnBlock) {
+    var regexTag = /<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g;
+    markup = markup.replace(regexTag, function (match, endSlash, name) {
+      name = name.toUpperCase();
+      var isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) && !!endSlash;
+      var isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);
+      return match + (isEndOfInlineContainer || isBlockNode ? '\n' : '');
+    });
+    markup = markup.trim();
+  }
+
+  return markup;
+}
+
+function posFromPlaceholder(placeholder) {
+  var $placeholder = external_jQuery_default()(placeholder);
+  var pos = $placeholder.offset();
+  var height = $placeholder.outerHeight(true); // include margin
+
+  return {
+    left: pos.left,
+    top: pos.top + height
+  };
+}
+
+function attachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.on(key, events[key]);
+  });
+}
+
+function detachEvents($node, events) {
+  Object.keys(events).forEach(function (key) {
+    $node.off(key, events[key]);
+  });
+}
+/**
+ * @method isCustomStyleTag
+ *
+ * assert if a node contains a "note-styletag" class,
+ * which implies that's a custom-made style tag node
+ *
+ * @param {Node} an HTML DOM node
+ */
+
+
+function isCustomStyleTag(node) {
+  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');
+}
+
+/* harmony default export */ const dom = ({
+  /** @property {String} NBSP_CHAR */
+  NBSP_CHAR: NBSP_CHAR,
+
+  /** @property {String} ZERO_WIDTH_NBSP_CHAR */
+  ZERO_WIDTH_NBSP_CHAR: ZERO_WIDTH_NBSP_CHAR,
+
+  /** @property {String} blank */
+  blank: blankHTML,
+
+  /** @property {String} emptyPara */
+  emptyPara: "<p>".concat(blankHTML, "</p>"),
+  makePredByNodeName: makePredByNodeName,
+  isEditable: isEditable,
+  isControlSizing: isControlSizing,
+  isText: isText,
+  isElement: isElement,
+  isVoid: isVoid,
+  isPara: isPara,
+  isPurePara: isPurePara,
+  isHeading: isHeading,
+  isInline: isInline,
+  isBlock: func.not(isInline),
+  isBodyInline: isBodyInline,
+  isBody: isBody,
+  isParaInline: isParaInline,
+  isPre: isPre,
+  isList: isList,
+  isTable: isTable,
+  isData: isData,
+  isCell: isCell,
+  isBlockquote: isBlockquote,
+  isBodyContainer: isBodyContainer,
+  isAnchor: isAnchor,
+  isDiv: makePredByNodeName('DIV'),
+  isLi: isLi,
+  isBR: makePredByNodeName('BR'),
+  isSpan: makePredByNodeName('SPAN'),
+  isB: makePredByNodeName('B'),
+  isU: makePredByNodeName('U'),
+  isS: makePredByNodeName('S'),
+  isI: makePredByNodeName('I'),
+  isImg: makePredByNodeName('IMG'),
+  isTextarea: isTextarea,
+  deepestChildIsEmpty: deepestChildIsEmpty,
+  isEmpty: dom_isEmpty,
+  isEmptyAnchor: func.and(isAnchor, dom_isEmpty),
+  isClosestSibling: isClosestSibling,
+  withClosestSiblings: withClosestSiblings,
+  nodeLength: nodeLength,
+  isLeftEdgePoint: isLeftEdgePoint,
+  isRightEdgePoint: isRightEdgePoint,
+  isEdgePoint: isEdgePoint,
+  isLeftEdgeOf: isLeftEdgeOf,
+  isRightEdgeOf: isRightEdgeOf,
+  isLeftEdgePointOf: isLeftEdgePointOf,
+  isRightEdgePointOf: isRightEdgePointOf,
+  prevPoint: prevPoint,
+  nextPoint: nextPoint,
+  nextPointWithEmptyNode: nextPointWithEmptyNode,
+  isSamePoint: isSamePoint,
+  isVisiblePoint: isVisiblePoint,
+  prevPointUntil: prevPointUntil,
+  nextPointUntil: nextPointUntil,
+  isCharPoint: isCharPoint,
+  isSpacePoint: isSpacePoint,
+  walkPoint: walkPoint,
+  ancestor: ancestor,
+  singleChildAncestor: singleChildAncestor,
+  listAncestor: listAncestor,
+  lastAncestor: lastAncestor,
+  listNext: listNext,
+  listPrev: listPrev,
+  listDescendant: listDescendant,
+  commonAncestor: commonAncestor,
+  wrap: wrap,
+  insertAfter: insertAfter,
+  appendChildNodes: appendChildNodes,
+  position: position,
+  hasChildren: hasChildren,
+  makeOffsetPath: makeOffsetPath,
+  fromOffsetPath: fromOffsetPath,
+  splitTree: splitTree,
+  splitPoint: splitPoint,
+  create: create,
+  createText: createText,
+  remove: remove,
+  removeWhile: removeWhile,
+  replace: replace,
+  html: html,
+  value: value,
+  posFromPlaceholder: posFromPlaceholder,
+  attachEvents: attachEvents,
+  detachEvents: detachEvents,
+  isCustomStyleTag: isCustomStyleTag
+});
+;// CONCATENATED MODULE: ./src/js/Context.js
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Context = /*#__PURE__*/function () {
+  /**
+   * @param {jQuery} $note
+   * @param {Object} options
+   */
+  function Context($note, options) {
+    _classCallCheck(this, Context);
+
+    this.$note = $note;
+    this.memos = {};
+    this.modules = {};
+    this.layoutInfo = {};
+    this.options = external_jQuery_default().extend(true, {}, options); // init ui with options
+
+    (external_jQuery_default()).summernote.ui = external_jQuery_default().summernote.ui_template(this.options);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.initialize();
+  }
+  /**
+   * create layout and initialize modules and other resources
+   */
+
+
+  _createClass(Context, [{
+    key: "initialize",
+    value: function initialize() {
+      this.layoutInfo = this.ui.createLayout(this.$note);
+
+      this._initialize();
+
+      this.$note.hide();
+      return this;
+    }
+    /**
+     * destroy modules and other resources and remove layout
+     */
+
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this._destroy();
+
+      this.$note.removeData('summernote');
+      this.ui.removeLayout(this.$note, this.layoutInfo);
+    }
+    /**
+     * destory modules and other resources and initialize it again
+     */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      var disabled = this.isDisabled();
+      this.code(dom.emptyPara);
+
+      this._destroy();
+
+      this._initialize();
+
+      if (disabled) {
+        this.disable();
+      }
+    }
+  }, {
+    key: "_initialize",
+    value: function _initialize() {
+      var _this = this;
+
+      // set own id
+      this.options.id = func.uniqueId(external_jQuery_default().now()); // set default container for tooltips, popovers, and dialogs
+
+      this.options.container = this.options.container || this.layoutInfo.editor; // add optional buttons
+
+      var buttons = external_jQuery_default().extend({}, this.options.buttons);
+      Object.keys(buttons).forEach(function (key) {
+        _this.memo('button.' + key, buttons[key]);
+      });
+      var modules = external_jQuery_default().extend({}, this.options.modules, (external_jQuery_default()).summernote.plugins || {}); // add and initialize modules
+
+      Object.keys(modules).forEach(function (key) {
+        _this.module(key, modules[key], true);
+      });
+      Object.keys(this.modules).forEach(function (key) {
+        _this.initializeModule(key);
+      });
+    }
+  }, {
+    key: "_destroy",
+    value: function _destroy() {
+      var _this2 = this;
+
+      // destroy modules with reversed order
+      Object.keys(this.modules).reverse().forEach(function (key) {
+        _this2.removeModule(key);
+      });
+      Object.keys(this.memos).forEach(function (key) {
+        _this2.removeMemo(key);
+      }); // trigger custom onDestroy callback
+
+      this.triggerEvent('destroy', this);
+    }
+  }, {
+    key: "code",
+    value: function code(html) {
+      var isActivated = this.invoke('codeview.isActivated');
+
+      if (html === undefined) {
+        this.invoke('codeview.sync');
+        return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();
+      } else {
+        if (isActivated) {
+          this.invoke('codeview.sync', html);
+        } else {
+          this.layoutInfo.editable.html(html);
+        }
+
+        this.$note.val(html);
+        this.triggerEvent('change', html, this.layoutInfo.editable);
+      }
+    }
+  }, {
+    key: "isDisabled",
+    value: function isDisabled() {
+      return this.layoutInfo.editable.attr('contenteditable') === 'false';
+    }
+  }, {
+    key: "enable",
+    value: function enable() {
+      this.layoutInfo.editable.attr('contenteditable', true);
+      this.invoke('toolbar.activate', true);
+      this.triggerEvent('disable', false);
+      this.options.editing = true;
+    }
+  }, {
+    key: "disable",
+    value: function disable() {
+      // close codeview if codeview is opend
+      if (this.invoke('codeview.isActivated')) {
+        this.invoke('codeview.deactivate');
+      }
+
+      this.layoutInfo.editable.attr('contenteditable', false);
+      this.options.editing = false;
+      this.invoke('toolbar.deactivate', true);
+      this.triggerEvent('disable', true);
+    }
+  }, {
+    key: "triggerEvent",
+    value: function triggerEvent() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];
+
+      if (callback) {
+        callback.apply(this.$note[0], args);
+      }
+
+      this.$note.trigger('summernote.' + namespace, args);
+    }
+  }, {
+    key: "initializeModule",
+    value: function initializeModule(key) {
+      var module = this.modules[key];
+      module.shouldInitialize = module.shouldInitialize || func.ok;
+
+      if (!module.shouldInitialize()) {
+        return;
+      } // initialize module
+
+
+      if (module.initialize) {
+        module.initialize();
+      } // attach events
+
+
+      if (module.events) {
+        dom.attachEvents(this.$note, module.events);
+      }
+    }
+  }, {
+    key: "module",
+    value: function module(key, ModuleClass, withoutIntialize) {
+      if (arguments.length === 1) {
+        return this.modules[key];
+      }
+
+      this.modules[key] = new ModuleClass(this);
+
+      if (!withoutIntialize) {
+        this.initializeModule(key);
+      }
+    }
+  }, {
+    key: "removeModule",
+    value: function removeModule(key) {
+      var module = this.modules[key];
+
+      if (module.shouldInitialize()) {
+        if (module.events) {
+          dom.detachEvents(this.$note, module.events);
+        }
+
+        if (module.destroy) {
+          module.destroy();
+        }
+      }
+
+      delete this.modules[key];
+    }
+  }, {
+    key: "memo",
+    value: function memo(key, obj) {
+      if (arguments.length === 1) {
+        return this.memos[key];
+      }
+
+      this.memos[key] = obj;
+    }
+  }, {
+    key: "removeMemo",
+    value: function removeMemo(key) {
+      if (this.memos[key] && this.memos[key].destroy) {
+        this.memos[key].destroy();
+      }
+
+      delete this.memos[key];
+    }
+    /**
+     * Some buttons need to change their visual style immediately once they get pressed
+     */
+
+  }, {
+    key: "createInvokeHandlerAndUpdateState",
+    value: function createInvokeHandlerAndUpdateState(namespace, value) {
+      var _this3 = this;
+
+      return function (event) {
+        _this3.createInvokeHandler(namespace, value)(event);
+
+        _this3.invoke('buttons.updateCurrentStyle');
+      };
+    }
+  }, {
+    key: "createInvokeHandler",
+    value: function createInvokeHandler(namespace, value) {
+      var _this4 = this;
+
+      return function (event) {
+        event.preventDefault();
+        var $target = external_jQuery_default()(event.target);
+
+        _this4.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);
+      };
+    }
+  }, {
+    key: "invoke",
+    value: function invoke() {
+      var namespace = lists.head(arguments);
+      var args = lists.tail(lists.from(arguments));
+      var splits = namespace.split('.');
+      var hasSeparator = splits.length > 1;
+      var moduleName = hasSeparator && lists.head(splits);
+      var methodName = hasSeparator ? lists.last(splits) : lists.head(splits);
+      var module = this.modules[moduleName || 'editor'];
+
+      if (!moduleName && this[methodName]) {
+        return this[methodName].apply(this, args);
+      } else if (module && module[methodName] && module.shouldInitialize()) {
+        return module[methodName].apply(module, args);
+      }
+    }
+  }]);
+
+  return Context;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/summernote.js
+
+
+
+
+external_jQuery_default().fn.extend({
+  /**
+   * Summernote API
+   *
+   * @param {Object|String}
+   * @return {this}
+   */
+  summernote: function summernote() {
+    var type = external_jQuery_default().type(lists.head(arguments));
+    var isExternalAPICalled = type === 'string';
+    var hasInitOptions = type === 'object';
+    var options = external_jQuery_default().extend({}, (external_jQuery_default()).summernote.options, hasInitOptions ? lists.head(arguments) : {}); // Update options
+
+    options.langInfo = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.lang["en-US"], (external_jQuery_default()).summernote.lang[options.lang]);
+    options.icons = external_jQuery_default().extend(true, {}, (external_jQuery_default()).summernote.options.icons, options.icons);
+    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;
+    this.each(function (idx, note) {
+      var $note = external_jQuery_default()(note);
+
+      if (!$note.data('summernote')) {
+        var context = new Context($note, options);
+        $note.data('summernote', context);
+        $note.data('summernote').triggerEvent('init', context.layoutInfo);
+      }
+    });
+    var $note = this.first();
+
+    if ($note.length) {
+      var context = $note.data('summernote');
+
+      if (isExternalAPICalled) {
+        return context.invoke.apply(context, lists.from(arguments));
+      } else if (options.focus) {
+        context.invoke('editor.focus');
+      }
+    }
+
+    return this;
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/range.js
+function range_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function range_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function range_createClass(Constructor, protoProps, staticProps) { if (protoProps) range_defineProperties(Constructor.prototype, protoProps); if (staticProps) range_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+/**
+ * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js
+ *
+ * @param {TextRange} textRange
+ * @param {Boolean} isStart
+ * @return {BoundaryPoint}
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx
+ */
+
+function textRangeToPoint(textRange, isStart) {
+  var container = textRange.parentElement();
+  var offset;
+  var tester = document.body.createTextRange();
+  var prevContainer;
+  var childNodes = lists.from(container.childNodes);
+
+  for (offset = 0; offset < childNodes.length; offset++) {
+    if (dom.isText(childNodes[offset])) {
+      continue;
+    }
+
+    tester.moveToElementText(childNodes[offset]);
+
+    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {
+      break;
+    }
+
+    prevContainer = childNodes[offset];
+  }
+
+  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {
+    var textRangeStart = document.body.createTextRange();
+    var curTextNode = null;
+    textRangeStart.moveToElementText(prevContainer || container);
+    textRangeStart.collapse(!prevContainer);
+    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;
+    var pointTester = textRange.duplicate();
+    pointTester.setEndPoint('StartToStart', textRangeStart);
+    var textCount = pointTester.text.replace(/[\r\n]/g, '').length;
+
+    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    } // [workaround] enforce IE to re-reference curTextNode, hack
+
+
+    var dummy = curTextNode.nodeValue; // eslint-disable-line
+
+    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) && textCount === curTextNode.nodeValue.length) {
+      textCount -= curTextNode.nodeValue.length;
+      curTextNode = curTextNode.nextSibling;
+    }
+
+    container = curTextNode;
+    offset = textCount;
+  }
+
+  return {
+    cont: container,
+    offset: offset
+  };
+}
+/**
+ * return TextRange from boundary point (inspired by google closure-library)
+ * @param {BoundaryPoint} point
+ * @return {TextRange}
+ */
+
+
+function pointToTextRange(point) {
+  var textRangeInfo = function textRangeInfo(container, offset) {
+    var node, isCollapseToStart;
+
+    if (dom.isText(container)) {
+      var prevTextNodes = dom.listPrev(container, func.not(dom.isText));
+      var prevContainer = lists.last(prevTextNodes).previousSibling;
+      node = prevContainer || container.parentNode;
+      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);
+      isCollapseToStart = !prevContainer;
+    } else {
+      node = container.childNodes[offset] || container;
+
+      if (dom.isText(node)) {
+        return textRangeInfo(node, 0);
+      }
+
+      offset = 0;
+      isCollapseToStart = false;
+    }
+
+    return {
+      node: node,
+      collapseToStart: isCollapseToStart,
+      offset: offset
+    };
+  };
+
+  var textRange = document.body.createTextRange();
+  var info = textRangeInfo(point.node, point.offset);
+  textRange.moveToElementText(info.node);
+  textRange.collapse(info.collapseToStart);
+  textRange.moveStart('character', info.offset);
+  return textRange;
+}
+/**
+   * Wrapped Range
+   *
+   * @constructor
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   */
+
+
+var WrappedRange = /*#__PURE__*/function () {
+  function WrappedRange(sc, so, ec, eo) {
+    range_classCallCheck(this, WrappedRange);
+
+    this.sc = sc;
+    this.so = so;
+    this.ec = ec;
+    this.eo = eo; // isOnEditable: judge whether range is on editable or not
+
+    this.isOnEditable = this.makeIsOn(dom.isEditable); // isOnList: judge whether range is on list node or not
+
+    this.isOnList = this.makeIsOn(dom.isList); // isOnAnchor: judge whether range is on anchor node or not
+
+    this.isOnAnchor = this.makeIsOn(dom.isAnchor); // isOnCell: judge whether range is on cell node or not
+
+    this.isOnCell = this.makeIsOn(dom.isCell); // isOnData: judge whether range is on data node or not
+
+    this.isOnData = this.makeIsOn(dom.isData);
+  } // nativeRange: get nativeRange from sc, so, ec, eo
+
+
+  range_createClass(WrappedRange, [{
+    key: "nativeRange",
+    value: function nativeRange() {
+      if (env.isW3CRangeSupport) {
+        var w3cRange = document.createRange();
+        w3cRange.setStart(this.sc, this.so);
+        w3cRange.setEnd(this.ec, this.eo);
+        return w3cRange;
+      } else {
+        var textRange = pointToTextRange({
+          node: this.sc,
+          offset: this.so
+        });
+        textRange.setEndPoint('EndToEnd', pointToTextRange({
+          node: this.ec,
+          offset: this.eo
+        }));
+        return textRange;
+      }
+    }
+  }, {
+    key: "getPoints",
+    value: function getPoints() {
+      return {
+        sc: this.sc,
+        so: this.so,
+        ec: this.ec,
+        eo: this.eo
+      };
+    }
+  }, {
+    key: "getStartPoint",
+    value: function getStartPoint() {
+      return {
+        node: this.sc,
+        offset: this.so
+      };
+    }
+  }, {
+    key: "getEndPoint",
+    value: function getEndPoint() {
+      return {
+        node: this.ec,
+        offset: this.eo
+      };
+    }
+    /**
+     * select update visible range
+     */
+
+  }, {
+    key: "select",
+    value: function select() {
+      var nativeRng = this.nativeRange();
+
+      if (env.isW3CRangeSupport) {
+        var selection = document.getSelection();
+
+        if (selection.rangeCount > 0) {
+          selection.removeAllRanges();
+        }
+
+        selection.addRange(nativeRng);
+      } else {
+        nativeRng.select();
+      }
+
+      return this;
+    }
+    /**
+     * Moves the scrollbar to start container(sc) of current range
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "scrollIntoView",
+    value: function scrollIntoView(container) {
+      var height = external_jQuery_default()(container).height();
+
+      if (container.scrollTop + height < this.sc.offsetTop) {
+        container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);
+      }
+
+      return this;
+    }
+    /**
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "normalize",
+    value: function normalize() {
+      /**
+       * @param {BoundaryPoint} point
+       * @param {Boolean} isLeftToRight - true: prefer to choose right node
+       *                                - false: prefer to choose left node
+       * @return {BoundaryPoint}
+       */
+      var getVisiblePoint = function getVisiblePoint(point, isLeftToRight) {
+        if (!point) {
+          return point;
+        } // Just use the given point [XXX:Adhoc]
+        //  - case 01. if the point is on the middle of the node
+        //  - case 02. if the point is on the right edge and prefer to choose left node
+        //  - case 03. if the point is on the left edge and prefer to choose right node
+        //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void
+        //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void
+        //  - case 06. if the point is on the block node and there is no children
+
+
+        if (dom.isVisiblePoint(point)) {
+          if (!dom.isEdgePoint(point) || dom.isRightEdgePoint(point) && !isLeftToRight || dom.isLeftEdgePoint(point) && isLeftToRight || dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling) || dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling) || dom.isBlock(point.node) && dom.isEmpty(point.node)) {
+            return point;
+          }
+        } // point on block's edge
+
+
+        var block = dom.ancestor(point.node, dom.isBlock);
+        var hasRightNode = false;
+
+        if (!hasRightNode) {
+          var prevPoint = dom.prevPoint(point) || {
+            node: null
+          };
+          hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;
+        }
+
+        var hasLeftNode = false;
+
+        if (!hasLeftNode) {
+          var _nextPoint = dom.nextPoint(point) || {
+            node: null
+          };
+
+          hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(_nextPoint.node)) && isLeftToRight;
+        }
+
+        if (hasRightNode || hasLeftNode) {
+          // returns point already on visible point
+          if (dom.isVisiblePoint(point)) {
+            return point;
+          } // reverse direction
+
+
+          isLeftToRight = !isLeftToRight;
+        }
+
+        var nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint) : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);
+        return nextPoint || point;
+      };
+
+      var endPoint = getVisiblePoint(this.getEndPoint(), false);
+      var startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns matched nodes on range
+     *
+     * @param {Function} [pred] - predicate function
+     * @param {Object} [options]
+     * @param {Boolean} [options.includeAncestor]
+     * @param {Boolean} [options.fullyContains]
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "nodes",
+    value: function nodes(pred, options) {
+      pred = pred || func.ok;
+      var includeAncestor = options && options.includeAncestor;
+      var fullyContains = options && options.fullyContains; // TODO compare points and sort
+
+      var startPoint = this.getStartPoint();
+      var endPoint = this.getEndPoint();
+      var nodes = [];
+      var leftEdgeNodes = [];
+      dom.walkPoint(startPoint, endPoint, function (point) {
+        if (dom.isEditable(point.node)) {
+          return;
+        }
+
+        var node;
+
+        if (fullyContains) {
+          if (dom.isLeftEdgePoint(point)) {
+            leftEdgeNodes.push(point.node);
+          }
+
+          if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {
+            node = point.node;
+          }
+        } else if (includeAncestor) {
+          node = dom.ancestor(point.node, pred);
+        } else {
+          node = point.node;
+        }
+
+        if (node && pred(node)) {
+          nodes.push(node);
+        }
+      }, true);
+      return lists.unique(nodes);
+    }
+    /**
+     * returns commonAncestor of range
+     * @return {Element} - commonAncestor
+     */
+
+  }, {
+    key: "commonAncestor",
+    value: function commonAncestor() {
+      return dom.commonAncestor(this.sc, this.ec);
+    }
+    /**
+     * returns expanded range by pred
+     *
+     * @param {Function} pred - predicate function
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "expand",
+    value: function expand(pred) {
+      var startAncestor = dom.ancestor(this.sc, pred);
+      var endAncestor = dom.ancestor(this.ec, pred);
+
+      if (!startAncestor && !endAncestor) {
+        return new WrappedRange(this.sc, this.so, this.ec, this.eo);
+      }
+
+      var boundaryPoints = this.getPoints();
+
+      if (startAncestor) {
+        boundaryPoints.sc = startAncestor;
+        boundaryPoints.so = 0;
+      }
+
+      if (endAncestor) {
+        boundaryPoints.ec = endAncestor;
+        boundaryPoints.eo = dom.nodeLength(endAncestor);
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * @param {Boolean} isCollapseToStart
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "collapse",
+    value: function collapse(isCollapseToStart) {
+      if (isCollapseToStart) {
+        return new WrappedRange(this.sc, this.so, this.sc, this.so);
+      } else {
+        return new WrappedRange(this.ec, this.eo, this.ec, this.eo);
+      }
+    }
+    /**
+     * splitText on range
+     */
+
+  }, {
+    key: "splitText",
+    value: function splitText() {
+      var isSameContainer = this.sc === this.ec;
+      var boundaryPoints = this.getPoints();
+
+      if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {
+        this.ec.splitText(this.eo);
+      }
+
+      if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {
+        boundaryPoints.sc = this.sc.splitText(this.so);
+        boundaryPoints.so = 0;
+
+        if (isSameContainer) {
+          boundaryPoints.ec = boundaryPoints.sc;
+          boundaryPoints.eo = this.eo - this.so;
+        }
+      }
+
+      return new WrappedRange(boundaryPoints.sc, boundaryPoints.so, boundaryPoints.ec, boundaryPoints.eo);
+    }
+    /**
+     * delete contents on range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "deleteContents",
+    value: function deleteContents() {
+      if (this.isCollapsed()) {
+        return this;
+      }
+
+      var rng = this.splitText();
+      var nodes = rng.nodes(null, {
+        fullyContains: true
+      }); // find new cursor point
+
+      var point = dom.prevPointUntil(rng.getStartPoint(), function (point) {
+        return !lists.contains(nodes, point.node);
+      });
+      var emptyParents = [];
+      external_jQuery_default().each(nodes, function (idx, node) {
+        // find empty parents
+        var parent = node.parentNode;
+
+        if (point.node !== parent && dom.nodeLength(parent) === 1) {
+          emptyParents.push(parent);
+        }
+
+        dom.remove(node, false);
+      }); // remove empty parents
+
+      external_jQuery_default().each(emptyParents, function (idx, node) {
+        dom.remove(node, false);
+      });
+      return new WrappedRange(point.node, point.offset, point.node, point.offset).normalize();
+    }
+    /**
+     * makeIsOn: return isOn(pred) function
+     */
+
+  }, {
+    key: "makeIsOn",
+    value: function makeIsOn(pred) {
+      return function () {
+        var ancestor = dom.ancestor(this.sc, pred);
+        return !!ancestor && ancestor === dom.ancestor(this.ec, pred);
+      };
+    }
+    /**
+     * @param {Function} pred
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isLeftEdgeOf",
+    value: function isLeftEdgeOf(pred) {
+      if (!dom.isLeftEdgePoint(this.getStartPoint())) {
+        return false;
+      }
+
+      var node = dom.ancestor(this.sc, pred);
+      return node && dom.isLeftEdgeOf(this.sc, node);
+    }
+    /**
+     * returns whether range was collapsed or not
+     */
+
+  }, {
+    key: "isCollapsed",
+    value: function isCollapsed() {
+      return this.sc === this.ec && this.so === this.eo;
+    }
+    /**
+     * wrap inline nodes which children of body with paragraph
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "wrapBodyInlineWithPara",
+    value: function wrapBodyInlineWithPara() {
+      if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {
+        this.sc.innerHTML = dom.emptyPara;
+        return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);
+      }
+      /**
+       * [workaround] firefox often create range on not visible point. so normalize here.
+       *  - firefox: |<p>text</p>|
+       *  - chrome: <p>|text|</p>
+       */
+
+
+      var rng = this.normalize();
+
+      if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {
+        return rng;
+      } // find inline top ancestor
+
+
+      var topAncestor;
+
+      if (dom.isInline(rng.sc)) {
+        var ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));
+        topAncestor = lists.last(ancestors);
+
+        if (!dom.isInline(topAncestor)) {
+          topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];
+        }
+      } else {
+        topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];
+      }
+
+      if (topAncestor) {
+        // siblings not in paragraph
+        var inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();
+        inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline)); // wrap with paragraph
+
+        if (inlineSiblings.length) {
+          var para = dom.wrap(lists.head(inlineSiblings), 'p');
+          dom.appendChildNodes(para, lists.tail(inlineSiblings));
+        }
+      }
+
+      return this.normalize();
+    }
+    /**
+     * insert node at current cursor
+     *
+     * @param {Node} node
+     * @return {Node}
+     */
+
+  }, {
+    key: "insertNode",
+    value: function insertNode(node) {
+      var rng = this;
+
+      if (dom.isText(node) || dom.isInline(node)) {
+        rng = this.wrapBodyInlineWithPara().deleteContents();
+      }
+
+      var info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));
+
+      if (info.rightNode) {
+        info.rightNode.parentNode.insertBefore(node, info.rightNode);
+
+        if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {
+          info.rightNode.parentNode.removeChild(info.rightNode);
+        }
+      } else {
+        info.container.appendChild(node);
+      }
+
+      return node;
+    }
+    /**
+     * insert html at current cursor
+     */
+
+  }, {
+    key: "pasteHTML",
+    value: function pasteHTML(markup) {
+      markup = external_jQuery_default().trim(markup);
+      var contentsContainer = external_jQuery_default()('<div></div>').html(markup)[0];
+      var childNodes = lists.from(contentsContainer.childNodes); // const rng = this.wrapBodyInlineWithPara().deleteContents();
+
+      var rng = this;
+      var reversed = false;
+
+      if (rng.so >= 0) {
+        childNodes = childNodes.reverse();
+        reversed = true;
+      }
+
+      childNodes = childNodes.map(function (childNode) {
+        return rng.insertNode(childNode);
+      });
+
+      if (reversed) {
+        childNodes = childNodes.reverse();
+      }
+
+      return childNodes;
+    }
+    /**
+     * returns text in range
+     *
+     * @return {String}
+     */
+
+  }, {
+    key: "toString",
+    value: function toString() {
+      var nativeRng = this.nativeRange();
+      return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;
+    }
+    /**
+     * returns range for word before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordRange",
+    value: function getWordRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      if (!dom.isCharPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        return !dom.isCharPoint(point);
+      });
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, function (point) {
+          return !dom.isCharPoint(point);
+        });
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor
+     *
+     * @param {Boolean} [findAfter] - find after cursor, default: false
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getWordsRange",
+    value: function getWordsRange(findAfter) {
+      var endPoint = this.getEndPoint();
+
+      var isNotTextPoint = function isNotTextPoint(point) {
+        return !dom.isCharPoint(point) && !dom.isSpacePoint(point);
+      };
+
+      if (isNotTextPoint(endPoint)) {
+        return this;
+      }
+
+      var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);
+
+      if (findAfter) {
+        endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);
+      }
+
+      return new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * returns range for words before cursor that match with a Regex
+     *
+     * example:
+     *  range: 'hi @Peter Pan'
+     *  regex: '/@[a-z ]+/i'
+     *  return range: '@Peter Pan'
+     *
+     * @param {RegExp} [regex]
+     * @return {WrappedRange|null}
+     */
+
+  }, {
+    key: "getWordsMatchRange",
+    value: function getWordsMatchRange(regex) {
+      var endPoint = this.getEndPoint();
+      var startPoint = dom.prevPointUntil(endPoint, function (point) {
+        if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {
+          return true;
+        }
+
+        var rng = new WrappedRange(point.node, point.offset, endPoint.node, endPoint.offset);
+        var result = regex.exec(rng.toString());
+        return result && result.index === 0;
+      });
+      var rng = new WrappedRange(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+      var text = rng.toString();
+      var result = regex.exec(text);
+
+      if (result && result[0].length === text.length) {
+        return rng;
+      } else {
+        return null;
+      }
+    }
+    /**
+     * create offsetPath bookmark
+     *
+     * @param {Node} editable
+     */
+
+  }, {
+    key: "bookmark",
+    value: function bookmark(editable) {
+      return {
+        s: {
+          path: dom.makeOffsetPath(editable, this.sc),
+          offset: this.so
+        },
+        e: {
+          path: dom.makeOffsetPath(editable, this.ec),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * create offsetPath bookmark base on paragraph
+     *
+     * @param {Node[]} paras
+     */
+
+  }, {
+    key: "paraBookmark",
+    value: function paraBookmark(paras) {
+      return {
+        s: {
+          path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),
+          offset: this.so
+        },
+        e: {
+          path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),
+          offset: this.eo
+        }
+      };
+    }
+    /**
+     * getClientRects
+     * @return {Rect[]}
+     */
+
+  }, {
+    key: "getClientRects",
+    value: function getClientRects() {
+      var nativeRng = this.nativeRange();
+      return nativeRng.getClientRects();
+    }
+  }]);
+
+  return WrappedRange;
+}();
+/**
+ * Data structure
+ *  * BoundaryPoint: a point of dom tree
+ *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range
+ *
+ * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position
+ */
+
+
+/* harmony default export */ const range = ({
+  /**
+   * create Range Object From arguments or Browser Selection
+   *
+   * @param {Node} sc - start container
+   * @param {Number} so - start offset
+   * @param {Node} ec - end container
+   * @param {Number} eo - end offset
+   * @return {WrappedRange}
+   */
+  create: function create(sc, so, ec, eo) {
+    if (arguments.length === 4) {
+      return new WrappedRange(sc, so, ec, eo);
+    } else if (arguments.length === 2) {
+      // collapsed
+      ec = sc;
+      eo = so;
+      return new WrappedRange(sc, so, ec, eo);
+    } else {
+      var wrappedRange = this.createFromSelection();
+
+      if (!wrappedRange && arguments.length === 1) {
+        var bodyElement = arguments[0];
+
+        if (dom.isEditable(bodyElement)) {
+          bodyElement = bodyElement.lastChild;
+        }
+
+        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);
+      }
+
+      return wrappedRange;
+    }
+  },
+  createFromBodyElement: function createFromBodyElement(bodyElement) {
+    var isCollapseToStart = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+    var wrappedRange = this.createFromNode(bodyElement);
+    return wrappedRange.collapse(isCollapseToStart);
+  },
+  createFromSelection: function createFromSelection() {
+    var sc, so, ec, eo;
+
+    if (env.isW3CRangeSupport) {
+      var selection = document.getSelection();
+
+      if (!selection || selection.rangeCount === 0) {
+        return null;
+      } else if (dom.isBody(selection.anchorNode)) {
+        // Firefox: returns entire body as range on initialization.
+        // We won't never need it.
+        return null;
+      }
+
+      var nativeRng = selection.getRangeAt(0);
+      sc = nativeRng.startContainer;
+      so = nativeRng.startOffset;
+      ec = nativeRng.endContainer;
+      eo = nativeRng.endOffset;
+    } else {
+      // IE8: TextRange
+      var textRange = document.selection.createRange();
+      var textRangeEnd = textRange.duplicate();
+      textRangeEnd.collapse(false);
+      var textRangeStart = textRange;
+      textRangeStart.collapse(true);
+      var startPoint = textRangeToPoint(textRangeStart, true);
+      var endPoint = textRangeToPoint(textRangeEnd, false); // same visible point case: range was collapsed.
+
+      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) && dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) && endPoint.node.nextSibling === startPoint.node) {
+        startPoint = endPoint;
+      }
+
+      sc = startPoint.cont;
+      so = startPoint.offset;
+      ec = endPoint.cont;
+      eo = endPoint.offset;
+    }
+
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from node
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNode: function createFromNode(node) {
+    var sc = node;
+    var so = 0;
+    var ec = node;
+    var eo = dom.nodeLength(ec); // browsers can't target a picture or void node
+
+    if (dom.isVoid(sc)) {
+      so = dom.listPrev(sc).length - 1;
+      sc = sc.parentNode;
+    }
+
+    if (dom.isBR(ec)) {
+      eo = dom.listPrev(ec).length - 1;
+      ec = ec.parentNode;
+    } else if (dom.isVoid(ec)) {
+      eo = dom.listPrev(ec).length;
+      ec = ec.parentNode;
+    }
+
+    return this.create(sc, so, ec, eo);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeBefore: function createFromNodeBefore(node) {
+    return this.createFromNode(node).collapse(true);
+  },
+
+  /**
+   * create WrappedRange from node after position
+   *
+   * @param {Node} node
+   * @return {WrappedRange}
+   */
+  createFromNodeAfter: function createFromNodeAfter(node) {
+    return this.createFromNode(node).collapse();
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from bookmark
+   *
+   * @param {Node} editable
+   * @param {Object} bookmark
+   * @return {WrappedRange}
+   */
+  createFromBookmark: function createFromBookmark(editable, bookmark) {
+    var sc = dom.fromOffsetPath(editable, bookmark.s.path);
+    var so = bookmark.s.offset;
+    var ec = dom.fromOffsetPath(editable, bookmark.e.path);
+    var eo = bookmark.e.offset;
+    return new WrappedRange(sc, so, ec, eo);
+  },
+
+  /**
+   * @method
+   *
+   * create WrappedRange from paraBookmark
+   *
+   * @param {Object} bookmark
+   * @param {Node[]} paras
+   * @return {WrappedRange}
+   */
+  createFromParaBookmark: function createFromParaBookmark(bookmark, paras) {
+    var so = bookmark.s.offset;
+    var eo = bookmark.e.offset;
+    var sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);
+    var ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);
+    return new WrappedRange(sc, so, ec, eo);
+  }
+});
+;// CONCATENATED MODULE: ./src/js/core/key.js
+
+
+var KEY_MAP = {
+  'BACKSPACE': 8,
+  'TAB': 9,
+  'ENTER': 13,
+  'ESCAPE': 27,
+  'SPACE': 32,
+  'DELETE': 46,
+  // Arrow
+  'LEFT': 37,
+  'UP': 38,
+  'RIGHT': 39,
+  'DOWN': 40,
+  // Number: 0-9
+  'NUM0': 48,
+  'NUM1': 49,
+  'NUM2': 50,
+  'NUM3': 51,
+  'NUM4': 52,
+  'NUM5': 53,
+  'NUM6': 54,
+  'NUM7': 55,
+  'NUM8': 56,
+  // Alphabet: a-z
+  'B': 66,
+  'E': 69,
+  'I': 73,
+  'J': 74,
+  'K': 75,
+  'L': 76,
+  'R': 82,
+  'S': 83,
+  'U': 85,
+  'V': 86,
+  'Y': 89,
+  'Z': 90,
+  'SLASH': 191,
+  'LEFTBRACKET': 219,
+  'BACKSLASH': 220,
+  'RIGHTBRACKET': 221,
+  // Navigation
+  'HOME': 36,
+  'END': 35,
+  'PAGEUP': 33,
+  'PAGEDOWN': 34
+};
+/**
+ * @class core.key
+ *
+ * Object for keycodes.
+ *
+ * @singleton
+ * @alternateClassName key
+ */
+
+/* harmony default export */ const key = ({
+  /**
+   * @method isEdit
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isEdit: function isEdit(keyCode) {
+    return lists.contains([KEY_MAP.BACKSPACE, KEY_MAP.TAB, KEY_MAP.ENTER, KEY_MAP.SPACE, KEY_MAP.DELETE], keyCode);
+  },
+
+  /**
+   * @method isMove
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isMove: function isMove(keyCode) {
+    return lists.contains([KEY_MAP.LEFT, KEY_MAP.UP, KEY_MAP.RIGHT, KEY_MAP.DOWN], keyCode);
+  },
+
+  /**
+   * @method isNavigation
+   *
+   * @param {Number} keyCode
+   * @return {Boolean}
+   */
+  isNavigation: function isNavigation(keyCode) {
+    return lists.contains([KEY_MAP.HOME, KEY_MAP.END, KEY_MAP.PAGEUP, KEY_MAP.PAGEDOWN], keyCode);
+  },
+
+  /**
+   * @property {Object} nameFromCode
+   * @property {String} nameFromCode.8 "BACKSPACE"
+   */
+  nameFromCode: func.invertObject(KEY_MAP),
+  code: KEY_MAP
+});
+;// CONCATENATED MODULE: ./src/js/core/async.js
+
+/**
+ * @method readFileAsDataURL
+ *
+ * read contents of file as representing URL
+ *
+ * @param {File} file
+ * @return {Promise} - then: dataUrl
+ */
+
+function readFileAsDataURL(file) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    external_jQuery_default().extend(new FileReader(), {
+      onload: function onload(e) {
+        var dataURL = e.target.result;
+        deferred.resolve(dataURL);
+      },
+      onerror: function onerror(err) {
+        deferred.reject(err);
+      }
+    }).readAsDataURL(file);
+  }).promise();
+}
+/**
+ * @method createImage
+ *
+ * create `<image>` from url string
+ *
+ * @param {String} url
+ * @return {Promise} - then: $image
+ */
+
+function createImage(url) {
+  return external_jQuery_default().Deferred(function (deferred) {
+    var $img = external_jQuery_default()('<img>');
+    $img.one('load', function () {
+      $img.off('error abort');
+      deferred.resolve($img);
+    }).one('error abort', function () {
+      $img.off('load').detach();
+      deferred.reject($img);
+    }).css({
+      display: 'none'
+    }).appendTo(document.body).attr('src', url);
+  }).promise();
+}
+;// CONCATENATED MODULE: ./src/js/editing/History.js
+function History_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function History_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function History_createClass(Constructor, protoProps, staticProps) { if (protoProps) History_defineProperties(Constructor.prototype, protoProps); if (staticProps) History_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var History = /*#__PURE__*/function () {
+  function History(context) {
+    History_classCallCheck(this, History);
+
+    this.stack = [];
+    this.stackOffset = -1;
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+    this.editable = this.$editable[0];
+  }
+
+  History_createClass(History, [{
+    key: "makeSnapshot",
+    value: function makeSnapshot() {
+      var rng = range.create(this.editable);
+      var emptyBookmark = {
+        s: {
+          path: [],
+          offset: 0
+        },
+        e: {
+          path: [],
+          offset: 0
+        }
+      };
+      return {
+        contents: this.$editable.html(),
+        bookmark: rng && rng.isOnEditable() ? rng.bookmark(this.editable) : emptyBookmark
+      };
+    }
+  }, {
+    key: "applySnapshot",
+    value: function applySnapshot(snapshot) {
+      if (snapshot.contents !== null) {
+        this.$editable.html(snapshot.contents);
+      }
+
+      if (snapshot.bookmark !== null) {
+        range.createFromBookmark(this.editable, snapshot.bookmark).select();
+      }
+    }
+    /**
+    * @method rewind
+    * Rewinds the history stack back to the first snapshot taken.
+    * Leaves the stack intact, so that "Redo" can still be used.
+    */
+
+  }, {
+    key: "rewind",
+    value: function rewind() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      } // Return to the first available snapshot.
+
+
+      this.stackOffset = 0; // Apply that snapshot.
+
+      this.applySnapshot(this.stack[this.stackOffset]);
+    }
+    /**
+    *  @method commit
+    *  Resets history stack, but keeps current editor's content.
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+    * @method reset
+    * Resets the history stack completely; reverting to an empty editor.
+    */
+
+  }, {
+    key: "reset",
+    value: function reset() {
+      // Clear the stack.
+      this.stack = []; // Restore stackOffset to its original value.
+
+      this.stackOffset = -1; // Clear the editable area.
+
+      this.$editable.html(''); // Record our first snapshot (of nothing).
+
+      this.recordUndo();
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      // Create snap shot if not yet recorded
+      if (this.$editable.html() !== this.stack[this.stackOffset].contents) {
+        this.recordUndo();
+      }
+
+      if (this.stackOffset > 0) {
+        this.stackOffset--;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      if (this.stack.length - 1 > this.stackOffset) {
+        this.stackOffset++;
+        this.applySnapshot(this.stack[this.stackOffset]);
+      }
+    }
+    /**
+     * recorded undo
+     */
+
+  }, {
+    key: "recordUndo",
+    value: function recordUndo() {
+      this.stackOffset++; // Wash out stack after stackOffset
+
+      if (this.stack.length > this.stackOffset) {
+        this.stack = this.stack.slice(0, this.stackOffset);
+      } // Create new snapshot and push it to the end
+
+
+      this.stack.push(this.makeSnapshot()); // If the stack size reachs to the limit, then slice it
+
+      if (this.stack.length > this.context.options.historyLimit) {
+        this.stack.shift();
+        this.stackOffset -= 1;
+      }
+    }
+  }]);
+
+  return History;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Style.js
+function Style_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Style_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Style_createClass(Constructor, protoProps, staticProps) { if (protoProps) Style_defineProperties(Constructor.prototype, protoProps); if (staticProps) Style_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Style = /*#__PURE__*/function () {
+  function Style() {
+    Style_classCallCheck(this, Style);
+  }
+
+  Style_createClass(Style, [{
+    key: "jQueryCSS",
+    value:
+    /**
+     * @method jQueryCSS
+     *
+     * [workaround] for old jQuery
+     * passing an array of style properties to .css()
+     * will result in an object of property-value pairs.
+     * (compability with version < 1.9)
+     *
+     * @private
+     * @param  {jQuery} $obj
+     * @param  {Array} propertyNames - An array of one or more CSS properties.
+     * @return {Object}
+     */
+    function jQueryCSS($obj, propertyNames) {
+      var result = {};
+      external_jQuery_default().each(propertyNames, function (idx, propertyName) {
+        result[propertyName] = $obj.css(propertyName);
+      });
+      return result;
+    }
+    /**
+     * returns style object from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "fromNode",
+    value: function fromNode($node) {
+      var properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];
+      var styleInfo = this.jQueryCSS($node, properties) || {};
+      var fontSize = $node[0].style.fontSize || styleInfo['font-size'];
+      styleInfo['font-size'] = parseInt(fontSize, 10);
+      styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);
+      return styleInfo;
+    }
+    /**
+     * paragraph level style
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} styleInfo
+     */
+
+  }, {
+    key: "stylePara",
+    value: function stylePara(rng, styleInfo) {
+      external_jQuery_default().each(rng.nodes(dom.isPara, {
+        includeAncestor: true
+      }), function (idx, para) {
+        external_jQuery_default()(para).css(styleInfo);
+      });
+    }
+    /**
+     * insert and returns styleNodes on range.
+     *
+     * @param {WrappedRange} rng
+     * @param {Object} [options] - options for styleNodes
+     * @param {String} [options.nodeName] - default: `SPAN`
+     * @param {Boolean} [options.expandClosestSibling] - default: `false`
+     * @param {Boolean} [options.onlyPartialContains] - default: `false`
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "styleNodes",
+    value: function styleNodes(rng, options) {
+      rng = rng.splitText();
+      var nodeName = options && options.nodeName || 'SPAN';
+      var expandClosestSibling = !!(options && options.expandClosestSibling);
+      var onlyPartialContains = !!(options && options.onlyPartialContains);
+
+      if (rng.isCollapsed()) {
+        return [rng.insertNode(dom.create(nodeName))];
+      }
+
+      var pred = dom.makePredByNodeName(nodeName);
+      var nodes = rng.nodes(dom.isText, {
+        fullyContains: true
+      }).map(function (text) {
+        return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);
+      });
+
+      if (expandClosestSibling) {
+        if (onlyPartialContains) {
+          var nodesInRange = rng.nodes(); // compose with partial contains predication
+
+          pred = func.and(pred, function (node) {
+            return lists.contains(nodesInRange, node);
+          });
+        }
+
+        return nodes.map(function (node) {
+          var siblings = dom.withClosestSiblings(node, pred);
+          var head = lists.head(siblings);
+          var tails = lists.tail(siblings);
+          external_jQuery_default().each(tails, function (idx, elem) {
+            dom.appendChildNodes(head, elem.childNodes);
+            dom.remove(elem);
+          });
+          return lists.head(siblings);
+        });
+      } else {
+        return nodes;
+      }
+    }
+    /**
+     * get current style on cursor
+     *
+     * @param {WrappedRange} rng
+     * @return {Object} - object contains style properties.
+     */
+
+  }, {
+    key: "current",
+    value: function current(rng) {
+      var $cont = external_jQuery_default()(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);
+      var styleInfo = this.fromNode($cont); // document.queryCommandState for toggle state
+      // [workaround] prevent Firefox nsresult: "0x80004005 (NS_ERROR_FAILURE)"
+
+      try {
+        styleInfo = external_jQuery_default().extend(styleInfo, {
+          'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',
+          'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',
+          'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',
+          'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',
+          'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',
+          'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',
+          'font-family': document.queryCommandValue('fontname') || styleInfo['font-family']
+        });
+      } catch (e) {// eslint-disable-next-line
+      } // list-style-type to list-style(unordered, ordered)
+
+
+      if (!rng.isOnList()) {
+        styleInfo['list-style'] = 'none';
+      } else {
+        var orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];
+        var isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;
+        styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';
+      }
+
+      var para = dom.ancestor(rng.sc, dom.isPara);
+
+      if (para && para.style['line-height']) {
+        styleInfo['line-height'] = para.style.lineHeight;
+      } else {
+        var lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);
+        styleInfo['line-height'] = lineHeight.toFixed(1);
+      }
+
+      styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);
+      styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);
+      styleInfo.range = rng;
+      return styleInfo;
+    }
+  }]);
+
+  return Style;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Bullet.js
+function Bullet_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Bullet_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Bullet_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bullet_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bullet_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var Bullet = /*#__PURE__*/function () {
+  function Bullet() {
+    Bullet_classCallCheck(this, Bullet);
+  }
+
+  Bullet_createClass(Bullet, [{
+    key: "insertOrderedList",
+    value:
+    /**
+     * toggle ordered list
+     */
+    function insertOrderedList(editable) {
+      this.toggleList('OL', editable);
+    }
+    /**
+     * toggle unordered list
+     */
+
+  }, {
+    key: "insertUnorderedList",
+    value: function insertUnorderedList(editable) {
+      this.toggleList('UL', editable);
+    }
+    /**
+     * indent
+     */
+
+  }, {
+    key: "indent",
+    value: function indent(editable) {
+      var _this = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          var previousList = _this.findList(head.previousSibling);
+
+          if (previousList) {
+            paras.map(function (para) {
+              return previousList.appendChild(para);
+            });
+          } else {
+            _this.wrapList(paras, head.parentNode.nodeName);
+
+            paras.map(function (para) {
+              return para.parentNode;
+            }).map(function (para) {
+              return _this.appendToPrevious(para);
+            });
+          }
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              return (parseInt(val, 10) || 0) + 25;
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * outdent
+     */
+
+  }, {
+    key: "outdent",
+    value: function outdent(editable) {
+      var _this2 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode'));
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+
+        if (dom.isLi(head)) {
+          _this2.releaseList([paras]);
+        } else {
+          external_jQuery_default().each(paras, function (idx, para) {
+            external_jQuery_default()(para).css('marginLeft', function (idx, val) {
+              val = parseInt(val, 10) || 0;
+              return val > 25 ? val - 25 : '';
+            });
+          });
+        }
+      });
+      rng.select();
+    }
+    /**
+     * toggle list
+     *
+     * @param {String} listName - OL or UL
+     */
+
+  }, {
+    key: "toggleList",
+    value: function toggleList(listName, editable) {
+      var _this3 = this;
+
+      var rng = range.create(editable).wrapBodyInlineWithPara();
+      var paras = rng.nodes(dom.isPara, {
+        includeAncestor: true
+      });
+      var bookmark = rng.paraBookmark(paras);
+      var clustereds = lists.clusterBy(paras, func.peq2('parentNode')); // paragraph to list
+
+      if (lists.find(paras, dom.isPurePara)) {
+        var wrappedParas = [];
+        external_jQuery_default().each(clustereds, function (idx, paras) {
+          wrappedParas = wrappedParas.concat(_this3.wrapList(paras, listName));
+        });
+        paras = wrappedParas; // list to paragraph or change list style
+      } else {
+        var diffLists = rng.nodes(dom.isList, {
+          includeAncestor: true
+        }).filter(function (listNode) {
+          return !external_jQuery_default().nodeName(listNode, listName);
+        });
+
+        if (diffLists.length) {
+          external_jQuery_default().each(diffLists, function (idx, listNode) {
+            dom.replace(listNode, listName);
+          });
+        } else {
+          paras = this.releaseList(clustereds, true);
+        }
+      }
+
+      range.createFromParaBookmark(bookmark, paras).select();
+    }
+    /**
+     * @param {Node[]} paras
+     * @param {String} listName
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "wrapList",
+    value: function wrapList(paras, listName) {
+      var head = lists.head(paras);
+      var last = lists.last(paras);
+      var prevList = dom.isList(head.previousSibling) && head.previousSibling;
+      var nextList = dom.isList(last.nextSibling) && last.nextSibling;
+      var listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last); // P to LI
+
+      paras = paras.map(function (para) {
+        return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;
+      }); // append to list(<ul>, <ol>)
+
+      dom.appendChildNodes(listNode, paras);
+
+      if (nextList) {
+        dom.appendChildNodes(listNode, lists.from(nextList.childNodes));
+        dom.remove(nextList);
+      }
+
+      return paras;
+    }
+    /**
+     * @method releaseList
+     *
+     * @param {Array[]} clustereds
+     * @param {Boolean} isEscapseToBody
+     * @return {Node[]}
+     */
+
+  }, {
+    key: "releaseList",
+    value: function releaseList(clustereds, isEscapseToBody) {
+      var _this4 = this;
+
+      var releasedParas = [];
+      external_jQuery_default().each(clustereds, function (idx, paras) {
+        var head = lists.head(paras);
+        var last = lists.last(paras);
+        var headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;
+        var parentItem = headList.parentNode;
+
+        if (headList.parentNode.nodeName === 'LI') {
+          paras.map(function (para) {
+            var newList = _this4.findNextSiblings(para);
+
+            if (parentItem.nextSibling) {
+              parentItem.parentNode.insertBefore(para, parentItem.nextSibling);
+            } else {
+              parentItem.parentNode.appendChild(para);
+            }
+
+            if (newList.length) {
+              _this4.wrapList(newList, headList.nodeName);
+
+              para.appendChild(newList[0].parentNode);
+            }
+          });
+
+          if (headList.children.length === 0) {
+            parentItem.removeChild(headList);
+          }
+
+          if (parentItem.childNodes.length === 0) {
+            parentItem.parentNode.removeChild(parentItem);
+          }
+        } else {
+          var lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {
+            node: last.parentNode,
+            offset: dom.position(last) + 1
+          }, {
+            isSkipPaddingBlankHTML: true
+          }) : null;
+          var middleList = dom.splitTree(headList, {
+            node: head.parentNode,
+            offset: dom.position(head)
+          }, {
+            isSkipPaddingBlankHTML: true
+          });
+          paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi) : lists.from(middleList.childNodes).filter(dom.isLi); // LI to P
+
+          if (isEscapseToBody || !dom.isList(headList.parentNode)) {
+            paras = paras.map(function (para) {
+              return dom.replace(para, 'P');
+            });
+          }
+
+          external_jQuery_default().each(lists.from(paras).reverse(), function (idx, para) {
+            dom.insertAfter(para, headList);
+          }); // remove empty lists
+
+          var rootLists = lists.compact([headList, middleList, lastList]);
+          external_jQuery_default().each(rootLists, function (idx, rootList) {
+            var listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));
+            external_jQuery_default().each(listNodes.reverse(), function (idx, listNode) {
+              if (!dom.nodeLength(listNode)) {
+                dom.remove(listNode, true);
+              }
+            });
+          });
+        }
+
+        releasedParas = releasedParas.concat(paras);
+      });
+      return releasedParas;
+    }
+    /**
+     * @method appendToPrevious
+     *
+     * Appends list to previous list item, if
+     * none exist it wraps the list in a new list item.
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "appendToPrevious",
+    value: function appendToPrevious(node) {
+      return node.previousSibling ? dom.appendChildNodes(node.previousSibling, [node]) : this.wrapList([node], 'LI');
+    }
+    /**
+     * @method findList
+     *
+     * Finds an existing list in list item
+     *
+     * @param {HTMLNode} ListItem
+     * @return {Array[]}
+     */
+
+  }, {
+    key: "findList",
+    value: function findList(node) {
+      return node ? lists.find(node.children, function (child) {
+        return ['OL', 'UL'].indexOf(child.nodeName) > -1;
+      }) : null;
+    }
+    /**
+     * @method findNextSiblings
+     *
+     * Finds all list item siblings that follow it
+     *
+     * @param {HTMLNode} ListItem
+     * @return {HTMLNode}
+     */
+
+  }, {
+    key: "findNextSiblings",
+    value: function findNextSiblings(node) {
+      var siblings = [];
+
+      while (node.nextSibling) {
+        siblings.push(node.nextSibling);
+        node = node.nextSibling;
+      }
+
+      return siblings;
+    }
+  }]);
+
+  return Bullet;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Typing.js
+function Typing_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Typing_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Typing_createClass(Constructor, protoProps, staticProps) { if (protoProps) Typing_defineProperties(Constructor.prototype, protoProps); if (staticProps) Typing_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class editing.Typing
+ *
+ * Typing
+ *
+ */
+
+var Typing = /*#__PURE__*/function () {
+  function Typing(context) {
+    Typing_classCallCheck(this, Typing);
+
+    // a Bullet instance to toggle lists off
+    this.bullet = new Bullet();
+    this.options = context.options;
+  }
+  /**
+   * insert tab
+   *
+   * @param {WrappedRange} rng
+   * @param {Number} tabsize
+   */
+
+
+  Typing_createClass(Typing, [{
+    key: "insertTab",
+    value: function insertTab(rng, tabsize) {
+      var tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));
+      rng = rng.deleteContents();
+      rng.insertNode(tab, true);
+      rng = range.create(tab, tabsize);
+      rng.select();
+    }
+    /**
+     * insert paragraph
+     *
+     * @param {jQuery} $editable
+     * @param {WrappedRange} rng Can be used in unit tests to "mock" the range
+     *
+     * blockquoteBreakingLevel
+     *   0 - No break, the new paragraph remains inside the quote
+     *   1 - Break the first blockquote in the ancestors list
+     *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)
+     */
+
+  }, {
+    key: "insertParagraph",
+    value: function insertParagraph(editable, rng) {
+      rng = rng || range.create(editable); // deleteContents on range.
+
+      rng = rng.deleteContents(); // Wrap range if it needs to be wrapped by paragraph
+
+      rng = rng.wrapBodyInlineWithPara(); // finding paragraph
+
+      var splitRoot = dom.ancestor(rng.sc, dom.isPara);
+      var nextPara; // on paragraph: split paragraph
+
+      if (splitRoot) {
+        // if it is an empty line with li
+        if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {
+          // toggle UL/OL and escape
+          this.bullet.toggleList(splitRoot.parentNode.nodeName);
+          return;
+        } else {
+          var blockquote = null;
+
+          if (this.options.blockquoteBreakingLevel === 1) {
+            blockquote = dom.ancestor(splitRoot, dom.isBlockquote);
+          } else if (this.options.blockquoteBreakingLevel === 2) {
+            blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);
+          }
+
+          if (blockquote) {
+            // We're inside a blockquote and options ask us to break it
+            nextPara = external_jQuery_default()(dom.emptyPara)[0]; // If the split is right before a <br>, remove it so that there's no "empty line"
+            // after the split in the new blockquote created
+
+            if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {
+              external_jQuery_default()(rng.sc.nextSibling).remove();
+            }
+
+            var split = dom.splitTree(blockquote, rng.getStartPoint(), {
+              isDiscardEmptySplits: true
+            });
+
+            if (split) {
+              split.parentNode.insertBefore(nextPara, split);
+            } else {
+              dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote
+            }
+          } else {
+            nextPara = dom.splitTree(splitRoot, rng.getStartPoint()); // not a blockquote, just insert the paragraph
+
+            var emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);
+            emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));
+            external_jQuery_default().each(emptyAnchors, function (idx, anchor) {
+              dom.remove(anchor);
+            }); // replace empty heading, pre or custom-made styleTag with P tag
+
+            if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {
+              nextPara = dom.replace(nextPara, 'p');
+            }
+          }
+        } // no paragraph: insert empty paragraph
+
+      } else {
+        var next = rng.sc.childNodes[rng.so];
+        nextPara = external_jQuery_default()(dom.emptyPara)[0];
+
+        if (next) {
+          rng.sc.insertBefore(nextPara, next);
+        } else {
+          rng.sc.appendChild(nextPara);
+        }
+      }
+
+      range.create(nextPara, 0).normalize().select().scrollIntoView(editable);
+    }
+  }]);
+
+  return Typing;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/editing/Table.js
+function Table_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Table_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Table_createClass(Constructor, protoProps, staticProps) { if (protoProps) Table_defineProperties(Constructor.prototype, protoProps); if (staticProps) Table_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+/**
+ * @class Create a virtual table to create what actions to do in change.
+ * @param {object} startPoint Cell selected to apply change.
+ * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where
+ * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction
+ * @param {object} domTable Dom element of table to make changes.
+ */
+
+var TableResultAction = function TableResultAction(startPoint, where, action, domTable) {
+  var _startPoint = {
+    'colPos': 0,
+    'rowPos': 0
+  };
+  var _virtualTable = [];
+  var _actionCellList = []; /// ///////////////////////////////////////////
+  // Private functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Set the startPoint of action.
+   */
+
+  function setStartPoint() {
+    if (!startPoint || !startPoint.tagName || startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th') {
+      // Impossible to identify start Cell point
+      return;
+    }
+
+    _startPoint.colPos = startPoint.cellIndex;
+
+    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {
+      // Impossible to identify start Row point
+      return;
+    }
+
+    _startPoint.rowPos = startPoint.parentElement.rowIndex;
+  }
+  /**
+   * Define virtual table position info object.
+   *
+   * @param {int} rowIndex Index position in line of virtual table.
+   * @param {int} cellIndex Index position in column of virtual table.
+   * @param {object} baseRow Row affected by this position.
+   * @param {object} baseCell Cell affected by this position.
+   * @param {bool} isSpan Inform if it is an span cell/row.
+   */
+
+
+  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {
+    var objPosition = {
+      'baseRow': baseRow,
+      'baseCell': baseCell,
+      'isRowSpan': isRowSpan,
+      'isColSpan': isColSpan,
+      'isVirtual': isVirtualCell
+    };
+
+    if (!_virtualTable[rowIndex]) {
+      _virtualTable[rowIndex] = [];
+    }
+
+    _virtualTable[rowIndex][cellIndex] = objPosition;
+  }
+  /**
+   * Create action cell object.
+   *
+   * @param {object} virtualTableCellObj Object of specific position on virtual table.
+   * @param {enum} resultAction Action to be applied in that item.
+   */
+
+
+  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {
+    return {
+      'baseCell': virtualTableCellObj.baseCell,
+      'action': resultAction,
+      'virtualTable': {
+        'rowIndex': virtualRowPosition,
+        'cellIndex': virtualColPosition
+      }
+    };
+  }
+  /**
+   * Recover free index of row to append Cell.
+   *
+   * @param {int} rowIndex Index of row to find free space.
+   * @param {int} cellIndex Index of cell to find free space in table.
+   */
+
+
+  function recoverCellIndex(rowIndex, cellIndex) {
+    if (!_virtualTable[rowIndex]) {
+      return cellIndex;
+    }
+
+    if (!_virtualTable[rowIndex][cellIndex]) {
+      return cellIndex;
+    }
+
+    var newCellIndex = cellIndex;
+
+    while (_virtualTable[rowIndex][newCellIndex]) {
+      newCellIndex++;
+
+      if (!_virtualTable[rowIndex][newCellIndex]) {
+        return newCellIndex;
+      }
+    }
+  }
+  /**
+   * Recover info about row and cell and add information to virtual table.
+   *
+   * @param {object} row Row to recover information.
+   * @param {object} cell Cell to recover information.
+   */
+
+
+  function addCellInfoToVirtual(row, cell) {
+    var cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);
+    var cellHasColspan = cell.colSpan > 1;
+    var cellHasRowspan = cell.rowSpan > 1;
+    var isThisSelectedCell = row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos;
+    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false); // Add span rows to virtual Table.
+
+    var rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;
+
+    if (rowspanNumber > 1) {
+      for (var rp = 1; rp < rowspanNumber; rp++) {
+        var rowspanIndex = row.rowIndex + rp;
+        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);
+      }
+    } // Add span cols to virtual table.
+
+
+    var colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;
+
+    if (colspanNumber > 1) {
+      for (var cp = 1; cp < colspanNumber; cp++) {
+        var cellspanIndex = recoverCellIndex(row.rowIndex, cellIndex + cp);
+        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);
+        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);
+      }
+    }
+  }
+  /**
+   * Process validation and adjust of start point if needed
+   *
+   * @param {int} rowIndex
+   * @param {int} cellIndex
+   * @param {object} cell
+   * @param {bool} isSelectedCell
+   */
+
+
+  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {
+    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {
+      _startPoint.colPos++;
+    }
+  }
+  /**
+   * Create virtual table of cells with all cells, including span cells.
+   */
+
+
+  function createVirtualTable() {
+    var rows = domTable.rows;
+
+    for (var rowIndex = 0; rowIndex < rows.length; rowIndex++) {
+      var cells = rows[rowIndex].cells;
+
+      for (var cellIndex = 0; cellIndex < cells.length; cellIndex++) {
+        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);
+      }
+    }
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getDeleteResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (!cell.isVirtual && cell.isRowSpan) {
+          return TableResultAction.resultAction.AddCell;
+        } else if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SubtractSpanCount;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.RemoveCell;
+  }
+  /**
+   * Get action to be applied on the cell.
+   *
+   * @param {object} cell virtual table cell to apply action
+   */
+
+
+  function getAddResultActionToCell(cell) {
+    switch (where) {
+      case TableResultAction.where.Column:
+        if (cell.isColSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isRowSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+
+      case TableResultAction.where.Row:
+        if (cell.isRowSpan) {
+          return TableResultAction.resultAction.SumSpanCount;
+        } else if (cell.isColSpan && cell.isVirtual) {
+          return TableResultAction.resultAction.Ignore;
+        }
+
+        break;
+    }
+
+    return TableResultAction.resultAction.AddCell;
+  }
+
+  function init() {
+    setStartPoint();
+    createVirtualTable();
+  } /// ///////////////////////////////////////////
+  // Public functions
+  /// ///////////////////////////////////////////
+
+  /**
+   * Recover array os what to do in table.
+   */
+
+
+  this.getActionList = function () {
+    var fixedRow = where === TableResultAction.where.Row ? _startPoint.rowPos : -1;
+    var fixedCol = where === TableResultAction.where.Column ? _startPoint.colPos : -1;
+    var actualPosition = 0;
+    var canContinue = true;
+
+    while (canContinue) {
+      var rowPosition = fixedRow >= 0 ? fixedRow : actualPosition;
+      var colPosition = fixedCol >= 0 ? fixedCol : actualPosition;
+      var row = _virtualTable[rowPosition];
+
+      if (!row) {
+        canContinue = false;
+        return _actionCellList;
+      }
+
+      var cell = row[colPosition];
+
+      if (!cell) {
+        canContinue = false;
+        return _actionCellList;
+      } // Define action to be applied in this cell
+
+
+      var resultAction = TableResultAction.resultAction.Ignore;
+
+      switch (action) {
+        case TableResultAction.requestAction.Add:
+          resultAction = getAddResultActionToCell(cell);
+          break;
+
+        case TableResultAction.requestAction.Delete:
+          resultAction = getDeleteResultActionToCell(cell);
+          break;
+      }
+
+      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));
+
+      actualPosition++;
+    }
+
+    return _actionCellList;
+  };
+
+  init();
+};
+/**
+*
+* Where action occours enum.
+*/
+
+
+TableResultAction.where = {
+  'Row': 0,
+  'Column': 1
+};
+/**
+*
+* Requested action to apply enum.
+*/
+
+TableResultAction.requestAction = {
+  'Add': 0,
+  'Delete': 1
+};
+/**
+*
+* Result action to be executed enum.
+*/
+
+TableResultAction.resultAction = {
+  'Ignore': 0,
+  'SubtractSpanCount': 1,
+  'RemoveCell': 2,
+  'AddCell': 3,
+  'SumSpanCount': 4
+};
+/**
+ *
+ * @class editing.Table
+ *
+ * Table
+ *
+ */
+
+var Table = /*#__PURE__*/function () {
+  function Table() {
+    Table_classCallCheck(this, Table);
+  }
+
+  Table_createClass(Table, [{
+    key: "tab",
+    value:
+    /**
+     * handle tab key
+     *
+     * @param {WrappedRange} rng
+     * @param {Boolean} isShift
+     */
+    function tab(rng, isShift) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var table = dom.ancestor(cell, dom.isTable);
+      var cells = dom.listDescendant(table, dom.isCell);
+      var nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);
+
+      if (nextCell) {
+        range.create(nextCell, 0).select();
+      }
+    }
+    /**
+     * Add a new row
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (top/bottom)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addRow",
+    value: function addRow(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var currentTr = external_jQuery_default()(cell).closest('tr');
+      var trAttributes = this.recoverAttributes(currentTr);
+      var html = external_jQuery_default()('<tr' + trAttributes + '></tr>');
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Add, external_jQuery_default()(currentTr).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var idCell = 0; idCell < actions.length; idCell++) {
+        var currentCell = actions[idCell];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            {
+              if (position === 'top') {
+                var baseCellTr = currentCell.baseCell.parent;
+                var isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;
+
+                if (isTopFromRowSpan) {
+                  var newTd = external_jQuery_default()('<div></div>').append(external_jQuery_default()('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();
+                  html.append(newTd);
+                  break;
+                }
+              }
+
+              var rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);
+              rowspanNumber++;
+              currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);
+            }
+            break;
+        }
+      }
+
+      if (position === 'top') {
+        currentTr.before(html);
+      } else {
+        var cellHasRowspan = cell.rowSpan > 1;
+
+        if (cellHasRowspan) {
+          var lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);
+          external_jQuery_default()(external_jQuery_default()(currentTr).parent().find('tr')[lastTrIndex]).after(external_jQuery_default()(html));
+          return;
+        }
+
+        currentTr.after(html);
+      }
+    }
+    /**
+     * Add a new col
+     *
+     * @param {WrappedRange} rng
+     * @param {String} position (left/right)
+     * @return {Node}
+     */
+
+  }, {
+    key: "addCol",
+    value: function addCol(rng, position) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var rowsGroup = external_jQuery_default()(row).siblings();
+      rowsGroup.push(row);
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Add, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        var currentCell = actions[actionIndex];
+        var tdAttributes = this.recoverAttributes(currentCell.baseCell);
+
+        switch (currentCell.action) {
+          case TableResultAction.resultAction.AddCell:
+            if (position === 'right') {
+              external_jQuery_default()(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+
+          case TableResultAction.resultAction.SumSpanCount:
+            if (position === 'right') {
+              var colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);
+              colspanNumber++;
+              currentCell.baseCell.setAttribute('colSpan', colspanNumber);
+            } else {
+              external_jQuery_default()(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');
+            }
+
+            break;
+        }
+      }
+    }
+    /*
+    * Copy attributes from element.
+    *
+    * @param {object} Element to recover attributes.
+    * @return {string} Copied string elements.
+    */
+
+  }, {
+    key: "recoverAttributes",
+    value: function recoverAttributes(el) {
+      var resultStr = '';
+
+      if (!el) {
+        return resultStr;
+      }
+
+      var attrList = el.attributes || [];
+
+      for (var i = 0; i < attrList.length; i++) {
+        if (attrList[i].name.toLowerCase() === 'id') {
+          continue;
+        }
+
+        if (attrList[i].specified) {
+          resultStr += ' ' + attrList[i].name + '=\'' + attrList[i].value + '\'';
+        }
+      }
+
+      return resultStr;
+    }
+    /**
+     * Delete current row
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteRow",
+    value: function deleteRow(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var rowPos = row[0].rowIndex;
+      var vTable = new TableResultAction(cell, TableResultAction.where.Row, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        var baseCell = actions[actionIndex].baseCell;
+        var virtualPosition = actions[actionIndex].virtualTable;
+        var hasRowspan = baseCell.rowSpan && baseCell.rowSpan > 1;
+        var rowspanNumber = hasRowspan ? parseInt(baseCell.rowSpan, 10) : 0;
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.AddCell:
+            {
+              var nextRow = row.next('tr')[0];
+
+              if (!nextRow) {
+                continue;
+              }
+
+              var cloneRow = row[0].cells[cellPos];
+
+              if (hasRowspan) {
+                if (rowspanNumber > 2) {
+                  rowspanNumber--;
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);
+                  nextRow.cells[cellPos].innerHTML = '';
+                } else if (rowspanNumber === 2) {
+                  nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);
+                  nextRow.cells[cellPos].removeAttribute('rowSpan');
+                  nextRow.cells[cellPos].innerHTML = '';
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            if (hasRowspan) {
+              if (rowspanNumber > 2) {
+                rowspanNumber--;
+                baseCell.setAttribute('rowSpan', rowspanNumber);
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              } else if (rowspanNumber === 2) {
+                baseCell.removeAttribute('rowSpan');
+
+                if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) {
+                  baseCell.innerHTML = '';
+                }
+              }
+            }
+
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            // Do not need remove cell because row will be deleted.
+            continue;
+        }
+      }
+
+      row.remove();
+    }
+    /**
+     * Delete current col
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteCol",
+    value: function deleteCol(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      var row = external_jQuery_default()(cell).closest('tr');
+      var cellPos = row.children('td, th').index(external_jQuery_default()(cell));
+      var vTable = new TableResultAction(cell, TableResultAction.where.Column, TableResultAction.requestAction.Delete, external_jQuery_default()(row).closest('table')[0]);
+      var actions = vTable.getActionList();
+
+      for (var actionIndex = 0; actionIndex < actions.length; actionIndex++) {
+        if (!actions[actionIndex]) {
+          continue;
+        }
+
+        switch (actions[actionIndex].action) {
+          case TableResultAction.resultAction.Ignore:
+            continue;
+
+          case TableResultAction.resultAction.SubtractSpanCount:
+            {
+              var baseCell = actions[actionIndex].baseCell;
+              var hasColspan = baseCell.colSpan && baseCell.colSpan > 1;
+
+              if (hasColspan) {
+                var colspanNumber = baseCell.colSpan ? parseInt(baseCell.colSpan, 10) : 0;
+
+                if (colspanNumber > 2) {
+                  colspanNumber--;
+                  baseCell.setAttribute('colSpan', colspanNumber);
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                } else if (colspanNumber === 2) {
+                  baseCell.removeAttribute('colSpan');
+
+                  if (baseCell.cellIndex === cellPos) {
+                    baseCell.innerHTML = '';
+                  }
+                }
+              }
+            }
+            continue;
+
+          case TableResultAction.resultAction.RemoveCell:
+            dom.remove(actions[actionIndex].baseCell, true);
+            continue;
+        }
+      }
+    }
+    /**
+     * create empty table element
+     *
+     * @param {Number} rowCount
+     * @param {Number} colCount
+     * @return {Node}
+     */
+
+  }, {
+    key: "createTable",
+    value: function createTable(colCount, rowCount, options) {
+      var tds = [];
+      var tdHTML;
+
+      for (var idxCol = 0; idxCol < colCount; idxCol++) {
+        tds.push('<td>' + dom.blank + '</td>');
+      }
+
+      tdHTML = tds.join('');
+      var trs = [];
+      var trHTML;
+
+      for (var idxRow = 0; idxRow < rowCount; idxRow++) {
+        trs.push('<tr>' + tdHTML + '</tr>');
+      }
+
+      trHTML = trs.join('');
+      var $table = external_jQuery_default()('<table>' + trHTML + '</table>');
+
+      if (options && options.tableClassName) {
+        $table.addClass(options.tableClassName);
+      }
+
+      return $table[0];
+    }
+    /**
+     * Delete current table
+     *
+     * @param {WrappedRange} rng
+     * @return {Node}
+     */
+
+  }, {
+    key: "deleteTable",
+    value: function deleteTable(rng) {
+      var cell = dom.ancestor(rng.commonAncestor(), dom.isCell);
+      external_jQuery_default()(cell).closest('table').remove();
+    }
+  }]);
+
+  return Table;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Editor.js
+function Editor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Editor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Editor_createClass(Constructor, protoProps, staticProps) { if (protoProps) Editor_defineProperties(Constructor.prototype, protoProps); if (staticProps) Editor_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+var KEY_BOGUS = 'bogus';
+/**
+ * @class Editor
+ */
+
+var Editor = /*#__PURE__*/function () {
+  function Editor(context) {
+    var _this = this;
+
+    Editor_classCallCheck(this, Editor);
+
+    this.context = context;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.editable = this.$editable[0];
+    this.lastRange = null;
+    this.snapshot = null;
+    this.style = new Style();
+    this.table = new Table();
+    this.typing = new Typing(context);
+    this.bullet = new Bullet();
+    this.history = new History(context);
+    this.context.memo('help.escape', this.lang.help.escape);
+    this.context.memo('help.undo', this.lang.help.undo);
+    this.context.memo('help.redo', this.lang.help.redo);
+    this.context.memo('help.tab', this.lang.help.tab);
+    this.context.memo('help.untab', this.lang.help.untab);
+    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);
+    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);
+    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);
+    this.context.memo('help.indent', this.lang.help.indent);
+    this.context.memo('help.outdent', this.lang.help.outdent);
+    this.context.memo('help.formatPara', this.lang.help.formatPara);
+    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);
+    this.context.memo('help.fontName', this.lang.help.fontName); // native commands(with execCommand), generate function for execCommand
+
+    var commands = ['bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript', 'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'formatBlock', 'removeFormat', 'backColor'];
+
+    for (var idx = 0, len = commands.length; idx < len; idx++) {
+      this[commands[idx]] = function (sCmd) {
+        return function (value) {
+          _this.beforeCommand();
+
+          document.execCommand(sCmd, false, value);
+
+          _this.afterCommand(true);
+        };
+      }(commands[idx]);
+
+      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);
+    }
+
+    this.fontName = this.wrapCommand(function (value) {
+      return _this.fontStyling('font-family', env.validFontName(value));
+    });
+    this.fontSize = this.wrapCommand(function (value) {
+      var unit = _this.currentStyle()['font-size-unit'];
+
+      return _this.fontStyling('font-size', value + unit);
+    });
+    this.fontSizeUnit = this.wrapCommand(function (value) {
+      var size = _this.currentStyle()['font-size'];
+
+      return _this.fontStyling('font-size', size + value);
+    });
+
+    for (var _idx = 1; _idx <= 6; _idx++) {
+      this['formatH' + _idx] = function (idx) {
+        return function () {
+          _this.formatBlock('H' + idx);
+        };
+      }(_idx);
+
+      this.context.memo('help.formatH' + _idx, this.lang.help['formatH' + _idx]);
+    }
+
+    this.insertParagraph = this.wrapCommand(function () {
+      _this.typing.insertParagraph(_this.editable);
+    });
+    this.insertOrderedList = this.wrapCommand(function () {
+      _this.bullet.insertOrderedList(_this.editable);
+    });
+    this.insertUnorderedList = this.wrapCommand(function () {
+      _this.bullet.insertUnorderedList(_this.editable);
+    });
+    this.indent = this.wrapCommand(function () {
+      _this.bullet.indent(_this.editable);
+    });
+    this.outdent = this.wrapCommand(function () {
+      _this.bullet.outdent(_this.editable);
+    });
+    /**
+     * insertNode
+     * insert node
+     * @param {Node} node
+     */
+
+    this.insertNode = this.wrapCommand(function (node) {
+      if (_this.isLimited(external_jQuery_default()(node).text().length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      rng.insertNode(node);
+
+      _this.setLastRange(range.createFromNodeAfter(node).select());
+    });
+    /**
+     * insert text
+     * @param {String} text
+     */
+
+    this.insertText = this.wrapCommand(function (text) {
+      if (_this.isLimited(text.length)) {
+        return;
+      }
+
+      var rng = _this.getLastRange();
+
+      var textNode = rng.insertNode(dom.createText(text));
+
+      _this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());
+    });
+    /**
+     * paste HTML
+     * @param {String} markup
+     */
+
+    this.pasteHTML = this.wrapCommand(function (markup) {
+      if (_this.isLimited(markup.length)) {
+        return;
+      }
+
+      markup = _this.context.invoke('codeview.purify', markup);
+
+      var contents = _this.getLastRange().pasteHTML(markup);
+
+      _this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());
+    });
+    /**
+     * formatBlock
+     *
+     * @param {String} tagName
+     */
+
+    this.formatBlock = this.wrapCommand(function (tagName, $target) {
+      var onApplyCustomStyle = _this.options.callbacks.onApplyCustomStyle;
+
+      if (onApplyCustomStyle) {
+        onApplyCustomStyle.call(_this, $target, _this.context, _this.onFormatBlock);
+      } else {
+        _this.onFormatBlock(tagName, $target);
+      }
+    });
+    /**
+     * insert horizontal rule
+     */
+
+    this.insertHorizontalRule = this.wrapCommand(function () {
+      var hrNode = _this.getLastRange().insertNode(dom.create('HR'));
+
+      if (hrNode.nextSibling) {
+        _this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());
+      }
+    });
+    /**
+     * lineHeight
+     * @param {String} value
+     */
+
+    this.lineHeight = this.wrapCommand(function (value) {
+      _this.style.stylePara(_this.getLastRange(), {
+        lineHeight: value
+      });
+    });
+    /**
+     * create link (command)
+     *
+     * @param {Object} linkInfo
+     */
+
+    this.createLink = this.wrapCommand(function (linkInfo) {
+      var linkUrl = linkInfo.url;
+      var linkText = linkInfo.text;
+      var isNewWindow = linkInfo.isNewWindow;
+      var checkProtocol = linkInfo.checkProtocol;
+
+      var rng = linkInfo.range || _this.getLastRange();
+
+      var additionalTextLength = linkText.length - rng.toString().length;
+
+      if (additionalTextLength > 0 && _this.isLimited(additionalTextLength)) {
+        return;
+      }
+
+      var isTextChanged = rng.toString() !== linkText; // handle spaced urls from input
+
+      if (typeof linkUrl === 'string') {
+        linkUrl = linkUrl.trim();
+      }
+
+      if (_this.options.onCreateLink) {
+        linkUrl = _this.options.onCreateLink(linkUrl);
+      } else if (checkProtocol) {
+        // if url doesn't have any protocol and not even a relative or a label, use http:// as default
+        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(linkUrl) ? linkUrl : _this.options.defaultProtocol + linkUrl;
+      }
+
+      var anchors = [];
+
+      if (isTextChanged) {
+        rng = rng.deleteContents();
+        var anchor = rng.insertNode(external_jQuery_default()('<A>' + linkText + '</A>')[0]);
+        anchors.push(anchor);
+      } else {
+        anchors = _this.style.styleNodes(rng, {
+          nodeName: 'A',
+          expandClosestSibling: true,
+          onlyPartialContains: true
+        });
+      }
+
+      external_jQuery_default().each(anchors, function (idx, anchor) {
+        external_jQuery_default()(anchor).attr('href', linkUrl);
+
+        if (isNewWindow) {
+          external_jQuery_default()(anchor).attr('target', '_blank');
+        } else {
+          external_jQuery_default()(anchor).removeAttr('target');
+        }
+      });
+
+      _this.setLastRange(_this.createRangeFromList(anchors).select());
+    });
+    /**
+     * setting color
+     *
+     * @param {Object} sObjColor  color code
+     * @param {String} sObjColor.foreColor foreground color
+     * @param {String} sObjColor.backColor background color
+     */
+
+    this.color = this.wrapCommand(function (colorInfo) {
+      var foreColor = colorInfo.foreColor;
+      var backColor = colorInfo.backColor;
+
+      if (foreColor) {
+        document.execCommand('foreColor', false, foreColor);
+      }
+
+      if (backColor) {
+        document.execCommand('backColor', false, backColor);
+      }
+    });
+    /**
+     * Set foreground color
+     *
+     * @param {String} colorCode foreground color code
+     */
+
+    this.foreColor = this.wrapCommand(function (colorInfo) {
+      document.execCommand('foreColor', false, colorInfo);
+    });
+    /**
+     * insert Table
+     *
+     * @param {String} dimension of table (ex : "5x5")
+     */
+
+    this.insertTable = this.wrapCommand(function (dim) {
+      var dimension = dim.split('x');
+
+      var rng = _this.getLastRange().deleteContents();
+
+      rng.insertNode(_this.table.createTable(dimension[0], dimension[1], _this.options));
+    });
+    /**
+     * remove media object and Figure Elements if media object is img with Figure.
+     */
+
+    this.removeMedia = this.wrapCommand(function () {
+      var $target = external_jQuery_default()(_this.restoreTarget()).parent();
+
+      if ($target.closest('figure').length) {
+        $target.closest('figure').remove();
+      } else {
+        $target = external_jQuery_default()(_this.restoreTarget()).detach();
+      }
+
+      _this.context.triggerEvent('media.delete', $target, _this.$editable);
+    });
+    /**
+     * float me
+     *
+     * @param {String} value
+     */
+
+    this.floatMe = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      $target.toggleClass('note-float-left', value === 'left');
+      $target.toggleClass('note-float-right', value === 'right');
+      $target.css('float', value === 'none' ? '' : value);
+    });
+    /**
+     * resize overlay element
+     * @param {String} value
+     */
+
+    this.resize = this.wrapCommand(function (value) {
+      var $target = external_jQuery_default()(_this.restoreTarget());
+      value = parseFloat(value);
+
+      if (value === 0) {
+        $target.css('width', '');
+      } else {
+        $target.css({
+          width: value * 100 + '%',
+          height: ''
+        });
+      }
+    });
+  }
+
+  Editor_createClass(Editor, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      // bind custom events
+      this.$editable.on('keydown', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          _this2.context.triggerEvent('enter', event);
+        }
+
+        _this2.context.triggerEvent('keydown', event); // keep a snapshot to limit text on input event
+
+
+        _this2.snapshot = _this2.history.makeSnapshot();
+        _this2.hasKeyShortCut = false;
+
+        if (!event.isDefaultPrevented()) {
+          if (_this2.options.shortcuts) {
+            _this2.hasKeyShortCut = _this2.handleKeyMap(event);
+          } else {
+            _this2.preventDefaultEditableShortCuts(event);
+          }
+        }
+
+        if (_this2.isLimited(1, event)) {
+          var lastRange = _this2.getLastRange();
+
+          if (lastRange.eo - lastRange.so === 0) {
+            return false;
+          }
+        }
+
+        _this2.setLastRange(); // record undo in the key event except keyMap.
+
+
+        if (_this2.options.recordEveryKeystroke) {
+          if (_this2.hasKeyShortCut === false) {
+            _this2.history.recordUndo();
+          }
+        }
+      }).on('keyup', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('keyup', event);
+      }).on('focus', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('focus', event);
+      }).on('blur', function (event) {
+        _this2.context.triggerEvent('blur', event);
+      }).on('mousedown', function (event) {
+        _this2.context.triggerEvent('mousedown', event);
+      }).on('mouseup', function (event) {
+        _this2.setLastRange();
+
+        _this2.history.recordUndo();
+
+        _this2.context.triggerEvent('mouseup', event);
+      }).on('scroll', function (event) {
+        _this2.context.triggerEvent('scroll', event);
+      }).on('paste', function (event) {
+        _this2.setLastRange();
+
+        _this2.context.triggerEvent('paste', event);
+      }).on('input', function () {
+        // To limit composition characters (e.g. Korean)
+        if (_this2.isLimited(0) && _this2.snapshot) {
+          _this2.history.applySnapshot(_this2.snapshot);
+        }
+      });
+      this.$editable.attr('spellcheck', this.options.spellCheck);
+      this.$editable.attr('autocorrect', this.options.spellCheck);
+
+      if (this.options.disableGrammar) {
+        this.$editable.attr('data-gramm', false);
+      } // init content before set event
+
+
+      this.$editable.html(dom.html(this.$note) || dom.emptyPara);
+      this.$editable.on(env.inputEventName, func.debounce(function () {
+        _this2.context.triggerEvent('change', _this2.$editable.html(), _this2.$editable);
+      }, 10));
+      this.$editable.on('focusin', function (event) {
+        _this2.context.triggerEvent('focusin', event);
+      }).on('focusout', function (event) {
+        _this2.context.triggerEvent('focusout', event);
+      });
+
+      if (this.options.airMode) {
+        if (this.options.overrideContextMenu) {
+          this.$editor.on('contextmenu', function (event) {
+            _this2.context.triggerEvent('contextmenu', event);
+
+            return false;
+          });
+        }
+      } else {
+        if (this.options.width) {
+          this.$editor.outerWidth(this.options.width);
+        }
+
+        if (this.options.height) {
+          this.$editable.outerHeight(this.options.height);
+        }
+
+        if (this.options.maxHeight) {
+          this.$editable.css('max-height', this.options.maxHeight);
+        }
+
+        if (this.options.minHeight) {
+          this.$editable.css('min-height', this.options.minHeight);
+        }
+      }
+
+      this.history.recordUndo();
+      this.setLastRange();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$editable.off();
+    }
+  }, {
+    key: "handleKeyMap",
+    value: function handleKeyMap(event) {
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      var keys = [];
+
+      if (event.metaKey) {
+        keys.push('CMD');
+      }
+
+      if (event.ctrlKey && !event.altKey) {
+        keys.push('CTRL');
+      }
+
+      if (event.shiftKey) {
+        keys.push('SHIFT');
+      }
+
+      var keyName = key.nameFromCode[event.keyCode];
+
+      if (keyName) {
+        keys.push(keyName);
+      }
+
+      var eventName = keyMap[keys.join('+')];
+
+      if (keyName === 'TAB' && !this.options.tabDisable) {
+        this.afterCommand();
+      } else if (eventName) {
+        if (this.context.invoke(eventName) !== false) {
+          event.preventDefault(); // if keyMap action was invoked
+
+          return true;
+        }
+      } else if (key.isEdit(event.keyCode)) {
+        this.afterCommand();
+      }
+
+      return false;
+    }
+  }, {
+    key: "preventDefaultEditableShortCuts",
+    value: function preventDefaultEditableShortCuts(event) {
+      // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)
+      if ((event.ctrlKey || event.metaKey) && lists.contains([66, 73, 85], event.keyCode)) {
+        event.preventDefault();
+      }
+    }
+  }, {
+    key: "isLimited",
+    value: function isLimited(pad, event) {
+      pad = pad || 0;
+
+      if (typeof event !== 'undefined') {
+        if (key.isMove(event.keyCode) || key.isNavigation(event.keyCode) || event.ctrlKey || event.metaKey || lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {
+          return false;
+        }
+      }
+
+      if (this.options.maxTextLength > 0) {
+        if (this.$editable.text().length + pad > this.options.maxTextLength) {
+          return true;
+        }
+      }
+
+      return false;
+    }
+    /**
+     * create range
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRange",
+    value: function createRange() {
+      this.focus();
+      this.setLastRange();
+      return this.getLastRange();
+    }
+    /**
+     * create a new range from the list of elements
+     *
+     * @param {list} dom element list
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "createRangeFromList",
+    value: function createRangeFromList(lst) {
+      var startRange = range.createFromNodeBefore(lists.head(lst));
+      var startPoint = startRange.getStartPoint();
+      var endRange = range.createFromNodeAfter(lists.last(lst));
+      var endPoint = endRange.getEndPoint();
+      return range.create(startPoint.node, startPoint.offset, endPoint.node, endPoint.offset);
+    }
+    /**
+     * set the last range
+     *
+     * if given rng is exist, set rng as the last range
+     * or create a new range at the end of the document
+     *
+     * @param {WrappedRange} rng
+     */
+
+  }, {
+    key: "setLastRange",
+    value: function setLastRange(rng) {
+      if (rng) {
+        this.lastRange = rng;
+      } else {
+        this.lastRange = range.create(this.editable);
+
+        if (external_jQuery_default()(this.lastRange.sc).closest('.note-editable').length === 0) {
+          this.lastRange = range.createFromBodyElement(this.editable);
+        }
+      }
+    }
+    /**
+     * get the last range
+     *
+     * if there is a saved last range, return it
+     * or create a new range and return it
+     *
+     * @return {WrappedRange}
+     */
+
+  }, {
+    key: "getLastRange",
+    value: function getLastRange() {
+      if (!this.lastRange) {
+        this.setLastRange();
+      }
+
+      return this.lastRange;
+    }
+    /**
+     * saveRange
+     *
+     * save current range
+     *
+     * @param {Boolean} [thenCollapse=false]
+     */
+
+  }, {
+    key: "saveRange",
+    value: function saveRange(thenCollapse) {
+      if (thenCollapse) {
+        this.getLastRange().collapse().select();
+      }
+    }
+    /**
+     * restoreRange
+     *
+     * restore lately range
+     */
+
+  }, {
+    key: "restoreRange",
+    value: function restoreRange() {
+      if (this.lastRange) {
+        this.lastRange.select();
+        this.focus();
+      }
+    }
+  }, {
+    key: "saveTarget",
+    value: function saveTarget(node) {
+      this.$editable.data('target', node);
+    }
+  }, {
+    key: "clearTarget",
+    value: function clearTarget() {
+      this.$editable.removeData('target');
+    }
+  }, {
+    key: "restoreTarget",
+    value: function restoreTarget() {
+      return this.$editable.data('target');
+    }
+    /**
+     * currentStyle
+     *
+     * current style
+     * @return {Object|Boolean} unfocus
+     */
+
+  }, {
+    key: "currentStyle",
+    value: function currentStyle() {
+      var rng = range.create();
+
+      if (rng) {
+        rng = rng.normalize();
+      }
+
+      return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);
+    }
+    /**
+     * style from node
+     *
+     * @param {jQuery} $node
+     * @return {Object}
+     */
+
+  }, {
+    key: "styleFromNode",
+    value: function styleFromNode($node) {
+      return this.style.fromNode($node);
+    }
+    /**
+     * undo
+     */
+
+  }, {
+    key: "undo",
+    value: function undo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.undo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /*
+    * commit
+    */
+
+  }, {
+    key: "commit",
+    value: function commit() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.commit();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * redo
+     */
+
+  }, {
+    key: "redo",
+    value: function redo() {
+      this.context.triggerEvent('before.command', this.$editable.html());
+      this.history.redo();
+      this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+    }
+    /**
+     * before command
+     */
+
+  }, {
+    key: "beforeCommand",
+    value: function beforeCommand() {
+      this.context.triggerEvent('before.command', this.$editable.html()); // Set styleWithCSS before run a command
+
+      document.execCommand('styleWithCSS', false, this.options.styleWithCSS); // keep focus on editable before command execution
+
+      this.focus();
+    }
+    /**
+     * after command
+     * @param {Boolean} isPreventTrigger
+     */
+
+  }, {
+    key: "afterCommand",
+    value: function afterCommand(isPreventTrigger) {
+      this.normalizeContent();
+      this.history.recordUndo();
+
+      if (!isPreventTrigger) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+    /**
+     * handle tab key
+     */
+
+  }, {
+    key: "tab",
+    value: function tab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+
+        if (!this.isLimited(this.options.tabSize)) {
+          this.beforeCommand();
+          this.typing.insertTab(rng, this.options.tabSize);
+          this.afterCommand();
+        }
+      }
+    }
+    /**
+     * handle shift+tab key
+     */
+
+  }, {
+    key: "untab",
+    value: function untab() {
+      var rng = this.getLastRange();
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.table.tab(rng, true);
+      } else {
+        if (this.options.tabSize === 0) {
+          return false;
+        }
+      }
+    }
+    /**
+     * run given function between beforeCommand and afterCommand
+     */
+
+  }, {
+    key: "wrapCommand",
+    value: function wrapCommand(fn) {
+      return function () {
+        this.beforeCommand();
+        fn.apply(this, arguments);
+        this.afterCommand();
+      };
+    }
+    /**
+     * insert image
+     *
+     * @param {String} src
+     * @param {String|Function} param
+     * @return {Promise}
+     */
+
+  }, {
+    key: "insertImage",
+    value: function insertImage(src, param) {
+      var _this3 = this;
+
+      return createImage(src, param).then(function ($image) {
+        _this3.beforeCommand();
+
+        if (typeof param === 'function') {
+          param($image);
+        } else {
+          if (typeof param === 'string') {
+            $image.attr('data-filename', param);
+          }
+
+          $image.css('width', Math.min(_this3.$editable.width(), $image.width()));
+        }
+
+        $image.show();
+
+        _this3.getLastRange().insertNode($image[0]);
+
+        _this3.setLastRange(range.createFromNodeAfter($image[0]).select());
+
+        _this3.afterCommand();
+      }).fail(function (e) {
+        _this3.context.triggerEvent('image.upload.error', e);
+      });
+    }
+    /**
+     * insertImages
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesAsDataURL",
+    value: function insertImagesAsDataURL(files) {
+      var _this4 = this;
+
+      external_jQuery_default().each(files, function (idx, file) {
+        var filename = file.name;
+
+        if (_this4.options.maximumImageFileSize && _this4.options.maximumImageFileSize < file.size) {
+          _this4.context.triggerEvent('image.upload.error', _this4.lang.image.maximumFileSizeError);
+        } else {
+          readFileAsDataURL(file).then(function (dataURL) {
+            return _this4.insertImage(dataURL, filename);
+          }).fail(function () {
+            _this4.context.triggerEvent('image.upload.error');
+          });
+        }
+      });
+    }
+    /**
+     * insertImagesOrCallback
+     * @param {File[]} files
+     */
+
+  }, {
+    key: "insertImagesOrCallback",
+    value: function insertImagesOrCallback(files) {
+      var callbacks = this.options.callbacks; // If onImageUpload set,
+
+      if (callbacks.onImageUpload) {
+        this.context.triggerEvent('image.upload', files); // else insert Image as dataURL
+      } else {
+        this.insertImagesAsDataURL(files);
+      }
+    }
+    /**
+     * return selected plain text
+     * @return {String} text
+     */
+
+  }, {
+    key: "getSelectedText",
+    value: function getSelectedText() {
+      var rng = this.getLastRange(); // if range on anchor, expand range with anchor
+
+      if (rng.isOnAnchor()) {
+        rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));
+      }
+
+      return rng.toString();
+    }
+  }, {
+    key: "onFormatBlock",
+    value: function onFormatBlock(tagName, $target) {
+      // [workaround] for MSIE, IE need `<`
+      document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName); // support custom class
+
+      if ($target && $target.length) {
+        // find the exact element has given tagName
+        if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {
+          $target = $target.find(tagName);
+        }
+
+        if ($target && $target.length) {
+          var currentRange = this.createRange();
+          var $parent = external_jQuery_default()([currentRange.sc, currentRange.ec]).closest(tagName); // remove class added for current block
+
+          $parent.removeClass();
+          var className = $target[0].className || '';
+
+          if (className) {
+            $parent.addClass(className);
+          }
+        }
+      }
+    }
+  }, {
+    key: "formatPara",
+    value: function formatPara() {
+      this.formatBlock('P');
+    }
+  }, {
+    key: "fontStyling",
+    value: function fontStyling(target, value) {
+      var rng = this.getLastRange();
+
+      if (rng !== '') {
+        var spans = this.style.styleNodes(rng);
+        this.$editor.find('.note-status-output').html('');
+        external_jQuery_default()(spans).css(target, value); // [workaround] added styled bogus span for style
+        //  - also bogus character needed for cursor position
+
+        if (rng.isCollapsed()) {
+          var firstSpan = lists.head(spans);
+
+          if (firstSpan && !dom.nodeLength(firstSpan)) {
+            firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;
+            range.createFromNode(firstSpan.firstChild).select();
+            this.setLastRange();
+            this.$editable.data(KEY_BOGUS, firstSpan);
+          }
+        } else {
+          this.setLastRange(this.createRangeFromList(spans).select());
+        }
+      } else {
+        var noteStatusOutput = external_jQuery_default().now();
+        this.$editor.find('.note-status-output').html('<div id="note-status-output-' + noteStatusOutput + '" class="alert alert-info">' + this.lang.output.noSelection + '</div>');
+        setTimeout(function () {
+          external_jQuery_default()('#note-status-output-' + noteStatusOutput).remove();
+        }, 5000);
+      }
+    }
+    /**
+     * unlink
+     *
+     * @type command
+     */
+
+  }, {
+    key: "unlink",
+    value: function unlink() {
+      var rng = this.getLastRange();
+
+      if (rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        rng = range.createFromNode(anchor);
+        rng.select();
+        this.setLastRange();
+        this.beforeCommand();
+        document.execCommand('unlink');
+        this.afterCommand();
+      }
+    }
+    /**
+     * returns link info
+     *
+     * @return {Object}
+     * @return {WrappedRange} return.range
+     * @return {String} return.text
+     * @return {Boolean} [return.isNewWindow=true]
+     * @return {String} [return.url=""]
+     */
+
+  }, {
+    key: "getLinkInfo",
+    value: function getLinkInfo() {
+      var rng = this.getLastRange().expand(dom.isAnchor); // Get the first anchor on range(for edit).
+
+      var $anchor = external_jQuery_default()(lists.head(rng.nodes(dom.isAnchor)));
+      var linkInfo = {
+        range: rng,
+        text: rng.toString(),
+        url: $anchor.length ? $anchor.attr('href') : ''
+      }; // When anchor exists,
+
+      if ($anchor.length) {
+        // Set isNewWindow by checking its target.
+        linkInfo.isNewWindow = $anchor.attr('target') === '_blank';
+      }
+
+      return linkInfo;
+    }
+  }, {
+    key: "addRow",
+    value: function addRow(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addRow(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "addCol",
+    value: function addCol(position) {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.addCol(rng, position);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteRow",
+    value: function deleteRow() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteRow(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteCol",
+    value: function deleteCol() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteCol(rng);
+        this.afterCommand();
+      }
+    }
+  }, {
+    key: "deleteTable",
+    value: function deleteTable() {
+      var rng = this.getLastRange(this.$editable);
+
+      if (rng.isCollapsed() && rng.isOnCell()) {
+        this.beforeCommand();
+        this.table.deleteTable(rng);
+        this.afterCommand();
+      }
+    }
+    /**
+     * @param {Position} pos
+     * @param {jQuery} $target - target element
+     * @param {Boolean} [bKeepRatio] - keep ratio
+     */
+
+  }, {
+    key: "resizeTo",
+    value: function resizeTo(pos, $target, bKeepRatio) {
+      var imageSize;
+
+      if (bKeepRatio) {
+        var newRatio = pos.y / pos.x;
+        var ratio = $target.data('ratio');
+        imageSize = {
+          width: ratio > newRatio ? pos.x : pos.y / ratio,
+          height: ratio > newRatio ? pos.x * ratio : pos.y
+        };
+      } else {
+        imageSize = {
+          width: pos.x,
+          height: pos.y
+        };
+      }
+
+      $target.css(imageSize);
+    }
+    /**
+     * returns whether editable area has focus or not.
+     */
+
+  }, {
+    key: "hasFocus",
+    value: function hasFocus() {
+      return this.$editable.is(':focus');
+    }
+    /**
+     * set focus
+     */
+
+  }, {
+    key: "focus",
+    value: function focus() {
+      // [workaround] Screen will move when page is scolled in IE.
+      //  - do focus when not focused
+      if (!this.hasFocus()) {
+        this.$editable.focus();
+      }
+    }
+    /**
+     * returns whether contents is empty or not.
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isEmpty",
+    value: function isEmpty() {
+      return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();
+    }
+    /**
+     * Removes all contents and restores the editable instance to an _emptyPara_.
+     */
+
+  }, {
+    key: "empty",
+    value: function empty() {
+      this.context.invoke('code', dom.emptyPara);
+    }
+    /**
+     * normalize content
+     */
+
+  }, {
+    key: "normalizeContent",
+    value: function normalizeContent() {
+      this.$editable[0].normalize();
+    }
+  }]);
+
+  return Editor;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Clipboard.js
+function Clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Clipboard_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Clipboard_createClass(Constructor, protoProps, staticProps) { if (protoProps) Clipboard_defineProperties(Constructor.prototype, protoProps); if (staticProps) Clipboard_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Clipboard = /*#__PURE__*/function () {
+  function Clipboard(context) {
+    Clipboard_classCallCheck(this, Clipboard);
+
+    this.context = context;
+    this.$editable = context.layoutInfo.editable;
+  }
+
+  Clipboard_createClass(Clipboard, [{
+    key: "initialize",
+    value: function initialize() {
+      this.$editable.on('paste', this.pasteByEvent.bind(this));
+    }
+    /**
+     * paste by clipboard event
+     *
+     * @param {Event} event
+     */
+
+  }, {
+    key: "pasteByEvent",
+    value: function pasteByEvent(event) {
+      var _this = this;
+
+      var clipboardData = event.originalEvent.clipboardData;
+
+      if (clipboardData && clipboardData.items && clipboardData.items.length) {
+        var item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);
+
+        if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
+          // paste img file
+          this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);
+          event.preventDefault();
+        } else if (item.kind === 'string') {
+          // paste text with maxTextLength check
+          if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {
+            event.preventDefault();
+          }
+        }
+      } else if (window.clipboardData) {
+        // for IE
+        var text = window.clipboardData.getData('text');
+
+        if (this.context.invoke('editor.isLimited', text.length)) {
+          event.preventDefault();
+        }
+      } // Call editor.afterCommand after proceeding default event handler
+
+
+      setTimeout(function () {
+        _this.context.invoke('editor.afterCommand');
+      }, 10);
+    }
+  }]);
+
+  return Clipboard;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Dropzone.js
+function Dropzone_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Dropzone_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Dropzone_createClass(Constructor, protoProps, staticProps) { if (protoProps) Dropzone_defineProperties(Constructor.prototype, protoProps); if (staticProps) Dropzone_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Dropzone = /*#__PURE__*/function () {
+  function Dropzone(context) {
+    Dropzone_classCallCheck(this, Dropzone);
+
+    this.context = context;
+    this.$eventListener = external_jQuery_default()(document);
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.documentEventHandlers = {};
+    this.$dropzone = external_jQuery_default()(['<div class="note-dropzone">', '<div class="note-dropzone-message"></div>', '</div>'].join('')).prependTo(this.$editor);
+  }
+  /**
+   * attach Drag and Drop Events
+   */
+
+
+  Dropzone_createClass(Dropzone, [{
+    key: "initialize",
+    value: function initialize() {
+      if (this.options.disableDragAndDrop) {
+        // prevent default drop event
+        this.documentEventHandlers.onDrop = function (e) {
+          e.preventDefault();
+        }; // do not consider outside of dropzone
+
+
+        this.$eventListener = this.$dropzone;
+        this.$eventListener.on('drop', this.documentEventHandlers.onDrop);
+      } else {
+        this.attachDragAndDropEvent();
+      }
+    }
+    /**
+     * attach Drag and Drop Events
+     */
+
+  }, {
+    key: "attachDragAndDropEvent",
+    value: function attachDragAndDropEvent() {
+      var _this = this;
+
+      var collection = external_jQuery_default()();
+      var $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');
+
+      this.documentEventHandlers.onDragenter = function (e) {
+        var isCodeview = _this.context.invoke('codeview.isActivated');
+
+        var hasEditorSize = _this.$editor.width() > 0 && _this.$editor.height() > 0;
+
+        if (!isCodeview && !collection.length && hasEditorSize) {
+          _this.$editor.addClass('dragover');
+
+          _this.$dropzone.width(_this.$editor.width());
+
+          _this.$dropzone.height(_this.$editor.height());
+
+          $dropzoneMessage.text(_this.lang.image.dragImageHere);
+        }
+
+        collection = collection.add(e.target);
+      };
+
+      this.documentEventHandlers.onDragleave = function (e) {
+        collection = collection.not(e.target); // If nodeName is BODY, then just make it over (fix for IE)
+
+        if (!collection.length || e.target.nodeName === 'BODY') {
+          collection = external_jQuery_default()();
+
+          _this.$editor.removeClass('dragover');
+        }
+      };
+
+      this.documentEventHandlers.onDrop = function () {
+        collection = external_jQuery_default()();
+
+        _this.$editor.removeClass('dragover');
+      }; // show dropzone on dragenter when dragging a object to document
+      // -but only if the editor is visible, i.e. has a positive width and height
+
+
+      this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter).on('dragleave', this.documentEventHandlers.onDragleave).on('drop', this.documentEventHandlers.onDrop); // change dropzone's message on hover.
+
+      this.$dropzone.on('dragenter', function () {
+        _this.$dropzone.addClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dropImage);
+      }).on('dragleave', function () {
+        _this.$dropzone.removeClass('hover');
+
+        $dropzoneMessage.text(_this.lang.image.dragImageHere);
+      }); // attach dropImage
+
+      this.$dropzone.on('drop', function (event) {
+        var dataTransfer = event.originalEvent.dataTransfer; // stop the browser from opening the dropped content
+
+        event.preventDefault();
+
+        if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
+          _this.$editable.focus();
+
+          _this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);
+        } else {
+          external_jQuery_default().each(dataTransfer.types, function (idx, type) {
+            // skip moz-specific types
+            if (type.toLowerCase().indexOf('_moz_') > -1) {
+              return;
+            }
+
+            var content = dataTransfer.getData(type);
+
+            if (type.toLowerCase().indexOf('text') > -1) {
+              _this.context.invoke('editor.pasteHTML', content);
+            } else {
+              external_jQuery_default()(content).each(function (idx, item) {
+                _this.context.invoke('editor.insertNode', item);
+              });
+            }
+          });
+        }
+      }).on('dragover', false); // prevent default dragover event
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      var _this2 = this;
+
+      Object.keys(this.documentEventHandlers).forEach(function (key) {
+        _this2.$eventListener.off(key.substr(2).toLowerCase(), _this2.documentEventHandlers[key]);
+      });
+      this.documentEventHandlers = {};
+    }
+  }]);
+
+  return Dropzone;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Codeview.js
+function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
+
+function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
+
+function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
+
+function Codeview_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Codeview_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Codeview_createClass(Constructor, protoProps, staticProps) { if (protoProps) Codeview_defineProperties(Constructor.prototype, protoProps); if (staticProps) Codeview_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+/**
+ * @class Codeview
+ */
+
+var CodeView = /*#__PURE__*/function () {
+  function CodeView(context) {
+    Codeview_classCallCheck(this, CodeView);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+    this.CodeMirrorConstructor = window.CodeMirror;
+
+    if (this.options.codemirror.CodeMirrorConstructor) {
+      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;
+    }
+  }
+
+  Codeview_createClass(CodeView, [{
+    key: "sync",
+    value: function sync(html) {
+      var isCodeview = this.isActivated();
+      var CodeMirror = this.CodeMirrorConstructor;
+
+      if (isCodeview) {
+        if (html) {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').getDoc().setValue(html);
+          } else {
+            this.$codable.val(html);
+          }
+        } else {
+          if (CodeMirror) {
+            this.$codable.data('cmEditor').save();
+          }
+        }
+      }
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.$codable.on('keyup', function (event) {
+        if (event.keyCode === key.code.ESCAPE) {
+          _this.deactivate();
+        }
+      });
+    }
+    /**
+     * @return {Boolean}
+     */
+
+  }, {
+    key: "isActivated",
+    value: function isActivated() {
+      return this.$editor.hasClass('codeview');
+    }
+    /**
+     * toggle codeview
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      if (this.isActivated()) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+
+      this.context.triggerEvent('codeview.toggled');
+    }
+    /**
+     * purify input value
+     * @param value
+     * @returns {*}
+     */
+
+  }, {
+    key: "purify",
+    value: function purify(value) {
+      if (this.options.codeviewFilter) {
+        // filter code view regex
+        value = value.replace(this.options.codeviewFilterRegex, ''); // allow specific iframe tag
+
+        if (this.options.codeviewIframeFilter) {
+          var whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);
+          value = value.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi, function (tag) {
+            // remove if src attribute is duplicated
+            if (/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(tag)) {
+              return '';
+            }
+
+            var _iterator = _createForOfIteratorHelper(whitelist),
+                _step;
+
+            try {
+              for (_iterator.s(); !(_step = _iterator.n()).done;) {
+                var src = _step.value;
+
+                // pass if src is trusted
+                if (new RegExp('src="(https?:)?\/\/' + src.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '\/(.+)"').test(tag)) {
+                  return tag;
+                }
+              }
+            } catch (err) {
+              _iterator.e(err);
+            } finally {
+              _iterator.f();
+            }
+
+            return '';
+          });
+        }
+      }
+
+      return value;
+    }
+    /**
+     * activate code view
+     */
+
+  }, {
+    key: "activate",
+    value: function activate() {
+      var _this2 = this;
+
+      var CodeMirror = this.CodeMirrorConstructor;
+      this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));
+      this.$codable.height(this.$editable.height());
+      this.context.invoke('toolbar.updateCodeview', true);
+      this.context.invoke('airPopover.updateCodeview', true);
+      this.$editor.addClass('codeview');
+      this.$codable.focus(); // activate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror); // CodeMirror TernServer
+
+        if (this.options.codemirror.tern) {
+          var server = new CodeMirror.TernServer(this.options.codemirror.tern);
+          cmEditor.ternServer = server;
+          cmEditor.on('cursorActivity', function (cm) {
+            server.updateArgHints(cm);
+          });
+        }
+
+        cmEditor.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);
+        });
+        cmEditor.on('change', function () {
+          _this2.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);
+        }); // CodeMirror hasn't Padding.
+
+        cmEditor.setSize(null, this.$editable.outerHeight());
+        this.$codable.data('cmEditor', cmEditor);
+      } else {
+        this.$codable.on('blur', function (event) {
+          _this2.context.triggerEvent('blur.codeview', _this2.$codable.val(), event);
+        });
+        this.$codable.on('input', function () {
+          _this2.context.triggerEvent('change.codeview', _this2.$codable.val(), _this2.$codable);
+        });
+      }
+    }
+    /**
+     * deactivate code view
+     */
+
+  }, {
+    key: "deactivate",
+    value: function deactivate() {
+      var CodeMirror = this.CodeMirrorConstructor; // deactivate CodeMirror as codable
+
+      if (CodeMirror) {
+        var cmEditor = this.$codable.data('cmEditor');
+        this.$codable.val(cmEditor.getValue());
+        cmEditor.toTextArea();
+      }
+
+      var value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);
+      var isChange = this.$editable.html() !== value;
+      this.$editable.html(value);
+      this.$editable.height(this.options.height ? this.$codable.height() : 'auto');
+      this.$editor.removeClass('codeview');
+
+      if (isChange) {
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+
+      this.$editable.focus();
+      this.context.invoke('toolbar.updateCodeview', false);
+      this.context.invoke('airPopover.updateCodeview', false);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      if (this.isActivated()) {
+        this.deactivate();
+      }
+    }
+  }]);
+
+  return CodeView;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Statusbar.js
+function Statusbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Statusbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Statusbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Statusbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Statusbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+var EDITABLE_PADDING = 24;
+
+var Statusbar = /*#__PURE__*/function () {
+  function Statusbar(context) {
+    Statusbar_classCallCheck(this, Statusbar);
+
+    this.$document = external_jQuery_default()(document);
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.options = context.options;
+  }
+
+  Statusbar_createClass(Statusbar, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      if (this.options.airMode || this.options.disableResizeEditor) {
+        this.destroy();
+        return;
+      }
+
+      this.$statusbar.on('mousedown', function (event) {
+        event.preventDefault();
+        event.stopPropagation();
+
+        var editableTop = _this.$editable.offset().top - _this.$document.scrollTop();
+
+        var editableCodeTop = _this.$codable.offset().top - _this.$document.scrollTop();
+
+        var onMouseMove = function onMouseMove(event) {
+          var height = event.clientY - (editableTop + EDITABLE_PADDING);
+          var heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);
+          height = _this.options.minheight > 0 ? Math.max(height, _this.options.minheight) : height;
+          height = _this.options.maxHeight > 0 ? Math.min(height, _this.options.maxHeight) : height;
+          heightCode = _this.options.minheight > 0 ? Math.max(heightCode, _this.options.minheight) : heightCode;
+          heightCode = _this.options.maxHeight > 0 ? Math.min(heightCode, _this.options.maxHeight) : heightCode;
+
+          _this.$editable.height(height);
+
+          _this.$codable.height(heightCode);
+        };
+
+        _this.$document.on('mousemove', onMouseMove).one('mouseup', function () {
+          _this.$document.off('mousemove', onMouseMove);
+        });
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$statusbar.off();
+      this.$statusbar.addClass('locked');
+    }
+  }]);
+
+  return Statusbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Fullscreen.js
+function Fullscreen_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Fullscreen_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Fullscreen_createClass(Constructor, protoProps, staticProps) { if (protoProps) Fullscreen_defineProperties(Constructor.prototype, protoProps); if (staticProps) Fullscreen_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Fullscreen = /*#__PURE__*/function () {
+  function Fullscreen(context) {
+    var _this = this;
+
+    Fullscreen_classCallCheck(this, Fullscreen);
+
+    this.context = context;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$codable = context.layoutInfo.codable;
+    this.$window = external_jQuery_default()(window);
+    this.$scrollbar = external_jQuery_default()('html, body');
+    this.scrollbarClassName = 'note-fullscreen-body';
+
+    this.onResize = function () {
+      _this.resizeTo({
+        h: _this.$window.height() - _this.$toolbar.outerHeight()
+      });
+    };
+  }
+
+  Fullscreen_createClass(Fullscreen, [{
+    key: "resizeTo",
+    value: function resizeTo(size) {
+      this.$editable.css('height', size.h);
+      this.$codable.css('height', size.h);
+
+      if (this.$codable.data('cmeditor')) {
+        this.$codable.data('cmeditor').setsize(null, size.h);
+      }
+    }
+    /**
+     * toggle fullscreen
+     */
+
+  }, {
+    key: "toggle",
+    value: function toggle() {
+      this.$editor.toggleClass('fullscreen');
+      var isFullscreen = this.isFullscreen();
+      this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);
+
+      if (isFullscreen) {
+        this.$editable.data('orgHeight', this.$editable.css('height'));
+        this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));
+        this.$editable.css('maxHeight', '');
+        this.$window.on('resize', this.onResize).trigger('resize');
+      } else {
+        this.$window.off('resize', this.onResize);
+        this.resizeTo({
+          h: this.$editable.data('orgHeight')
+        });
+        this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));
+      }
+
+      this.context.invoke('toolbar.updateFullscreen', isFullscreen);
+    }
+  }, {
+    key: "isFullscreen",
+    value: function isFullscreen() {
+      return this.$editor.hasClass('fullscreen');
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$scrollbar.removeClass(this.scrollbarClassName);
+    }
+  }]);
+
+  return Fullscreen;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Handle.js
+function Handle_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Handle_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Handle_createClass(Constructor, protoProps, staticProps) { if (protoProps) Handle_defineProperties(Constructor.prototype, protoProps); if (staticProps) Handle_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var Handle = /*#__PURE__*/function () {
+  function Handle(context) {
+    var _this = this;
+
+    Handle_classCallCheck(this, Handle);
+
+    this.context = context;
+    this.$document = external_jQuery_default()(document);
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        if (_this.update(e.target, e)) {
+          e.preventDefault();
+        }
+      },
+      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': function summernoteKeyupSummernoteScrollSummernoteChangeSummernoteDialogShown() {
+        _this.update();
+      },
+      'summernote.disable summernote.blur': function summernoteDisableSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Handle_createClass(Handle, [{
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$handle = external_jQuery_default()(['<div class="note-handle">', '<div class="note-control-selection">', '<div class="note-control-selection-bg"></div>', '<div class="note-control-holder note-control-nw"></div>', '<div class="note-control-holder note-control-ne"></div>', '<div class="note-control-holder note-control-sw"></div>', '<div class="', this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing', ' note-control-se"></div>', this.options.disableResizeImage ? '' : '<div class="note-control-selection-info"></div>', '</div>', '</div>'].join('')).prependTo(this.$editingArea);
+      this.$handle.on('mousedown', function (event) {
+        if (dom.isControlSizing(event.target)) {
+          event.preventDefault();
+          event.stopPropagation();
+
+          var $target = _this2.$handle.find('.note-control-selection').data('target');
+
+          var posStart = $target.offset();
+
+          var scrollTop = _this2.$document.scrollTop();
+
+          var onMouseMove = function onMouseMove(event) {
+            _this2.context.invoke('editor.resizeTo', {
+              x: event.clientX - posStart.left,
+              y: event.clientY - (posStart.top - scrollTop)
+            }, $target, !event.shiftKey);
+
+            _this2.update($target[0], event);
+          };
+
+          _this2.$document.on('mousemove', onMouseMove).one('mouseup', function (e) {
+            e.preventDefault();
+
+            _this2.$document.off('mousemove', onMouseMove);
+
+            _this2.context.invoke('editor.afterCommand');
+          });
+
+          if (!$target.data('ratio')) {
+            // original ratio.
+            $target.data('ratio', $target.height() / $target.width());
+          }
+        }
+      }); // Listen for scrolling on the handle overlay.
+
+      this.$handle.on('wheel', function (e) {
+        e.preventDefault();
+
+        _this2.update();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$handle.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isImage = dom.isImg(target);
+      var $selection = this.$handle.find('.note-control-selection');
+      this.context.invoke('imagePopover.update', target, event);
+
+      if (isImage) {
+        var $image = external_jQuery_default()(target);
+        var position = $image.position();
+        var pos = {
+          left: position.left + parseInt($image.css('marginLeft'), 10),
+          top: position.top + parseInt($image.css('marginTop'), 10)
+        }; // exclude margin
+
+        var imageSize = {
+          w: $image.outerWidth(false),
+          h: $image.outerHeight(false)
+        };
+        $selection.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top,
+          width: imageSize.w,
+          height: imageSize.h
+        }).data('target', $image); // save current image element.
+
+        var origImageObj = new Image();
+        origImageObj.src = $image.attr('src');
+        var sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';
+        $selection.find('.note-control-selection-info').text(sizingText);
+        this.context.invoke('editor.saveTarget', target);
+      } else {
+        this.hide();
+      }
+
+      return isImage;
+    }
+    /**
+     * hide
+     *
+     * @param {jQuery} $handle
+     */
+
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.context.invoke('editor.clearTarget');
+      this.$handle.children().hide();
+    }
+  }]);
+
+  return Handle;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoLink.js
+function AutoLink_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoLink_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoLink_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoLink_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoLink_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var defaultScheme = 'http://';
+var linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i;
+
+var AutoLink = /*#__PURE__*/function () {
+  function AutoLink(context) {
+    var _this = this;
+
+    AutoLink_classCallCheck(this, AutoLink);
+
+    this.context = context;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoLink_createClass(AutoLink, [{
+    key: "initialize",
+    value: function initialize() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWordRange = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWordRange) {
+        return;
+      }
+
+      var keyword = this.lastWordRange.toString();
+      var match = keyword.match(linkPattern);
+
+      if (match && (match[1] || match[2])) {
+        var link = match[1] ? keyword : defaultScheme + keyword;
+        var urlText = this.options.showDomainOnlyForAutolink ? keyword.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i, '').split('/')[0] : keyword;
+        var node = external_jQuery_default()('<a></a>').html(urlText).attr('href', link)[0];
+
+        if (this.context.options.linkTargetBlank) {
+          external_jQuery_default()(node).attr('target', '_blank');
+        }
+
+        this.lastWordRange.insertNode(node);
+        this.lastWordRange = null;
+        this.context.invoke('editor.focus');
+      }
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWordRange = wordRange;
+      }
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoLink;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoSync.js
+function AutoSync_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoSync_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoSync_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoSync_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoSync_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+/**
+ * textarea auto sync.
+ */
+
+var AutoSync = /*#__PURE__*/function () {
+  function AutoSync(context) {
+    var _this = this;
+
+    AutoSync_classCallCheck(this, AutoSync);
+
+    this.$note = context.layoutInfo.note;
+    this.events = {
+      'summernote.change': function summernoteChange() {
+        _this.$note.val(context.invoke('code'));
+      }
+    };
+  }
+
+  AutoSync_createClass(AutoSync, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return dom.isTextarea(this.$note[0]);
+    }
+  }]);
+
+  return AutoSync;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AutoReplace.js
+function AutoReplace_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AutoReplace_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AutoReplace_createClass(Constructor, protoProps, staticProps) { if (protoProps) AutoReplace_defineProperties(Constructor.prototype, protoProps); if (staticProps) AutoReplace_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var AutoReplace = /*#__PURE__*/function () {
+  function AutoReplace(context) {
+    var _this = this;
+
+    AutoReplace_classCallCheck(this, AutoReplace);
+
+    this.context = context;
+    this.options = context.options.replace || {};
+    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];
+    this.previousKeydownCode = null;
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      }
+    };
+  }
+
+  AutoReplace_createClass(AutoReplace, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.match;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.lastWord = null;
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      if (!this.lastWord) {
+        return;
+      }
+
+      var self = this;
+      var keyword = this.lastWord.toString();
+      this.options.match(keyword, function (match) {
+        if (match) {
+          var node = '';
+
+          if (typeof match === 'string') {
+            node = dom.createText(match);
+          } else if (match instanceof jQuery) {
+            node = match[0];
+          } else if (match instanceof Node) {
+            node = match;
+          }
+
+          if (!node) return;
+          self.lastWord.insertNode(node);
+          self.lastWord = null;
+          self.context.invoke('editor.focus');
+        }
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      // this forces it to remember the last whole word, even if multiple termination keys are pressed
+      // before the previous key is let go.
+      if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {
+        this.previousKeydownCode = e.keyCode;
+        return;
+      }
+
+      if (lists.contains(this.keys, e.keyCode)) {
+        var wordRange = this.context.invoke('editor.createRange').getWordRange();
+        this.lastWord = wordRange;
+      }
+
+      this.previousKeydownCode = e.keyCode;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      if (lists.contains(this.keys, e.keyCode)) {
+        this.replace();
+      }
+    }
+  }]);
+
+  return AutoReplace;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Placeholder.js
+function Placeholder_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Placeholder_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Placeholder_createClass(Constructor, protoProps, staticProps) { if (protoProps) Placeholder_defineProperties(Constructor.prototype, protoProps); if (staticProps) Placeholder_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Placeholder = /*#__PURE__*/function () {
+  function Placeholder(context) {
+    var _this = this;
+
+    Placeholder_classCallCheck(this, Placeholder);
+
+    this.context = context;
+    this.$editingArea = context.layoutInfo.editingArea;
+    this.options = context.options;
+
+    if (this.options.inheritPlaceholder === true) {
+      // get placeholder value from the original element
+      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;
+    }
+
+    this.events = {
+      'summernote.init summernote.change': function summernoteInitSummernoteChange() {
+        _this.update();
+      },
+      'summernote.codeview.toggled': function summernoteCodeviewToggled() {
+        _this.update();
+      }
+    };
+  }
+
+  Placeholder_createClass(Placeholder, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !!this.options.placeholder;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$placeholder = external_jQuery_default()('<div class="note-placeholder"></div>');
+      this.$placeholder.on('click', function () {
+        _this2.context.invoke('focus');
+      }).html(this.options.placeholder).prependTo(this.$editingArea);
+      this.update();
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$placeholder.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      var isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');
+      this.$placeholder.toggle(isShow);
+    }
+  }]);
+
+  return Placeholder;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Buttons.js
+function Buttons_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Buttons_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Buttons_createClass(Constructor, protoProps, staticProps) { if (protoProps) Buttons_defineProperties(Constructor.prototype, protoProps); if (staticProps) Buttons_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var Buttons = /*#__PURE__*/function () {
+  function Buttons(context) {
+    Buttons_classCallCheck(this, Buttons);
+
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.context = context;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    this.invertedKeyMap = func.invertObject(this.options.keyMap[env.isMac ? 'mac' : 'pc']);
+  }
+
+  Buttons_createClass(Buttons, [{
+    key: "representShortcut",
+    value: function representShortcut(editorMethod) {
+      var shortcut = this.invertedKeyMap[editorMethod];
+
+      if (!this.options.shortcuts || !shortcut) {
+        return '';
+      }
+
+      if (env.isMac) {
+        shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');
+      }
+
+      shortcut = shortcut.replace('BACKSLASH', '\\').replace('SLASH', '/').replace('LEFTBRACKET', '[').replace('RIGHTBRACKET', ']');
+      return ' (' + shortcut + ')';
+    }
+  }, {
+    key: "button",
+    value: function button(o) {
+      if (!this.options.tooltip && o.tooltip) {
+        delete o.tooltip;
+      }
+
+      o.container = this.options.container;
+      return this.ui.button(o);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.addToolbarButtons();
+      this.addImagePopoverButtons();
+      this.addLinkPopoverButtons();
+      this.addTablePopoverButtons();
+      this.fontInstalledMap = {};
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      delete this.fontInstalledMap;
+    }
+  }, {
+    key: "isFontInstalled",
+    value: function isFontInstalled(name) {
+      if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {
+        this.fontInstalledMap[name] = env.isFontInstalled(name) || lists.contains(this.options.fontNamesIgnoreCheck, name);
+      }
+
+      return this.fontInstalledMap[name];
+    }
+  }, {
+    key: "isFontDeservedToAdd",
+    value: function isFontDeservedToAdd(name) {
+      name = name.toLowerCase();
+      return name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1;
+    }
+  }, {
+    key: "colorPalette",
+    value: function colorPalette(className, tooltip, backColor, foreColor) {
+      var _this = this;
+
+      return this.ui.buttonGroup({
+        className: 'note-color ' + className,
+        children: [this.button({
+          className: 'note-current-color-button',
+          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),
+          tooltip: tooltip,
+          click: function click(e) {
+            var $button = external_jQuery_default()(e.currentTarget);
+
+            if (backColor && foreColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor'),
+                foreColor: $button.attr('data-foreColor')
+              });
+            } else if (backColor) {
+              _this.context.invoke('editor.color', {
+                backColor: $button.attr('data-backColor')
+              });
+            } else if (foreColor) {
+              _this.context.invoke('editor.color', {
+                foreColor: $button.attr('data-foreColor')
+              });
+            }
+          },
+          callback: function callback($button) {
+            var $recentColor = $button.find('.note-recent-color');
+
+            if (backColor) {
+              $recentColor.css('background-color', _this.options.colorButton.backColor);
+              $button.attr('data-backColor', _this.options.colorButton.backColor);
+            }
+
+            if (foreColor) {
+              $recentColor.css('color', _this.options.colorButton.foreColor);
+              $button.attr('data-foreColor', _this.options.colorButton.foreColor);
+            } else {
+              $recentColor.css('color', 'transparent');
+            }
+          }
+        }), this.button({
+          className: 'dropdown-toggle',
+          contents: this.ui.dropdownButtonContents('', this.options),
+          tooltip: this.lang.color.more,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), this.ui.dropdown({
+          items: (backColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.background + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">', this.lang.color.transparent, '</button>', '</div>', '<div class="note-holder" data-event="backColor"><!-- back colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="backColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.backColor + '" data-event="backColorPalette-' + this.options.id + '">', '</div>', '<div class="note-holder-custom" id="backColorPalette-' + this.options.id + '" data-event="backColor"></div>', '</div>'].join('') : '') + (foreColor ? ['<div class="note-palette">', '<div class="note-palette-title">' + this.lang.color.foreground + '</div>', '<div>', '<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">', this.lang.color.resetToDefault, '</button>', '</div>', '<div class="note-holder" data-event="foreColor"><!-- fore colors --></div>', '<div>', '<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-' + this.options.id + '">', this.lang.color.cpSelect, '</button>', '<input type="color" id="foreColorPicker-' + this.options.id + '" class="note-btn note-color-select-btn" value="' + this.options.colorButton.foreColor + '" data-event="foreColorPalette-' + this.options.id + '">', '</div>', // Fix missing Div, Commented to find easily if it's wrong
+          '<div class="note-holder-custom" id="foreColorPalette-' + this.options.id + '" data-event="foreColor"></div>', '</div>'].join('') : ''),
+          callback: function callback($dropdown) {
+            $dropdown.find('.note-holder').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: _this.options.colors,
+                colorsName: _this.options.colorsName,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            /* TODO: do we have to record recent custom colors within cookies? */
+
+            var customColors = [['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF']];
+            $dropdown.find('.note-holder-custom').each(function (idx, item) {
+              var $holder = external_jQuery_default()(item);
+              $holder.append(_this.ui.palette({
+                colors: customColors,
+                colorsName: customColors,
+                eventName: $holder.data('event'),
+                container: _this.options.container,
+                tooltip: _this.options.tooltip
+              }).render());
+            });
+            $dropdown.find('input[type=color]').each(function (idx, item) {
+              external_jQuery_default()(item).change(function () {
+                var $chip = $dropdown.find('#' + external_jQuery_default()(this).data('event')).find('.note-color-btn').first();
+                var color = this.value.toUpperCase();
+                $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+                $chip.click();
+              });
+            });
+          },
+          click: function click(event) {
+            event.stopPropagation();
+            var $parent = external_jQuery_default()('.' + className).find('.note-dropdown-menu');
+            var $button = external_jQuery_default()(event.target);
+            var eventName = $button.data('event');
+            var value = $button.attr('data-value');
+
+            if (eventName === 'openPalette') {
+              var $picker = $parent.find('#' + value);
+              var $palette = external_jQuery_default()($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]); // Shift palette chips
+
+              var $chip = $palette.find('.note-color-btn').last().detach(); // Set chip attributes
+
+              var color = $picker.val();
+              $chip.css('background-color', color).attr('aria-label', color).attr('data-value', color).attr('data-original-title', color);
+              $palette.prepend($chip);
+              $picker.click();
+            } else {
+              if (lists.contains(['backColor', 'foreColor'], eventName)) {
+                var key = eventName === 'backColor' ? 'background-color' : 'color';
+                var $color = $button.closest('.note-color').find('.note-recent-color');
+                var $currentButton = $button.closest('.note-color').find('.note-current-color-button');
+                $color.css(key, value);
+                $currentButton.attr('data-' + eventName, value);
+              }
+
+              _this.context.invoke('editor.' + eventName, value);
+            }
+          }
+        })]
+      }).render();
+    }
+  }, {
+    key: "addToolbarButtons",
+    value: function addToolbarButtons() {
+      var _this2 = this;
+
+      this.context.memo('button.style', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.magic), _this2.options),
+          tooltip: _this2.lang.style.style,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          className: 'dropdown-style',
+          items: _this2.options.styleTags,
+          title: _this2.lang.style.style,
+          template: function template(item) {
+            // TBD: need to be simplified
+            if (typeof item === 'string') {
+              item = {
+                tag: item,
+                title: Object.prototype.hasOwnProperty.call(_this2.lang.style, item) ? _this2.lang.style[item] : item
+              };
+            }
+
+            var tag = item.tag;
+            var title = item.title;
+            var style = item.style ? ' style="' + item.style + '" ' : '';
+            var className = item.className ? ' class="' + item.className + '"' : '';
+            return '<' + tag + style + className + '>' + title + '</' + tag + '>';
+          },
+          click: _this2.context.createInvokeHandler('editor.formatBlock')
+        })]).render();
+      });
+
+      var _loop = function _loop(styleIdx, styleLen) {
+        var item = _this2.options.styleTags[styleIdx];
+
+        _this2.context.memo('button.style.' + item, function () {
+          return _this2.button({
+            className: 'note-btn-style-' + item,
+            contents: '<div data-value="' + item + '">' + item.toUpperCase() + '</div>',
+            tooltip: _this2.lang.style[item],
+            click: _this2.context.createInvokeHandler('editor.formatBlock')
+          }).render();
+        });
+      };
+
+      for (var styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {
+        _loop(styleIdx, styleLen);
+      }
+
+      this.context.memo('button.bold', function () {
+        return _this2.button({
+          className: 'note-btn-bold',
+          contents: _this2.ui.icon(_this2.options.icons.bold),
+          tooltip: _this2.lang.font.bold + _this2.representShortcut('bold'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.bold')
+        }).render();
+      });
+      this.context.memo('button.italic', function () {
+        return _this2.button({
+          className: 'note-btn-italic',
+          contents: _this2.ui.icon(_this2.options.icons.italic),
+          tooltip: _this2.lang.font.italic + _this2.representShortcut('italic'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.italic')
+        }).render();
+      });
+      this.context.memo('button.underline', function () {
+        return _this2.button({
+          className: 'note-btn-underline',
+          contents: _this2.ui.icon(_this2.options.icons.underline),
+          tooltip: _this2.lang.font.underline + _this2.representShortcut('underline'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.underline')
+        }).render();
+      });
+      this.context.memo('button.clear', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.eraser),
+          tooltip: _this2.lang.font.clear + _this2.representShortcut('removeFormat'),
+          click: _this2.context.createInvokeHandler('editor.removeFormat')
+        }).render();
+      });
+      this.context.memo('button.strikethrough', function () {
+        return _this2.button({
+          className: 'note-btn-strikethrough',
+          contents: _this2.ui.icon(_this2.options.icons.strikethrough),
+          tooltip: _this2.lang.font.strikethrough + _this2.representShortcut('strikethrough'),
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.strikethrough')
+        }).render();
+      });
+      this.context.memo('button.superscript', function () {
+        return _this2.button({
+          className: 'note-btn-superscript',
+          contents: _this2.ui.icon(_this2.options.icons.superscript),
+          tooltip: _this2.lang.font.superscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.superscript')
+        }).render();
+      });
+      this.context.memo('button.subscript', function () {
+        return _this2.button({
+          className: 'note-btn-subscript',
+          contents: _this2.ui.icon(_this2.options.icons.subscript),
+          tooltip: _this2.lang.font.subscript,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.subscript')
+        }).render();
+      });
+      this.context.memo('button.fontname', function () {
+        var styleInfo = _this2.context.invoke('editor.currentStyle');
+
+        if (_this2.options.addDefaultFonts) {
+          // Add 'default' fonts into the fontnames array if not exist
+          external_jQuery_default().each(styleInfo['font-family'].split(','), function (idx, fontname) {
+            fontname = fontname.trim().replace(/['"]+/g, '');
+
+            if (_this2.isFontDeservedToAdd(fontname)) {
+              if (_this2.options.fontNames.indexOf(fontname) === -1) {
+                _this2.options.fontNames.push(fontname);
+              }
+            }
+          });
+        }
+
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontname"></span>', _this2.options),
+          tooltip: _this2.lang.font.name,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontname',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontNames.filter(_this2.isFontInstalled.bind(_this2)),
+          title: _this2.lang.font.name,
+          template: function template(item) {
+            return '<span style="font-family: ' + env.validFontName(item) + '">' + item + '</span>';
+          },
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontName')
+        })]).render();
+      });
+      this.context.memo('button.fontsize', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>', _this2.options),
+          tooltip: _this2.lang.font.size,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsize',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizes,
+          title: _this2.lang.font.size,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSize')
+        })]).render();
+      });
+      this.context.memo('button.fontsizeunit', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>', _this2.options),
+          tooltip: _this2.lang.font.sizeunit,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          className: 'dropdown-fontsizeunit',
+          checkClassName: _this2.options.icons.menuCheck,
+          items: _this2.options.fontSizeUnits,
+          title: _this2.lang.font.sizeunit,
+          click: _this2.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit')
+        })]).render();
+      });
+      this.context.memo('button.color', function () {
+        return _this2.colorPalette('note-color-all', _this2.lang.color.recent, true, true);
+      });
+      this.context.memo('button.forecolor', function () {
+        return _this2.colorPalette('note-color-fore', _this2.lang.color.foreground, false, true);
+      });
+      this.context.memo('button.backcolor', function () {
+        return _this2.colorPalette('note-color-back', _this2.lang.color.background, true, false);
+      });
+      this.context.memo('button.ul', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.unorderedlist),
+          tooltip: _this2.lang.lists.unordered + _this2.representShortcut('insertUnorderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertUnorderedList')
+        }).render();
+      });
+      this.context.memo('button.ol', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.orderedlist),
+          tooltip: _this2.lang.lists.ordered + _this2.representShortcut('insertOrderedList'),
+          click: _this2.context.createInvokeHandler('editor.insertOrderedList')
+        }).render();
+      });
+      var justifyLeft = this.button({
+        contents: this.ui.icon(this.options.icons.alignLeft),
+        tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),
+        click: this.context.createInvokeHandler('editor.justifyLeft')
+      });
+      var justifyCenter = this.button({
+        contents: this.ui.icon(this.options.icons.alignCenter),
+        tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),
+        click: this.context.createInvokeHandler('editor.justifyCenter')
+      });
+      var justifyRight = this.button({
+        contents: this.ui.icon(this.options.icons.alignRight),
+        tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),
+        click: this.context.createInvokeHandler('editor.justifyRight')
+      });
+      var justifyFull = this.button({
+        contents: this.ui.icon(this.options.icons.alignJustify),
+        tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),
+        click: this.context.createInvokeHandler('editor.justifyFull')
+      });
+      var outdent = this.button({
+        contents: this.ui.icon(this.options.icons.outdent),
+        tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),
+        click: this.context.createInvokeHandler('editor.outdent')
+      });
+      var indent = this.button({
+        contents: this.ui.icon(this.options.icons.indent),
+        tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),
+        click: this.context.createInvokeHandler('editor.indent')
+      });
+      this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));
+      this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));
+      this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));
+      this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));
+      this.context.memo('button.outdent', func.invoke(outdent, 'render'));
+      this.context.memo('button.indent', func.invoke(indent, 'render'));
+      this.context.memo('button.paragraph', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.alignLeft), _this2.options),
+          tooltip: _this2.lang.paragraph.paragraph,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown([_this2.ui.buttonGroup({
+          className: 'note-align',
+          children: [justifyLeft, justifyCenter, justifyRight, justifyFull]
+        }), _this2.ui.buttonGroup({
+          className: 'note-list',
+          children: [outdent, indent]
+        })])]).render();
+      });
+      this.context.memo('button.height', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.textHeight), _this2.options),
+          tooltip: _this2.lang.font.height,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdownCheck({
+          items: _this2.options.lineHeights,
+          checkClassName: _this2.options.icons.menuCheck,
+          className: 'dropdown-line-height',
+          title: _this2.lang.font.height,
+          click: _this2.context.createInvokeHandler('editor.lineHeight')
+        })]).render();
+      });
+      this.context.memo('button.table', function () {
+        return _this2.ui.buttonGroup([_this2.button({
+          className: 'dropdown-toggle',
+          contents: _this2.ui.dropdownButtonContents(_this2.ui.icon(_this2.options.icons.table), _this2.options),
+          tooltip: _this2.lang.table.table,
+          data: {
+            toggle: 'dropdown'
+          }
+        }), _this2.ui.dropdown({
+          title: _this2.lang.table.table,
+          className: 'note-table',
+          items: ['<div class="note-dimension-picker">', '<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>', '<div class="note-dimension-picker-highlighted"></div>', '<div class="note-dimension-picker-unhighlighted"></div>', '</div>', '<div class="note-dimension-display">1 x 1</div>'].join('')
+        })], {
+          callback: function callback($node) {
+            var $catcher = $node.find('.note-dimension-picker-mousecatcher');
+            $catcher.css({
+              width: _this2.options.insertTableMaxSize.col + 'em',
+              height: _this2.options.insertTableMaxSize.row + 'em'
+            }).mouseup(_this2.context.createInvokeHandler('editor.insertTable')).on('mousemove', _this2.tableMoveHandler.bind(_this2));
+          }
+        }).render();
+      });
+      this.context.memo('button.link', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.link),
+          tooltip: _this2.lang.link.link + _this2.representShortcut('linkDialog.show'),
+          click: _this2.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.picture', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.picture),
+          tooltip: _this2.lang.image.image,
+          click: _this2.context.createInvokeHandler('imageDialog.show')
+        }).render();
+      });
+      this.context.memo('button.video', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.video),
+          tooltip: _this2.lang.video.video,
+          click: _this2.context.createInvokeHandler('videoDialog.show')
+        }).render();
+      });
+      this.context.memo('button.hr', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.minus),
+          tooltip: _this2.lang.hr.insert + _this2.representShortcut('insertHorizontalRule'),
+          click: _this2.context.createInvokeHandler('editor.insertHorizontalRule')
+        }).render();
+      });
+      this.context.memo('button.fullscreen', function () {
+        return _this2.button({
+          className: 'btn-fullscreen note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.arrowsAlt),
+          tooltip: _this2.lang.options.fullscreen,
+          click: _this2.context.createInvokeHandler('fullscreen.toggle')
+        }).render();
+      });
+      this.context.memo('button.codeview', function () {
+        return _this2.button({
+          className: 'btn-codeview note-codeview-keep',
+          contents: _this2.ui.icon(_this2.options.icons.code),
+          tooltip: _this2.lang.options.codeview,
+          click: _this2.context.createInvokeHandler('codeview.toggle')
+        }).render();
+      });
+      this.context.memo('button.redo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.redo),
+          tooltip: _this2.lang.history.redo + _this2.representShortcut('redo'),
+          click: _this2.context.createInvokeHandler('editor.redo')
+        }).render();
+      });
+      this.context.memo('button.undo', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.undo),
+          tooltip: _this2.lang.history.undo + _this2.representShortcut('undo'),
+          click: _this2.context.createInvokeHandler('editor.undo')
+        }).render();
+      });
+      this.context.memo('button.help', function () {
+        return _this2.button({
+          contents: _this2.ui.icon(_this2.options.icons.question),
+          tooltip: _this2.lang.options.help,
+          click: _this2.context.createInvokeHandler('helpDialog.show')
+        }).render();
+      });
+    }
+    /**
+     * image: [
+     *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],
+     *   ['float', ['floatLeft', 'floatRight', 'floatNone']],
+     *   ['remove', ['removeMedia']],
+     * ],
+     */
+
+  }, {
+    key: "addImagePopoverButtons",
+    value: function addImagePopoverButtons() {
+      var _this3 = this;
+
+      // Image Size Buttons
+      this.context.memo('button.resizeFull', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">100%</span>',
+          tooltip: _this3.lang.image.resizeFull,
+          click: _this3.context.createInvokeHandler('editor.resize', '1')
+        }).render();
+      });
+      this.context.memo('button.resizeHalf', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">50%</span>',
+          tooltip: _this3.lang.image.resizeHalf,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.5')
+        }).render();
+      });
+      this.context.memo('button.resizeQuarter', function () {
+        return _this3.button({
+          contents: '<span class="note-fontsize-10">25%</span>',
+          tooltip: _this3.lang.image.resizeQuarter,
+          click: _this3.context.createInvokeHandler('editor.resize', '0.25')
+        }).render();
+      });
+      this.context.memo('button.resizeNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.resizeNone,
+          click: _this3.context.createInvokeHandler('editor.resize', '0')
+        }).render();
+      }); // Float Buttons
+
+      this.context.memo('button.floatLeft', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatLeft),
+          tooltip: _this3.lang.image.floatLeft,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'left')
+        }).render();
+      });
+      this.context.memo('button.floatRight', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.floatRight),
+          tooltip: _this3.lang.image.floatRight,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'right')
+        }).render();
+      });
+      this.context.memo('button.floatNone', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.rollback),
+          tooltip: _this3.lang.image.floatNone,
+          click: _this3.context.createInvokeHandler('editor.floatMe', 'none')
+        }).render();
+      }); // Remove Buttons
+
+      this.context.memo('button.removeMedia', function () {
+        return _this3.button({
+          contents: _this3.ui.icon(_this3.options.icons.trash),
+          tooltip: _this3.lang.image.remove,
+          click: _this3.context.createInvokeHandler('editor.removeMedia')
+        }).render();
+      });
+    }
+  }, {
+    key: "addLinkPopoverButtons",
+    value: function addLinkPopoverButtons() {
+      var _this4 = this;
+
+      this.context.memo('button.linkDialogShow', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.link),
+          tooltip: _this4.lang.link.edit,
+          click: _this4.context.createInvokeHandler('linkDialog.show')
+        }).render();
+      });
+      this.context.memo('button.unlink', function () {
+        return _this4.button({
+          contents: _this4.ui.icon(_this4.options.icons.unlink),
+          tooltip: _this4.lang.link.unlink,
+          click: _this4.context.createInvokeHandler('editor.unlink')
+        }).render();
+      });
+    }
+    /**
+     * table : [
+     *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],
+     *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]
+     * ],
+     */
+
+  }, {
+    key: "addTablePopoverButtons",
+    value: function addTablePopoverButtons() {
+      var _this5 = this;
+
+      this.context.memo('button.addRowUp', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowAbove),
+          tooltip: _this5.lang.table.addRowAbove,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'top')
+        }).render();
+      });
+      this.context.memo('button.addRowDown', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowBelow),
+          tooltip: _this5.lang.table.addRowBelow,
+          click: _this5.context.createInvokeHandler('editor.addRow', 'bottom')
+        }).render();
+      });
+      this.context.memo('button.addColLeft', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colBefore),
+          tooltip: _this5.lang.table.addColLeft,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'left')
+        }).render();
+      });
+      this.context.memo('button.addColRight', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colAfter),
+          tooltip: _this5.lang.table.addColRight,
+          click: _this5.context.createInvokeHandler('editor.addCol', 'right')
+        }).render();
+      });
+      this.context.memo('button.deleteRow', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.rowRemove),
+          tooltip: _this5.lang.table.delRow,
+          click: _this5.context.createInvokeHandler('editor.deleteRow')
+        }).render();
+      });
+      this.context.memo('button.deleteCol', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.colRemove),
+          tooltip: _this5.lang.table.delCol,
+          click: _this5.context.createInvokeHandler('editor.deleteCol')
+        }).render();
+      });
+      this.context.memo('button.deleteTable', function () {
+        return _this5.button({
+          className: 'btn-md',
+          contents: _this5.ui.icon(_this5.options.icons.trash),
+          tooltip: _this5.lang.table.delTable,
+          click: _this5.context.createInvokeHandler('editor.deleteTable')
+        }).render();
+      });
+    }
+  }, {
+    key: "build",
+    value: function build($container, groups) {
+      for (var groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {
+        var group = groups[groupIdx];
+        var groupName = Array.isArray(group) ? group[0] : group;
+        var buttons = Array.isArray(group) ? group.length === 1 ? [group[0]] : group[1] : [group];
+        var $group = this.ui.buttonGroup({
+          className: 'note-' + groupName
+        }).render();
+
+        for (var idx = 0, len = buttons.length; idx < len; idx++) {
+          var btn = this.context.memo('button.' + buttons[idx]);
+
+          if (btn) {
+            $group.append(typeof btn === 'function' ? btn(this.context) : btn);
+          }
+        }
+
+        $group.appendTo($container);
+      }
+    }
+    /**
+     * @param {jQuery} [$container]
+     */
+
+  }, {
+    key: "updateCurrentStyle",
+    value: function updateCurrentStyle($container) {
+      var $cont = $container || this.$toolbar;
+      var styleInfo = this.context.invoke('editor.currentStyle');
+      this.updateBtnStates($cont, {
+        '.note-btn-bold': function noteBtnBold() {
+          return styleInfo['font-bold'] === 'bold';
+        },
+        '.note-btn-italic': function noteBtnItalic() {
+          return styleInfo['font-italic'] === 'italic';
+        },
+        '.note-btn-underline': function noteBtnUnderline() {
+          return styleInfo['font-underline'] === 'underline';
+        },
+        '.note-btn-subscript': function noteBtnSubscript() {
+          return styleInfo['font-subscript'] === 'subscript';
+        },
+        '.note-btn-superscript': function noteBtnSuperscript() {
+          return styleInfo['font-superscript'] === 'superscript';
+        },
+        '.note-btn-strikethrough': function noteBtnStrikethrough() {
+          return styleInfo['font-strikethrough'] === 'strikethrough';
+        }
+      });
+
+      if (styleInfo['font-family']) {
+        var fontNames = styleInfo['font-family'].split(',').map(function (name) {
+          return name.replace(/[\'\"]/g, '').replace(/\s+$/, '').replace(/^\s+/, '');
+        });
+        var fontName = lists.find(fontNames, this.isFontInstalled.bind(this));
+        $cont.find('.dropdown-fontname a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontName + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);
+      }
+
+      if (styleInfo['font-size']) {
+        var fontSize = styleInfo['font-size'];
+        $cont.find('.dropdown-fontsize a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = $item.data('value') + '' === fontSize + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsize').text(fontSize);
+        var fontSizeUnit = styleInfo['font-size-unit'];
+        $cont.find('.dropdown-fontsizeunit a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item);
+          var isChecked = $item.data('value') + '' === fontSizeUnit + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);
+      }
+
+      if (styleInfo['line-height']) {
+        var lineHeight = styleInfo['line-height'];
+        $cont.find('.dropdown-line-height a').each(function (idx, item) {
+          var $item = external_jQuery_default()(item); // always compare with string to avoid creating another func.
+
+          var isChecked = external_jQuery_default()(item).data('value') + '' === lineHeight + '';
+          $item.toggleClass('checked', isChecked);
+        });
+        $cont.find('.note-current-line-height').text(lineHeight);
+      }
+    }
+  }, {
+    key: "updateBtnStates",
+    value: function updateBtnStates($container, infos) {
+      var _this6 = this;
+
+      external_jQuery_default().each(infos, function (selector, pred) {
+        _this6.ui.toggleBtnActive($container.find(selector), pred());
+      });
+    }
+  }, {
+    key: "tableMoveHandler",
+    value: function tableMoveHandler(event) {
+      var PX_PER_EM = 18;
+      var $picker = external_jQuery_default()(event.target.parentNode); // target is mousecatcher
+
+      var $dimensionDisplay = $picker.next();
+      var $catcher = $picker.find('.note-dimension-picker-mousecatcher');
+      var $highlighted = $picker.find('.note-dimension-picker-highlighted');
+      var $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');
+      var posOffset; // HTML5 with jQuery - e.offsetX is undefined in Firefox
+
+      if (event.offsetX === undefined) {
+        var posCatcher = external_jQuery_default()(event.target).offset();
+        posOffset = {
+          x: event.pageX - posCatcher.left,
+          y: event.pageY - posCatcher.top
+        };
+      } else {
+        posOffset = {
+          x: event.offsetX,
+          y: event.offsetY
+        };
+      }
+
+      var dim = {
+        c: Math.ceil(posOffset.x / PX_PER_EM) || 1,
+        r: Math.ceil(posOffset.y / PX_PER_EM) || 1
+      };
+      $highlighted.css({
+        width: dim.c + 'em',
+        height: dim.r + 'em'
+      });
+      $catcher.data('value', dim.c + 'x' + dim.r);
+
+      if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {
+        $unhighlighted.css({
+          width: dim.c + 1 + 'em'
+        });
+      }
+
+      if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {
+        $unhighlighted.css({
+          height: dim.r + 1 + 'em'
+        });
+      }
+
+      $dimensionDisplay.html(dim.c + ' x ' + dim.r);
+    }
+  }]);
+
+  return Buttons;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/Toolbar.js
+function Toolbar_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function Toolbar_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function Toolbar_createClass(Constructor, protoProps, staticProps) { if (protoProps) Toolbar_defineProperties(Constructor.prototype, protoProps); if (staticProps) Toolbar_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Toolbar = /*#__PURE__*/function () {
+  function Toolbar(context) {
+    Toolbar_classCallCheck(this, Toolbar);
+
+    this.context = context;
+    this.$window = external_jQuery_default()(window);
+    this.$document = external_jQuery_default()(document);
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$note = context.layoutInfo.note;
+    this.$editor = context.layoutInfo.editor;
+    this.$toolbar = context.layoutInfo.toolbar;
+    this.$editable = context.layoutInfo.editable;
+    this.$statusbar = context.layoutInfo.statusbar;
+    this.options = context.options;
+    this.isFollowing = false;
+    this.followScroll = this.followScroll.bind(this);
+  }
+
+  Toolbar_createClass(Toolbar, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !this.options.airMode;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this = this;
+
+      this.options.toolbar = this.options.toolbar || [];
+
+      if (!this.options.toolbar.length) {
+        this.$toolbar.hide();
+      } else {
+        this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);
+      }
+
+      if (this.options.toolbarContainer) {
+        this.$toolbar.appendTo(this.options.toolbarContainer);
+      }
+
+      this.changeContainer(false);
+      this.$note.on('summernote.keyup summernote.mouseup summernote.change', function () {
+        _this.context.invoke('buttons.updateCurrentStyle');
+      });
+      this.context.invoke('buttons.updateCurrentStyle');
+
+      if (this.options.followingToolbar) {
+        this.$window.on('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$toolbar.children().remove();
+
+      if (this.options.followingToolbar) {
+        this.$window.off('scroll resize', this.followScroll);
+      }
+    }
+  }, {
+    key: "followScroll",
+    value: function followScroll() {
+      if (this.$editor.hasClass('fullscreen')) {
+        return false;
+      }
+
+      var editorHeight = this.$editor.outerHeight();
+      var editorWidth = this.$editor.width();
+      var toolbarHeight = this.$toolbar.height();
+      var statusbarHeight = this.$statusbar.height(); // check if the web app is currently using another static bar
+
+      var otherBarHeight = 0;
+
+      if (this.options.otherStaticBar) {
+        otherBarHeight = external_jQuery_default()(this.options.otherStaticBar).outerHeight();
+      }
+
+      var currentOffset = this.$document.scrollTop();
+      var editorOffsetTop = this.$editor.offset().top;
+      var editorOffsetBottom = editorOffsetTop + editorHeight;
+      var activateOffset = editorOffsetTop - otherBarHeight;
+      var deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;
+
+      if (!this.isFollowing && currentOffset > activateOffset && currentOffset < deactivateOffsetBottom - toolbarHeight) {
+        this.isFollowing = true;
+        this.$editable.css({
+          marginTop: this.$toolbar.outerHeight()
+        });
+        this.$toolbar.css({
+          position: 'fixed',
+          top: otherBarHeight,
+          width: editorWidth,
+          zIndex: 1000
+        });
+      } else if (this.isFollowing && (currentOffset < activateOffset || currentOffset > deactivateOffsetBottom)) {
+        this.isFollowing = false;
+        this.$toolbar.css({
+          position: 'relative',
+          top: 0,
+          width: '100%',
+          zIndex: 'auto'
+        });
+        this.$editable.css({
+          marginTop: ''
+        });
+      }
+    }
+  }, {
+    key: "changeContainer",
+    value: function changeContainer(isFullscreen) {
+      if (isFullscreen) {
+        this.$toolbar.prependTo(this.$editor);
+      } else {
+        if (this.options.toolbarContainer) {
+          this.$toolbar.appendTo(this.options.toolbarContainer);
+        }
+      }
+
+      if (this.options.followingToolbar) {
+        this.followScroll();
+      }
+    }
+  }, {
+    key: "updateFullscreen",
+    value: function updateFullscreen(isFullscreen) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);
+      this.changeContainer(isFullscreen);
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.deactivate();
+      } else {
+        this.activate();
+      }
+    }
+  }, {
+    key: "activate",
+    value: function activate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, true);
+    }
+  }, {
+    key: "deactivate",
+    value: function deactivate(isIncludeCodeview) {
+      var $btn = this.$toolbar.find('button');
+
+      if (!isIncludeCodeview) {
+        $btn = $btn.not('.note-codeview-keep');
+      }
+
+      this.ui.toggleBtn($btn, false);
+    }
+  }]);
+
+  return Toolbar;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkDialog.js
+function LinkDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var LinkDialog = /*#__PURE__*/function () {
+  function LinkDialog(context) {
+    LinkDialog_classCallCheck(this, LinkDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);
+  }
+
+  LinkDialog_createClass(LinkDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group">', "<label for=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.textToDisplay, "</label>"), "<input id=\"note-dialog-link-txt-".concat(this.options.id, "\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>"), '</div>', '<div class="form-group note-form-group">', "<label for=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.link.url, "</label>"), "<input id=\"note-dialog-link-url-".concat(this.options.id, "\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>"), '</div>', !this.options.disableLinkTarget ? external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-open-in-new-window',
+        text: this.lang.link.openInNewWindow,
+        checked: true
+      }).render()).html() : '', external_jQuery_default()('<div></div>').append(this.ui.checkbox({
+        className: 'sn-checkbox-use-protocol',
+        text: this.lang.link.useProtocol,
+        checked: true
+      }).render()).html()].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.link.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        className: 'link-dialog',
+        title: this.lang.link.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+    /**
+     * toggle update button
+     */
+
+  }, {
+    key: "toggleLinkBtn",
+    value: function toggleLinkBtn($linkBtn, $linkText, $linkUrl) {
+      this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());
+    }
+    /**
+     * Show link dialog and set event handlers on dialog controls.
+     *
+     * @param {Object} linkInfo
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showLinkDialog",
+    value: function showLinkDialog(linkInfo) {
+      var _this = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $linkText = _this.$dialog.find('.note-link-text');
+
+        var $linkUrl = _this.$dialog.find('.note-link-url');
+
+        var $linkBtn = _this.$dialog.find('.note-link-btn');
+
+        var $openInNewWindow = _this.$dialog.find('.sn-checkbox-open-in-new-window input[type=checkbox]');
+
+        var $useProtocol = _this.$dialog.find('.sn-checkbox-use-protocol input[type=checkbox]');
+
+        _this.ui.onDialogShown(_this.$dialog, function () {
+          _this.context.triggerEvent('dialog.shown'); // If no url was given and given text is valid URL then copy that into URL Field
+
+
+          if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {
+            linkInfo.url = linkInfo.text;
+          }
+
+          $linkText.on('input paste propertychange', function () {
+            // If linktext was modified by input events,
+            // cloning text from linkUrl will be stopped.
+            linkInfo.text = $linkText.val();
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.text);
+          $linkUrl.on('input paste propertychange', function () {
+            // Display same text on `Text to display` as default
+            // when linktext has no text
+            if (!linkInfo.text) {
+              $linkText.val($linkUrl.val());
+            }
+
+            _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+          }).val(linkInfo.url);
+
+          if (!env.isSupportTouch) {
+            $linkUrl.trigger('focus');
+          }
+
+          _this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);
+
+          _this.bindEnterKey($linkUrl, $linkBtn);
+
+          _this.bindEnterKey($linkText, $linkBtn);
+
+          var isNewWindowChecked = linkInfo.isNewWindow !== undefined ? linkInfo.isNewWindow : _this.context.options.linkTargetBlank;
+          $openInNewWindow.prop('checked', isNewWindowChecked);
+          var useProtocolChecked = linkInfo.url ? false : _this.context.options.useProtocol;
+          $useProtocol.prop('checked', useProtocolChecked);
+          $linkBtn.one('click', function (event) {
+            event.preventDefault();
+            deferred.resolve({
+              range: linkInfo.range,
+              url: $linkUrl.val(),
+              text: $linkText.val(),
+              isNewWindow: $openInNewWindow.is(':checked'),
+              checkProtocol: $useProtocol.is(':checked')
+            });
+
+            _this.ui.hideDialog(_this.$dialog);
+          });
+        });
+
+        _this.ui.onDialogHidden(_this.$dialog, function () {
+          // detach events
+          $linkText.off();
+          $linkUrl.off();
+          $linkBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this.ui.showDialog(_this.$dialog);
+      }).promise();
+    }
+    /**
+     * @param {Object} layoutInfo
+     */
+
+  }, {
+    key: "show",
+    value: function show() {
+      var _this2 = this;
+
+      var linkInfo = this.context.invoke('editor.getLinkInfo');
+      this.context.invoke('editor.saveRange');
+      this.showLinkDialog(linkInfo).then(function (linkInfo) {
+        _this2.context.invoke('editor.restoreRange');
+
+        _this2.context.invoke('editor.createLink', linkInfo);
+      }).fail(function () {
+        _this2.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return LinkDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/LinkPopover.js
+function LinkPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function LinkPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function LinkPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) LinkPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) LinkPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var LinkPopover = /*#__PURE__*/function () {
+  function LinkPopover(context) {
+    var _this = this;
+
+    LinkPopover_classCallCheck(this, LinkPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteChangeSummernoteScroll() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  LinkPopover_createClass(LinkPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.link);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-link-popover',
+        callback: function callback($node) {
+          var $content = $node.find('.popover-content,.note-popover-content');
+          $content.prepend('<span><a target="_blank"></a>&nbsp;</span>');
+        }
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.link);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update() {
+      // Prevent focusing on editable when invoke('code') is executed
+      if (!this.context.invoke('editor.hasFocus')) {
+        this.hide();
+        return;
+      }
+
+      var rng = this.context.invoke('editor.getLastRange');
+
+      if (rng.isCollapsed() && rng.isOnAnchor()) {
+        var anchor = dom.ancestor(rng.sc, dom.isAnchor);
+        var href = external_jQuery_default()(anchor).attr('href');
+        this.$popover.find('a').attr('href', href).text(href);
+        var pos = dom.posFromPlaceholder(anchor);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return LinkPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImageDialog.js
+function ImageDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImageDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImageDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var ImageDialog = /*#__PURE__*/function () {
+  function ImageDialog(context) {
+    ImageDialog_classCallCheck(this, ImageDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  ImageDialog_createClass(ImageDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var imageLimitation = '';
+
+      if (this.options.maximumImageFileSize) {
+        var unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));
+        var readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 + ' ' + ' KMGTP'[unit] + 'B';
+        imageLimitation = "<small>".concat(this.lang.image.maximumFileSize + ' : ' + readableSize, "</small>");
+      }
+
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group note-group-select-from-files">', '<label for="note-dialog-image-file-' + this.options.id + '" class="note-form-label">' + this.lang.image.selectFromFiles + '</label>', '<input id="note-dialog-image-file-' + this.options.id + '" class="note-image-input form-control-file note-form-control note-input" ', ' type="file" name="files" accept="' + this.options.acceptImageFileTypes + '" multiple="multiple"/>', imageLimitation, '</div>', '<div class="form-group note-group-image-url">', '<label for="note-dialog-image-url-' + this.options.id + '" class="note-form-label">' + this.lang.image.url + '</label>', '<input id="note-dialog-image-url-' + this.options.id + '" class="note-image-url form-control note-form-control note-input" type="text"/>', '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.image.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.image.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showImageDialog().then(function (data) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange');
+
+        if (typeof data === 'string') {
+          // image url
+          // If onImageLinkInsert set,
+          if (_this.options.callbacks.onImageLinkInsert) {
+            _this.context.triggerEvent('image.link.insert', data);
+          } else {
+            _this.context.invoke('editor.insertImage', data);
+          }
+        } else {
+          // array of files
+          _this.context.invoke('editor.insertImagesOrCallback', data);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show image dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showImageDialog",
+    value: function showImageDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $imageInput = _this2.$dialog.find('.note-image-input');
+
+        var $imageUrl = _this2.$dialog.find('.note-image-url');
+
+        var $imageBtn = _this2.$dialog.find('.note-image-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown'); // Cloning imageInput to clear element.
+
+
+          $imageInput.replaceWith($imageInput.clone().on('change', function (event) {
+            deferred.resolve(event.target.files || event.target.value);
+          }).val(''));
+          $imageUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($imageBtn, $imageUrl.val());
+          }).val('');
+
+          if (!env.isSupportTouch) {
+            $imageUrl.trigger('focus');
+          }
+
+          $imageBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($imageUrl.val());
+          });
+
+          _this2.bindEnterKey($imageUrl, $imageBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $imageInput.off();
+          $imageUrl.off();
+          $imageBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return ImageDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/ImagePopover.js
+function ImagePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function ImagePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function ImagePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImagePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImagePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+/**
+ * Image popover module
+ *  mouse events that show/hide popover will be handled by Handle.js.
+ *  Handle.js will receive the events and invoke 'imagePopover.update'.
+ */
+
+var ImagePopover = /*#__PURE__*/function () {
+  function ImagePopover(context) {
+    var _this = this;
+
+    ImagePopover_classCallCheck(this, ImagePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.editable = context.layoutInfo.editable[0];
+    this.options = context.options;
+    this.events = {
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  ImagePopover_createClass(ImagePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.image);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-image-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.image);
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target, event) {
+      if (dom.isImg(target)) {
+        var position = external_jQuery_default()(target).offset();
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        var pos = {};
+
+        if (this.options.popatmouse) {
+          pos.left = event.pageX - 20;
+          pos.top = event.pageY;
+        } else {
+          pos = position;
+        }
+
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return ImagePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/TablePopover.js
+function TablePopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function TablePopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function TablePopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) TablePopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) TablePopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+var TablePopover = /*#__PURE__*/function () {
+  function TablePopover(context) {
+    var _this = this;
+
+    TablePopover_classCallCheck(this, TablePopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.events = {
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.update(e.target);
+      },
+      'summernote.keyup summernote.scroll summernote.change': function summernoteKeyupSummernoteScrollSummernoteChange() {
+        _this.update();
+      },
+      'summernote.disable summernote.dialog.shown': function summernoteDisableSummernoteDialogShown() {
+        _this.hide();
+      },
+      'summernote.blur': function summernoteBlur(we, e) {
+        if (e.originalEvent && e.originalEvent.relatedTarget) {
+          if (!_this.$popover[0].contains(e.originalEvent.relatedTarget)) {
+            _this.hide();
+          }
+        } else {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  TablePopover_createClass(TablePopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return !lists.isEmpty(this.options.popover.table);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      this.$popover = this.ui.popover({
+        className: 'note-table-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content,.note-popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.table); // [workaround] Disable Firefox's default table editor
+
+      if (env.isFF) {
+        document.execCommand('enableInlineTableEditing', false, false);
+      }
+
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(target) {
+      if (this.context.isDisabled()) {
+        return false;
+      }
+
+      var isCell = dom.isCell(target) || dom.isCell(target === null || target === void 0 ? void 0 : target.parentElement);
+
+      if (isCell) {
+        var pos = dom.posFromPlaceholder(target);
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        pos.top -= containerOffset.top;
+        pos.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: pos.left,
+          top: pos.top
+        });
+      } else {
+        this.hide();
+      }
+
+      return isCell;
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return TablePopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/VideoDialog.js
+function VideoDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function VideoDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function VideoDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) VideoDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) VideoDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+var VideoDialog = /*#__PURE__*/function () {
+  function VideoDialog(context) {
+    VideoDialog_classCallCheck(this, VideoDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  VideoDialog_createClass(VideoDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<div class="form-group note-form-group row-fluid">', "<label for=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-form-label\">").concat(this.lang.video.url, " <small class=\"text-muted\">").concat(this.lang.video.providers, "</small></label>"), "<input id=\"note-dialog-video-url-".concat(this.options.id, "\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>"), '</div>'].join('');
+      var buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';
+      var footer = "<input type=\"button\" href=\"#\" class=\"".concat(buttonClass, "\" value=\"").concat(this.lang.video.insert, "\" disabled>");
+      this.$dialog = this.ui.dialog({
+        title: this.lang.video.insert,
+        fade: this.options.dialogsFade,
+        body: body,
+        footer: footer
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "bindEnterKey",
+    value: function bindEnterKey($input, $btn) {
+      $input.on('keypress', function (event) {
+        if (event.keyCode === key.code.ENTER) {
+          event.preventDefault();
+          $btn.trigger('click');
+        }
+      });
+    }
+  }, {
+    key: "createVideoNode",
+    value: function createVideoNode(url) {
+      // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)
+      var ytRegExp = /\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/;
+      var ytRegExpForStart = /^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/;
+      var ytMatch = url.match(ytRegExp);
+      var gdRegExp = /(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/;
+      var gdMatch = url.match(gdRegExp);
+      var igRegExp = /(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/;
+      var igMatch = url.match(igRegExp);
+      var vRegExp = /\/\/vine\.co\/v\/([a-zA-Z0-9]+)/;
+      var vMatch = url.match(vRegExp);
+      var vimRegExp = /\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/;
+      var vimMatch = url.match(vimRegExp);
+      var dmRegExp = /.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/;
+      var dmMatch = url.match(dmRegExp);
+      var youkuRegExp = /\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/;
+      var youkuMatch = url.match(youkuRegExp);
+      var peerTubeRegExp = /\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/;
+      var peerTubeMatch = url.match(peerTubeRegExp);
+      var qqRegExp = /\/\/v\.qq\.com.*?vid=(.+)/;
+      var qqMatch = url.match(qqRegExp);
+      var qqRegExp2 = /\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/;
+      var qqMatch2 = url.match(qqRegExp2);
+      var mp4RegExp = /^.+.(mp4|m4v)$/;
+      var mp4Match = url.match(mp4RegExp);
+      var oggRegExp = /^.+.(ogg|ogv)$/;
+      var oggMatch = url.match(oggRegExp);
+      var webmRegExp = /^.+.(webm)$/;
+      var webmMatch = url.match(webmRegExp);
+      var fbRegExp = /(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/;
+      var fbMatch = url.match(fbRegExp);
+      var $video;
+
+      if (ytMatch && ytMatch[1].length === 11) {
+        var youtubeId = ytMatch[1];
+        var start = 0;
+
+        if (typeof ytMatch[2] !== 'undefined') {
+          var ytMatchForStart = ytMatch[2].match(ytRegExpForStart);
+
+          if (ytMatchForStart) {
+            for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {
+              start += typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0;
+            }
+          }
+        }
+
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : '')).attr('width', '640').attr('height', '360');
+      } else if (gdMatch && gdMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview').attr('width', '640').attr('height', '480');
+      } else if (igMatch && igMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/').attr('width', '612').attr('height', '710').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else if (vMatch && vMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', vMatch[0] + '/embed/simple').attr('width', '600').attr('height', '600').attr('class', 'vine-embed');
+      } else if (vimMatch && vimMatch[3].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('src', '//player.vimeo.com/video/' + vimMatch[3]).attr('width', '640').attr('height', '360');
+      } else if (dmMatch && dmMatch[2].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2]).attr('width', '640').attr('height', '360');
+      } else if (youkuMatch && youkuMatch[1].length) {
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '498').attr('width', '510').attr('src', '//player.youku.com/embed/' + youkuMatch[1]);
+      } else if (peerTubeMatch && peerTubeMatch[0].length) {
+        var begin = 0;
+        if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];
+        var end = 0;
+        if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];
+        var loop = 0;
+        if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];
+        var autoplay = 0;
+        if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];
+        var muted = 0;
+        if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];
+        $video = external_jQuery_default()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr('frameborder', 0).attr('src', '//' + peerTubeMatch[1] + '/videos/embed/' + peerTubeMatch[2] + "?loop=" + loop + "&autoplay=" + autoplay + "&muted=" + muted + (begin > 0 ? '&start=' + begin : '') + (end > 0 ? '&end=' + start : '')).attr('width', '560').attr('height', '315');
+      } else if (qqMatch && qqMatch[1].length || qqMatch2 && qqMatch2[2].length) {
+        var vid = qqMatch && qqMatch[1].length ? qqMatch[1] : qqMatch2[2];
+        $video = external_jQuery_default()('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>').attr('frameborder', 0).attr('height', '310').attr('width', '500').attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');
+      } else if (mp4Match || oggMatch || webmMatch) {
+        $video = external_jQuery_default()('<video controls>').attr('src', url).attr('width', '640').attr('height', '360');
+      } else if (fbMatch && fbMatch[0].length) {
+        $video = external_jQuery_default()('<iframe>').attr('frameborder', 0).attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560').attr('width', '560').attr('height', '301').attr('scrolling', 'no').attr('allowtransparency', 'true');
+      } else {
+        // this is not a known video link. Now what, Cat? Now what?
+        return false;
+      }
+
+      $video.addClass('note-video-clip');
+      return $video[0];
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this = this;
+
+      var text = this.context.invoke('editor.getSelectedText');
+      this.context.invoke('editor.saveRange');
+      this.showVideoDialog(text).then(function (url) {
+        // [workaround] hide dialog before restore range for IE range focus
+        _this.ui.hideDialog(_this.$dialog);
+
+        _this.context.invoke('editor.restoreRange'); // build node
+
+
+        var $node = _this.createVideoNode(url);
+
+        if ($node) {
+          // insert video node
+          _this.context.invoke('editor.insertNode', $node);
+        }
+      }).fail(function () {
+        _this.context.invoke('editor.restoreRange');
+      });
+    }
+    /**
+     * show video dialog
+     *
+     * @param {jQuery} $dialog
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showVideoDialog",
+    value: function showVideoDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        var $videoUrl = _this2.$dialog.find('.note-video-url');
+
+        var $videoBtn = _this2.$dialog.find('.note-video-btn');
+
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          $videoUrl.on('input paste propertychange', function () {
+            _this2.ui.toggleBtn($videoBtn, $videoUrl.val());
+          });
+
+          if (!env.isSupportTouch) {
+            $videoUrl.trigger('focus');
+          }
+
+          $videoBtn.click(function (event) {
+            event.preventDefault();
+            deferred.resolve($videoUrl.val());
+          });
+
+          _this2.bindEnterKey($videoUrl, $videoBtn);
+        });
+
+        _this2.ui.onDialogHidden(_this2.$dialog, function () {
+          $videoUrl.off();
+          $videoBtn.off();
+
+          if (deferred.state() === 'pending') {
+            deferred.reject();
+          }
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      });
+    }
+  }]);
+
+  return VideoDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HelpDialog.js
+function HelpDialog_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HelpDialog_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HelpDialog_createClass(Constructor, protoProps, staticProps) { if (protoProps) HelpDialog_defineProperties(Constructor.prototype, protoProps); if (staticProps) HelpDialog_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+var HelpDialog = /*#__PURE__*/function () {
+  function HelpDialog(context) {
+    HelpDialog_classCallCheck(this, HelpDialog);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$body = external_jQuery_default()(document.body);
+    this.$editor = context.layoutInfo.editor;
+    this.options = context.options;
+    this.lang = this.options.langInfo;
+  }
+
+  HelpDialog_createClass(HelpDialog, [{
+    key: "initialize",
+    value: function initialize() {
+      var $container = this.options.dialogsInBody ? this.$body : this.options.container;
+      var body = ['<p class="text-center">', '<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ', '<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ', '<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>', '</p>'].join('');
+      this.$dialog = this.ui.dialog({
+        title: this.lang.options.help,
+        fade: this.options.dialogsFade,
+        body: this.createShortcutList(),
+        footer: body,
+        callback: function callback($node) {
+          $node.find('.modal-body,.note-modal-body').css({
+            'max-height': 300,
+            'overflow': 'scroll'
+          });
+        }
+      }).render().appendTo($container);
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.ui.hideDialog(this.$dialog);
+      this.$dialog.remove();
+    }
+  }, {
+    key: "createShortcutList",
+    value: function createShortcutList() {
+      var _this = this;
+
+      var keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];
+      return Object.keys(keyMap).map(function (key) {
+        var command = keyMap[key];
+        var $row = external_jQuery_default()('<div><div class="help-list-item"></div></div>');
+        $row.append(external_jQuery_default()('<label><kbd>' + key + '</kdb></label>').css({
+          'width': 180,
+          'margin-right': 10
+        })).append(external_jQuery_default()('<span></span>').html(_this.context.memo('help.' + command) || command));
+        return $row.html();
+      }).join('');
+    }
+    /**
+     * show help dialog
+     *
+     * @return {Promise}
+     */
+
+  }, {
+    key: "showHelpDialog",
+    value: function showHelpDialog() {
+      var _this2 = this;
+
+      return external_jQuery_default().Deferred(function (deferred) {
+        _this2.ui.onDialogShown(_this2.$dialog, function () {
+          _this2.context.triggerEvent('dialog.shown');
+
+          deferred.resolve();
+        });
+
+        _this2.ui.showDialog(_this2.$dialog);
+      }).promise();
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      var _this3 = this;
+
+      this.context.invoke('editor.saveRange');
+      this.showHelpDialog().then(function () {
+        _this3.context.invoke('editor.restoreRange');
+      });
+    }
+  }]);
+
+  return HelpDialog;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/AirPopover.js
+function AirPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function AirPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function AirPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) AirPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) AirPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var AIRMODE_POPOVER_X_OFFSET = -5;
+var AIRMODE_POPOVER_Y_OFFSET = 5;
+
+var AirPopover = /*#__PURE__*/function () {
+  function AirPopover(context) {
+    var _this = this;
+
+    AirPopover_classCallCheck(this, AirPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.options = context.options;
+    this.hidable = true;
+    this.onContextmenu = false;
+    this.pageX = null;
+    this.pageY = null;
+    this.events = {
+      'summernote.contextmenu': function summernoteContextmenu(e) {
+        if (_this.options.editing) {
+          e.preventDefault();
+          e.stopPropagation();
+          _this.onContextmenu = true;
+
+          _this.update(true);
+        }
+      },
+      'summernote.mousedown': function summernoteMousedown(we, e) {
+        _this.pageX = e.pageX;
+        _this.pageY = e.pageY;
+      },
+      'summernote.keyup summernote.mouseup summernote.scroll': function summernoteKeyupSummernoteMouseupSummernoteScroll(we, e) {
+        if (_this.options.editing && !_this.onContextmenu) {
+          _this.pageX = e.pageX;
+          _this.pageY = e.pageY;
+
+          _this.update();
+        }
+
+        _this.onContextmenu = false;
+      },
+      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteChangeSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      },
+      'summernote.focusout': function summernoteFocusout() {
+        if (!_this.$popover.is(':active,:focus')) {
+          _this.hide();
+        }
+      }
+    };
+  }
+
+  AirPopover_createClass(AirPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.options.airMode && !lists.isEmpty(this.options.popover.air);
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.$popover = this.ui.popover({
+        className: 'note-air-popover'
+      }).render().appendTo(this.options.container);
+      var $content = this.$popover.find('.popover-content');
+      this.context.invoke('buttons.build', $content, this.options.popover.air); // disable hiding this popover preemptively by 'summernote.blur' event.
+
+      this.$popover.on('mousedown', function () {
+        _this2.hidable = false;
+      }); // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).
+
+      this.$popover.on('mouseup', function () {
+        _this2.hidable = true;
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "update",
+    value: function update(forcelyOpen) {
+      var styleInfo = this.context.invoke('editor.currentStyle');
+
+      if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {
+        var rect = {
+          left: this.pageX,
+          top: this.pageY
+        };
+        var containerOffset = external_jQuery_default()(this.options.container).offset();
+        rect.top -= containerOffset.top;
+        rect.left -= containerOffset.left;
+        this.$popover.css({
+          display: 'block',
+          left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,
+          top: rect.top + AIRMODE_POPOVER_Y_OFFSET
+        });
+        this.context.invoke('buttons.updateCurrentStyle', this.$popover);
+      } else {
+        this.hide();
+      }
+    }
+  }, {
+    key: "updateCodeview",
+    value: function updateCodeview(isCodeview) {
+      this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);
+
+      if (isCodeview) {
+        this.hide();
+      }
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      if (this.hidable) {
+        this.$popover.hide();
+      }
+    }
+  }]);
+
+  return AirPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/module/HintPopover.js
+function HintPopover_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function HintPopover_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function HintPopover_createClass(Constructor, protoProps, staticProps) { if (protoProps) HintPopover_defineProperties(Constructor.prototype, protoProps); if (staticProps) HintPopover_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+
+
+
+
+var POPOVER_DIST = 5;
+
+var HintPopover = /*#__PURE__*/function () {
+  function HintPopover(context) {
+    var _this = this;
+
+    HintPopover_classCallCheck(this, HintPopover);
+
+    this.context = context;
+    this.ui = (external_jQuery_default()).summernote.ui;
+    this.$editable = context.layoutInfo.editable;
+    this.options = context.options;
+    this.hint = this.options.hint || [];
+    this.direction = this.options.hintDirection || 'bottom';
+    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];
+    this.events = {
+      'summernote.keyup': function summernoteKeyup(we, e) {
+        if (!e.isDefaultPrevented()) {
+          _this.handleKeyup(e);
+        }
+      },
+      'summernote.keydown': function summernoteKeydown(we, e) {
+        _this.handleKeydown(e);
+      },
+      'summernote.disable summernote.dialog.shown summernote.blur': function summernoteDisableSummernoteDialogShownSummernoteBlur() {
+        _this.hide();
+      }
+    };
+  }
+
+  HintPopover_createClass(HintPopover, [{
+    key: "shouldInitialize",
+    value: function shouldInitialize() {
+      return this.hints.length > 0;
+    }
+  }, {
+    key: "initialize",
+    value: function initialize() {
+      var _this2 = this;
+
+      this.lastWordRange = null;
+      this.matchingWord = null;
+      this.$popover = this.ui.popover({
+        className: 'note-hint-popover',
+        hideArrow: true,
+        direction: ''
+      }).render().appendTo(this.options.container);
+      this.$popover.hide();
+      this.$content = this.$popover.find('.popover-content,.note-popover-content');
+      this.$content.on('click', '.note-hint-item', function (e) {
+        _this2.$content.find('.active').removeClass('active');
+
+        external_jQuery_default()(e.currentTarget).addClass('active');
+
+        _this2.replace();
+      });
+      this.$popover.on('mousedown', function (e) {
+        e.preventDefault();
+      });
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      this.$popover.remove();
+    }
+  }, {
+    key: "selectItem",
+    value: function selectItem($item) {
+      this.$content.find('.active').removeClass('active');
+      $item.addClass('active');
+      this.$content[0].scrollTop = $item[0].offsetTop - this.$content.innerHeight() / 2;
+    }
+  }, {
+    key: "moveDown",
+    value: function moveDown() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $next = $current.next();
+
+      if ($next.length) {
+        this.selectItem($next);
+      } else {
+        var $nextGroup = $current.parent().next();
+
+        if (!$nextGroup.length) {
+          $nextGroup = this.$content.find('.note-hint-group').first();
+        }
+
+        this.selectItem($nextGroup.find('.note-hint-item').first());
+      }
+    }
+  }, {
+    key: "moveUp",
+    value: function moveUp() {
+      var $current = this.$content.find('.note-hint-item.active');
+      var $prev = $current.prev();
+
+      if ($prev.length) {
+        this.selectItem($prev);
+      } else {
+        var $prevGroup = $current.parent().prev();
+
+        if (!$prevGroup.length) {
+          $prevGroup = this.$content.find('.note-hint-group').last();
+        }
+
+        this.selectItem($prevGroup.find('.note-hint-item').last());
+      }
+    }
+  }, {
+    key: "replace",
+    value: function replace() {
+      var $item = this.$content.find('.note-hint-item.active');
+
+      if ($item.length) {
+        var node = this.nodeFromItem($item); // If matchingWord length = 0 -> capture OK / open hint / but as mention capture "" (\w*)
+
+        if (this.matchingWord !== null && this.matchingWord.length === 0) {
+          this.lastWordRange.so = this.lastWordRange.eo; // Else si > 0 and normal case -> adjust range "before" for correct position of insertion
+        } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {
+          var rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;
+
+          if (rangeCompute > 0) {
+            this.lastWordRange.so += rangeCompute;
+          }
+        }
+
+        this.lastWordRange.insertNode(node);
+
+        if (this.options.hintSelect === 'next') {
+          var blank = document.createTextNode('');
+          external_jQuery_default()(node).after(blank);
+          range.createFromNodeBefore(blank).select();
+        } else {
+          range.createFromNodeAfter(node).select();
+        }
+
+        this.lastWordRange = null;
+        this.hide();
+        this.context.invoke('editor.focus');
+        this.context.triggerEvent('change', this.$editable.html(), this.$editable);
+      }
+    }
+  }, {
+    key: "nodeFromItem",
+    value: function nodeFromItem($item) {
+      var hint = this.hints[$item.data('index')];
+      var item = $item.data('item');
+      var node = hint.content ? hint.content(item) : item;
+
+      if (typeof node === 'string') {
+        node = dom.createText(node);
+      }
+
+      return node;
+    }
+  }, {
+    key: "createItemTemplates",
+    value: function createItemTemplates(hintIdx, items) {
+      var hint = this.hints[hintIdx];
+      return items.map(function (item
+      /*, idx */
+      ) {
+        var $item = external_jQuery_default()('<div class="note-hint-item"></div>');
+        $item.append(hint.template ? hint.template(item) : item + '');
+        $item.data({
+          'index': hintIdx,
+          'item': item
+        });
+        return $item;
+      });
+    }
+  }, {
+    key: "handleKeydown",
+    value: function handleKeydown(e) {
+      if (!this.$popover.is(':visible')) {
+        return;
+      }
+
+      if (e.keyCode === key.code.ENTER) {
+        e.preventDefault();
+        this.replace();
+      } else if (e.keyCode === key.code.UP) {
+        e.preventDefault();
+        this.moveUp();
+      } else if (e.keyCode === key.code.DOWN) {
+        e.preventDefault();
+        this.moveDown();
+      }
+    }
+  }, {
+    key: "searchKeyword",
+    value: function searchKeyword(index, keyword, callback) {
+      var hint = this.hints[index];
+
+      if (hint && hint.match.test(keyword) && hint.search) {
+        var matches = hint.match.exec(keyword);
+        this.matchingWord = matches[0];
+        hint.search(matches[1], callback);
+      } else {
+        callback();
+      }
+    }
+  }, {
+    key: "createGroup",
+    value: function createGroup(idx, keyword) {
+      var _this3 = this;
+
+      var $group = external_jQuery_default()('<div class="note-hint-group note-hint-group-' + idx + '"></div>');
+      this.searchKeyword(idx, keyword, function (items) {
+        items = items || [];
+
+        if (items.length) {
+          $group.html(_this3.createItemTemplates(idx, items));
+
+          _this3.show();
+        }
+      });
+      return $group;
+    }
+  }, {
+    key: "handleKeyup",
+    value: function handleKeyup(e) {
+      var _this4 = this;
+
+      if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {
+        var _range = this.context.invoke('editor.getLastRange');
+
+        var wordRange, keyword;
+
+        if (this.options.hintMode === 'words') {
+          wordRange = _range.getWordsRange(_range);
+          keyword = wordRange.toString();
+          this.hints.forEach(function (hint) {
+            if (hint.match.test(keyword)) {
+              wordRange = _range.getWordsMatchRange(hint.match);
+              return false;
+            }
+          });
+
+          if (!wordRange) {
+            this.hide();
+            return;
+          }
+
+          keyword = wordRange.toString();
+        } else {
+          wordRange = _range.getWordRange();
+          keyword = wordRange.toString();
+        }
+
+        if (this.hints.length && keyword) {
+          this.$content.empty();
+          var bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));
+          var containerOffset = external_jQuery_default()(this.options.container).offset();
+
+          if (bnd) {
+            bnd.top -= containerOffset.top;
+            bnd.left -= containerOffset.left;
+            this.$popover.hide();
+            this.lastWordRange = wordRange;
+            this.hints.forEach(function (hint, idx) {
+              if (hint.match.test(keyword)) {
+                _this4.createGroup(idx, keyword).appendTo(_this4.$content);
+              }
+            }); // select first .note-hint-item
+
+            this.$content.find('.note-hint-item:first').addClass('active'); // set position for popover after group is created
+
+            if (this.direction === 'top') {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST
+              });
+            } else {
+              this.$popover.css({
+                left: bnd.left,
+                top: bnd.top + bnd.height + POPOVER_DIST
+              });
+            }
+          }
+        } else {
+          this.hide();
+        }
+      }
+    }
+  }, {
+    key: "show",
+    value: function show() {
+      this.$popover.show();
+    }
+  }, {
+    key: "hide",
+    value: function hide() {
+      this.$popover.hide();
+    }
+  }]);
+
+  return HintPopover;
+}();
+
+
+;// CONCATENATED MODULE: ./src/js/settings.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  version: '0.8.20',
+  plugins: {},
+  dom: dom,
+  range: range,
+  lists: lists,
+  options: {
+    langInfo: (external_jQuery_default()).summernote.lang["en-US"],
+    editing: true,
+    modules: {
+      'editor': Editor,
+      'clipboard': Clipboard,
+      'dropzone': Dropzone,
+      'codeview': CodeView,
+      'statusbar': Statusbar,
+      'fullscreen': Fullscreen,
+      'handle': Handle,
+      // FIXME: HintPopover must be front of autolink
+      //  - Script error about range when Enter key is pressed on hint popover
+      'hintPopover': HintPopover,
+      'autoLink': AutoLink,
+      'autoSync': AutoSync,
+      'autoReplace': AutoReplace,
+      'placeholder': Placeholder,
+      'buttons': Buttons,
+      'toolbar': Toolbar,
+      'linkDialog': LinkDialog,
+      'linkPopover': LinkPopover,
+      'imageDialog': ImageDialog,
+      'imagePopover': ImagePopover,
+      'tablePopover': TablePopover,
+      'videoDialog': VideoDialog,
+      'helpDialog': HelpDialog,
+      'airPopover': AirPopover
+    },
+    buttons: {},
+    lang: 'en-US',
+    followingToolbar: false,
+    toolbarPosition: 'top',
+    otherStaticBar: '',
+    // toolbar
+    codeviewKeepButton: false,
+    toolbar: [['style', ['style']], ['font', ['bold', 'underline', 'clear']], ['fontname', ['fontname']], ['color', ['color']], ['para', ['ul', 'ol', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture', 'video']], ['view', ['fullscreen', 'codeview', 'help']]],
+    // popover
+    popatmouse: true,
+    popover: {
+      image: [['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']], ['float', ['floatLeft', 'floatRight', 'floatNone']], ['remove', ['removeMedia']]],
+      link: [['link', ['linkDialogShow', 'unlink']]],
+      table: [['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']], ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]],
+      air: [['color', ['color']], ['font', ['bold', 'underline', 'clear']], ['para', ['ul', 'paragraph']], ['table', ['table']], ['insert', ['link', 'picture']], ['view', ['fullscreen', 'codeview']]]
+    },
+    // air mode: inline editor
+    airMode: false,
+    overrideContextMenu: false,
+    // TBD
+    width: null,
+    height: null,
+    linkTargetBlank: true,
+    useProtocol: true,
+    defaultProtocol: 'http://',
+    focus: false,
+    tabDisabled: false,
+    tabSize: 4,
+    styleWithCSS: false,
+    shortcuts: true,
+    textareaAutoSync: true,
+    tooltip: 'auto',
+    container: null,
+    maxTextLength: 0,
+    blockquoteBreakingLevel: 2,
+    spellCheck: true,
+    disableGrammar: false,
+    placeholder: null,
+    inheritPlaceholder: false,
+    // TODO: need to be documented
+    recordEveryKeystroke: false,
+    historyLimit: 200,
+    // TODO: need to be documented
+    showDomainOnlyForAutolink: false,
+    // TODO: need to be documented
+    hintMode: 'word',
+    hintSelect: 'after',
+    hintDirection: 'bottom',
+    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
+    fontNames: ['Arial', 'Arial Black', 'Comic Sans MS', 'Courier New', 'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande', 'Tahoma', 'Times New Roman', 'Verdana'],
+    fontNamesIgnoreCheck: [],
+    addDefaultFonts: true,
+    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],
+    fontSizeUnits: ['px', 'pt'],
+    // pallete colors(n x n)
+    colors: [['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'], ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'], ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'], ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'], ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'], ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'], ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'], ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031']],
+    // http://chir.ag/projects/name-that-color/
+    colorsName: [['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'], ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'], ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'], ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'], ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'], ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'], ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'], ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou']],
+    colorButton: {
+      foreColor: '#000000',
+      backColor: '#FFFF00'
+    },
+    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],
+    tableClassName: 'table table-bordered',
+    insertTableMaxSize: {
+      col: 10,
+      row: 10
+    },
+    // By default, dialogs are attached in container.
+    dialogsInBody: false,
+    dialogsFade: false,
+    maximumImageFileSize: null,
+    acceptImageFileTypes: "image/*",
+    callbacks: {
+      onBeforeCommand: null,
+      onBlur: null,
+      onBlurCodeview: null,
+      onChange: null,
+      onChangeCodeview: null,
+      onDialogShown: null,
+      onEnter: null,
+      onFocus: null,
+      onImageLinkInsert: null,
+      onImageUpload: null,
+      onImageUploadError: null,
+      onInit: null,
+      onKeydown: null,
+      onKeyup: null,
+      onMousedown: null,
+      onMouseup: null,
+      onPaste: null,
+      onScroll: null
+    },
+    codemirror: {
+      mode: 'text/html',
+      htmlMode: true,
+      lineNumbers: true
+    },
+    codeviewFilter: true,
+    codeviewFilterRegex: /<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,
+    codeviewIframeFilter: true,
+    codeviewIframeWhitelistSrc: [],
+    codeviewIframeWhitelistSrcBase: ['www.youtube.com', 'www.youtube-nocookie.com', 'www.facebook.com', 'vine.co', 'instagram.com', 'player.vimeo.com', 'www.dailymotion.com', 'player.youku.com', 'jumpingbean.tv', 'v.qq.com'],
+    keyMap: {
+      pc: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CTRL+Z': 'undo',
+        'CTRL+Y': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CTRL+B': 'bold',
+        'CTRL+I': 'italic',
+        'CTRL+U': 'underline',
+        'CTRL+SHIFT+S': 'strikethrough',
+        'CTRL+BACKSLASH': 'removeFormat',
+        'CTRL+SHIFT+L': 'justifyLeft',
+        'CTRL+SHIFT+E': 'justifyCenter',
+        'CTRL+SHIFT+R': 'justifyRight',
+        'CTRL+SHIFT+J': 'justifyFull',
+        'CTRL+SHIFT+NUM7': 'insertUnorderedList',
+        'CTRL+SHIFT+NUM8': 'insertOrderedList',
+        'CTRL+LEFTBRACKET': 'outdent',
+        'CTRL+RIGHTBRACKET': 'indent',
+        'CTRL+NUM0': 'formatPara',
+        'CTRL+NUM1': 'formatH1',
+        'CTRL+NUM2': 'formatH2',
+        'CTRL+NUM3': 'formatH3',
+        'CTRL+NUM4': 'formatH4',
+        'CTRL+NUM5': 'formatH5',
+        'CTRL+NUM6': 'formatH6',
+        'CTRL+ENTER': 'insertHorizontalRule',
+        'CTRL+K': 'linkDialog.show'
+      },
+      mac: {
+        'ESC': 'escape',
+        'ENTER': 'insertParagraph',
+        'CMD+Z': 'undo',
+        'CMD+SHIFT+Z': 'redo',
+        'TAB': 'tab',
+        'SHIFT+TAB': 'untab',
+        'CMD+B': 'bold',
+        'CMD+I': 'italic',
+        'CMD+U': 'underline',
+        'CMD+SHIFT+S': 'strikethrough',
+        'CMD+BACKSLASH': 'removeFormat',
+        'CMD+SHIFT+L': 'justifyLeft',
+        'CMD+SHIFT+E': 'justifyCenter',
+        'CMD+SHIFT+R': 'justifyRight',
+        'CMD+SHIFT+J': 'justifyFull',
+        'CMD+SHIFT+NUM7': 'insertUnorderedList',
+        'CMD+SHIFT+NUM8': 'insertOrderedList',
+        'CMD+LEFTBRACKET': 'outdent',
+        'CMD+RIGHTBRACKET': 'indent',
+        'CMD+NUM0': 'formatPara',
+        'CMD+NUM1': 'formatH1',
+        'CMD+NUM2': 'formatH2',
+        'CMD+NUM3': 'formatH3',
+        'CMD+NUM4': 'formatH4',
+        'CMD+NUM5': 'formatH5',
+        'CMD+NUM6': 'formatH6',
+        'CMD+ENTER': 'insertHorizontalRule',
+        'CMD+K': 'linkDialog.show'
+      }
+    },
+    icons: {
+      'align': 'note-icon-align',
+      'alignCenter': 'note-icon-align-center',
+      'alignJustify': 'note-icon-align-justify',
+      'alignLeft': 'note-icon-align-left',
+      'alignRight': 'note-icon-align-right',
+      'rowBelow': 'note-icon-row-below',
+      'colBefore': 'note-icon-col-before',
+      'colAfter': 'note-icon-col-after',
+      'rowAbove': 'note-icon-row-above',
+      'rowRemove': 'note-icon-row-remove',
+      'colRemove': 'note-icon-col-remove',
+      'indent': 'note-icon-align-indent',
+      'outdent': 'note-icon-align-outdent',
+      'arrowsAlt': 'note-icon-arrows-alt',
+      'bold': 'note-icon-bold',
+      'caret': 'note-icon-caret',
+      'circle': 'note-icon-circle',
+      'close': 'note-icon-close',
+      'code': 'note-icon-code',
+      'eraser': 'note-icon-eraser',
+      'floatLeft': 'note-icon-float-left',
+      'floatRight': 'note-icon-float-right',
+      'font': 'note-icon-font',
+      'frame': 'note-icon-frame',
+      'italic': 'note-icon-italic',
+      'link': 'note-icon-link',
+      'unlink': 'note-icon-chain-broken',
+      'magic': 'note-icon-magic',
+      'menuCheck': 'note-icon-menu-check',
+      'minus': 'note-icon-minus',
+      'orderedlist': 'note-icon-orderedlist',
+      'pencil': 'note-icon-pencil',
+      'picture': 'note-icon-picture',
+      'question': 'note-icon-question',
+      'redo': 'note-icon-redo',
+      'rollback': 'note-icon-rollback',
+      'square': 'note-icon-square',
+      'strikethrough': 'note-icon-strikethrough',
+      'subscript': 'note-icon-subscript',
+      'superscript': 'note-icon-superscript',
+      'table': 'note-icon-table',
+      'textHeight': 'note-icon-text-height',
+      'trash': 'note-icon-trash',
+      'underline': 'note-icon-underline',
+      'undo': 'note-icon-undo',
+      'unorderedlist': 'note-icon-unorderedlist',
+      'video': 'note-icon-video'
+    }
+  }
+});
+;// CONCATENATED MODULE: ./src/js/renderer.js
+function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function renderer_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function renderer_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function renderer_createClass(Constructor, protoProps, staticProps) { if (protoProps) renderer_defineProperties(Constructor.prototype, protoProps); if (staticProps) renderer_defineProperties(Constructor, staticProps); return Constructor; }
+
+
+
+var Renderer = /*#__PURE__*/function () {
+  function Renderer(markup, children, options, callback) {
+    renderer_classCallCheck(this, Renderer);
+
+    this.markup = markup;
+    this.children = children;
+    this.options = options;
+    this.callback = callback;
+  }
+
+  renderer_createClass(Renderer, [{
+    key: "render",
+    value: function render($parent) {
+      var $node = external_jQuery_default()(this.markup);
+
+      if (this.options && this.options.contents) {
+        $node.html(this.options.contents);
+      }
+
+      if (this.options && this.options.className) {
+        $node.addClass(this.options.className);
+      }
+
+      if (this.options && this.options.data) {
+        external_jQuery_default().each(this.options.data, function (k, v) {
+          $node.attr('data-' + k, v);
+        });
+      }
+
+      if (this.options && this.options.click) {
+        $node.on('click', this.options.click);
+      }
+
+      if (this.children) {
+        var $container = $node.find('.note-children-container');
+        this.children.forEach(function (child) {
+          child.render($container.length ? $container : $node);
+        });
+      }
+
+      if (this.callback) {
+        this.callback($node, this.options);
+      }
+
+      if (this.options && this.options.callback) {
+        this.options.callback($node);
+      }
+
+      if ($parent) {
+        $parent.append($node);
+      }
+
+      return $node;
+    }
+  }]);
+
+  return Renderer;
+}();
+
+/* harmony default export */ const renderer = ({
+  create: function create(markup, callback) {
+    return function () {
+      var options = _typeof(arguments[1]) === 'object' ? arguments[1] : arguments[0];
+      var children = Array.isArray(arguments[0]) ? arguments[0] : [];
+
+      if (options && options.children) {
+        children = options.children;
+      }
+
+      return new Renderer(markup, children, options, callback);
+    };
+  }
+});
+;// CONCATENATED MODULE: ./src/styles/bs3/summernote-bs3.js
+function summernote_bs3_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { summernote_bs3_typeof = function _typeof(obj) { return typeof obj; }; } else { summernote_bs3_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return summernote_bs3_typeof(obj); }
+
+
+
+
+
+var editor = renderer.create('<div class="note-editor note-frame panel panel-default"></div>');
+var toolbar = renderer.create('<div class="panel-heading note-toolbar" role="toolbar"></div>');
+var editingArea = renderer.create('<div class="note-editing-area"></div>');
+var codable = renderer.create('<textarea class="note-codable" aria-multiline="true"></textarea>');
+var editable = renderer.create('<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>');
+var statusbar = renderer.create(['<output class="note-status-output" role="status" aria-live="polite"></output>', '<div class="note-statusbar" role="status">', '<div class="note-resizebar" aria-label="Resize">', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '<div class="note-icon-bar"></div>', '</div>', '</div>'].join(''));
+var airEditor = renderer.create('<div class="note-editor note-airframe"></div>');
+var airEditable = renderer.create(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>', '<output class="note-status-output" role="status" aria-live="polite"></output>'].join(''));
+var buttonGroup = renderer.create('<div class="note-btn-group btn-group"></div>');
+var dropdown = renderer.create('<ul class="note-dropdown-menu dropdown-menu"></ul>', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    var option = summernote_bs3_typeof(item) === 'object' ? item.option : undefined;
+    var dataValue = 'data-value="' + value + '"';
+    var dataOption = option !== undefined ? ' data-option="' + option + '"' : '';
+    return '<li aria-label="' + value + '"><a href="#" ' + (dataValue + dataOption) + '>' + content + '</a></li>';
+  }).join('') : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+
+var dropdownButtonContents = function dropdownButtonContents(contents, options) {
+  return contents + ' ' + icon(options.icons.caret, 'span');
+};
+
+var dropdownCheck = renderer.create('<ul class="note-dropdown-menu dropdown-menu note-check"></ul>', function ($node, options) {
+  var markup = Array.isArray(options.items) ? options.items.map(function (item) {
+    var value = typeof item === 'string' ? item : item.value || '';
+    var content = options.template ? options.template(item) : item;
+    return '<li aria-label="' + item + '"><a href="#" data-value="' + value + '">' + icon(options.checkClassName) + ' ' + content + '</a></li>';
+  }).join('') : options.items;
+  $node.html(markup).attr({
+    'aria-label': options.title
+  });
+
+  if (options && options.codeviewKeepButton) {
+    $node.addClass('note-codeview-keep');
+  }
+});
+var dialog = renderer.create('<div class="modal note-modal" aria-hidden="false" tabindex="-1" role="dialog"></div>', function ($node, options) {
+  if (options.fade) {
+    $node.addClass('fade');
+  }
+
+  $node.attr({
+    'aria-label': options.title
+  });
+  $node.html(['<div class="modal-dialog">', '<div class="modal-content">', options.title ? '<div class="modal-header">' + '<button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">&times;</button>' + '<h4 class="modal-title">' + options.title + '</h4>' + '</div>' : '', '<div class="modal-body">' + options.body + '</div>', options.footer ? '<div class="modal-footer">' + options.footer + '</div>' : '', '</div>', '</div>'].join(''));
+});
+var popover = renderer.create(['<div class="note-popover popover in">', '<div class="arrow"></div>', '<div class="popover-content note-children-container"></div>', '</div>'].join(''), function ($node, options) {
+  var direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';
+  $node.addClass(direction);
+
+  if (options.hideArrow) {
+    $node.find('.arrow').hide();
+  }
+});
+var summernote_bs3_checkbox = renderer.create('<div class="checkbox"></div>', function ($node, options) {
+  $node.html(['<label' + (options.id ? ' for="note-' + options.id + '"' : '') + '>', '<input type="checkbox"' + (options.id ? ' id="note-' + options.id + '"' : ''), options.checked ? ' checked' : '', ' aria-checked="' + (options.checked ? 'true' : 'false') + '"/>', options.text ? options.text : '', '</label>'].join(''));
+});
+
+var icon = function icon(iconClassName, tagName) {
+  if (iconClassName.match(/^</)) {
+    return iconClassName;
+  }
+
+  tagName = tagName || 'i';
+  return '<' + tagName + ' class="' + iconClassName + '"></' + tagName + '>';
+};
+
+var ui = function ui(editorOptions) {
+  return {
+    editor: editor,
+    toolbar: toolbar,
+    editingArea: editingArea,
+    codable: codable,
+    editable: editable,
+    statusbar: statusbar,
+    airEditor: airEditor,
+    airEditable: airEditable,
+    buttonGroup: buttonGroup,
+    dropdown: dropdown,
+    dropdownButtonContents: dropdownButtonContents,
+    dropdownCheck: dropdownCheck,
+    dialog: dialog,
+    popover: popover,
+    checkbox: summernote_bs3_checkbox,
+    icon: icon,
+    options: editorOptions,
+    palette: function palette($node, options) {
+      return renderer.create('<div class="note-color-palette"></div>', function ($node, options) {
+        var contents = [];
+
+        for (var row = 0, rowSize = options.colors.length; row < rowSize; row++) {
+          var eventName = options.eventName;
+          var colors = options.colors[row];
+          var colorsName = options.colorsName[row];
+          var buttons = [];
+
+          for (var col = 0, colSize = colors.length; col < colSize; col++) {
+            var color = colors[col];
+            var colorName = colorsName[col];
+            buttons.push(['<button type="button" class="note-color-btn"', 'style="background-color:', color, '" ', 'data-event="', eventName, '" ', 'data-value="', color, '" ', 'title="', colorName, '" ', 'aria-label="', colorName, '" ', 'data-toggle="button" tabindex="-1"></button>'].join(''));
+          }
+
+          contents.push('<div class="note-color-row">' + buttons.join('') + '</div>');
+        }
+
+        $node.html(contents.join(''));
+
+        if (options.tooltip) {
+          $node.find('.note-color-btn').tooltip({
+            container: options.container || editorOptions.container,
+            trigger: 'hover',
+            placement: 'bottom'
+          });
+        }
+      })($node, options);
+    },
+    button: function button($node, options) {
+      return renderer.create('<button type="button" class="note-btn btn btn-default btn-sm" tabindex="-1"></button>', function ($node, options) {
+        if (options && options.tooltip) {
+          $node.attr({
+            title: options.tooltip,
+            'aria-label': options.tooltip
+          }).tooltip({
+            container: options.container || editorOptions.container,
+            trigger: 'hover',
+            placement: 'bottom'
+          }).on('click', function (e) {
+            external_jQuery_default()(e.currentTarget).tooltip('hide');
+          });
+        }
+
+        if (options && options.codeviewButton) {
+          $node.addClass('note-codeview-keep');
+        }
+      })($node, options);
+    },
+    toggleBtn: function toggleBtn($btn, isEnable) {
+      $btn.toggleClass('disabled', !isEnable);
+      $btn.attr('disabled', !isEnable);
+    },
+    toggleBtnActive: function toggleBtnActive($btn, isActive) {
+      $btn.toggleClass('active', isActive);
+    },
+    onDialogShown: function onDialogShown($dialog, handler) {
+      $dialog.one('shown.bs.modal', handler);
+    },
+    onDialogHidden: function onDialogHidden($dialog, handler) {
+      $dialog.one('hidden.bs.modal', handler);
+    },
+    showDialog: function showDialog($dialog) {
+      $dialog.modal('show');
+    },
+    hideDialog: function hideDialog($dialog) {
+      $dialog.modal('hide');
+    },
+    createLayout: function createLayout($note) {
+      var $editor = (editorOptions.airMode ? airEditor([editingArea([codable(), airEditable()])]) : editorOptions.toolbarPosition === 'bottom' ? editor([editingArea([codable(), editable()]), toolbar(), statusbar()]) : editor([toolbar(), editingArea([codable(), editable()]), statusbar()])).render();
+      $editor.insertAfter($note);
+      return {
+        note: $note,
+        editor: $editor,
+        toolbar: $editor.find('.note-toolbar'),
+        editingArea: $editor.find('.note-editing-area'),
+        editable: $editor.find('.note-editable'),
+        codable: $editor.find('.note-codable'),
+        statusbar: $editor.find('.note-statusbar')
+      };
+    },
+    removeLayout: function removeLayout($note, layoutInfo) {
+      $note.html(layoutInfo.editable.html());
+      layoutInfo.editor.remove();
+      $note.show();
+    }
+  };
+};
+
+(external_jQuery_default()).summernote = external_jQuery_default().extend((external_jQuery_default()).summernote, {
+  ui_template: ui,
+  "interface": 'bs3'
+});
+})();
+
+/******/ 	return __webpack_exports__;
+/******/ })()
+;
+});
+//# sourceMappingURL=summernote.js.map
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.js.map b/public_html/vendor/admin-lte-plugins/summernote/summernote.js.map
new file mode 100644
index 0000000..d9f48e0
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"summernote.js","mappings":"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","sources":["webpack:///webpack/universalModuleDefinition","webpack:///./src/lang/summernote-en-US.js","webpack:///external umd \"jQuery\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///./src/js/core/env.js","webpack:///./src/js/core/func.js","webpack:///./src/js/core/lists.js","webpack:///./src/js/core/dom.js","webpack:///./src/js/Context.js","webpack:///./src/js/summernote.js","webpack:///./src/js/core/range.js","webpack:///./src/js/core/key.js","webpack:///./src/js/core/async.js","webpack:///./src/js/editing/History.js","webpack:///./src/js/editing/Style.js","webpack:///./src/js/editing/Bullet.js","webpack:///./src/js/editing/Typing.js","webpack:///./src/js/editing/Table.js","webpack:///./src/js/module/Editor.js","webpack:///./src/js/module/Clipboard.js","webpack:///./src/js/module/Dropzone.js","webpack:///./src/js/module/Codeview.js","webpack:///./src/js/module/Statusbar.js","webpack:///./src/js/module/Fullscreen.js","webpack:///./src/js/module/Handle.js","webpack:///./src/js/module/AutoLink.js","webpack:///./src/js/module/AutoSync.js","webpack:///./src/js/module/AutoReplace.js","webpack:///./src/js/module/Placeholder.js","webpack:///./src/js/module/Buttons.js","webpack:///./src/js/module/Toolbar.js","webpack:///./src/js/module/LinkDialog.js","webpack:///./src/js/module/LinkPopover.js","webpack:///./src/js/module/ImageDialog.js","webpack:///./src/js/module/ImagePopover.js","webpack:///./src/js/module/TablePopover.js","webpack:///./src/js/module/VideoDialog.js","webpack:///./src/js/module/HelpDialog.js","webpack:///./src/js/module/AirPopover.js","webpack:///./src/js/module/HintPopover.js","webpack:///./src/js/settings.js","webpack:///./src/js/renderer.js","webpack:///./src/styles/bs3/summernote-bs3.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jQuery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jQuery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jQuery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(self, function(__WEBPACK_EXTERNAL_MODULE__1145__) {\nreturn ","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n","module.exports = __WEBPACK_EXTERNAL_MODULE__1145__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from 'jquery';\n\n/**\n * returns whether font is installed or not.\n *\n * @param {String} fontName\n * @return {Boolean}\n */\nconst genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];\n\nfunction validFontName(fontName) {\n  return ($.inArray(fontName.toLowerCase(), genericFontFamilies) === -1) ? `'${fontName}'` : fontName;\n}\n\nfunction isFontInstalled(fontName) {\n  const testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';\n  const testText = 'mmmmmmmmmmwwwww';\n  const testSize = '200px';\n\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n\n  context.font = testSize + \" '\" + testFontName + \"'\";\n  const originalWidth = context.measureText(testText).width;\n\n  context.font = testSize + ' ' + validFontName(fontName) + ', \"' + testFontName + '\"';\n  const width = context.measureText(testText).width;\n\n  return originalWidth !== width;\n}\n\nconst userAgent = navigator.userAgent;\nconst isMSIE = /MSIE|Trident/i.test(userAgent);\nlet browserVersion;\nif (isMSIE) {\n  let matches = /MSIE (\\d+[.]\\d+)/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n  matches = /Trident\\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n}\n\nconst isEdge = /Edge\\/\\d+/.test(userAgent);\n\nconst isSupportTouch =\n  (('ontouchstart' in window) ||\n   (navigator.MaxTouchPoints > 0) ||\n   (navigator.msMaxTouchPoints > 0));\n\n// [workaround] IE doesn't have input events for contentEditable\n// - see: https://goo.gl/4bfIvA\nconst inputEventName = (isMSIE) ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';\n\n/**\n * @class core.env\n *\n * Object which check platform and agent\n *\n * @singleton\n * @alternateClassName env\n */\nexport default {\n  isMac: navigator.appVersion.indexOf('Mac') > -1,\n  isMSIE,\n  isEdge,\n  isFF: !isEdge && /firefox/i.test(userAgent),\n  isPhantom: /PhantomJS/i.test(userAgent),\n  isWebkit: !isEdge && /webkit/i.test(userAgent),\n  isChrome: !isEdge && /chrome/i.test(userAgent),\n  isSafari: !isEdge && /safari/i.test(userAgent) && (!/chrome/i.test(userAgent)),\n  browserVersion,\n  isSupportTouch,\n  isFontInstalled,\n  isW3CRangeSupport: !!document.createRange,\n  inputEventName,\n  genericFontFamilies,\n  validFontName,\n};\n","import $ from 'jquery';\n\n/**\n * @class core.func\n *\n * func utils (for high-order func's arg)\n *\n * @singleton\n * @alternateClassName func\n */\nfunction eq(itemA) {\n  return function(itemB) {\n    return itemA === itemB;\n  };\n}\n\nfunction eq2(itemA, itemB) {\n  return itemA === itemB;\n}\n\nfunction peq2(propName) {\n  return function(itemA, itemB) {\n    return itemA[propName] === itemB[propName];\n  };\n}\n\nfunction ok() {\n  return true;\n}\n\nfunction fail() {\n  return false;\n}\n\nfunction not(f) {\n  return function() {\n    return !f.apply(f, arguments);\n  };\n}\n\nfunction and(fA, fB) {\n  return function(item) {\n    return fA(item) && fB(item);\n  };\n}\n\nfunction self(a) {\n  return a;\n}\n\nfunction invoke(obj, method) {\n  return function() {\n    return obj[method].apply(obj, arguments);\n  };\n}\n\nlet idCounter = 0;\n\n/**\n * reset globally-unique id\n *\n */\nfunction resetUniqueId() {\n  idCounter = 0;\n}\n\n/**\n * generate a globally-unique id\n *\n * @param {String} [prefix]\n */\nfunction uniqueId(prefix) {\n  const id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n/**\n * returns bnd (bounds) from rect\n *\n * - IE Compatibility Issue: http://goo.gl/sRLOAo\n * - Scroll Issue: http://goo.gl/sNjUc\n *\n * @param {Rect} rect\n * @return {Object} bounds\n * @return {Number} bounds.top\n * @return {Number} bounds.left\n * @return {Number} bounds.width\n * @return {Number} bounds.height\n */\nfunction rect2bnd(rect) {\n  const $document = $(document);\n  return {\n    top: rect.top + $document.scrollTop(),\n    left: rect.left + $document.scrollLeft(),\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n}\n\n/**\n * returns a copy of the object where the keys have become the values and the values the keys.\n * @param {Object} obj\n * @return {Object}\n */\nfunction invertObject(obj) {\n  const inverted = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      inverted[obj[key]] = key;\n    }\n  }\n  return inverted;\n}\n\n/**\n * @param {String} namespace\n * @param {String} [prefix]\n * @return {String}\n */\nfunction namespaceToCamel(namespace, prefix) {\n  prefix = prefix || '';\n  return prefix + namespace.split('.').map(function(name) {\n    return name.substring(0, 1).toUpperCase() + name.substring(1);\n  }).join('');\n}\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param {Function} func\n * @param {Number} wait\n * @param {Boolean} immediate\n * @return {Function}\n */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function() {\n    const context = this;\n    const args = arguments;\n    const later = () => {\n      timeout = null;\n      if (!immediate) {\n        func.apply(context, args);\n      }\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) {\n      func.apply(context, args);\n    }\n  };\n}\n\n/**\n *\n * @param {String} url\n * @return {Boolean}\n */\nfunction isValidUrl(url) {\n  const expression = /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/gi;\n  return expression.test(url);\n}\n\nexport default {\n  eq,\n  eq2,\n  peq2,\n  ok,\n  fail,\n  self,\n  not,\n  and,\n  invoke,\n  resetUniqueId,\n  uniqueId,\n  rect2bnd,\n  invertObject,\n  namespaceToCamel,\n  debounce,\n  isValidUrl,\n};\n","import func from './func';\n\n/**\n * returns the first item of an array.\n *\n * @param {Array} array\n */\nfunction head(array) {\n  return array[0];\n}\n\n/**\n * returns the last item of an array.\n *\n * @param {Array} array\n */\nfunction last(array) {\n  return array[array.length - 1];\n}\n\n/**\n * returns everything but the last entry of the array.\n *\n * @param {Array} array\n */\nfunction initial(array) {\n  return array.slice(0, array.length - 1);\n}\n\n/**\n * returns the rest of the items in an array.\n *\n * @param {Array} array\n */\nfunction tail(array) {\n  return array.slice(1);\n}\n\n/**\n * returns item of array\n */\nfunction find(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    const item = array[idx];\n    if (pred(item)) {\n      return item;\n    }\n  }\n}\n\n/**\n * returns true if all of the values in the array pass the predicate truth test.\n */\nfunction all(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!pred(array[idx])) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * returns true if the value is present in the list.\n */\nfunction contains(array, item) {\n  if (array && array.length && item) {\n    if (array.indexOf) {\n      return array.indexOf(item) !== -1;\n    } else if (array.contains) {\n      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`\n      return array.contains(item);\n    }\n  }\n  return false;\n}\n\n/**\n * get sum from a list\n *\n * @param {Array} array - array\n * @param {Function} fn - iterator\n */\nfunction sum(array, fn) {\n  fn = fn || func.self;\n  return array.reduce(function(memo, v) {\n    return memo + fn(v);\n  }, 0);\n}\n\n/**\n * returns a copy of the collection with array type.\n * @param {Collection} collection - collection eg) node.childNodes, ...\n */\nfunction from(collection) {\n  const result = [];\n  const length = collection.length;\n  let idx = -1;\n  while (++idx < length) {\n    result[idx] = collection[idx];\n  }\n  return result;\n}\n\n/**\n * returns whether list is empty or not\n */\nfunction isEmpty(array) {\n  return !array || !array.length;\n}\n\n/**\n * cluster elements by predicate function.\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n * @param {Array[]}\n */\nfunction clusterBy(array, fn) {\n  if (!array.length) { return []; }\n  const aTail = tail(array);\n  return aTail.reduce(function(memo, v) {\n    const aLast = last(memo);\n    if (fn(last(aLast), v)) {\n      aLast[aLast.length] = v;\n    } else {\n      memo[memo.length] = [v];\n    }\n    return memo;\n  }, [[head(array)]]);\n}\n\n/**\n * returns a copy of the array with all false values removed\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n */\nfunction compact(array) {\n  const aResult = [];\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (array[idx]) { aResult.push(array[idx]); }\n  }\n  return aResult;\n}\n\n/**\n * produces a duplicate-free version of the array\n *\n * @param {Array} array\n */\nfunction unique(array) {\n  const results = [];\n\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!contains(results, array[idx])) {\n      results.push(array[idx]);\n    }\n  }\n\n  return results;\n}\n\n/**\n * returns next item.\n * @param {Array} array\n */\nfunction next(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx + 1];\n  }\n  return null;\n}\n\n/**\n * returns prev item.\n * @param {Array} array\n */\nfunction prev(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx - 1];\n  }\n  return null;\n}\n\n/**\n * @class core.list\n *\n * list utils\n *\n * @singleton\n * @alternateClassName list\n */\nexport default {\n  head,\n  last,\n  initial,\n  tail,\n  prev,\n  next,\n  find,\n  contains,\n  all,\n  sum,\n  from,\n  isEmpty,\n  clusterBy,\n  compact,\n  unique,\n};\n","import $ from 'jquery';\nimport func from './func';\nimport lists from './lists';\nimport env from './env';\n\nconst NBSP_CHAR = String.fromCharCode(160);\nconst ZERO_WIDTH_NBSP_CHAR = '\\ufeff';\n\n/**\n * @method isEditable\n *\n * returns whether node is `note-editable` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEditable(node) {\n  return node && $(node).hasClass('note-editable');\n}\n\n/**\n * @method isControlSizing\n *\n * returns whether node is `note-control-sizing` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isControlSizing(node) {\n  return node && $(node).hasClass('note-control-sizing');\n}\n\n/**\n * @method makePredByNodeName\n *\n * returns predicate which judge whether nodeName is same\n *\n * @param {String} nodeName\n * @return {Function}\n */\nfunction makePredByNodeName(nodeName) {\n  nodeName = nodeName.toUpperCase();\n  return function(node) {\n    return node && node.nodeName.toUpperCase() === nodeName;\n  };\n}\n\n/**\n * @method isText\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is text(3)\n */\nfunction isText(node) {\n  return node && node.nodeType === 3;\n}\n\n/**\n * @method isElement\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is element(1)\n */\nfunction isElement(node) {\n  return node && node.nodeType === 1;\n}\n\n/**\n * ex) br, col, embed, hr, img, input, ...\n * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n */\nfunction isVoid(node) {\n  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());\n}\n\nfunction isPara(node) {\n  if (isEditable(node)) {\n    return false;\n  }\n\n  // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph\n  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nfunction isHeading(node) {\n  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nconst isPre = makePredByNodeName('PRE');\n\nconst isLi = makePredByNodeName('LI');\n\nfunction isPurePara(node) {\n  return isPara(node) && !isLi(node);\n}\n\nconst isTable = makePredByNodeName('TABLE');\n\nconst isData = makePredByNodeName('DATA');\n\nfunction isInline(node) {\n  return !isBodyContainer(node) &&\n         !isList(node) &&\n         !isHr(node) &&\n         !isPara(node) &&\n         !isTable(node) &&\n         !isBlockquote(node) &&\n         !isData(node);\n}\n\nfunction isList(node) {\n  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());\n}\n\nconst isHr = makePredByNodeName('HR');\n\nfunction isCell(node) {\n  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());\n}\n\nconst isBlockquote = makePredByNodeName('BLOCKQUOTE');\n\nfunction isBodyContainer(node) {\n  return isCell(node) || isBlockquote(node) || isEditable(node);\n}\n\nconst isAnchor = makePredByNodeName('A');\n\nfunction isParaInline(node) {\n  return isInline(node) && !!ancestor(node, isPara);\n}\n\nfunction isBodyInline(node) {\n  return isInline(node) && !ancestor(node, isPara);\n}\n\nconst isBody = makePredByNodeName('BODY');\n\n/**\n * returns whether nodeB is closest sibling of nodeA\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @return {Boolean}\n */\nfunction isClosestSibling(nodeA, nodeB) {\n  return nodeA.nextSibling === nodeB ||\n         nodeA.previousSibling === nodeB;\n}\n\n/**\n * returns array of closest siblings with node\n *\n * @param {Node} node\n * @param {function} [pred] - predicate function\n * @return {Node[]}\n */\nfunction withClosestSiblings(node, pred) {\n  pred = pred || func.ok;\n\n  const siblings = [];\n  if (node.previousSibling && pred(node.previousSibling)) {\n    siblings.push(node.previousSibling);\n  }\n  siblings.push(node);\n  if (node.nextSibling && pred(node.nextSibling)) {\n    siblings.push(node.nextSibling);\n  }\n  return siblings;\n}\n\n/**\n * blank HTML for cursor position\n * - [workaround] old IE only works with &nbsp;\n * - [workaround] IE11 and other browser works with bogus br\n */\nconst blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';\n\n/**\n * @method nodeLength\n *\n * returns #text's text size or element's childNodes size\n *\n * @param {Node} node\n */\nfunction nodeLength(node) {\n  if (isText(node)) {\n    return node.nodeValue.length;\n  }\n\n  if (node) {\n    return node.childNodes.length;\n  }\n\n  return 0;\n}\n\n/**\n * returns whether deepest child node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction deepestChildIsEmpty(node) {\n  do {\n    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;\n  } while ((node = node.firstElementChild));\n\n  return isEmpty(node);\n}\n\n/**\n * returns whether node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEmpty(node) {\n  const len = nodeLength(node);\n\n  if (len === 0) {\n    return true;\n  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {\n    // ex) <p><br></p>, <span><br></span>\n    return true;\n  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {\n    // ex) <p></p>, <span></span>\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * padding blankHTML if node is empty (for cursor position)\n */\nfunction paddingBlankHTML(node) {\n  if (!isVoid(node) && !nodeLength(node)) {\n    node.innerHTML = blankHTML;\n  }\n}\n\n/**\n * find nearest ancestor predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction ancestor(node, pred) {\n  while (node) {\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * find nearest ancestor only single child blood line and predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction singleChildAncestor(node, pred) {\n  node = node.parentNode;\n\n  while (node) {\n    if (nodeLength(node) !== 1) { break; }\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * returns new array of ancestor nodes (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listAncestor(node, pred) {\n  pred = pred || func.fail;\n\n  const ancestors = [];\n  ancestor(node, function(el) {\n    if (!isEditable(el)) {\n      ancestors.push(el);\n    }\n\n    return pred(el);\n  });\n  return ancestors;\n}\n\n/**\n * find farthest ancestor predicate hit\n */\nfunction lastAncestor(node, pred) {\n  const ancestors = listAncestor(node);\n  return lists.last(ancestors.filter(pred));\n}\n\n/**\n * returns common ancestor node between two nodes.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n */\nfunction commonAncestor(nodeA, nodeB) {\n  const ancestors = listAncestor(nodeA);\n  for (let n = nodeB; n; n = n.parentNode) {\n    if (ancestors.indexOf(n) > -1) return n;\n  }\n  return null; // difference document area\n}\n\n/**\n * listing all previous siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listPrev(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.previousSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing next siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listNext(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.nextSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing descendant nodes\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listDescendant(node, pred) {\n  const descendants = [];\n  pred = pred || func.ok;\n\n  // start DFS(depth first search) with node\n  (function fnWalk(current) {\n    if (node !== current && pred(current)) {\n      descendants.push(current);\n    }\n    for (let idx = 0, len = current.childNodes.length; idx < len; idx++) {\n      fnWalk(current.childNodes[idx]);\n    }\n  })(node);\n\n  return descendants;\n}\n\n/**\n * wrap node with new tag.\n *\n * @param {Node} node\n * @param {Node} tagName of wrapper\n * @return {Node} - wrapper\n */\nfunction wrap(node, wrapperName) {\n  const parent = node.parentNode;\n  const wrapper = $('<' + wrapperName + '>')[0];\n\n  parent.insertBefore(wrapper, node);\n  wrapper.appendChild(node);\n\n  return wrapper;\n}\n\n/**\n * insert node after preceding\n *\n * @param {Node} node\n * @param {Node} preceding - predicate function\n */\nfunction insertAfter(node, preceding) {\n  const next = preceding.nextSibling;\n  let parent = preceding.parentNode;\n  if (next) {\n    parent.insertBefore(node, next);\n  } else {\n    parent.appendChild(node);\n  }\n  return node;\n}\n\n/**\n * append elements.\n *\n * @param {Node} node\n * @param {Collection} aChild\n */\nfunction appendChildNodes(node, aChild) {\n  $.each(aChild, function(idx, child) {\n    node.appendChild(child);\n  });\n  return node;\n}\n\n/**\n * returns whether boundaryPoint is left edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isLeftEdgePoint(point) {\n  return point.offset === 0;\n}\n\n/**\n * returns whether boundaryPoint is right edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isRightEdgePoint(point) {\n  return point.offset === nodeLength(point.node);\n}\n\n/**\n * returns whether boundaryPoint is edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isEdgePoint(point) {\n  return isLeftEdgePoint(point) || isRightEdgePoint(point);\n}\n\n/**\n * returns whether node is left edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgeOf(node, ancestor) {\n  while (node && node !== ancestor) {\n    if (position(node) !== 0) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether node is right edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgeOf(node, ancestor) {\n  if (!ancestor) {\n    return false;\n  }\n  while (node && node !== ancestor) {\n    if (position(node) !== nodeLength(node.parentNode) - 1) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether point is left edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgePointOf(point, ancestor) {\n  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns whether point is right edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgePointOf(point, ancestor) {\n  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns offset from parent.\n *\n * @param {Node} node\n */\nfunction position(node) {\n  let offset = 0;\n  while ((node = node.previousSibling)) {\n    offset += 1;\n  }\n  return offset;\n}\n\nfunction hasChildren(node) {\n  return !!(node && node.childNodes && node.childNodes.length);\n}\n\n/**\n * returns previous boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction prevPoint(point, isSkipInnerOffset) {\n  let node;\n  let offset;\n\n  if (point.offset === 0) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node);\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset - 1];\n    offset = nodeLength(node);\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? 0 : point.offset - 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPoint(point, isSkipInnerOffset) {\n  let node, offset;\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint with empty node\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPointWithEmptyNode(point, isSkipInnerOffset) {\n  let node, offset = 0;\n\n  // if node is empty string node, return current node's sibling.\n  if (isEmpty(point.node)) {\n    if(point.node === null){\n      return null;\n    }\n\n    node = point.node.nextSibling;\n    offset = 0;\n\n    return {\n      node: node,\n      offset: offset,\n    };\n  }\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node) + 1;\n\n    // if next node is editable ,  return current node's sibling node.\n    if (isEditable(node)) {\n      node = point.node.nextSibling;\n      offset = 0;\n    }\n\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n    if (isEmpty(node)) {\n      if (!isEmpty(point.node.nextSibling)) {\n        return {\n          node: point.node.nextSibling,\n          offset: offset,\n        };\n      }\n      return null;\n    }\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n\n    if (isEmpty(node)) {\n      return null;\n    }\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/*\n* returns the next Text node index or 0 if not found.\n*/\nfunction getNextTextNode(actual) {\n  if(!actual.nextSibling) return undefined;\n  if(actual.parent !== actual.nextSibling.parent) return undefined;\n\n  if(isText(actual.nextSibling) ) return actual.nextSibling;\n  else return getNextTextNode(actual.nextSibling);\n}\n\n/**\n * returns whether pointA and pointB is same or not.\n *\n * @param {BoundaryPoint} pointA\n * @param {BoundaryPoint} pointB\n * @return {Boolean}\n */\nfunction isSamePoint(pointA, pointB) {\n  return pointA.node === pointB.node && pointA.offset === pointB.offset;\n}\n\n/**\n * returns whether point is visible (can set cursor) or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isVisiblePoint(point) {\n  if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {\n    return true;\n  }\n\n  const leftNode = point.node.childNodes[point.offset - 1];\n  const rightNode = point.node.childNodes[point.offset];\n  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode)) || isTable(rightNode)) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * @method prevPointUtil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction prevPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = prevPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * @method nextPointUntil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction nextPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = nextPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * returns whether point has character or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isCharPoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch && (ch !== ' ' && ch !== NBSP_CHAR);\n}\n\n/**\n * returns whether point has space or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isSpacePoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch === ' ' || ch === NBSP_CHAR;\n}\n\n/**\n * @method walkPoint\n *\n * @param {BoundaryPoint} startPoint\n * @param {BoundaryPoint} endPoint\n * @param {Function} handler\n * @param {Boolean} isSkipInnerOffset\n */\nfunction walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {\n  let point = startPoint;\n\n  while (point) {\n    handler(point);\n\n    if (isSamePoint(point, endPoint)) {\n      break;\n    }\n\n    const isSkipOffset = isSkipInnerOffset &&\n                       startPoint.node !== point.node &&\n                       endPoint.node !== point.node;\n    point = nextPointWithEmptyNode(point, isSkipOffset);\n  }\n}\n\n/**\n * @method makeOffsetPath\n *\n * return offsetPath(array of offset) from ancestor\n *\n * @param {Node} ancestor - ancestor node\n * @param {Node} node\n */\nfunction makeOffsetPath(ancestor, node) {\n  const ancestors = listAncestor(node, func.eq(ancestor));\n  return ancestors.map(position).reverse();\n}\n\n/**\n * @method fromOffsetPath\n *\n * return element from offsetPath(array of offset)\n *\n * @param {Node} ancestor - ancestor node\n * @param {array} offsets - offsetPath\n */\nfunction fromOffsetPath(ancestor, offsets) {\n  let current = ancestor;\n  for (let i = 0, len = offsets.length; i < len; i++) {\n    if (current.childNodes.length <= offsets[i]) {\n      current = current.childNodes[current.childNodes.length - 1];\n    } else {\n      current = current.childNodes[offsets[i]];\n    }\n  }\n  return current;\n}\n\n/**\n * @method splitNode\n *\n * split element or #text\n *\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @param {Boolean} [options.isDiscardEmptySplits] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitNode(point, options) {\n  let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;\n  const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;\n  const isDiscardEmptySplits = options && options.isDiscardEmptySplits;\n\n  if (isDiscardEmptySplits) {\n    isSkipPaddingBlankHTML = true;\n  }\n\n  // edge case\n  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {\n    if (isLeftEdgePoint(point)) {\n      return point.node;\n    } else if (isRightEdgePoint(point)) {\n      return point.node.nextSibling;\n    }\n  }\n\n  // split #text\n  if (isText(point.node)) {\n    return point.node.splitText(point.offset);\n  } else {\n    const childNode = point.node.childNodes[point.offset];\n    const clone = insertAfter(point.node.cloneNode(false), point.node);\n    appendChildNodes(clone, listNext(childNode));\n\n    if (!isSkipPaddingBlankHTML) {\n      paddingBlankHTML(point.node);\n      paddingBlankHTML(clone);\n    }\n\n    if (isDiscardEmptySplits) {\n      if (isEmpty(point.node)) {\n        remove(point.node);\n      }\n      if (isEmpty(clone)) {\n        remove(clone);\n        return point.node.nextSibling;\n      }\n    }\n\n    return clone;\n  }\n}\n\n/**\n * @method splitTree\n *\n * split tree by point\n *\n * @param {Node} root - split root\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitTree(root, point, options) {\n  // ex) [#text, <span>, <p>]\n  const ancestors = listAncestor(point.node, func.eq(root));\n\n  if (!ancestors.length) {\n    return null;\n  } else if (ancestors.length === 1) {\n    return splitNode(point, options);\n  }\n\n  return ancestors.reduce(function(node, parent) {\n    if (node === point.node) {\n      node = splitNode(point, options);\n    }\n\n    return splitNode({\n      node: parent,\n      offset: node ? position(node) : nodeLength(parent),\n    }, options);\n  });\n}\n\n/**\n * split point\n *\n * @param {Point} point\n * @param {Boolean} isInline\n * @return {Object}\n */\nfunction splitPoint(point, isInline) {\n  // find splitRoot, container\n  //  - inline: splitRoot is a child of paragraph\n  //  - block: splitRoot is a child of bodyContainer\n  const pred = isInline ? isPara : isBodyContainer;\n  const ancestors = listAncestor(point.node, pred);\n  const topAncestor = lists.last(ancestors) || point.node;\n\n  let splitRoot, container;\n  if (pred(topAncestor)) {\n    splitRoot = ancestors[ancestors.length - 2];\n    container = topAncestor;\n  } else {\n    splitRoot = topAncestor;\n    container = splitRoot.parentNode;\n  }\n\n  // if splitRoot is exists, split with splitTree\n  let pivot = splitRoot && splitTree(splitRoot, point, {\n    isSkipPaddingBlankHTML: isInline,\n    isNotSplitEdgePoint: isInline,\n  });\n\n  // if container is point.node, find pivot with point.offset\n  if (!pivot && container === point.node) {\n    pivot = point.node.childNodes[point.offset];\n  }\n\n  return {\n    rightNode: pivot,\n    container: container,\n  };\n}\n\nfunction create(nodeName) {\n  return document.createElement(nodeName);\n}\n\nfunction createText(text) {\n  return document.createTextNode(text);\n}\n\n/**\n * @method remove\n *\n * remove node, (isRemoveChild: remove child or not)\n *\n * @param {Node} node\n * @param {Boolean} isRemoveChild\n */\nfunction remove(node, isRemoveChild) {\n  if (!node || !node.parentNode) { return; }\n  if (node.removeNode) { return node.removeNode(isRemoveChild); }\n\n  const parent = node.parentNode;\n  if (!isRemoveChild) {\n    const nodes = [];\n    for (let i = 0, len = node.childNodes.length; i < len; i++) {\n      nodes.push(node.childNodes[i]);\n    }\n\n    for (let i = 0, len = nodes.length; i < len; i++) {\n      parent.insertBefore(nodes[i], node);\n    }\n  }\n\n  parent.removeChild(node);\n}\n\n/**\n * @method removeWhile\n *\n * @param {Node} node\n * @param {Function} pred\n */\nfunction removeWhile(node, pred) {\n  while (node) {\n    if (isEditable(node) || !pred(node)) {\n      break;\n    }\n\n    const parent = node.parentNode;\n    remove(node);\n    node = parent;\n  }\n}\n\n/**\n * @method replace\n *\n * replace node with provided nodeName\n *\n * @param {Node} node\n * @param {String} nodeName\n * @return {Node} - new node\n */\nfunction replace(node, nodeName) {\n  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {\n    return node;\n  }\n\n  const newNode = create(nodeName);\n\n  if (node.style.cssText) {\n    newNode.style.cssText = node.style.cssText;\n  }\n\n  appendChildNodes(newNode, lists.from(node.childNodes));\n  insertAfter(newNode, node);\n  remove(node);\n\n  return newNode;\n}\n\nconst isTextarea = makePredByNodeName('TEXTAREA');\n\n/**\n * @param {jQuery} $node\n * @param {Boolean} [stripLinebreaks] - default: false\n */\nfunction value($node, stripLinebreaks) {\n  const val = isTextarea($node[0]) ? $node.val() : $node.html();\n  if (stripLinebreaks) {\n    return val.replace(/[\\n\\r]/g, '');\n  }\n  return val;\n}\n\n/**\n * @method html\n *\n * get the HTML contents of node\n *\n * @param {jQuery} $node\n * @param {Boolean} [isNewlineOnBlock]\n */\nfunction html($node, isNewlineOnBlock) {\n  let markup = value($node);\n\n  if (isNewlineOnBlock) {\n    const regexTag = /<(\\/?)(\\b(?!!)[^>\\s]*)(.*?)(\\s*\\/?>)/g;\n    markup = markup.replace(regexTag, function(match, endSlash, name) {\n      name = name.toUpperCase();\n      const isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&\n                                   !!endSlash;\n      const isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);\n\n      return match + ((isEndOfInlineContainer || isBlockNode) ? '\\n' : '');\n    });\n    markup = markup.trim();\n  }\n\n  return markup;\n}\n\nfunction posFromPlaceholder(placeholder) {\n  const $placeholder = $(placeholder);\n  const pos = $placeholder.offset();\n  const height = $placeholder.outerHeight(true); // include margin\n\n  return {\n    left: pos.left,\n    top: pos.top + height,\n  };\n}\n\nfunction attachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.on(key, events[key]);\n  });\n}\n\nfunction detachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.off(key, events[key]);\n  });\n}\n\n/**\n * @method isCustomStyleTag\n *\n * assert if a node contains a \"note-styletag\" class,\n * which implies that's a custom-made style tag node\n *\n * @param {Node} an HTML DOM node\n */\nfunction isCustomStyleTag(node) {\n  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');\n}\n\nexport default {\n  /** @property {String} NBSP_CHAR */\n  NBSP_CHAR,\n  /** @property {String} ZERO_WIDTH_NBSP_CHAR */\n  ZERO_WIDTH_NBSP_CHAR,\n  /** @property {String} blank */\n  blank: blankHTML,\n  /** @property {String} emptyPara */\n  emptyPara: `<p>${blankHTML}</p>`,\n  makePredByNodeName,\n  isEditable,\n  isControlSizing,\n  isText,\n  isElement,\n  isVoid,\n  isPara,\n  isPurePara,\n  isHeading,\n  isInline,\n  isBlock: func.not(isInline),\n  isBodyInline,\n  isBody,\n  isParaInline,\n  isPre,\n  isList,\n  isTable,\n  isData,\n  isCell,\n  isBlockquote,\n  isBodyContainer,\n  isAnchor,\n  isDiv: makePredByNodeName('DIV'),\n  isLi,\n  isBR: makePredByNodeName('BR'),\n  isSpan: makePredByNodeName('SPAN'),\n  isB: makePredByNodeName('B'),\n  isU: makePredByNodeName('U'),\n  isS: makePredByNodeName('S'),\n  isI: makePredByNodeName('I'),\n  isImg: makePredByNodeName('IMG'),\n  isTextarea,\n  deepestChildIsEmpty,\n  isEmpty,\n  isEmptyAnchor: func.and(isAnchor, isEmpty),\n  isClosestSibling,\n  withClosestSiblings,\n  nodeLength,\n  isLeftEdgePoint,\n  isRightEdgePoint,\n  isEdgePoint,\n  isLeftEdgeOf,\n  isRightEdgeOf,\n  isLeftEdgePointOf,\n  isRightEdgePointOf,\n  prevPoint,\n  nextPoint,\n  nextPointWithEmptyNode,\n  isSamePoint,\n  isVisiblePoint,\n  prevPointUntil,\n  nextPointUntil,\n  isCharPoint,\n  isSpacePoint,\n  walkPoint,\n  ancestor,\n  singleChildAncestor,\n  listAncestor,\n  lastAncestor,\n  listNext,\n  listPrev,\n  listDescendant,\n  commonAncestor,\n  wrap,\n  insertAfter,\n  appendChildNodes,\n  position,\n  hasChildren,\n  makeOffsetPath,\n  fromOffsetPath,\n  splitTree,\n  splitPoint,\n  create,\n  createText,\n  remove,\n  removeWhile,\n  replace,\n  html,\n  value,\n  posFromPlaceholder,\n  attachEvents,\n  detachEvents,\n  isCustomStyleTag,\n};\n","import $ from 'jquery';\nimport func from './core/func';\nimport lists from './core/lists';\nimport dom from './core/dom';\n\nexport default class Context {\n  /**\n   * @param {jQuery} $note\n   * @param {Object} options\n   */\n  constructor($note, options) {\n    this.$note = $note;\n\n    this.memos = {};\n    this.modules = {};\n    this.layoutInfo = {};\n    this.options = $.extend(true, {}, options);\n\n    // init ui with options\n    $.summernote.ui = $.summernote.ui_template(this.options);\n    this.ui = $.summernote.ui;\n\n    this.initialize();\n  }\n\n  /**\n   * create layout and initialize modules and other resources\n   */\n  initialize() {\n    this.layoutInfo = this.ui.createLayout(this.$note);\n    this._initialize();\n    this.$note.hide();\n    return this;\n  }\n\n  /**\n   * destroy modules and other resources and remove layout\n   */\n  destroy() {\n    this._destroy();\n    this.$note.removeData('summernote');\n    this.ui.removeLayout(this.$note, this.layoutInfo);\n  }\n\n  /**\n   * destory modules and other resources and initialize it again\n   */\n  reset() {\n    const disabled = this.isDisabled();\n    this.code(dom.emptyPara);\n    this._destroy();\n    this._initialize();\n\n    if (disabled) {\n      this.disable();\n    }\n  }\n\n  _initialize() {\n    // set own id\n    this.options.id = func.uniqueId($.now());\n    // set default container for tooltips, popovers, and dialogs\n    this.options.container = this.options.container || this.layoutInfo.editor;\n\n    // add optional buttons\n    const buttons = $.extend({}, this.options.buttons);\n    Object.keys(buttons).forEach((key) => {\n      this.memo('button.' + key, buttons[key]);\n    });\n\n    const modules = $.extend({}, this.options.modules, $.summernote.plugins || {});\n\n    // add and initialize modules\n    Object.keys(modules).forEach((key) => {\n      this.module(key, modules[key], true);\n    });\n\n    Object.keys(this.modules).forEach((key) => {\n      this.initializeModule(key);\n    });\n  }\n\n  _destroy() {\n    // destroy modules with reversed order\n    Object.keys(this.modules).reverse().forEach((key) => {\n      this.removeModule(key);\n    });\n\n    Object.keys(this.memos).forEach((key) => {\n      this.removeMemo(key);\n    });\n    // trigger custom onDestroy callback\n    this.triggerEvent('destroy', this);\n  }\n\n  code(html) {\n    const isActivated = this.invoke('codeview.isActivated');\n\n    if (html === undefined) {\n      this.invoke('codeview.sync');\n      return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();\n    } else {\n      if (isActivated) {\n        this.invoke('codeview.sync', html);\n      } else {\n        this.layoutInfo.editable.html(html);\n      }\n      this.$note.val(html);\n      this.triggerEvent('change', html, this.layoutInfo.editable);\n    }\n  }\n\n  isDisabled() {\n    return this.layoutInfo.editable.attr('contenteditable') === 'false';\n  }\n\n  enable() {\n    this.layoutInfo.editable.attr('contenteditable', true);\n    this.invoke('toolbar.activate', true);\n    this.triggerEvent('disable', false);\n    this.options.editing = true;\n  }\n\n  disable() {\n    // close codeview if codeview is opend\n    if (this.invoke('codeview.isActivated')) {\n      this.invoke('codeview.deactivate');\n    }\n    this.layoutInfo.editable.attr('contenteditable', false);\n    this.options.editing = false;\n    this.invoke('toolbar.deactivate', true);\n\n    this.triggerEvent('disable', true);\n  }\n\n  triggerEvent() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];\n    if (callback) {\n      callback.apply(this.$note[0], args);\n    }\n    this.$note.trigger('summernote.' + namespace, args);\n  }\n\n  initializeModule(key) {\n    const module = this.modules[key];\n    module.shouldInitialize = module.shouldInitialize || func.ok;\n    if (!module.shouldInitialize()) {\n      return;\n    }\n\n    // initialize module\n    if (module.initialize) {\n      module.initialize();\n    }\n\n    // attach events\n    if (module.events) {\n      dom.attachEvents(this.$note, module.events);\n    }\n  }\n\n  module(key, ModuleClass, withoutIntialize) {\n    if (arguments.length === 1) {\n      return this.modules[key];\n    }\n\n    this.modules[key] = new ModuleClass(this);\n\n    if (!withoutIntialize) {\n      this.initializeModule(key);\n    }\n  }\n\n  removeModule(key) {\n    const module = this.modules[key];\n    if (module.shouldInitialize()) {\n      if (module.events) {\n        dom.detachEvents(this.$note, module.events);\n      }\n\n      if (module.destroy) {\n        module.destroy();\n      }\n    }\n\n    delete this.modules[key];\n  }\n\n  memo(key, obj) {\n    if (arguments.length === 1) {\n      return this.memos[key];\n    }\n    this.memos[key] = obj;\n  }\n\n  removeMemo(key) {\n    if (this.memos[key] && this.memos[key].destroy) {\n      this.memos[key].destroy();\n    }\n\n    delete this.memos[key];\n  }\n\n  /**\n   * Some buttons need to change their visual style immediately once they get pressed\n   */\n  createInvokeHandlerAndUpdateState(namespace, value) {\n    return (event) => {\n      this.createInvokeHandler(namespace, value)(event);\n      this.invoke('buttons.updateCurrentStyle');\n    };\n  }\n\n  createInvokeHandler(namespace, value) {\n    return (event) => {\n      event.preventDefault();\n      const $target = $(event.target);\n      this.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);\n    };\n  }\n\n  invoke() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const splits = namespace.split('.');\n    const hasSeparator = splits.length > 1;\n    const moduleName = hasSeparator && lists.head(splits);\n    const methodName = hasSeparator ? lists.last(splits) : lists.head(splits);\n\n    const module = this.modules[moduleName || 'editor'];\n    if (!moduleName && this[methodName]) {\n      return this[methodName].apply(this, args);\n    } else if (module && module[methodName] && module.shouldInitialize()) {\n      return module[methodName].apply(module, args);\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from './core/env';\nimport lists from './core/lists';\nimport Context from './Context';\n\n$.fn.extend({\n  /**\n   * Summernote API\n   *\n   * @param {Object|String}\n   * @return {this}\n   */\n  summernote: function() {\n    const type = $.type(lists.head(arguments));\n    const isExternalAPICalled = type === 'string';\n    const hasInitOptions = type === 'object';\n\n    const options = $.extend({}, $.summernote.options, hasInitOptions ? lists.head(arguments) : {});\n\n    // Update options\n    options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);\n    options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons);\n    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;\n\n    this.each((idx, note) => {\n      const $note = $(note);\n      if (!$note.data('summernote')) {\n        const context = new Context($note, options);\n        $note.data('summernote', context);\n        $note.data('summernote').triggerEvent('init', context.layoutInfo);\n      }\n    });\n\n    const $note = this.first();\n    if ($note.length) {\n      const context = $note.data('summernote');\n      if (isExternalAPICalled) {\n        return context.invoke.apply(context, lists.from(arguments));\n      } else if (options.focus) {\n        context.invoke('editor.focus');\n      }\n    }\n\n    return this;\n  },\n});\n","import $ from 'jquery';\nimport env from './env';\nimport func from './func';\nimport lists from './lists';\nimport dom from './dom';\n\n/**\n * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js\n *\n * @param {TextRange} textRange\n * @param {Boolean} isStart\n * @return {BoundaryPoint}\n *\n * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx\n */\nfunction textRangeToPoint(textRange, isStart) {\n  let container = textRange.parentElement();\n  let offset;\n\n  const tester = document.body.createTextRange();\n  let prevContainer;\n  const childNodes = lists.from(container.childNodes);\n  for (offset = 0; offset < childNodes.length; offset++) {\n    if (dom.isText(childNodes[offset])) {\n      continue;\n    }\n    tester.moveToElementText(childNodes[offset]);\n    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {\n      break;\n    }\n    prevContainer = childNodes[offset];\n  }\n\n  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {\n    const textRangeStart = document.body.createTextRange();\n    let curTextNode = null;\n    textRangeStart.moveToElementText(prevContainer || container);\n    textRangeStart.collapse(!prevContainer);\n    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;\n\n    const pointTester = textRange.duplicate();\n    pointTester.setEndPoint('StartToStart', textRangeStart);\n    let textCount = pointTester.text.replace(/[\\r\\n]/g, '').length;\n\n    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    // [workaround] enforce IE to re-reference curTextNode, hack\n    const dummy = curTextNode.nodeValue; // eslint-disable-line\n\n    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&\n      textCount === curTextNode.nodeValue.length) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    container = curTextNode;\n    offset = textCount;\n  }\n\n  return {\n    cont: container,\n    offset: offset,\n  };\n}\n\n/**\n * return TextRange from boundary point (inspired by google closure-library)\n * @param {BoundaryPoint} point\n * @return {TextRange}\n */\nfunction pointToTextRange(point) {\n  const textRangeInfo = function(container, offset) {\n    let node, isCollapseToStart;\n\n    if (dom.isText(container)) {\n      const prevTextNodes = dom.listPrev(container, func.not(dom.isText));\n      const prevContainer = lists.last(prevTextNodes).previousSibling;\n      node = prevContainer || container.parentNode;\n      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);\n      isCollapseToStart = !prevContainer;\n    } else {\n      node = container.childNodes[offset] || container;\n      if (dom.isText(node)) {\n        return textRangeInfo(node, 0);\n      }\n\n      offset = 0;\n      isCollapseToStart = false;\n    }\n\n    return {\n      node: node,\n      collapseToStart: isCollapseToStart,\n      offset: offset,\n    };\n  };\n\n  const textRange = document.body.createTextRange();\n  const info = textRangeInfo(point.node, point.offset);\n\n  textRange.moveToElementText(info.node);\n  textRange.collapse(info.collapseToStart);\n  textRange.moveStart('character', info.offset);\n  return textRange;\n}\n\n/**\n   * Wrapped Range\n   *\n   * @constructor\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   */\nclass WrappedRange {\n  constructor(sc, so, ec, eo) {\n    this.sc = sc;\n    this.so = so;\n    this.ec = ec;\n    this.eo = eo;\n\n    // isOnEditable: judge whether range is on editable or not\n    this.isOnEditable = this.makeIsOn(dom.isEditable);\n    // isOnList: judge whether range is on list node or not\n    this.isOnList = this.makeIsOn(dom.isList);\n    // isOnAnchor: judge whether range is on anchor node or not\n    this.isOnAnchor = this.makeIsOn(dom.isAnchor);\n    // isOnCell: judge whether range is on cell node or not\n    this.isOnCell = this.makeIsOn(dom.isCell);\n    // isOnData: judge whether range is on data node or not\n    this.isOnData = this.makeIsOn(dom.isData);\n  }\n\n  // nativeRange: get nativeRange from sc, so, ec, eo\n  nativeRange() {\n    if (env.isW3CRangeSupport) {\n      const w3cRange = document.createRange();\n      w3cRange.setStart(this.sc, this.so);\n      w3cRange.setEnd(this.ec, this.eo);\n\n      return w3cRange;\n    } else {\n      const textRange = pointToTextRange({\n        node: this.sc,\n        offset: this.so,\n      });\n\n      textRange.setEndPoint('EndToEnd', pointToTextRange({\n        node: this.ec,\n        offset: this.eo,\n      }));\n\n      return textRange;\n    }\n  }\n\n  getPoints() {\n    return {\n      sc: this.sc,\n      so: this.so,\n      ec: this.ec,\n      eo: this.eo,\n    };\n  }\n\n  getStartPoint() {\n    return {\n      node: this.sc,\n      offset: this.so,\n    };\n  }\n\n  getEndPoint() {\n    return {\n      node: this.ec,\n      offset: this.eo,\n    };\n  }\n\n  /**\n   * select update visible range\n   */\n  select() {\n    const nativeRng = this.nativeRange();\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (selection.rangeCount > 0) {\n        selection.removeAllRanges();\n      }\n      selection.addRange(nativeRng);\n    } else {\n      nativeRng.select();\n    }\n\n    return this;\n  }\n\n  /**\n   * Moves the scrollbar to start container(sc) of current range\n   *\n   * @return {WrappedRange}\n   */\n  scrollIntoView(container) {\n    const height = $(container).height();\n    if (container.scrollTop + height < this.sc.offsetTop) {\n      container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);\n    }\n\n    return this;\n  }\n\n  /**\n   * @return {WrappedRange}\n   */\n  normalize() {\n    /**\n     * @param {BoundaryPoint} point\n     * @param {Boolean} isLeftToRight - true: prefer to choose right node\n     *                                - false: prefer to choose left node\n     * @return {BoundaryPoint}\n     */\n    const getVisiblePoint = function(point, isLeftToRight) {\n      if (!point) {\n        return point;\n      }\n\n      // Just use the given point [XXX:Adhoc]\n      //  - case 01. if the point is on the middle of the node\n      //  - case 02. if the point is on the right edge and prefer to choose left node\n      //  - case 03. if the point is on the left edge and prefer to choose right node\n      //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void\n      //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void\n      //  - case 06. if the point is on the block node and there is no children\n      if (dom.isVisiblePoint(point)) {\n        if (!dom.isEdgePoint(point) ||\n            (dom.isRightEdgePoint(point) && !isLeftToRight) ||\n            (dom.isLeftEdgePoint(point) && isLeftToRight) ||\n            (dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling)) ||\n            (dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling)) ||\n            (dom.isBlock(point.node) && dom.isEmpty(point.node))) {\n          return point;\n        }\n      }\n\n      // point on block's edge\n      const block = dom.ancestor(point.node, dom.isBlock);\n      let hasRightNode = false;\n\n      if (!hasRightNode) {\n        const prevPoint = dom.prevPoint(point) || { node: null };\n        hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;\n      }\n\n      let hasLeftNode = false;\n      if (!hasLeftNode) {\n        const nextPoint = dom.nextPoint(point) || { node: null };\n        hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(nextPoint.node)) && isLeftToRight;\n      }\n\n      if (hasRightNode || hasLeftNode) {\n        // returns point already on visible point\n        if (dom.isVisiblePoint(point)) {\n          return point;\n        }\n        // reverse direction\n        isLeftToRight = !isLeftToRight;\n      }\n\n      const nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint)\n        : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);\n      return nextPoint || point;\n    };\n\n    const endPoint = getVisiblePoint(this.getEndPoint(), false);\n    const startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns matched nodes on range\n   *\n   * @param {Function} [pred] - predicate function\n   * @param {Object} [options]\n   * @param {Boolean} [options.includeAncestor]\n   * @param {Boolean} [options.fullyContains]\n   * @return {Node[]}\n   */\n  nodes(pred, options) {\n    pred = pred || func.ok;\n\n    const includeAncestor = options && options.includeAncestor;\n    const fullyContains = options && options.fullyContains;\n\n    // TODO compare points and sort\n    const startPoint = this.getStartPoint();\n    const endPoint = this.getEndPoint();\n\n    const nodes = [];\n    const leftEdgeNodes = [];\n\n    dom.walkPoint(startPoint, endPoint, function(point) {\n      if (dom.isEditable(point.node)) {\n        return;\n      }\n\n      let node;\n      if (fullyContains) {\n        if (dom.isLeftEdgePoint(point)) {\n          leftEdgeNodes.push(point.node);\n        }\n        if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {\n          node = point.node;\n        }\n      } else if (includeAncestor) {\n        node = dom.ancestor(point.node, pred);\n      } else {\n        node = point.node;\n      }\n\n      if (node && pred(node)) {\n        nodes.push(node);\n      }\n    }, true);\n\n    return lists.unique(nodes);\n  }\n\n  /**\n   * returns commonAncestor of range\n   * @return {Element} - commonAncestor\n   */\n  commonAncestor() {\n    return dom.commonAncestor(this.sc, this.ec);\n  }\n\n  /**\n   * returns expanded range by pred\n   *\n   * @param {Function} pred - predicate function\n   * @return {WrappedRange}\n   */\n  expand(pred) {\n    const startAncestor = dom.ancestor(this.sc, pred);\n    const endAncestor = dom.ancestor(this.ec, pred);\n\n    if (!startAncestor && !endAncestor) {\n      return new WrappedRange(this.sc, this.so, this.ec, this.eo);\n    }\n\n    const boundaryPoints = this.getPoints();\n\n    if (startAncestor) {\n      boundaryPoints.sc = startAncestor;\n      boundaryPoints.so = 0;\n    }\n\n    if (endAncestor) {\n      boundaryPoints.ec = endAncestor;\n      boundaryPoints.eo = dom.nodeLength(endAncestor);\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * @param {Boolean} isCollapseToStart\n   * @return {WrappedRange}\n   */\n  collapse(isCollapseToStart) {\n    if (isCollapseToStart) {\n      return new WrappedRange(this.sc, this.so, this.sc, this.so);\n    } else {\n      return new WrappedRange(this.ec, this.eo, this.ec, this.eo);\n    }\n  }\n\n  /**\n   * splitText on range\n   */\n  splitText() {\n    const isSameContainer = this.sc === this.ec;\n    const boundaryPoints = this.getPoints();\n\n    if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {\n      this.ec.splitText(this.eo);\n    }\n\n    if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {\n      boundaryPoints.sc = this.sc.splitText(this.so);\n      boundaryPoints.so = 0;\n\n      if (isSameContainer) {\n        boundaryPoints.ec = boundaryPoints.sc;\n        boundaryPoints.eo = this.eo - this.so;\n      }\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * delete contents on range\n   * @return {WrappedRange}\n   */\n  deleteContents() {\n    if (this.isCollapsed()) {\n      return this;\n    }\n\n    const rng = this.splitText();\n    const nodes = rng.nodes(null, {\n      fullyContains: true,\n    });\n\n    // find new cursor point\n    const point = dom.prevPointUntil(rng.getStartPoint(), function(point) {\n      return !lists.contains(nodes, point.node);\n    });\n\n    const emptyParents = [];\n    $.each(nodes, function(idx, node) {\n      // find empty parents\n      const parent = node.parentNode;\n      if (point.node !== parent && dom.nodeLength(parent) === 1) {\n        emptyParents.push(parent);\n      }\n      dom.remove(node, false);\n    });\n\n    // remove empty parents\n    $.each(emptyParents, function(idx, node) {\n      dom.remove(node, false);\n    });\n\n    return new WrappedRange(\n      point.node,\n      point.offset,\n      point.node,\n      point.offset\n    ).normalize();\n  }\n\n  /**\n   * makeIsOn: return isOn(pred) function\n   */\n  makeIsOn(pred) {\n    return function() {\n      const ancestor = dom.ancestor(this.sc, pred);\n      return !!ancestor && (ancestor === dom.ancestor(this.ec, pred));\n    };\n  }\n\n  /**\n   * @param {Function} pred\n   * @return {Boolean}\n   */\n  isLeftEdgeOf(pred) {\n    if (!dom.isLeftEdgePoint(this.getStartPoint())) {\n      return false;\n    }\n\n    const node = dom.ancestor(this.sc, pred);\n    return node && dom.isLeftEdgeOf(this.sc, node);\n  }\n\n  /**\n   * returns whether range was collapsed or not\n   */\n  isCollapsed() {\n    return this.sc === this.ec && this.so === this.eo;\n  }\n\n  /**\n   * wrap inline nodes which children of body with paragraph\n   *\n   * @return {WrappedRange}\n   */\n  wrapBodyInlineWithPara() {\n    if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {\n      this.sc.innerHTML = dom.emptyPara;\n      return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);\n    }\n\n    /**\n     * [workaround] firefox often create range on not visible point. so normalize here.\n     *  - firefox: |<p>text</p>|\n     *  - chrome: <p>|text|</p>\n     */\n    const rng = this.normalize();\n    if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {\n      return rng;\n    }\n\n    // find inline top ancestor\n    let topAncestor;\n    if (dom.isInline(rng.sc)) {\n      const ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));\n      topAncestor = lists.last(ancestors);\n      if (!dom.isInline(topAncestor)) {\n        topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];\n      }\n    } else {\n      topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];\n    }\n\n    if (topAncestor) {\n      // siblings not in paragraph\n      let inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();\n      inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));\n\n      // wrap with paragraph\n      if (inlineSiblings.length) {\n        const para = dom.wrap(lists.head(inlineSiblings), 'p');\n        dom.appendChildNodes(para, lists.tail(inlineSiblings));\n      }\n    }\n\n    return this.normalize();\n  }\n\n  /**\n   * insert node at current cursor\n   *\n   * @param {Node} node\n   * @return {Node}\n   */\n  insertNode(node) {\n    let rng = this;\n\n    if (dom.isText(node) || dom.isInline(node)) {\n      rng = this.wrapBodyInlineWithPara().deleteContents();\n    }\n\n    const info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));\n    if (info.rightNode) {\n      info.rightNode.parentNode.insertBefore(node, info.rightNode);\n      if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {\n        info.rightNode.parentNode.removeChild(info.rightNode);\n      }\n    } else {\n      info.container.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * insert html at current cursor\n   */\n  pasteHTML(markup) {\n    markup = $.trim(markup);\n\n    const contentsContainer = $('<div></div>').html(markup)[0];\n    let childNodes = lists.from(contentsContainer.childNodes);\n\n    // const rng = this.wrapBodyInlineWithPara().deleteContents();\n    const rng = this;\n    let reversed = false;\n\n    if (rng.so >= 0) {\n      childNodes = childNodes.reverse();\n      reversed = true;\n    }\n\n    childNodes = childNodes.map(function(childNode) {\n      return rng.insertNode(childNode);\n    });\n\n    if (reversed) {\n      childNodes = childNodes.reverse();\n    }\n    return childNodes;\n  }\n\n  /**\n   * returns text in range\n   *\n   * @return {String}\n   */\n  toString() {\n    const nativeRng = this.nativeRange();\n    return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;\n  }\n\n  /**\n   * returns range for word before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordRange(findAfter) {\n    let endPoint = this.getEndPoint();\n\n    if (!dom.isCharPoint(endPoint)) {\n      return this;\n    }\n\n    const startPoint = dom.prevPointUntil(endPoint, function(point) {\n      return !dom.isCharPoint(point);\n    });\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, function(point) {\n        return !dom.isCharPoint(point);\n      });\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordsRange(findAfter) {\n    var endPoint = this.getEndPoint();\n\n    var isNotTextPoint = function(point) {\n      return !dom.isCharPoint(point) && !dom.isSpacePoint(point);\n    };\n\n    if (isNotTextPoint(endPoint)) {\n      return this;\n    }\n\n    var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor that match with a Regex\n   *\n   * example:\n   *  range: 'hi @Peter Pan'\n   *  regex: '/@[a-z ]+/i'\n   *  return range: '@Peter Pan'\n   *\n   * @param {RegExp} [regex]\n   * @return {WrappedRange|null}\n   */\n  getWordsMatchRange(regex) {\n    var endPoint = this.getEndPoint();\n\n    var startPoint = dom.prevPointUntil(endPoint, function(point) {\n      if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {\n        return true;\n      }\n      var rng = new WrappedRange(\n        point.node,\n        point.offset,\n        endPoint.node,\n        endPoint.offset\n      );\n      var result = regex.exec(rng.toString());\n      return result && result.index === 0;\n    });\n\n    var rng = new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n\n    var text = rng.toString();\n    var result = regex.exec(text);\n\n    if (result && result[0].length === text.length) {\n      return rng;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * create offsetPath bookmark\n   *\n   * @param {Node} editable\n   */\n  bookmark(editable) {\n    return {\n      s: {\n        path: dom.makeOffsetPath(editable, this.sc),\n        offset: this.so,\n      },\n      e: {\n        path: dom.makeOffsetPath(editable, this.ec),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * create offsetPath bookmark base on paragraph\n   *\n   * @param {Node[]} paras\n   */\n  paraBookmark(paras) {\n    return {\n      s: {\n        path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),\n        offset: this.so,\n      },\n      e: {\n        path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * getClientRects\n   * @return {Rect[]}\n   */\n  getClientRects() {\n    const nativeRng = this.nativeRange();\n    return nativeRng.getClientRects();\n  }\n}\n\n/**\n * Data structure\n *  * BoundaryPoint: a point of dom tree\n *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range\n *\n * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position\n */\nexport default {\n  /**\n   * create Range Object From arguments or Browser Selection\n   *\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   * @return {WrappedRange}\n   */\n  create: function(sc, so, ec, eo) {\n    if (arguments.length === 4) {\n      return new WrappedRange(sc, so, ec, eo);\n    } else if (arguments.length === 2) { // collapsed\n      ec = sc;\n      eo = so;\n      return new WrappedRange(sc, so, ec, eo);\n    } else {\n      let wrappedRange = this.createFromSelection();\n\n      if (!wrappedRange && arguments.length === 1) {\n        let bodyElement = arguments[0];\n        if (dom.isEditable(bodyElement)) {\n          bodyElement = bodyElement.lastChild;\n        }\n        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);\n      }\n      return wrappedRange;\n    }\n  },\n\n  createFromBodyElement: function(bodyElement, isCollapseToStart = false) {\n    var wrappedRange = this.createFromNode(bodyElement);\n    return wrappedRange.collapse(isCollapseToStart);\n  },\n\n  createFromSelection: function() {\n    let sc, so, ec, eo;\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (!selection || selection.rangeCount === 0) {\n        return null;\n      } else if (dom.isBody(selection.anchorNode)) {\n        // Firefox: returns entire body as range on initialization.\n        // We won't never need it.\n        return null;\n      }\n\n      const nativeRng = selection.getRangeAt(0);\n      sc = nativeRng.startContainer;\n      so = nativeRng.startOffset;\n      ec = nativeRng.endContainer;\n      eo = nativeRng.endOffset;\n    } else { // IE8: TextRange\n      const textRange = document.selection.createRange();\n      const textRangeEnd = textRange.duplicate();\n      textRangeEnd.collapse(false);\n      const textRangeStart = textRange;\n      textRangeStart.collapse(true);\n\n      let startPoint = textRangeToPoint(textRangeStart, true);\n      let endPoint = textRangeToPoint(textRangeEnd, false);\n\n      // same visible point case: range was collapsed.\n      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&\n        dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&\n        endPoint.node.nextSibling === startPoint.node) {\n        startPoint = endPoint;\n      }\n\n      sc = startPoint.cont;\n      so = startPoint.offset;\n      ec = endPoint.cont;\n      eo = endPoint.offset;\n    }\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from node\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNode: function(node) {\n    let sc = node;\n    let so = 0;\n    let ec = node;\n    let eo = dom.nodeLength(ec);\n\n    // browsers can't target a picture or void node\n    if (dom.isVoid(sc)) {\n      so = dom.listPrev(sc).length - 1;\n      sc = sc.parentNode;\n    }\n    if (dom.isBR(ec)) {\n      eo = dom.listPrev(ec).length - 1;\n      ec = ec.parentNode;\n    } else if (dom.isVoid(ec)) {\n      eo = dom.listPrev(ec).length;\n      ec = ec.parentNode;\n    }\n\n    return this.create(sc, so, ec, eo);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeBefore: function(node) {\n    return this.createFromNode(node).collapse(true);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeAfter: function(node) {\n    return this.createFromNode(node).collapse();\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from bookmark\n   *\n   * @param {Node} editable\n   * @param {Object} bookmark\n   * @return {WrappedRange}\n   */\n  createFromBookmark: function(editable, bookmark) {\n    const sc = dom.fromOffsetPath(editable, bookmark.s.path);\n    const so = bookmark.s.offset;\n    const ec = dom.fromOffsetPath(editable, bookmark.e.path);\n    const eo = bookmark.e.offset;\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from paraBookmark\n   *\n   * @param {Object} bookmark\n   * @param {Node[]} paras\n   * @return {WrappedRange}\n   */\n  createFromParaBookmark: function(bookmark, paras) {\n    const so = bookmark.s.offset;\n    const eo = bookmark.e.offset;\n    const sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);\n    const ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n};\n","import lists from './lists';\nimport func from './func';\n\nconst KEY_MAP = {\n  'BACKSPACE': 8,\n  'TAB': 9,\n  'ENTER': 13,\n  'ESCAPE': 27,\n  'SPACE': 32,\n  'DELETE': 46,\n\n  // Arrow\n  'LEFT': 37,\n  'UP': 38,\n  'RIGHT': 39,\n  'DOWN': 40,\n\n  // Number: 0-9\n  'NUM0': 48,\n  'NUM1': 49,\n  'NUM2': 50,\n  'NUM3': 51,\n  'NUM4': 52,\n  'NUM5': 53,\n  'NUM6': 54,\n  'NUM7': 55,\n  'NUM8': 56,\n\n  // Alphabet: a-z\n  'B': 66,\n  'E': 69,\n  'I': 73,\n  'J': 74,\n  'K': 75,\n  'L': 76,\n  'R': 82,\n  'S': 83,\n  'U': 85,\n  'V': 86,\n  'Y': 89,\n  'Z': 90,\n\n  'SLASH': 191,\n  'LEFTBRACKET': 219,\n  'BACKSLASH': 220,\n  'RIGHTBRACKET': 221,\n\n  // Navigation\n  'HOME': 36,\n  'END': 35,\n  'PAGEUP': 33,\n  'PAGEDOWN': 34,\n};\n\n/**\n * @class core.key\n *\n * Object for keycodes.\n *\n * @singleton\n * @alternateClassName key\n */\nexport default {\n  /**\n   * @method isEdit\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isEdit: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.BACKSPACE,\n      KEY_MAP.TAB,\n      KEY_MAP.ENTER,\n      KEY_MAP.SPACE,\n      KEY_MAP.DELETE,\n    ], keyCode);\n  },\n  /**\n   * @method isMove\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isMove: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.LEFT,\n      KEY_MAP.UP,\n      KEY_MAP.RIGHT,\n      KEY_MAP.DOWN,\n    ], keyCode);\n  },\n  /**\n   * @method isNavigation\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isNavigation: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.HOME,\n      KEY_MAP.END,\n      KEY_MAP.PAGEUP,\n      KEY_MAP.PAGEDOWN,\n    ], keyCode);\n  },\n  /**\n   * @property {Object} nameFromCode\n   * @property {String} nameFromCode.8 \"BACKSPACE\"\n   */\n  nameFromCode: func.invertObject(KEY_MAP),\n  code: KEY_MAP,\n};\n","import $ from 'jquery';\n\n/**\n * @method readFileAsDataURL\n *\n * read contents of file as representing URL\n *\n * @param {File} file\n * @return {Promise} - then: dataUrl\n */\nexport function readFileAsDataURL(file) {\n  return $.Deferred((deferred) => {\n    $.extend(new FileReader(), {\n      onload: (e) => {\n        const dataURL = e.target.result;\n        deferred.resolve(dataURL);\n      },\n      onerror: (err) => {\n        deferred.reject(err);\n      },\n    }).readAsDataURL(file);\n  }).promise();\n}\n\n/**\n * @method createImage\n *\n * create `<image>` from url string\n *\n * @param {String} url\n * @return {Promise} - then: $image\n */\nexport function createImage(url) {\n  return $.Deferred((deferred) => {\n    const $img = $('<img>');\n\n    $img.one('load', () => {\n      $img.off('error abort');\n      deferred.resolve($img);\n    }).one('error abort', () => {\n      $img.off('load').detach();\n      deferred.reject($img);\n    }).css({\n      display: 'none',\n    }).appendTo(document.body).attr('src', url);\n  }).promise();\n}\n","import range from '../core/range';\n\nexport default class History {\n  constructor(context) {\n    this.stack = [];\n    this.stackOffset = -1;\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n    this.editable = this.$editable[0];\n  }\n\n  makeSnapshot() {\n    const rng = range.create(this.editable);\n    const emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };\n\n    return {\n      contents: this.$editable.html(),\n      bookmark: ((rng && rng.isOnEditable()) ? rng.bookmark(this.editable) : emptyBookmark),\n    };\n  }\n\n  applySnapshot(snapshot) {\n    if (snapshot.contents !== null) {\n      this.$editable.html(snapshot.contents);\n    }\n    if (snapshot.bookmark !== null) {\n      range.createFromBookmark(this.editable, snapshot.bookmark).select();\n    }\n  }\n\n  /**\n  * @method rewind\n  * Rewinds the history stack back to the first snapshot taken.\n  * Leaves the stack intact, so that \"Redo\" can still be used.\n  */\n  rewind() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    // Return to the first available snapshot.\n    this.stackOffset = 0;\n\n    // Apply that snapshot.\n    this.applySnapshot(this.stack[this.stackOffset]);\n  }\n\n  /**\n  *  @method commit\n  *  Resets history stack, but keeps current editor's content.\n  */\n  commit() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n  * @method reset\n  * Resets the history stack completely; reverting to an empty editor.\n  */\n  reset() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Clear the editable area.\n    this.$editable.html('');\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    if (this.stackOffset > 0) {\n      this.stackOffset--;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    if (this.stack.length - 1 > this.stackOffset) {\n      this.stackOffset++;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * recorded undo\n   */\n  recordUndo() {\n    this.stackOffset++;\n\n    // Wash out stack after stackOffset\n    if (this.stack.length > this.stackOffset) {\n      this.stack = this.stack.slice(0, this.stackOffset);\n    }\n\n    // Create new snapshot and push it to the end\n    this.stack.push(this.makeSnapshot());\n\n    // If the stack size reachs to the limit, then slice it\n    if (this.stack.length > this.context.options.historyLimit) {\n      this.stack.shift();\n      this.stackOffset -= 1;\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class Style {\n  /**\n   * @method jQueryCSS\n   *\n   * [workaround] for old jQuery\n   * passing an array of style properties to .css()\n   * will result in an object of property-value pairs.\n   * (compability with version < 1.9)\n   *\n   * @private\n   * @param  {jQuery} $obj\n   * @param  {Array} propertyNames - An array of one or more CSS properties.\n   * @return {Object}\n   */\n  jQueryCSS($obj, propertyNames) {\n    const result = {};\n    $.each(propertyNames, (idx, propertyName) => {\n      result[propertyName] = $obj.css(propertyName);\n    });\n    return result;\n  }\n\n  /**\n   * returns style object from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  fromNode($node) {\n    const properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];\n    const styleInfo = this.jQueryCSS($node, properties) || {};\n\n    const fontSize = $node[0].style.fontSize || styleInfo['font-size'];\n\n    styleInfo['font-size'] = parseInt(fontSize, 10);\n    styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);\n\n    return styleInfo;\n  }\n\n  /**\n   * paragraph level style\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} styleInfo\n   */\n  stylePara(rng, styleInfo) {\n    $.each(rng.nodes(dom.isPara, {\n      includeAncestor: true,\n    }), (idx, para) => {\n      $(para).css(styleInfo);\n    });\n  }\n\n  /**\n   * insert and returns styleNodes on range.\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} [options] - options for styleNodes\n   * @param {String} [options.nodeName] - default: `SPAN`\n   * @param {Boolean} [options.expandClosestSibling] - default: `false`\n   * @param {Boolean} [options.onlyPartialContains] - default: `false`\n   * @return {Node[]}\n   */\n  styleNodes(rng, options) {\n    rng = rng.splitText();\n\n    const nodeName = (options && options.nodeName) || 'SPAN';\n    const expandClosestSibling = !!(options && options.expandClosestSibling);\n    const onlyPartialContains = !!(options && options.onlyPartialContains);\n\n    if (rng.isCollapsed()) {\n      return [rng.insertNode(dom.create(nodeName))];\n    }\n\n    let pred = dom.makePredByNodeName(nodeName);\n    const nodes = rng.nodes(dom.isText, {\n      fullyContains: true,\n    }).map((text) => {\n      return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);\n    });\n\n    if (expandClosestSibling) {\n      if (onlyPartialContains) {\n        const nodesInRange = rng.nodes();\n        // compose with partial contains predication\n        pred = func.and(pred, (node) => {\n          return lists.contains(nodesInRange, node);\n        });\n      }\n\n      return nodes.map((node) => {\n        const siblings = dom.withClosestSiblings(node, pred);\n        const head = lists.head(siblings);\n        const tails = lists.tail(siblings);\n        $.each(tails, (idx, elem) => {\n          dom.appendChildNodes(head, elem.childNodes);\n          dom.remove(elem);\n        });\n        return lists.head(siblings);\n      });\n    } else {\n      return nodes;\n    }\n  }\n\n  /**\n   * get current style on cursor\n   *\n   * @param {WrappedRange} rng\n   * @return {Object} - object contains style properties.\n   */\n  current(rng) {\n    const $cont = $(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);\n    let styleInfo = this.fromNode($cont);\n\n    // document.queryCommandState for toggle state\n    // [workaround] prevent Firefox nsresult: \"0x80004005 (NS_ERROR_FAILURE)\"\n    try {\n      styleInfo = $.extend(styleInfo, {\n        'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',\n        'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',\n        'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',\n        'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',\n        'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',\n        'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',\n        'font-family': document.queryCommandValue('fontname') || styleInfo['font-family'],\n      });\n    } catch (e) {\n      // eslint-disable-next-line\n    }\n\n    // list-style-type to list-style(unordered, ordered)\n    if (!rng.isOnList()) {\n      styleInfo['list-style'] = 'none';\n    } else {\n      const orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];\n      const isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;\n      styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';\n    }\n\n    const para = dom.ancestor(rng.sc, dom.isPara);\n    if (para && para.style['line-height']) {\n      styleInfo['line-height'] = para.style.lineHeight;\n    } else {\n      const lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);\n      styleInfo['line-height'] = lineHeight.toFixed(1);\n    }\n\n    styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);\n    styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);\n    styleInfo.range = rng;\n\n    return styleInfo;\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport func from '../core/func';\nimport dom from '../core/dom';\nimport range from '../core/range';\n\nexport default class Bullet {\n  /**\n   * toggle ordered list\n   */\n  insertOrderedList(editable) {\n    this.toggleList('OL', editable);\n  }\n\n  /**\n   * toggle unordered list\n   */\n  insertUnorderedList(editable) {\n    this.toggleList('UL', editable);\n  }\n\n  /**\n   * indent\n   */\n  indent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        const previousList = this.findList(head.previousSibling);\n        if (previousList) {\n          paras\n            .map(para => previousList.appendChild(para));\n        } else {\n          this.wrapList(paras, head.parentNode.nodeName);\n          paras\n            .map((para) => para.parentNode)\n            .map((para) => this.appendToPrevious(para));\n        }\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            return (parseInt(val, 10) || 0) + 25;\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * outdent\n   */\n  outdent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        this.releaseList([paras]);\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            val = (parseInt(val, 10) || 0);\n            return val > 25 ? val - 25 : '';\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * toggle list\n   *\n   * @param {String} listName - OL or UL\n   */\n  toggleList(listName, editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    let paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const bookmark = rng.paraBookmark(paras);\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    // paragraph to list\n    if (lists.find(paras, dom.isPurePara)) {\n      let wrappedParas = [];\n      $.each(clustereds, (idx, paras) => {\n        wrappedParas = wrappedParas.concat(this.wrapList(paras, listName));\n      });\n      paras = wrappedParas;\n    // list to paragraph or change list style\n    } else {\n      const diffLists = rng.nodes(dom.isList, {\n        includeAncestor: true,\n      }).filter((listNode) => {\n        return !$.nodeName(listNode, listName);\n      });\n\n      if (diffLists.length) {\n        $.each(diffLists, (idx, listNode) => {\n          dom.replace(listNode, listName);\n        });\n      } else {\n        paras = this.releaseList(clustereds, true);\n      }\n    }\n\n    range.createFromParaBookmark(bookmark, paras).select();\n  }\n\n  /**\n   * @param {Node[]} paras\n   * @param {String} listName\n   * @return {Node[]}\n   */\n  wrapList(paras, listName) {\n    const head = lists.head(paras);\n    const last = lists.last(paras);\n\n    const prevList = dom.isList(head.previousSibling) && head.previousSibling;\n    const nextList = dom.isList(last.nextSibling) && last.nextSibling;\n\n    const listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);\n\n    // P to LI\n    paras = paras.map((para) => {\n      return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;\n    });\n\n    // append to list(<ul>, <ol>)\n    dom.appendChildNodes(listNode, paras);\n\n    if (nextList) {\n      dom.appendChildNodes(listNode, lists.from(nextList.childNodes));\n      dom.remove(nextList);\n    }\n\n    return paras;\n  }\n\n  /**\n   * @method releaseList\n   *\n   * @param {Array[]} clustereds\n   * @param {Boolean} isEscapseToBody\n   * @return {Node[]}\n   */\n  releaseList(clustereds, isEscapseToBody) {\n    let releasedParas = [];\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      const last = lists.last(paras);\n\n      const headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;\n      const parentItem = headList.parentNode;\n\n      if (headList.parentNode.nodeName === 'LI') {\n        paras.map(para => {\n          const newList = this.findNextSiblings(para);\n\n          if (parentItem.nextSibling) {\n            parentItem.parentNode.insertBefore(\n              para,\n              parentItem.nextSibling\n            );\n          } else {\n            parentItem.parentNode.appendChild(para);\n          }\n\n          if (newList.length) {\n            this.wrapList(newList, headList.nodeName);\n            para.appendChild(newList[0].parentNode);\n          }\n        });\n\n        if (headList.children.length === 0) {\n          parentItem.removeChild(headList);\n        }\n\n        if (parentItem.childNodes.length === 0) {\n          parentItem.parentNode.removeChild(parentItem);\n        }\n      } else {\n        const lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {\n          node: last.parentNode,\n          offset: dom.position(last) + 1,\n        }, {\n          isSkipPaddingBlankHTML: true,\n        }) : null;\n\n        const middleList = dom.splitTree(headList, {\n          node: head.parentNode,\n          offset: dom.position(head),\n        }, {\n          isSkipPaddingBlankHTML: true,\n        });\n\n        paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi)\n          : lists.from(middleList.childNodes).filter(dom.isLi);\n\n        // LI to P\n        if (isEscapseToBody || !dom.isList(headList.parentNode)) {\n          paras = paras.map((para) => {\n            return dom.replace(para, 'P');\n          });\n        }\n\n        $.each(lists.from(paras).reverse(), (idx, para) => {\n          dom.insertAfter(para, headList);\n        });\n\n        // remove empty lists\n        const rootLists = lists.compact([headList, middleList, lastList]);\n        $.each(rootLists, (idx, rootList) => {\n          const listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));\n          $.each(listNodes.reverse(), (idx, listNode) => {\n            if (!dom.nodeLength(listNode)) {\n              dom.remove(listNode, true);\n            }\n          });\n        });\n      }\n\n      releasedParas = releasedParas.concat(paras);\n    });\n\n    return releasedParas;\n  }\n\n  /**\n   * @method appendToPrevious\n   *\n   * Appends list to previous list item, if\n   * none exist it wraps the list in a new list item.\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  appendToPrevious(node) {\n    return node.previousSibling\n      ? dom.appendChildNodes(node.previousSibling, [node])\n      : this.wrapList([node], 'LI');\n  }\n\n  /**\n   * @method findList\n   *\n   * Finds an existing list in list item\n   *\n   * @param {HTMLNode} ListItem\n   * @return {Array[]}\n   */\n  findList(node) {\n    return node\n      ? lists.find(node.children, child => ['OL', 'UL'].indexOf(child.nodeName) > -1)\n      : null;\n  }\n\n  /**\n   * @method findNextSiblings\n   *\n   * Finds all list item siblings that follow it\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  findNextSiblings(node) {\n    const siblings = [];\n    while (node.nextSibling) {\n      siblings.push(node.nextSibling);\n      node = node.nextSibling;\n    }\n    return siblings;\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport Bullet from '../editing/Bullet';\n\n/**\n * @class editing.Typing\n *\n * Typing\n *\n */\nexport default class Typing {\n  constructor(context) {\n    // a Bullet instance to toggle lists off\n    this.bullet = new Bullet();\n    this.options = context.options;\n  }\n\n  /**\n   * insert tab\n   *\n   * @param {WrappedRange} rng\n   * @param {Number} tabsize\n   */\n  insertTab(rng, tabsize) {\n    const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));\n    rng = rng.deleteContents();\n    rng.insertNode(tab, true);\n\n    rng = range.create(tab, tabsize);\n    rng.select();\n  }\n\n  /**\n   * insert paragraph\n   *\n   * @param {jQuery} $editable\n   * @param {WrappedRange} rng Can be used in unit tests to \"mock\" the range\n   *\n   * blockquoteBreakingLevel\n   *   0 - No break, the new paragraph remains inside the quote\n   *   1 - Break the first blockquote in the ancestors list\n   *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)\n   */\n  insertParagraph(editable, rng) {\n    rng = rng || range.create(editable);\n\n    // deleteContents on range.\n    rng = rng.deleteContents();\n\n    // Wrap range if it needs to be wrapped by paragraph\n    rng = rng.wrapBodyInlineWithPara();\n\n    // finding paragraph\n    const splitRoot = dom.ancestor(rng.sc, dom.isPara);\n\n    let nextPara;\n    // on paragraph: split paragraph\n    if (splitRoot) {\n      // if it is an empty line with li\n      if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {\n        // toggle UL/OL and escape\n        this.bullet.toggleList(splitRoot.parentNode.nodeName);\n        return;\n      } else {\n        let blockquote = null;\n        if (this.options.blockquoteBreakingLevel === 1) {\n          blockquote = dom.ancestor(splitRoot, dom.isBlockquote);\n        } else if (this.options.blockquoteBreakingLevel === 2) {\n          blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);\n        }\n\n        if (blockquote) {\n          // We're inside a blockquote and options ask us to break it\n          nextPara = $(dom.emptyPara)[0];\n          // If the split is right before a <br>, remove it so that there's no \"empty line\"\n          // after the split in the new blockquote created\n          if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {\n            $(rng.sc.nextSibling).remove();\n          }\n          const split = dom.splitTree(blockquote, rng.getStartPoint(), { isDiscardEmptySplits: true });\n          if (split) {\n            split.parentNode.insertBefore(nextPara, split);\n          } else {\n            dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote\n          }\n        } else {\n          nextPara = dom.splitTree(splitRoot, rng.getStartPoint());\n\n          // not a blockquote, just insert the paragraph\n          let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);\n          emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));\n\n          $.each(emptyAnchors, (idx, anchor) => {\n            dom.remove(anchor);\n          });\n\n          // replace empty heading, pre or custom-made styleTag with P tag\n          if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {\n            nextPara = dom.replace(nextPara, 'p');\n          }\n        }\n      }\n    // no paragraph: insert empty paragraph\n    } else {\n      const next = rng.sc.childNodes[rng.so];\n      nextPara = $(dom.emptyPara)[0];\n      if (next) {\n        rng.sc.insertBefore(nextPara, next);\n      } else {\n        rng.sc.appendChild(nextPara);\n      }\n    }\n\n    range.create(nextPara, 0).normalize().select().scrollIntoView(editable);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport lists from '../core/lists';\n\n/**\n * @class Create a virtual table to create what actions to do in change.\n * @param {object} startPoint Cell selected to apply change.\n * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where\n * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction\n * @param {object} domTable Dom element of table to make changes.\n */\nconst TableResultAction = function(startPoint, where, action, domTable) {\n  const _startPoint = { 'colPos': 0, 'rowPos': 0 };\n  const _virtualTable = [];\n  const _actionCellList = [];\n\n  /// ///////////////////////////////////////////\n  // Private functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Set the startPoint of action.\n   */\n  function setStartPoint() {\n    if (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {\n      // Impossible to identify start Cell point\n      return;\n    }\n    _startPoint.colPos = startPoint.cellIndex;\n    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {\n      // Impossible to identify start Row point\n      return;\n    }\n    _startPoint.rowPos = startPoint.parentElement.rowIndex;\n  }\n\n  /**\n   * Define virtual table position info object.\n   *\n   * @param {int} rowIndex Index position in line of virtual table.\n   * @param {int} cellIndex Index position in column of virtual table.\n   * @param {object} baseRow Row affected by this position.\n   * @param {object} baseCell Cell affected by this position.\n   * @param {bool} isSpan Inform if it is an span cell/row.\n   */\n  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {\n    const objPosition = {\n      'baseRow': baseRow,\n      'baseCell': baseCell,\n      'isRowSpan': isRowSpan,\n      'isColSpan': isColSpan,\n      'isVirtual': isVirtualCell,\n    };\n    if (!_virtualTable[rowIndex]) {\n      _virtualTable[rowIndex] = [];\n    }\n    _virtualTable[rowIndex][cellIndex] = objPosition;\n  }\n\n  /**\n   * Create action cell object.\n   *\n   * @param {object} virtualTableCellObj Object of specific position on virtual table.\n   * @param {enum} resultAction Action to be applied in that item.\n   */\n  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {\n    return {\n      'baseCell': virtualTableCellObj.baseCell,\n      'action': resultAction,\n      'virtualTable': {\n        'rowIndex': virtualRowPosition,\n        'cellIndex': virtualColPosition,\n      },\n    };\n  }\n\n  /**\n   * Recover free index of row to append Cell.\n   *\n   * @param {int} rowIndex Index of row to find free space.\n   * @param {int} cellIndex Index of cell to find free space in table.\n   */\n  function recoverCellIndex(rowIndex, cellIndex) {\n    if (!_virtualTable[rowIndex]) {\n      return cellIndex;\n    }\n    if (!_virtualTable[rowIndex][cellIndex]) {\n      return cellIndex;\n    }\n\n    let newCellIndex = cellIndex;\n    while (_virtualTable[rowIndex][newCellIndex]) {\n      newCellIndex++;\n      if (!_virtualTable[rowIndex][newCellIndex]) {\n        return newCellIndex;\n      }\n    }\n  }\n\n  /**\n   * Recover info about row and cell and add information to virtual table.\n   *\n   * @param {object} row Row to recover information.\n   * @param {object} cell Cell to recover information.\n   */\n  function addCellInfoToVirtual(row, cell) {\n    const cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);\n    const cellHasColspan = (cell.colSpan > 1);\n    const cellHasRowspan = (cell.rowSpan > 1);\n    const isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);\n    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);\n\n    // Add span rows to virtual Table.\n    const rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;\n    if (rowspanNumber > 1) {\n      for (let rp = 1; rp < rowspanNumber; rp++) {\n        const rowspanIndex = row.rowIndex + rp;\n        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);\n      }\n    }\n\n    // Add span cols to virtual table.\n    const colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;\n    if (colspanNumber > 1) {\n      for (let cp = 1; cp < colspanNumber; cp++) {\n        const cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));\n        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);\n      }\n    }\n  }\n\n  /**\n   * Process validation and adjust of start point if needed\n   *\n   * @param {int} rowIndex\n   * @param {int} cellIndex\n   * @param {object} cell\n   * @param {bool} isSelectedCell\n   */\n  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {\n    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {\n      _startPoint.colPos++;\n    }\n  }\n\n  /**\n   * Create virtual table of cells with all cells, including span cells.\n   */\n  function createVirtualTable() {\n    const rows = domTable.rows;\n    for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      const cells = rows[rowIndex].cells;\n      for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);\n      }\n    }\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getDeleteResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (!cell.isVirtual && cell.isRowSpan) {\n          return TableResultAction.resultAction.AddCell;\n        } else if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.RemoveCell;\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getAddResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isRowSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isColSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.AddCell;\n  }\n\n  function init() {\n    setStartPoint();\n    createVirtualTable();\n  }\n\n  /// ///////////////////////////////////////////\n  // Public functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Recover array os what to do in table.\n   */\n  this.getActionList = function() {\n    const fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;\n    const fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;\n\n    let actualPosition = 0;\n    let canContinue = true;\n    while (canContinue) {\n      const rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;\n      const colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;\n      const row = _virtualTable[rowPosition];\n      if (!row) {\n        canContinue = false;\n        return _actionCellList;\n      }\n      const cell = row[colPosition];\n      if (!cell) {\n        canContinue = false;\n        return _actionCellList;\n      }\n\n      // Define action to be applied in this cell\n      let resultAction = TableResultAction.resultAction.Ignore;\n      switch (action) {\n        case TableResultAction.requestAction.Add:\n          resultAction = getAddResultActionToCell(cell);\n          break;\n        case TableResultAction.requestAction.Delete:\n          resultAction = getDeleteResultActionToCell(cell);\n          break;\n      }\n      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));\n      actualPosition++;\n    }\n\n    return _actionCellList;\n  };\n\n  init();\n};\n/**\n*\n* Where action occours enum.\n*/\nTableResultAction.where = { 'Row': 0, 'Column': 1 };\n/**\n*\n* Requested action to apply enum.\n*/\nTableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };\n/**\n*\n* Result action to be executed enum.\n*/\nTableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };\n\n/**\n *\n * @class editing.Table\n *\n * Table\n *\n */\nexport default class Table {\n  /**\n   * handle tab key\n   *\n   * @param {WrappedRange} rng\n   * @param {Boolean} isShift\n   */\n  tab(rng, isShift) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const table = dom.ancestor(cell, dom.isTable);\n    const cells = dom.listDescendant(table, dom.isCell);\n\n    const nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);\n    if (nextCell) {\n      range.create(nextCell, 0).select();\n    }\n  }\n\n  /**\n   * Add a new row\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (top/bottom)\n   * @return {Node}\n   */\n  addRow(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n\n    const currentTr = $(cell).closest('tr');\n    const trAttributes = this.recoverAttributes(currentTr);\n    const html = $('<tr' + trAttributes + '></tr>');\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Add, $(currentTr).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let idCell = 0; idCell < actions.length; idCell++) {\n      const currentCell = actions[idCell];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          {\n            if (position === 'top') {\n              const baseCellTr = currentCell.baseCell.parent;\n              const isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;\n              if (isTopFromRowSpan) {\n                const newTd = $('<div></div>').append($('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();\n                html.append(newTd);\n                break;\n              }\n            }\n            let rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);\n            rowspanNumber++;\n            currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);\n          }\n          break;\n      }\n    }\n\n    if (position === 'top') {\n      currentTr.before(html);\n    } else {\n      const cellHasRowspan = (cell.rowSpan > 1);\n      if (cellHasRowspan) {\n        const lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);\n        $($(currentTr).parent().find('tr')[lastTrIndex]).after($(html));\n        return;\n      }\n      currentTr.after(html);\n    }\n  }\n\n  /**\n   * Add a new col\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (left/right)\n   * @return {Node}\n   */\n  addCol(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const rowsGroup = $(row).siblings();\n    rowsGroup.push(row);\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Add, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      const currentCell = actions[actionIndex];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          if (position === 'right') {\n            $(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          if (position === 'right') {\n            let colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);\n            colspanNumber++;\n            currentCell.baseCell.setAttribute('colSpan', colspanNumber);\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n      }\n    }\n  }\n\n  /*\n  * Copy attributes from element.\n  *\n  * @param {object} Element to recover attributes.\n  * @return {string} Copied string elements.\n  */\n  recoverAttributes(el) {\n    let resultStr = '';\n\n    if (!el) {\n      return resultStr;\n    }\n\n    const attrList = el.attributes || [];\n\n    for (let i = 0; i < attrList.length; i++) {\n      if (attrList[i].name.toLowerCase() === 'id') {\n        continue;\n      }\n\n      if (attrList[i].specified) {\n        resultStr += ' ' + attrList[i].name + '=\\'' + attrList[i].value + '\\'';\n      }\n    }\n\n    return resultStr;\n  }\n\n  /**\n   * Delete current row\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteRow(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n    const rowPos = row[0].rowIndex;\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n\n      const baseCell = actions[actionIndex].baseCell;\n      const virtualPosition = actions[actionIndex].virtualTable;\n      const hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);\n      let rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.AddCell:\n          {\n            const nextRow = row.next('tr')[0];\n            if (!nextRow) { continue; }\n            const cloneRow = row[0].cells[cellPos];\n            if (hasRowspan) {\n              if (rowspanNumber > 2) {\n                rowspanNumber--;\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);\n                nextRow.cells[cellPos].innerHTML = '';\n              } else if (rowspanNumber === 2) {\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].removeAttribute('rowSpan');\n                nextRow.cells[cellPos].innerHTML = '';\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          if (hasRowspan) {\n            if (rowspanNumber > 2) {\n              rowspanNumber--;\n              baseCell.setAttribute('rowSpan', rowspanNumber);\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            } else if (rowspanNumber === 2) {\n              baseCell.removeAttribute('rowSpan');\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          // Do not need remove cell because row will be deleted.\n          continue;\n      }\n    }\n    row.remove();\n  }\n\n  /**\n   * Delete current col\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteCol(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          {\n            const baseCell = actions[actionIndex].baseCell;\n            const hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);\n            if (hasColspan) {\n              let colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;\n              if (colspanNumber > 2) {\n                colspanNumber--;\n                baseCell.setAttribute('colSpan', colspanNumber);\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              } else if (colspanNumber === 2) {\n                baseCell.removeAttribute('colSpan');\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          dom.remove(actions[actionIndex].baseCell, true);\n          continue;\n      }\n    }\n  }\n\n  /**\n   * create empty table element\n   *\n   * @param {Number} rowCount\n   * @param {Number} colCount\n   * @return {Node}\n   */\n  createTable(colCount, rowCount, options) {\n    const tds = [];\n    let tdHTML;\n    for (let idxCol = 0; idxCol < colCount; idxCol++) {\n      tds.push('<td>' + dom.blank + '</td>');\n    }\n    tdHTML = tds.join('');\n\n    const trs = [];\n    let trHTML;\n    for (let idxRow = 0; idxRow < rowCount; idxRow++) {\n      trs.push('<tr>' + tdHTML + '</tr>');\n    }\n    trHTML = trs.join('');\n    const $table = $('<table>' + trHTML + '</table>');\n    if (options && options.tableClassName) {\n      $table.addClass(options.tableClassName);\n    }\n\n    return $table[0];\n  }\n\n  /**\n   * Delete current table\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteTable(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    $(cell).closest('table').remove();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport { readFileAsDataURL, createImage } from '../core/async';\nimport History from '../editing/History';\nimport Style from '../editing/Style';\nimport Typing from '../editing/Typing';\nimport Table from '../editing/Table';\nimport Bullet from '../editing/Bullet';\n\nconst KEY_BOGUS = 'bogus';\n\n/**\n * @class Editor\n */\nexport default class Editor {\n  constructor(context) {\n    this.context = context;\n\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.editable = this.$editable[0];\n    this.lastRange = null;\n    this.snapshot = null;\n\n    this.style = new Style();\n    this.table = new Table();\n    this.typing = new Typing(context);\n    this.bullet = new Bullet();\n    this.history = new History(context);\n\n    this.context.memo('help.escape', this.lang.help.escape);\n    this.context.memo('help.undo', this.lang.help.undo);\n    this.context.memo('help.redo', this.lang.help.redo);\n    this.context.memo('help.tab', this.lang.help.tab);\n    this.context.memo('help.untab', this.lang.help.untab);\n    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);\n    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);\n    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);\n    this.context.memo('help.indent', this.lang.help.indent);\n    this.context.memo('help.outdent', this.lang.help.outdent);\n    this.context.memo('help.formatPara', this.lang.help.formatPara);\n    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);\n    this.context.memo('help.fontName', this.lang.help.fontName);\n\n    // native commands(with execCommand), generate function for execCommand\n    const commands = [\n      'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',\n      'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n      'formatBlock', 'removeFormat', 'backColor',\n    ];\n\n    for (let idx = 0, len = commands.length; idx < len; idx++) {\n      this[commands[idx]] = ((sCmd) => {\n        return (value) => {\n          this.beforeCommand();\n          document.execCommand(sCmd, false, value);\n          this.afterCommand(true);\n        };\n      })(commands[idx]);\n      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);\n    }\n\n    this.fontName = this.wrapCommand((value) => {\n      return this.fontStyling('font-family', env.validFontName(value));\n    });\n\n    this.fontSize = this.wrapCommand((value) => {\n      const unit = this.currentStyle()['font-size-unit'];\n      return this.fontStyling('font-size', value + unit);\n    });\n\n    this.fontSizeUnit = this.wrapCommand((value) => {\n      const size = this.currentStyle()['font-size'];\n      return this.fontStyling('font-size', size + value);\n    });\n\n    for (let idx = 1; idx <= 6; idx++) {\n      this['formatH' + idx] = ((idx) => {\n        return () => {\n          this.formatBlock('H' + idx);\n        };\n      })(idx);\n      this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);\n    }\n\n    this.insertParagraph = this.wrapCommand(() => {\n      this.typing.insertParagraph(this.editable);\n    });\n\n    this.insertOrderedList = this.wrapCommand(() => {\n      this.bullet.insertOrderedList(this.editable);\n    });\n\n    this.insertUnorderedList = this.wrapCommand(() => {\n      this.bullet.insertUnorderedList(this.editable);\n    });\n\n    this.indent = this.wrapCommand(() => {\n      this.bullet.indent(this.editable);\n    });\n\n    this.outdent = this.wrapCommand(() => {\n      this.bullet.outdent(this.editable);\n    });\n\n    /**\n     * insertNode\n     * insert node\n     * @param {Node} node\n     */\n    this.insertNode = this.wrapCommand((node) => {\n      if (this.isLimited($(node).text().length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      rng.insertNode(node);\n      this.setLastRange(range.createFromNodeAfter(node).select());\n    });\n\n    /**\n     * insert text\n     * @param {String} text\n     */\n    this.insertText = this.wrapCommand((text) => {\n      if (this.isLimited(text.length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      const textNode = rng.insertNode(dom.createText(text));\n      this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());\n    });\n\n    /**\n     * paste HTML\n     * @param {String} markup\n     */\n    this.pasteHTML = this.wrapCommand((markup) => {\n      if (this.isLimited(markup.length)) {\n        return;\n      }\n      markup = this.context.invoke('codeview.purify', markup);\n      const contents = this.getLastRange().pasteHTML(markup);\n      this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());\n    });\n\n    /**\n     * formatBlock\n     *\n     * @param {String} tagName\n     */\n    this.formatBlock = this.wrapCommand((tagName, $target) => {\n      const onApplyCustomStyle = this.options.callbacks.onApplyCustomStyle;\n      if (onApplyCustomStyle) {\n        onApplyCustomStyle.call(this, $target, this.context, this.onFormatBlock);\n      } else {\n        this.onFormatBlock(tagName, $target);\n      }\n    });\n\n    /**\n     * insert horizontal rule\n     */\n    this.insertHorizontalRule = this.wrapCommand(() => {\n      const hrNode = this.getLastRange().insertNode(dom.create('HR'));\n      if (hrNode.nextSibling) {\n        this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());\n      }\n    });\n\n    /**\n     * lineHeight\n     * @param {String} value\n     */\n    this.lineHeight = this.wrapCommand((value) => {\n      this.style.stylePara(this.getLastRange(), {\n        lineHeight: value,\n      });\n    });\n\n    /**\n     * create link (command)\n     *\n     * @param {Object} linkInfo\n     */\n    this.createLink = this.wrapCommand((linkInfo) => {\n      let linkUrl = linkInfo.url;\n      const linkText = linkInfo.text;\n      const isNewWindow = linkInfo.isNewWindow;\n      const checkProtocol = linkInfo.checkProtocol;\n      let rng = linkInfo.range || this.getLastRange();\n      const additionalTextLength = linkText.length - rng.toString().length;\n      if (additionalTextLength > 0 && this.isLimited(additionalTextLength)) {\n        return;\n      }\n      const isTextChanged = rng.toString() !== linkText;\n\n      // handle spaced urls from input\n      if (typeof linkUrl === 'string') {\n        linkUrl = linkUrl.trim();\n      }\n\n      if (this.options.onCreateLink) {\n        linkUrl = this.options.onCreateLink(linkUrl);\n      } else if (checkProtocol) {\n        // if url doesn't have any protocol and not even a relative or a label, use http:// as default\n        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\\:|#|\\/)/.test(linkUrl)\n          ? linkUrl : this.options.defaultProtocol + linkUrl;\n      }\n\n      let anchors = [];\n      if (isTextChanged) {\n        rng = rng.deleteContents();\n        const anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);\n        anchors.push(anchor);\n      } else {\n        anchors = this.style.styleNodes(rng, {\n          nodeName: 'A',\n          expandClosestSibling: true,\n          onlyPartialContains: true,\n        });\n      }\n\n      $.each(anchors, (idx, anchor) => {\n        $(anchor).attr('href', linkUrl);\n        if (isNewWindow) {\n          $(anchor).attr('target', '_blank');\n        } else {\n          $(anchor).removeAttr('target');\n        }\n      });\n\n      this.setLastRange(\n        this.createRangeFromList(anchors).select()\n      );\n    });\n\n    /**\n     * setting color\n     *\n     * @param {Object} sObjColor  color code\n     * @param {String} sObjColor.foreColor foreground color\n     * @param {String} sObjColor.backColor background color\n     */\n    this.color = this.wrapCommand((colorInfo) => {\n      const foreColor = colorInfo.foreColor;\n      const backColor = colorInfo.backColor;\n\n      if (foreColor) { document.execCommand('foreColor', false, foreColor); }\n      if (backColor) { document.execCommand('backColor', false, backColor); }\n    });\n\n    /**\n     * Set foreground color\n     *\n     * @param {String} colorCode foreground color code\n     */\n    this.foreColor = this.wrapCommand((colorInfo) => {\n      document.execCommand('foreColor', false, colorInfo);\n    });\n\n    /**\n     * insert Table\n     *\n     * @param {String} dimension of table (ex : \"5x5\")\n     */\n    this.insertTable = this.wrapCommand((dim) => {\n      const dimension = dim.split('x');\n\n      const rng = this.getLastRange().deleteContents();\n      rng.insertNode(this.table.createTable(dimension[0], dimension[1], this.options));\n    });\n\n    /**\n     * remove media object and Figure Elements if media object is img with Figure.\n     */\n    this.removeMedia = this.wrapCommand(() => {\n      let $target = $(this.restoreTarget()).parent();\n      if ($target.closest('figure').length) {\n        $target.closest('figure').remove();\n      } else {\n        $target = $(this.restoreTarget()).detach();\n      }\n      this.context.triggerEvent('media.delete', $target, this.$editable);\n    });\n\n    /**\n     * float me\n     *\n     * @param {String} value\n     */\n    this.floatMe = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      $target.toggleClass('note-float-left', value === 'left');\n      $target.toggleClass('note-float-right', value === 'right');\n      $target.css('float', (value === 'none' ? '' : value));\n    });\n\n    /**\n     * resize overlay element\n     * @param {String} value\n     */\n    this.resize = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      value = parseFloat(value);\n      if (value === 0) {\n        $target.css('width', '');\n      } else {\n        $target.css({\n          width: value * 100 + '%',\n          height: '',\n        });\n      }\n    });\n  }\n\n  initialize() {\n    // bind custom events\n    this.$editable.on('keydown', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        this.context.triggerEvent('enter', event);\n      }\n      this.context.triggerEvent('keydown', event);\n\n      // keep a snapshot to limit text on input event\n      this.snapshot = this.history.makeSnapshot();\n      this.hasKeyShortCut = false;\n      if (!event.isDefaultPrevented()) {\n        if (this.options.shortcuts) {\n          this.hasKeyShortCut = this.handleKeyMap(event);\n        } else {\n          this.preventDefaultEditableShortCuts(event);\n        }\n      }\n      if (this.isLimited(1, event)) {\n        const lastRange = this.getLastRange();\n        if (lastRange.eo - lastRange.so === 0) {\n          return false;\n        }\n      }\n      this.setLastRange();\n\n      // record undo in the key event except keyMap.\n      if (this.options.recordEveryKeystroke) {\n        if (this.hasKeyShortCut === false) {\n          this.history.recordUndo();\n        }\n      }\n    }).on('keyup', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('keyup', event);\n    }).on('focus', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('focus', event);\n    }).on('blur', (event) => {\n      this.context.triggerEvent('blur', event);\n    }).on('mousedown', (event) => {\n      this.context.triggerEvent('mousedown', event);\n    }).on('mouseup', (event) => {\n      this.setLastRange();\n      this.history.recordUndo();\n      this.context.triggerEvent('mouseup', event);\n    }).on('scroll', (event) => {\n      this.context.triggerEvent('scroll', event);\n    }).on('paste', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('paste', event);\n    }).on('input', () => {\n      // To limit composition characters (e.g. Korean)\n      if (this.isLimited(0) && this.snapshot) {\n        this.history.applySnapshot(this.snapshot);\n      }\n    });\n\n    this.$editable.attr('spellcheck', this.options.spellCheck);\n\n    this.$editable.attr('autocorrect', this.options.spellCheck);\n\n    if (this.options.disableGrammar) {\n      this.$editable.attr('data-gramm', false);\n    }\n\n    // init content before set event\n    this.$editable.html(dom.html(this.$note) || dom.emptyPara);\n\n    this.$editable.on(env.inputEventName, func.debounce(() => {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }, 10));\n\n    this.$editable.on('focusin', (event) => {\n      this.context.triggerEvent('focusin', event);\n    }).on('focusout', (event) => {\n      this.context.triggerEvent('focusout', event);\n    });\n\n    if (this.options.airMode) {\n      if (this.options.overrideContextMenu) {\n        this.$editor.on('contextmenu', (event) => {\n          this.context.triggerEvent('contextmenu', event);\n          return false;\n        });\n      }\n    } else {\n      if (this.options.width) {\n        this.$editor.outerWidth(this.options.width);\n      }\n      if (this.options.height) {\n        this.$editable.outerHeight(this.options.height);\n      }\n      if (this.options.maxHeight) {\n        this.$editable.css('max-height', this.options.maxHeight);\n      }\n      if (this.options.minHeight) {\n        this.$editable.css('min-height', this.options.minHeight);\n      }\n    }\n\n    this.history.recordUndo();\n    this.setLastRange();\n  }\n\n  destroy() {\n    this.$editable.off();\n  }\n\n  handleKeyMap(event) {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    const keys = [];\n\n    if (event.metaKey) { keys.push('CMD'); }\n    if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }\n    if (event.shiftKey) { keys.push('SHIFT'); }\n\n    const keyName = key.nameFromCode[event.keyCode];\n    if (keyName) {\n      keys.push(keyName);\n    }\n\n    const eventName = keyMap[keys.join('+')];\n\n    if (keyName === 'TAB' && !this.options.tabDisable) {\n      this.afterCommand();\n    } else if (eventName) {\n      if (this.context.invoke(eventName) !== false) {\n        event.preventDefault();\n        // if keyMap action was invoked\n        return true;\n      }\n    } else if (key.isEdit(event.keyCode)) {\n      this.afterCommand();\n    }\n    return false;\n  }\n\n  preventDefaultEditableShortCuts(event) {\n    // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)\n    if ((event.ctrlKey || event.metaKey) &&\n      lists.contains([66, 73, 85], event.keyCode)) {\n      event.preventDefault();\n    }\n  }\n\n  isLimited(pad, event) {\n    pad = pad || 0;\n\n    if (typeof event !== 'undefined') {\n      if (key.isMove(event.keyCode) ||\n          key.isNavigation(event.keyCode) ||\n          (event.ctrlKey || event.metaKey) ||\n          lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {\n        return false;\n      }\n    }\n\n    if (this.options.maxTextLength > 0) {\n      if ((this.$editable.text().length + pad) > this.options.maxTextLength) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * create range\n   * @return {WrappedRange}\n   */\n  createRange() {\n    this.focus();\n    this.setLastRange();\n    return this.getLastRange();\n  }\n\n  /**\n   * create a new range from the list of elements\n   *\n   * @param {list} dom element list\n   * @return {WrappedRange}\n   */\n  createRangeFromList(lst) {\n    const startRange = range.createFromNodeBefore(lists.head(lst));\n    const startPoint = startRange.getStartPoint();\n    const endRange = range.createFromNodeAfter(lists.last(lst));\n    const endPoint = endRange.getEndPoint();\n\n    return range.create(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * set the last range\n   *\n   * if given rng is exist, set rng as the last range\n   * or create a new range at the end of the document\n   *\n   * @param {WrappedRange} rng\n   */\n  setLastRange(rng) {\n    if (rng) {\n      this.lastRange = rng;\n    } else {\n      this.lastRange = range.create(this.editable);\n\n      if ($(this.lastRange.sc).closest('.note-editable').length === 0) {\n        this.lastRange = range.createFromBodyElement(this.editable);\n      }\n    }\n  }\n\n  /**\n   * get the last range\n   *\n   * if there is a saved last range, return it\n   * or create a new range and return it\n   *\n   * @return {WrappedRange}\n   */\n  getLastRange() {\n    if (!this.lastRange) {\n      this.setLastRange();\n    }\n    return this.lastRange;\n  }\n\n  /**\n   * saveRange\n   *\n   * save current range\n   *\n   * @param {Boolean} [thenCollapse=false]\n   */\n  saveRange(thenCollapse) {\n    if (thenCollapse) {\n      this.getLastRange().collapse().select();\n    }\n  }\n\n  /**\n   * restoreRange\n   *\n   * restore lately range\n   */\n  restoreRange() {\n    if (this.lastRange) {\n      this.lastRange.select();\n      this.focus();\n    }\n  }\n\n  saveTarget(node) {\n    this.$editable.data('target', node);\n  }\n\n  clearTarget() {\n    this.$editable.removeData('target');\n  }\n\n  restoreTarget() {\n    return this.$editable.data('target');\n  }\n\n  /**\n   * currentStyle\n   *\n   * current style\n   * @return {Object|Boolean} unfocus\n   */\n  currentStyle() {\n    let rng = range.create();\n    if (rng) {\n      rng = rng.normalize();\n    }\n    return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);\n  }\n\n  /**\n   * style from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  styleFromNode($node) {\n    return this.style.fromNode($node);\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.undo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /*\n  * commit\n  */\n  commit() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.commit();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.redo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * before command\n   */\n  beforeCommand() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n\n    // Set styleWithCSS before run a command\n    document.execCommand('styleWithCSS', false, this.options.styleWithCSS);\n\n    // keep focus on editable before command execution\n    this.focus();\n  }\n\n  /**\n   * after command\n   * @param {Boolean} isPreventTrigger\n   */\n  afterCommand(isPreventTrigger) {\n    this.normalizeContent();\n    this.history.recordUndo();\n    if (!isPreventTrigger) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  /**\n   * handle tab key\n   */\n  tab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n\n      if (!this.isLimited(this.options.tabSize)) {\n        this.beforeCommand();\n        this.typing.insertTab(rng, this.options.tabSize);\n        this.afterCommand();\n      }\n    }\n  }\n\n  /**\n   * handle shift+tab key\n   */\n  untab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng, true);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * run given function between beforeCommand and afterCommand\n   */\n  wrapCommand(fn) {\n    return function() {\n      this.beforeCommand();\n      fn.apply(this, arguments);\n      this.afterCommand();\n    };\n  }\n\n  /**\n   * insert image\n   *\n   * @param {String} src\n   * @param {String|Function} param\n   * @return {Promise}\n   */\n  insertImage(src, param) {\n    return createImage(src, param).then(($image) => {\n      this.beforeCommand();\n\n      if (typeof param === 'function') {\n        param($image);\n      } else {\n        if (typeof param === 'string') {\n          $image.attr('data-filename', param);\n        }\n        $image.css('width', Math.min(this.$editable.width(), $image.width()));\n      }\n\n      $image.show();\n      this.getLastRange().insertNode($image[0]);\n      this.setLastRange(range.createFromNodeAfter($image[0]).select());\n      this.afterCommand();\n    }).fail((e) => {\n      this.context.triggerEvent('image.upload.error', e);\n    });\n  }\n\n  /**\n   * insertImages\n   * @param {File[]} files\n   */\n  insertImagesAsDataURL(files) {\n    $.each(files, (idx, file) => {\n      const filename = file.name;\n      if (this.options.maximumImageFileSize && this.options.maximumImageFileSize < file.size) {\n        this.context.triggerEvent('image.upload.error', this.lang.image.maximumFileSizeError);\n      } else {\n        readFileAsDataURL(file).then((dataURL) => {\n          return this.insertImage(dataURL, filename);\n        }).fail(() => {\n          this.context.triggerEvent('image.upload.error');\n        });\n      }\n    });\n  }\n\n  /**\n   * insertImagesOrCallback\n   * @param {File[]} files\n   */\n  insertImagesOrCallback(files) {\n    const callbacks = this.options.callbacks;\n    // If onImageUpload set,\n    if (callbacks.onImageUpload) {\n      this.context.triggerEvent('image.upload', files);\n      // else insert Image as dataURL\n    } else {\n      this.insertImagesAsDataURL(files);\n    }\n  }\n\n  /**\n   * return selected plain text\n   * @return {String} text\n   */\n  getSelectedText() {\n    let rng = this.getLastRange();\n\n    // if range on anchor, expand range with anchor\n    if (rng.isOnAnchor()) {\n      rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));\n    }\n\n    return rng.toString();\n  }\n\n  onFormatBlock(tagName, $target) {\n    // [workaround] for MSIE, IE need `<`\n    document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName);\n\n    // support custom class\n    if ($target && $target.length) {\n      // find the exact element has given tagName\n      if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {\n        $target = $target.find(tagName);\n      }\n\n      if ($target && $target.length) {\n        const currentRange = this.createRange();\n        const $parent = $([currentRange.sc, currentRange.ec]).closest(tagName);\n        // remove class added for current block\n        $parent.removeClass();\n        const className = $target[0].className || '';\n        if (className) {\n          $parent.addClass(className);\n        }\n      }\n    }\n  }\n\n  formatPara() {\n    this.formatBlock('P');\n  }\n\n  fontStyling(target, value) {\n    const rng = this.getLastRange();\n\n    if (rng !== '') {\n      const spans = this.style.styleNodes(rng);\n      this.$editor.find('.note-status-output').html('');\n      $(spans).css(target, value);\n\n      // [workaround] added styled bogus span for style\n      //  - also bogus character needed for cursor position\n      if (rng.isCollapsed()) {\n        const firstSpan = lists.head(spans);\n        if (firstSpan && !dom.nodeLength(firstSpan)) {\n          firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;\n          range.createFromNode(firstSpan.firstChild).select();\n          this.setLastRange();\n          this.$editable.data(KEY_BOGUS, firstSpan);\n        }\n      } else {\n        this.setLastRange(\n          this.createRangeFromList(spans).select()\n        );\n      }\n    } else {\n      const noteStatusOutput = $.now();\n      this.$editor.find('.note-status-output').html('<div id=\"note-status-output-' + noteStatusOutput + '\" class=\"alert alert-info\">' + this.lang.output.noSelection + '</div>');\n      setTimeout(function() { $('#note-status-output-' + noteStatusOutput).remove(); }, 5000);\n    }\n  }\n\n  /**\n   * unlink\n   *\n   * @type command\n   */\n  unlink() {\n    let rng = this.getLastRange();\n    if (rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      rng = range.createFromNode(anchor);\n      rng.select();\n      this.setLastRange();\n\n      this.beforeCommand();\n      document.execCommand('unlink');\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * returns link info\n   *\n   * @return {Object}\n   * @return {WrappedRange} return.range\n   * @return {String} return.text\n   * @return {Boolean} [return.isNewWindow=true]\n   * @return {String} [return.url=\"\"]\n   */\n  getLinkInfo() {\n    const rng = this.getLastRange().expand(dom.isAnchor);\n    // Get the first anchor on range(for edit).\n    const $anchor = $(lists.head(rng.nodes(dom.isAnchor)));\n    const linkInfo = {\n      range: rng,\n      text: rng.toString(),\n      url: $anchor.length ? $anchor.attr('href') : '',\n    };\n\n    // When anchor exists,\n    if ($anchor.length) {\n      // Set isNewWindow by checking its target.\n      linkInfo.isNewWindow = $anchor.attr('target') === '_blank';\n    }\n\n    return linkInfo;\n  }\n\n  addRow(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addRow(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  addCol(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addCol(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  deleteRow() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteRow(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteCol() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteCol(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteTable() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteTable(rng);\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * @param {Position} pos\n   * @param {jQuery} $target - target element\n   * @param {Boolean} [bKeepRatio] - keep ratio\n   */\n  resizeTo(pos, $target, bKeepRatio) {\n    let imageSize;\n    if (bKeepRatio) {\n      const newRatio = pos.y / pos.x;\n      const ratio = $target.data('ratio');\n      imageSize = {\n        width: ratio > newRatio ? pos.x : pos.y / ratio,\n        height: ratio > newRatio ? pos.x * ratio : pos.y,\n      };\n    } else {\n      imageSize = {\n        width: pos.x,\n        height: pos.y,\n      };\n    }\n\n    $target.css(imageSize);\n  }\n\n  /**\n   * returns whether editable area has focus or not.\n   */\n  hasFocus() {\n    return this.$editable.is(':focus');\n  }\n\n  /**\n   * set focus\n   */\n  focus() {\n    // [workaround] Screen will move when page is scolled in IE.\n    //  - do focus when not focused\n    if (!this.hasFocus()) {\n      this.$editable.focus();\n    }\n  }\n\n  /**\n   * returns whether contents is empty or not.\n   * @return {Boolean}\n   */\n  isEmpty() {\n    return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();\n  }\n\n  /**\n   * Removes all contents and restores the editable instance to an _emptyPara_.\n   */\n  empty() {\n    this.context.invoke('code', dom.emptyPara);\n  }\n\n  /**\n   * normalize content\n   */\n  normalizeContent() {\n    this.$editable[0].normalize();\n  }\n}\n","import lists from '../core/lists';\n\nexport default class Clipboard {\n  constructor(context) {\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n  }\n\n  initialize() {\n    this.$editable.on('paste', this.pasteByEvent.bind(this));\n  }\n\n  /**\n   * paste by clipboard event\n   *\n   * @param {Event} event\n   */\n  pasteByEvent(event) {\n    const clipboardData = event.originalEvent.clipboardData;\n\n    if (clipboardData && clipboardData.items && clipboardData.items.length) {\n      const item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);\n      if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {\n        // paste img file\n        this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);\n        event.preventDefault();\n      } else if (item.kind === 'string') {\n        // paste text with maxTextLength check\n        if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {\n          event.preventDefault();\n        }\n      }\n    } else if (window.clipboardData) {\n      // for IE\n      let text = window.clipboardData.getData('text');\n      if (this.context.invoke('editor.isLimited', text.length)) {\n        event.preventDefault();\n      }\n    }\n    // Call editor.afterCommand after proceeding default event handler\n    setTimeout(() => {\n      this.context.invoke('editor.afterCommand');\n    }, 10);\n  }\n}\n","import $ from 'jquery';\n\nexport default class Dropzone {\n  constructor(context) {\n    this.context = context;\n    this.$eventListener = $(document);\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.documentEventHandlers = {};\n\n    this.$dropzone = $([\n      '<div class=\"note-dropzone\">',\n        '<div class=\"note-dropzone-message\"></div>',\n      '</div>',\n    ].join('')).prependTo(this.$editor);\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  initialize() {\n    if (this.options.disableDragAndDrop) {\n      // prevent default drop event\n      this.documentEventHandlers.onDrop = (e) => {\n        e.preventDefault();\n      };\n      // do not consider outside of dropzone\n      this.$eventListener = this.$dropzone;\n      this.$eventListener.on('drop', this.documentEventHandlers.onDrop);\n    } else {\n      this.attachDragAndDropEvent();\n    }\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  attachDragAndDropEvent() {\n    let collection = $();\n    const $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');\n\n    this.documentEventHandlers.onDragenter = (e) => {\n      const isCodeview = this.context.invoke('codeview.isActivated');\n      const hasEditorSize = this.$editor.width() > 0 && this.$editor.height() > 0;\n      if (!isCodeview && !collection.length && hasEditorSize) {\n        this.$editor.addClass('dragover');\n        this.$dropzone.width(this.$editor.width());\n        this.$dropzone.height(this.$editor.height());\n        $dropzoneMessage.text(this.lang.image.dragImageHere);\n      }\n      collection = collection.add(e.target);\n    };\n\n    this.documentEventHandlers.onDragleave = (e) => {\n      collection = collection.not(e.target);\n\n      // If nodeName is BODY, then just make it over (fix for IE)\n      if (!collection.length || e.target.nodeName === 'BODY') {\n        collection = $();\n        this.$editor.removeClass('dragover');\n      }\n    };\n\n    this.documentEventHandlers.onDrop = () => {\n      collection = $();\n      this.$editor.removeClass('dragover');\n    };\n\n    // show dropzone on dragenter when dragging a object to document\n    // -but only if the editor is visible, i.e. has a positive width and height\n    this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter)\n      .on('dragleave', this.documentEventHandlers.onDragleave)\n      .on('drop', this.documentEventHandlers.onDrop);\n\n    // change dropzone's message on hover.\n    this.$dropzone.on('dragenter', () => {\n      this.$dropzone.addClass('hover');\n      $dropzoneMessage.text(this.lang.image.dropImage);\n    }).on('dragleave', () => {\n      this.$dropzone.removeClass('hover');\n      $dropzoneMessage.text(this.lang.image.dragImageHere);\n    });\n\n    // attach dropImage\n    this.$dropzone.on('drop', (event) => {\n      const dataTransfer = event.originalEvent.dataTransfer;\n\n      // stop the browser from opening the dropped content\n      event.preventDefault();\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        this.$editable.focus();\n        this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);\n      } else {\n        $.each(dataTransfer.types, (idx, type) => {\n          // skip moz-specific types\n          if (type.toLowerCase().indexOf('_moz_') > -1) {\n            return;\n          }\n          const content = dataTransfer.getData(type);\n\n          if (type.toLowerCase().indexOf('text') > -1) {\n            this.context.invoke('editor.pasteHTML', content);\n          } else {\n            $(content).each((idx, item) => {\n              this.context.invoke('editor.insertNode', item);\n            });\n          }\n        });\n      }\n    }).on('dragover', false); // prevent default dragover event\n  }\n\n  destroy() {\n    Object.keys(this.documentEventHandlers).forEach((key) => {\n      this.$eventListener.off(key.substr(2).toLowerCase(), this.documentEventHandlers[key]);\n    });\n    this.documentEventHandlers = {};\n  }\n}\n","import dom from '../core/dom';\nimport key from '../core/key';\n\n/**\n * @class Codeview\n */\nexport default class CodeView {\n  constructor(context) {\n    this.context = context;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n    this.CodeMirrorConstructor = window.CodeMirror;\n\n    if (this.options.codemirror.CodeMirrorConstructor) {\n      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;\n    }\n  }\n\n  sync(html) {\n    const isCodeview = this.isActivated();\n    const CodeMirror = this.CodeMirrorConstructor;\n\n    if (isCodeview) {\n      if (html) {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').getDoc().setValue(html);\n        } else {\n          this.$codable.val(html);\n        }\n      } else {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').save();\n        }\n      }\n    }\n  }\n\n  initialize() {\n    this.$codable.on('keyup', (event) => {\n      if (event.keyCode === key.code.ESCAPE) {\n        this.deactivate();\n      }\n    });\n  }\n\n  /**\n   * @return {Boolean}\n   */\n  isActivated() {\n    return this.$editor.hasClass('codeview');\n  }\n\n  /**\n   * toggle codeview\n   */\n  toggle() {\n    if (this.isActivated()) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n    this.context.triggerEvent('codeview.toggled');\n  }\n\n  /**\n   * purify input value\n   * @param value\n   * @returns {*}\n   */\n  purify(value) {\n    if (this.options.codeviewFilter) {\n      // filter code view regex\n      value = value.replace(this.options.codeviewFilterRegex, '');\n      // allow specific iframe tag\n      if (this.options.codeviewIframeFilter) {\n        const whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);\n        value = value.replace(/(<iframe.*?>.*?(?:<\\/iframe>)?)/gi, function(tag) {\n          // remove if src attribute is duplicated\n          if (/<.+src(?==?('|\"|\\s)?)[\\s\\S]+src(?=('|\"|\\s)?)[^>]*?>/i.test(tag)) {\n            return '';\n          }\n          for (const src of whitelist) {\n            // pass if src is trusted\n            if ((new RegExp('src=\"(https?:)?\\/\\/' + src.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '\\/(.+)\"')).test(tag)) {\n              return tag;\n            }\n          }\n          return '';\n        });\n      }\n    }\n    return value;\n  }\n\n  /**\n   * activate code view\n   */\n  activate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));\n    this.$codable.height(this.$editable.height());\n\n    this.context.invoke('toolbar.updateCodeview', true);\n    this.context.invoke('airPopover.updateCodeview', true);\n\n    this.$editor.addClass('codeview');\n    this.$codable.focus();\n\n    // activate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror);\n\n      // CodeMirror TernServer\n      if (this.options.codemirror.tern) {\n        const server = new CodeMirror.TernServer(this.options.codemirror.tern);\n        cmEditor.ternServer = server;\n        cmEditor.on('cursorActivity', (cm) => {\n          server.updateArgHints(cm);\n        });\n      }\n\n      cmEditor.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);\n      });\n      cmEditor.on('change', () => {\n        this.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);\n      });\n\n      // CodeMirror hasn't Padding.\n      cmEditor.setSize(null, this.$editable.outerHeight());\n      this.$codable.data('cmEditor', cmEditor);\n    } else {\n      this.$codable.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', this.$codable.val(), event);\n      });\n      this.$codable.on('input', () => {\n        this.context.triggerEvent('change.codeview', this.$codable.val(), this.$codable);\n      });\n    }\n  }\n\n  /**\n   * deactivate code view\n   */\n  deactivate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    // deactivate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = this.$codable.data('cmEditor');\n      this.$codable.val(cmEditor.getValue());\n      cmEditor.toTextArea();\n    }\n\n    const value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);\n    const isChange = this.$editable.html() !== value;\n\n    this.$editable.html(value);\n    this.$editable.height(this.options.height ? this.$codable.height() : 'auto');\n    this.$editor.removeClass('codeview');\n\n    if (isChange) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n\n    this.$editable.focus();\n\n    this.context.invoke('toolbar.updateCodeview', false);\n    this.context.invoke('airPopover.updateCodeview', false);\n  }\n\n  destroy() {\n    if (this.isActivated()) {\n      this.deactivate();\n    }\n  }\n}\n","import $ from 'jquery';\nconst EDITABLE_PADDING = 24;\n\nexport default class Statusbar {\n  constructor(context) {\n    this.$document = $(document);\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n  }\n\n  initialize() {\n    if (this.options.airMode || this.options.disableResizeEditor) {\n      this.destroy();\n      return;\n    }\n\n    this.$statusbar.on('mousedown', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const editableTop = this.$editable.offset().top - this.$document.scrollTop();\n      const editableCodeTop = this.$codable.offset().top - this.$document.scrollTop();\n\n      const onMouseMove = (event) => {\n        let height = event.clientY - (editableTop + EDITABLE_PADDING);\n        let heightCode = event.clientY - (editableCodeTop + EDITABLE_PADDING);\n\n        height = (this.options.minheight > 0) ? Math.max(height, this.options.minheight) : height;\n        height = (this.options.maxHeight > 0) ? Math.min(height, this.options.maxHeight) : height;\n        heightCode = (this.options.minheight > 0) ? Math.max(heightCode, this.options.minheight) : heightCode;\n        heightCode = (this.options.maxHeight > 0) ? Math.min(heightCode, this.options.maxHeight) : heightCode;\n\n\n        this.$editable.height(height);\n        this.$codable.height(heightCode);\n      };\n\n      this.$document.on('mousemove', onMouseMove).one('mouseup', () => {\n        this.$document.off('mousemove', onMouseMove);\n      });\n    });\n  }\n\n  destroy() {\n    this.$statusbar.off();\n    this.$statusbar.addClass('locked');\n  }\n}\n","import $ from 'jquery';\n\nexport default class Fullscreen {\n  constructor(context) {\n    this.context = context;\n\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n\n    this.$window = $(window);\n    this.$scrollbar = $('html, body');\n    this.scrollbarClassName = 'note-fullscreen-body';\n\n    this.onResize = () => {\n      this.resizeTo({\n        h: this.$window.height() - this.$toolbar.outerHeight(),\n      });\n    };\n  }\n\n  resizeTo(size) {\n    this.$editable.css('height', size.h);\n    this.$codable.css('height', size.h);\n    if (this.$codable.data('cmeditor')) {\n      this.$codable.data('cmeditor').setsize(null, size.h);\n    }\n  }\n\n  /**\n   * toggle fullscreen\n   */\n  toggle() {\n    this.$editor.toggleClass('fullscreen');\n    const isFullscreen = this.isFullscreen();\n    this.$scrollbar.toggleClass(this.scrollbarClassName, isFullscreen);\n    if (isFullscreen) {\n      this.$editable.data('orgHeight', this.$editable.css('height'));\n      this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));\n      this.$editable.css('maxHeight', '');\n      this.$window.on('resize', this.onResize).trigger('resize');\n    } else {\n      this.$window.off('resize', this.onResize);\n      this.resizeTo({ h: this.$editable.data('orgHeight') });\n      this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));\n    }\n\n    this.context.invoke('toolbar.updateFullscreen', isFullscreen);\n  }\n\n  isFullscreen() {\n    return this.$editor.hasClass('fullscreen');\n  }\n\n  destroy() {\n    this.$scrollbar.removeClass(this.scrollbarClassName);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\n\nexport default class Handle {\n  constructor(context) {\n    this.context = context;\n    this.$document = $(document);\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        if (this.update(e.target, e)) {\n          e.preventDefault();\n        }\n      },\n      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  initialize() {\n    this.$handle = $([\n      '<div class=\"note-handle\">',\n        '<div class=\"note-control-selection\">',\n          '<div class=\"note-control-selection-bg\"></div>',\n          '<div class=\"note-control-holder note-control-nw\"></div>',\n          '<div class=\"note-control-holder note-control-ne\"></div>',\n          '<div class=\"note-control-holder note-control-sw\"></div>',\n          '<div class=\"',\n            (this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),\n          ' note-control-se\"></div>',\n          (this.options.disableResizeImage ? '' : '<div class=\"note-control-selection-info\"></div>'),\n        '</div>',\n      '</div>',\n    ].join('')).prependTo(this.$editingArea);\n\n    this.$handle.on('mousedown', (event) => {\n      if (dom.isControlSizing(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const $target = this.$handle.find('.note-control-selection').data('target');\n        const posStart = $target.offset();\n        const scrollTop = this.$document.scrollTop();\n\n        const onMouseMove = (event) => {\n          this.context.invoke('editor.resizeTo', {\n            x: event.clientX - posStart.left,\n            y: event.clientY - (posStart.top - scrollTop),\n          }, $target, !event.shiftKey);\n\n          this.update($target[0], event);\n        };\n\n        this.$document\n          .on('mousemove', onMouseMove)\n          .one('mouseup', (e) => {\n            e.preventDefault();\n            this.$document.off('mousemove', onMouseMove);\n            this.context.invoke('editor.afterCommand');\n          });\n\n        if (!$target.data('ratio')) { // original ratio.\n          $target.data('ratio', $target.height() / $target.width());\n        }\n      }\n    });\n\n    // Listen for scrolling on the handle overlay.\n    this.$handle.on('wheel', (e) => {\n      e.preventDefault();\n      this.update();\n    });\n  }\n\n  destroy() {\n    this.$handle.remove();\n  }\n\n  update(target, event) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isImage = dom.isImg(target);\n    const $selection = this.$handle.find('.note-control-selection');\n\n    this.context.invoke('imagePopover.update', target, event);\n\n    if (isImage) {\n      const $image = $(target);\n      const position = $image.position();\n      const pos = {\n        left: position.left + parseInt($image.css('marginLeft'), 10),\n        top: position.top + parseInt($image.css('marginTop'), 10),\n      };\n\n      // exclude margin\n      const imageSize = {\n        w: $image.outerWidth(false),\n        h: $image.outerHeight(false),\n      };\n\n      $selection.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n        width: imageSize.w,\n        height: imageSize.h,\n      }).data('target', $image); // save current image element.\n\n      const origImageObj = new Image();\n      origImageObj.src = $image.attr('src');\n\n      const sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';\n      $selection.find('.note-control-selection-info').text(sizingText);\n      this.context.invoke('editor.saveTarget', target);\n    } else {\n      this.hide();\n    }\n\n    return isImage;\n  }\n\n  /**\n   * hide\n   *\n   * @param {jQuery} $handle\n   */\n  hide() {\n    this.context.invoke('editor.clearTarget');\n    this.$handle.children().hide();\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport key from '../core/key';\n\nconst defaultScheme = 'http://';\nconst linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\\:[\\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\\.)?(.+)$/i;\n\nexport default class AutoLink {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n  }\n\n  destroy() {\n    this.lastWordRange = null;\n  }\n\n  replace() {\n    if (!this.lastWordRange) {\n      return;\n    }\n\n    const keyword = this.lastWordRange.toString();\n    const match = keyword.match(linkPattern);\n\n    if (match && (match[1] || match[2])) {\n      const link = match[1] ? keyword : defaultScheme + keyword;\n      const urlText = this.options.showDomainOnlyForAutolink ?\n        keyword.replace(/^(?:https?:\\/\\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\\.)?/i, '').split('/')[0]\n        : keyword;\n      const node = $('<a></a>').html(urlText).attr('href', link)[0];\n      if (this.context.options.linkTargetBlank) {\n        $(node).attr('target', '_blank');\n      }\n\n      this.lastWordRange.insertNode(node);\n      this.lastWordRange = null;\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  handleKeydown(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWordRange = wordRange;\n    }\n  }\n\n  handleKeyup(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import dom from '../core/dom';\n\n/**\n * textarea auto sync.\n */\nexport default class AutoSync {\n  constructor(context) {\n    this.$note = context.layoutInfo.note;\n    this.events = {\n      'summernote.change': () => {\n        this.$note.val(context.invoke('code'));\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return dom.isTextarea(this.$note[0]);\n  }\n}\n","import lists from '../core/lists';\nimport dom from '../core/dom';\nimport key from '../core/key';\n\nexport default class AutoReplace {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options.replace || {};\n\n    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];\n    this.previousKeydownCode = null;\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.match;\n  }\n\n  initialize() {\n    this.lastWord = null;\n  }\n\n  destroy() {\n    this.lastWord = null;\n  }\n\n  replace() {\n    if (!this.lastWord) {\n      return;\n    }\n\n    const self = this;\n    const keyword = this.lastWord.toString();\n    this.options.match(keyword, function(match) {\n      if (match) {\n        let node = '';\n\n        if (typeof match === 'string') {\n          node = dom.createText(match);\n        } else if (match instanceof jQuery) {\n          node = match[0];\n        } else if (match instanceof Node) {\n          node = match;\n        }\n\n        if (!node) return;\n        self.lastWord.insertNode(node);\n        self.lastWord = null;\n        self.context.invoke('editor.focus');\n      }\n    });\n  }\n\n  handleKeydown(e) {\n    // this forces it to remember the last whole word, even if multiple termination keys are pressed\n    // before the previous key is let go.\n    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {\n      this.previousKeydownCode = e.keyCode;\n      return;\n    }\n\n    if (lists.contains(this.keys, e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWord = wordRange;\n    }\n    this.previousKeydownCode = e.keyCode;\n  }\n\n  handleKeyup(e) {\n    if (lists.contains(this.keys, e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import $ from 'jquery';\nexport default class Placeholder {\n  constructor(context) {\n    this.context = context;\n\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n\n    if (this.options.inheritPlaceholder === true) {\n      // get placeholder value from the original element\n      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;\n    }\n\n    this.events = {\n      'summernote.init summernote.change': () => {\n        this.update();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.placeholder;\n  }\n\n  initialize() {\n    this.$placeholder = $('<div class=\"note-placeholder\"></div>');\n    this.$placeholder.on('click', () => {\n      this.context.invoke('focus');\n    }).html(this.options.placeholder).prependTo(this.$editingArea);\n\n    this.update();\n  }\n\n  destroy() {\n    this.$placeholder.remove();\n  }\n\n  update() {\n    const isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');\n    this.$placeholder.toggle(isShow);\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport env from '../core/env';\n\nexport default class Buttons {\n  constructor(context) {\n    this.ui = $.summernote.ui;\n    this.context = context;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.invertedKeyMap = func.invertObject(\n      this.options.keyMap[env.isMac ? 'mac' : 'pc']\n    );\n  }\n\n  representShortcut(editorMethod) {\n    let shortcut = this.invertedKeyMap[editorMethod];\n    if (!this.options.shortcuts || !shortcut) {\n      return '';\n    }\n\n    if (env.isMac) {\n      shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');\n    }\n\n    shortcut = shortcut.replace('BACKSLASH', '\\\\')\n      .replace('SLASH', '/')\n      .replace('LEFTBRACKET', '[')\n      .replace('RIGHTBRACKET', ']');\n\n    return ' (' + shortcut + ')';\n  }\n\n  button(o) {\n    if (!this.options.tooltip && o.tooltip) {\n      delete o.tooltip;\n    }\n    o.container = this.options.container;\n    return this.ui.button(o);\n  }\n\n  initialize() {\n    this.addToolbarButtons();\n    this.addImagePopoverButtons();\n    this.addLinkPopoverButtons();\n    this.addTablePopoverButtons();\n    this.fontInstalledMap = {};\n  }\n\n  destroy() {\n    delete this.fontInstalledMap;\n  }\n\n  isFontInstalled(name) {\n    if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {\n      this.fontInstalledMap[name] = env.isFontInstalled(name) ||\n        lists.contains(this.options.fontNamesIgnoreCheck, name);\n    }\n    return this.fontInstalledMap[name];\n  }\n\n  isFontDeservedToAdd(name) {\n    name = name.toLowerCase();\n    return (name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1);\n  }\n\n  colorPalette(className, tooltip, backColor, foreColor) {\n    return this.ui.buttonGroup({\n      className: 'note-color ' + className,\n      children: [\n        this.button({\n          className: 'note-current-color-button',\n          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),\n          tooltip: tooltip,\n          click: (e) => {\n            const $button = $(e.currentTarget);\n            if (backColor && foreColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n                foreColor: $button.attr('data-foreColor'),\n              });\n            } else if (backColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n              });\n            } else if (foreColor) {\n              this.context.invoke('editor.color', {\n                foreColor: $button.attr('data-foreColor'),\n              });\n            }\n          },\n          callback: ($button) => {\n            const $recentColor = $button.find('.note-recent-color');\n            if (backColor) {\n              $recentColor.css('background-color', this.options.colorButton.backColor);\n              $button.attr('data-backColor', this.options.colorButton.backColor);\n            }\n            if (foreColor) {\n              $recentColor.css('color', this.options.colorButton.foreColor);\n              $button.attr('data-foreColor', this.options.colorButton.foreColor);\n            } else {\n              $recentColor.css('color', 'transparent');\n            }\n          },\n        }),\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('', this.options),\n          tooltip: this.lang.color.more,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          items: (backColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.background + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"backColor\" data-value=\"transparent\">',\n                  this.lang.color.transparent,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"backColor\"><!-- back colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"backColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"backColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.backColor + '\" data-event=\"backColorPalette-'+this.options.id+'\">',\n              '</div>',\n              '<div class=\"note-holder-custom\" id=\"backColorPalette-'+this.options.id+'\" data-event=\"backColor\"></div>',\n            '</div>',\n          ].join('') : '') +\n          (foreColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.foreground + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                  this.lang.color.resetToDefault,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"foreColor\"><!-- fore colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"foreColorPicker-'+this.options.id+'\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"foreColorPicker-'+this.options.id+'\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.foreColor + '\" data-event=\"foreColorPalette-'+this.options.id+'\">',\n              '</div>', // Fix missing Div, Commented to find easily if it's wrong\n              '<div class=\"note-holder-custom\" id=\"foreColorPalette-'+this.options.id+'\" data-event=\"foreColor\"></div>',\n            '</div>',\n          ].join('') : ''),\n          callback: ($dropdown) => {\n            $dropdown.find('.note-holder').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: this.options.colors,\n                colorsName: this.options.colorsName,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            /* TODO: do we have to record recent custom colors within cookies? */\n            var customColors = [\n              ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF'],\n            ];\n            $dropdown.find('.note-holder-custom').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: customColors,\n                colorsName: customColors,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            $dropdown.find('input[type=color]').each((idx, item) => {\n              $(item).change(function() {\n                const $chip = $dropdown.find('#' + $(this).data('event')).find('.note-color-btn').first();\n                const color = this.value.toUpperCase();\n                $chip.css('background-color', color)\n                  .attr('aria-label', color)\n                  .attr('data-value', color)\n                  .attr('data-original-title', color);\n                $chip.click();\n              });\n            });\n          },\n          click: (event) => {\n            event.stopPropagation();\n\n            const $parent = $('.' + className).find('.note-dropdown-menu');\n            const $button = $(event.target);\n            const eventName = $button.data('event');\n            const value = $button.attr('data-value');\n\n            if (eventName === 'openPalette') {\n              const $picker = $parent.find('#' + value);\n              const $palette = $($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]);\n\n              // Shift palette chips\n              const $chip = $palette.find('.note-color-btn').last().detach();\n\n              // Set chip attributes\n              const color = $picker.val();\n              $chip.css('background-color', color)\n                .attr('aria-label', color)\n                .attr('data-value', color)\n                .attr('data-original-title', color);\n              $palette.prepend($chip);\n              $picker.click();\n            } else {\n              if (lists.contains(['backColor', 'foreColor'], eventName)) {\n                const key = eventName === 'backColor' ? 'background-color' : 'color';\n                const $color = $button.closest('.note-color').find('.note-recent-color');\n                const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n                $color.css(key, value);\n                $currentButton.attr('data-' + eventName, value);\n              }\n              this.context.invoke('editor.' + eventName, value);\n            }\n          },\n        }),\n      ],\n    }).render();\n  }\n\n  addToolbarButtons() {\n    this.context.memo('button.style', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            this.ui.icon(this.options.icons.magic), this.options\n          ),\n          tooltip: this.lang.style.style,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          className: 'dropdown-style',\n          items: this.options.styleTags,\n          title: this.lang.style.style,\n          template: (item) => {\n            // TBD: need to be simplified\n            if (typeof item === 'string') {\n              item = {\n                tag: item,\n                title: (Object.prototype.hasOwnProperty.call(this.lang.style, item) ? this.lang.style[item] : item),\n              };\n            }\n\n            const tag = item.tag;\n            const title = item.title;\n            const style = item.style ? ' style=\"' + item.style + '\" ' : '';\n            const className = item.className ? ' class=\"' + item.className + '\"' : '';\n\n            return '<' + tag + style + className + '>' + title + '</' + tag + '>';\n          },\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }),\n      ]).render();\n    });\n\n    for (let styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {\n      const item = this.options.styleTags[styleIdx];\n\n      this.context.memo('button.style.' + item, () => {\n        return this.button({\n          className: 'note-btn-style-' + item,\n          contents: '<div data-value=\"' + item + '\">' + item.toUpperCase() + '</div>',\n          tooltip: this.lang.style[item],\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }).render();\n      });\n    }\n\n    this.context.memo('button.bold', () => {\n      return this.button({\n        className: 'note-btn-bold',\n        contents: this.ui.icon(this.options.icons.bold),\n        tooltip: this.lang.font.bold + this.representShortcut('bold'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.bold'),\n      }).render();\n    });\n\n    this.context.memo('button.italic', () => {\n      return this.button({\n        className: 'note-btn-italic',\n        contents: this.ui.icon(this.options.icons.italic),\n        tooltip: this.lang.font.italic + this.representShortcut('italic'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.italic'),\n      }).render();\n    });\n\n    this.context.memo('button.underline', () => {\n      return this.button({\n        className: 'note-btn-underline',\n        contents: this.ui.icon(this.options.icons.underline),\n        tooltip: this.lang.font.underline + this.representShortcut('underline'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.underline'),\n      }).render();\n    });\n\n    this.context.memo('button.clear', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.eraser),\n        tooltip: this.lang.font.clear + this.representShortcut('removeFormat'),\n        click: this.context.createInvokeHandler('editor.removeFormat'),\n      }).render();\n    });\n\n    this.context.memo('button.strikethrough', () => {\n      return this.button({\n        className: 'note-btn-strikethrough',\n        contents: this.ui.icon(this.options.icons.strikethrough),\n        tooltip: this.lang.font.strikethrough + this.representShortcut('strikethrough'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.strikethrough'),\n      }).render();\n    });\n\n    this.context.memo('button.superscript', () => {\n      return this.button({\n        className: 'note-btn-superscript',\n        contents: this.ui.icon(this.options.icons.superscript),\n        tooltip: this.lang.font.superscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.superscript'),\n      }).render();\n    });\n\n    this.context.memo('button.subscript', () => {\n      return this.button({\n        className: 'note-btn-subscript',\n        contents: this.ui.icon(this.options.icons.subscript),\n        tooltip: this.lang.font.subscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.subscript'),\n      }).render();\n    });\n\n    this.context.memo('button.fontname', () => {\n      const styleInfo = this.context.invoke('editor.currentStyle');\n\n      if (this.options.addDefaultFonts) {\n        // Add 'default' fonts into the fontnames array if not exist\n        $.each(styleInfo['font-family'].split(','), (idx, fontname) => {\n          fontname = fontname.trim().replace(/['\"]+/g, '');\n          if (this.isFontDeservedToAdd(fontname)) {\n            if (this.options.fontNames.indexOf(fontname) === -1) {\n              this.options.fontNames.push(fontname);\n            }\n          }\n        });\n      }\n\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            '<span class=\"note-current-fontname\"></span>', this.options\n          ),\n          tooltip: this.lang.font.name,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontname',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontNames.filter(this.isFontInstalled.bind(this)),\n          title: this.lang.font.name,\n          template: (item) => {\n            return '<span style=\"font-family: ' + env.validFontName(item) + '\">' + item + '</span>';\n          },\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontName'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsize', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsize\"></span>', this.options),\n          tooltip: this.lang.font.size,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsize',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizes,\n          title: this.lang.font.size,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSize'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsizeunit', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsizeunit\"></span>', this.options),\n          tooltip: this.lang.font.sizeunit,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsizeunit',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizeUnits,\n          title: this.lang.font.sizeunit,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.color', () => {\n      return this.colorPalette('note-color-all', this.lang.color.recent, true, true);\n    });\n\n    this.context.memo('button.forecolor', () => {\n      return this.colorPalette('note-color-fore', this.lang.color.foreground, false, true);\n    });\n\n    this.context.memo('button.backcolor', () => {\n      return this.colorPalette('note-color-back', this.lang.color.background, true, false);\n    });\n\n    this.context.memo('button.ul', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unorderedlist),\n        tooltip: this.lang.lists.unordered + this.representShortcut('insertUnorderedList'),\n        click: this.context.createInvokeHandler('editor.insertUnorderedList'),\n      }).render();\n    });\n\n    this.context.memo('button.ol', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.orderedlist),\n        tooltip: this.lang.lists.ordered + this.representShortcut('insertOrderedList'),\n        click: this.context.createInvokeHandler('editor.insertOrderedList'),\n      }).render();\n    });\n\n    const justifyLeft = this.button({\n      contents: this.ui.icon(this.options.icons.alignLeft),\n      tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),\n      click: this.context.createInvokeHandler('editor.justifyLeft'),\n    });\n\n    const justifyCenter = this.button({\n      contents: this.ui.icon(this.options.icons.alignCenter),\n      tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),\n      click: this.context.createInvokeHandler('editor.justifyCenter'),\n    });\n\n    const justifyRight = this.button({\n      contents: this.ui.icon(this.options.icons.alignRight),\n      tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),\n      click: this.context.createInvokeHandler('editor.justifyRight'),\n    });\n\n    const justifyFull = this.button({\n      contents: this.ui.icon(this.options.icons.alignJustify),\n      tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),\n      click: this.context.createInvokeHandler('editor.justifyFull'),\n    });\n\n    const outdent = this.button({\n      contents: this.ui.icon(this.options.icons.outdent),\n      tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),\n      click: this.context.createInvokeHandler('editor.outdent'),\n    });\n\n    const indent = this.button({\n      contents: this.ui.icon(this.options.icons.indent),\n      tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),\n      click: this.context.createInvokeHandler('editor.indent'),\n    });\n\n    this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));\n    this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));\n    this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));\n    this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));\n    this.context.memo('button.outdent', func.invoke(outdent, 'render'));\n    this.context.memo('button.indent', func.invoke(indent, 'render'));\n\n    this.context.memo('button.paragraph', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.alignLeft), this.options),\n          tooltip: this.lang.paragraph.paragraph,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown([\n          this.ui.buttonGroup({\n            className: 'note-align',\n            children: [justifyLeft, justifyCenter, justifyRight, justifyFull],\n          }),\n          this.ui.buttonGroup({\n            className: 'note-list',\n            children: [outdent, indent],\n          }),\n        ]),\n      ]).render();\n    });\n\n    this.context.memo('button.height', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.textHeight), this.options),\n          tooltip: this.lang.font.height,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          items: this.options.lineHeights,\n          checkClassName: this.options.icons.menuCheck,\n          className: 'dropdown-line-height',\n          title: this.lang.font.height,\n          click: this.context.createInvokeHandler('editor.lineHeight'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.table', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.table), this.options),\n          tooltip: this.lang.table.table,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          title: this.lang.table.table,\n          className: 'note-table',\n          items: [\n            '<div class=\"note-dimension-picker\">',\n              '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n              '<div class=\"note-dimension-picker-highlighted\"></div>',\n              '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n            '</div>',\n            '<div class=\"note-dimension-display\">1 x 1</div>',\n          ].join(''),\n        }),\n      ], {\n        callback: ($node) => {\n          const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n          $catcher.css({\n            width: this.options.insertTableMaxSize.col + 'em',\n            height: this.options.insertTableMaxSize.row + 'em',\n          }).mouseup(this.context.createInvokeHandler('editor.insertTable'))\n            .on('mousemove', this.tableMoveHandler.bind(this));\n        },\n      }).render();\n    });\n\n    this.context.memo('button.link', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.link + this.representShortcut('linkDialog.show'),\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.picture', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.picture),\n        tooltip: this.lang.image.image,\n        click: this.context.createInvokeHandler('imageDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.video', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.video),\n        tooltip: this.lang.video.video,\n        click: this.context.createInvokeHandler('videoDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.hr', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.minus),\n        tooltip: this.lang.hr.insert + this.representShortcut('insertHorizontalRule'),\n        click: this.context.createInvokeHandler('editor.insertHorizontalRule'),\n      }).render();\n    });\n\n    this.context.memo('button.fullscreen', () => {\n      return this.button({\n        className: 'btn-fullscreen note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.arrowsAlt),\n        tooltip: this.lang.options.fullscreen,\n        click: this.context.createInvokeHandler('fullscreen.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.codeview', () => {\n      return this.button({\n        className: 'btn-codeview note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.code),\n        tooltip: this.lang.options.codeview,\n        click: this.context.createInvokeHandler('codeview.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.redo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.redo),\n        tooltip: this.lang.history.redo + this.representShortcut('redo'),\n        click: this.context.createInvokeHandler('editor.redo'),\n      }).render();\n    });\n\n    this.context.memo('button.undo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.undo),\n        tooltip: this.lang.history.undo + this.representShortcut('undo'),\n        click: this.context.createInvokeHandler('editor.undo'),\n      }).render();\n    });\n\n    this.context.memo('button.help', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.question),\n        tooltip: this.lang.options.help,\n        click: this.context.createInvokeHandler('helpDialog.show'),\n      }).render();\n    });\n  }\n\n  /**\n   * image: [\n   *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n   *   ['float', ['floatLeft', 'floatRight', 'floatNone']],\n   *   ['remove', ['removeMedia']],\n   * ],\n   */\n  addImagePopoverButtons() {\n    // Image Size Buttons\n    this.context.memo('button.resizeFull', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">100%</span>',\n        tooltip: this.lang.image.resizeFull,\n        click: this.context.createInvokeHandler('editor.resize', '1'),\n      }).render();\n    });\n    this.context.memo('button.resizeHalf', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">50%</span>',\n        tooltip: this.lang.image.resizeHalf,\n        click: this.context.createInvokeHandler('editor.resize', '0.5'),\n      }).render();\n    });\n    this.context.memo('button.resizeQuarter', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">25%</span>',\n        tooltip: this.lang.image.resizeQuarter,\n        click: this.context.createInvokeHandler('editor.resize', '0.25'),\n      }).render();\n    });\n    this.context.memo('button.resizeNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.resizeNone,\n        click: this.context.createInvokeHandler('editor.resize', '0'),\n      }).render();\n    });\n\n    // Float Buttons\n    this.context.memo('button.floatLeft', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatLeft),\n        tooltip: this.lang.image.floatLeft,\n        click: this.context.createInvokeHandler('editor.floatMe', 'left'),\n      }).render();\n    });\n\n    this.context.memo('button.floatRight', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatRight),\n        tooltip: this.lang.image.floatRight,\n        click: this.context.createInvokeHandler('editor.floatMe', 'right'),\n      }).render();\n    });\n\n    this.context.memo('button.floatNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.floatNone,\n        click: this.context.createInvokeHandler('editor.floatMe', 'none'),\n      }).render();\n    });\n\n    // Remove Buttons\n    this.context.memo('button.removeMedia', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.image.remove,\n        click: this.context.createInvokeHandler('editor.removeMedia'),\n      }).render();\n    });\n  }\n\n  addLinkPopoverButtons() {\n    this.context.memo('button.linkDialogShow', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.edit,\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.unlink', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unlink),\n        tooltip: this.lang.link.unlink,\n        click: this.context.createInvokeHandler('editor.unlink'),\n      }).render();\n    });\n  }\n\n  /**\n   * table : [\n   *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n   *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]\n   * ],\n   */\n  addTablePopoverButtons() {\n    this.context.memo('button.addRowUp', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowAbove),\n        tooltip: this.lang.table.addRowAbove,\n        click: this.context.createInvokeHandler('editor.addRow', 'top'),\n      }).render();\n    });\n    this.context.memo('button.addRowDown', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowBelow),\n        tooltip: this.lang.table.addRowBelow,\n        click: this.context.createInvokeHandler('editor.addRow', 'bottom'),\n      }).render();\n    });\n    this.context.memo('button.addColLeft', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colBefore),\n        tooltip: this.lang.table.addColLeft,\n        click: this.context.createInvokeHandler('editor.addCol', 'left'),\n      }).render();\n    });\n    this.context.memo('button.addColRight', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colAfter),\n        tooltip: this.lang.table.addColRight,\n        click: this.context.createInvokeHandler('editor.addCol', 'right'),\n      }).render();\n    });\n    this.context.memo('button.deleteRow', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowRemove),\n        tooltip: this.lang.table.delRow,\n        click: this.context.createInvokeHandler('editor.deleteRow'),\n      }).render();\n    });\n    this.context.memo('button.deleteCol', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colRemove),\n        tooltip: this.lang.table.delCol,\n        click: this.context.createInvokeHandler('editor.deleteCol'),\n      }).render();\n    });\n    this.context.memo('button.deleteTable', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.table.delTable,\n        click: this.context.createInvokeHandler('editor.deleteTable'),\n      }).render();\n    });\n  }\n\n  build($container, groups) {\n    for (let groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {\n      const group = groups[groupIdx];\n      const groupName = Array.isArray(group) ? group[0] : group;\n      const buttons = Array.isArray(group) ? ((group.length === 1) ? [group[0]] : group[1]) : [group];\n\n      const $group = this.ui.buttonGroup({\n        className: 'note-' + groupName,\n      }).render();\n\n      for (let idx = 0, len = buttons.length; idx < len; idx++) {\n        const btn = this.context.memo('button.' + buttons[idx]);\n        if (btn) {\n          $group.append(typeof btn === 'function' ? btn(this.context) : btn);\n        }\n      }\n      $group.appendTo($container);\n    }\n  }\n\n  /**\n   * @param {jQuery} [$container]\n   */\n  updateCurrentStyle($container) {\n    const $cont = $container || this.$toolbar;\n\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    this.updateBtnStates($cont, {\n      '.note-btn-bold': () => {\n        return styleInfo['font-bold'] === 'bold';\n      },\n      '.note-btn-italic': () => {\n        return styleInfo['font-italic'] === 'italic';\n      },\n      '.note-btn-underline': () => {\n        return styleInfo['font-underline'] === 'underline';\n      },\n      '.note-btn-subscript': () => {\n        return styleInfo['font-subscript'] === 'subscript';\n      },\n      '.note-btn-superscript': () => {\n        return styleInfo['font-superscript'] === 'superscript';\n      },\n      '.note-btn-strikethrough': () => {\n        return styleInfo['font-strikethrough'] === 'strikethrough';\n      },\n    });\n\n    if (styleInfo['font-family']) {\n      const fontNames = styleInfo['font-family'].split(',').map((name) => {\n        return name.replace(/[\\'\\\"]/g, '')\n          .replace(/\\s+$/, '')\n          .replace(/^\\s+/, '');\n      });\n      const fontName = lists.find(fontNames, this.isFontInstalled.bind(this));\n\n      $cont.find('.dropdown-fontname a').each((idx, item) => {\n        const $item = $(item);\n        // always compare string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontName + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);\n    }\n\n    if (styleInfo['font-size']) {\n      const fontSize = styleInfo['font-size'];\n      $cont.find('.dropdown-fontsize a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontSize + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsize').text(fontSize);\n\n      const fontSizeUnit = styleInfo['font-size-unit'];\n      $cont.find('.dropdown-fontsizeunit a').each((idx, item) => {\n        const $item = $(item);\n        const isChecked = ($item.data('value') + '') === (fontSizeUnit + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);\n    }\n\n    if (styleInfo['line-height']) {\n      const lineHeight = styleInfo['line-height'];\n      $cont.find('.dropdown-line-height a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($(item).data('value') + '') === (lineHeight + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-line-height').text(lineHeight);\n    }\n  }\n\n  updateBtnStates($container, infos) {\n    $.each(infos, (selector, pred) => {\n      this.ui.toggleBtnActive($container.find(selector), pred());\n    });\n  }\n\n  tableMoveHandler(event) {\n    const PX_PER_EM = 18;\n    const $picker = $(event.target.parentNode); // target is mousecatcher\n    const $dimensionDisplay = $picker.next();\n    const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n    const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n    const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n    let posOffset;\n    // HTML5 with jQuery - e.offsetX is undefined in Firefox\n    if (event.offsetX === undefined) {\n      const posCatcher = $(event.target).offset();\n      posOffset = {\n        x: event.pageX - posCatcher.left,\n        y: event.pageY - posCatcher.top,\n      };\n    } else {\n      posOffset = {\n        x: event.offsetX,\n        y: event.offsetY,\n      };\n    }\n\n    const dim = {\n      c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n      r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n    };\n\n    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n    $catcher.data('value', dim.c + 'x' + dim.r);\n\n    if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {\n      $unhighlighted.css({ width: dim.c + 1 + 'em' });\n    }\n\n    if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {\n      $unhighlighted.css({ height: dim.r + 1 + 'em' });\n    }\n\n    $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n  }\n}\n","import $ from 'jquery';\nexport default class Toolbar {\n  constructor(context) {\n    this.context = context;\n\n    this.$window = $(window);\n    this.$document = $(document);\n\n    this.ui = $.summernote.ui;\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.options = context.options;\n\n    this.isFollowing = false;\n    this.followScroll = this.followScroll.bind(this);\n  }\n\n  shouldInitialize() {\n    return !this.options.airMode;\n  }\n\n  initialize() {\n    this.options.toolbar = this.options.toolbar || [];\n\n    if (!this.options.toolbar.length) {\n      this.$toolbar.hide();\n    } else {\n      this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);\n    }\n\n    if (this.options.toolbarContainer) {\n      this.$toolbar.appendTo(this.options.toolbarContainer);\n    }\n\n    this.changeContainer(false);\n\n    this.$note.on('summernote.keyup summernote.mouseup summernote.change', () => {\n      this.context.invoke('buttons.updateCurrentStyle');\n    });\n\n    this.context.invoke('buttons.updateCurrentStyle');\n    if (this.options.followingToolbar) {\n      this.$window.on('scroll resize', this.followScroll);\n    }\n  }\n\n  destroy() {\n    this.$toolbar.children().remove();\n\n    if (this.options.followingToolbar) {\n      this.$window.off('scroll resize', this.followScroll);\n    }\n  }\n\n  followScroll() {\n    if (this.$editor.hasClass('fullscreen')) {\n      return false;\n    }\n\n    const editorHeight = this.$editor.outerHeight();\n    const editorWidth = this.$editor.width();\n    const toolbarHeight = this.$toolbar.height();\n    const statusbarHeight = this.$statusbar.height();\n\n    // check if the web app is currently using another static bar\n    let otherBarHeight = 0;\n    if (this.options.otherStaticBar) {\n      otherBarHeight = $(this.options.otherStaticBar).outerHeight();\n    }\n\n    const currentOffset = this.$document.scrollTop();\n    const editorOffsetTop = this.$editor.offset().top;\n    const editorOffsetBottom = editorOffsetTop + editorHeight;\n    const activateOffset = editorOffsetTop - otherBarHeight;\n    const deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;\n\n    if (!this.isFollowing &&\n      (currentOffset > activateOffset) && (currentOffset < deactivateOffsetBottom - toolbarHeight)) {\n      this.isFollowing = true;\n      this.$editable.css({\n        marginTop: this.$toolbar.outerHeight(),\n      });\n      this.$toolbar.css({\n        position: 'fixed',\n        top: otherBarHeight,\n        width: editorWidth,\n        zIndex: 1000,\n      });\n    } else if (this.isFollowing &&\n      ((currentOffset < activateOffset) || (currentOffset > deactivateOffsetBottom))) {\n      this.isFollowing = false;\n      this.$toolbar.css({\n        position: 'relative',\n        top: 0,\n        width: '100%',\n        zIndex: 'auto',\n      });\n      this.$editable.css({\n        marginTop: '',\n      });\n    }\n  }\n\n  changeContainer(isFullscreen) {\n    if (isFullscreen) {\n      this.$toolbar.prependTo(this.$editor);\n    } else {\n      if (this.options.toolbarContainer) {\n        this.$toolbar.appendTo(this.options.toolbarContainer);\n      }\n    }\n    if (this.options.followingToolbar) {\n      this.followScroll();\n    }\n  }\n\n  updateFullscreen(isFullscreen) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);\n\n    this.changeContainer(isFullscreen);\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  }\n\n  activate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, true);\n  }\n\n  deactivate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, false);\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\n\nexport default class LinkDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-txt-${this.options.id}\" class=\"note-form-label\">${this.lang.link.textToDisplay}</label>`,\n        `<input id=\"note-dialog-link-txt-${this.options.id}\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-url-${this.options.id}\" class=\"note-form-label\">${this.lang.link.url}</label>`,\n        `<input id=\"note-dialog-link-url-${this.options.id}\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>`,\n      '</div>',\n      !this.options.disableLinkTarget\n        ? $('<div></div>').append(this.ui.checkbox({\n          className: 'sn-checkbox-open-in-new-window',\n          text: this.lang.link.openInNewWindow,\n          checked: true,\n        }).render()).html()\n        : '',\n      $('<div></div>').append(this.ui.checkbox({\n        className: 'sn-checkbox-use-protocol',\n        text: this.lang.link.useProtocol,\n        checked: true,\n      }).render()).html(),\n    ].join('');\n\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.link.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      className: 'link-dialog',\n      title: this.lang.link.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  /**\n   * toggle update button\n   */\n  toggleLinkBtn($linkBtn, $linkText, $linkUrl) {\n    this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());\n  }\n\n  /**\n   * Show link dialog and set event handlers on dialog controls.\n   *\n   * @param {Object} linkInfo\n   * @return {Promise}\n   */\n  showLinkDialog(linkInfo) {\n    return $.Deferred((deferred) => {\n      const $linkText = this.$dialog.find('.note-link-text');\n      const $linkUrl = this.$dialog.find('.note-link-url');\n      const $linkBtn = this.$dialog.find('.note-link-btn');\n      const $openInNewWindow = this.$dialog\n        .find('.sn-checkbox-open-in-new-window input[type=checkbox]');\n      const $useProtocol = this.$dialog\n        .find('.sn-checkbox-use-protocol input[type=checkbox]');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // If no url was given and given text is valid URL then copy that into URL Field\n        if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {\n          linkInfo.url = linkInfo.text;\n        }\n\n        $linkText.on('input paste propertychange', () => {\n          // If linktext was modified by input events,\n          // cloning text from linkUrl will be stopped.\n          linkInfo.text = $linkText.val();\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.text);\n\n        $linkUrl.on('input paste propertychange', () => {\n          // Display same text on `Text to display` as default\n          // when linktext has no text\n          if (!linkInfo.text) {\n            $linkText.val($linkUrl.val());\n          }\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.url);\n\n        if (!env.isSupportTouch) {\n          $linkUrl.trigger('focus');\n        }\n\n        this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        this.bindEnterKey($linkUrl, $linkBtn);\n        this.bindEnterKey($linkText, $linkBtn);\n\n        const isNewWindowChecked = linkInfo.isNewWindow !== undefined\n          ? linkInfo.isNewWindow : this.context.options.linkTargetBlank;\n\n        $openInNewWindow.prop('checked', isNewWindowChecked);\n\n        const useProtocolChecked = linkInfo.url\n          ? false : this.context.options.useProtocol;\n\n        $useProtocol.prop('checked', useProtocolChecked);\n\n        $linkBtn.one('click', (event) => {\n          event.preventDefault();\n\n          deferred.resolve({\n            range: linkInfo.range,\n            url: $linkUrl.val(),\n            text: $linkText.val(),\n            isNewWindow: $openInNewWindow.is(':checked'),\n            checkProtocol: $useProtocol.is(':checked'),\n          });\n          this.ui.hideDialog(this.$dialog);\n        });\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        // detach events\n        $linkText.off();\n        $linkUrl.off();\n        $linkBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  /**\n   * @param {Object} layoutInfo\n   */\n  show() {\n    const linkInfo = this.context.invoke('editor.getLinkInfo');\n\n    this.context.invoke('editor.saveRange');\n    this.showLinkDialog(linkInfo).then((linkInfo) => {\n      this.context.invoke('editor.restoreRange');\n      this.context.invoke('editor.createLink', linkInfo);\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class LinkPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.link);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-link-popover',\n      callback: ($node) => {\n        const $content = $node.find('.popover-content,.note-popover-content');\n        $content.prepend('<span><a target=\"_blank\"></a>&nbsp;</span>');\n      },\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.link);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update() {\n    // Prevent focusing on editable when invoke('code') is executed\n    if (!this.context.invoke('editor.hasFocus')) {\n      this.hide();\n      return;\n    }\n\n    const rng = this.context.invoke('editor.getLastRange');\n    if (rng.isCollapsed() && rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      const href = $(anchor).attr('href');\n      this.$popover.find('a').attr('href', href).text(href);\n\n      const pos = dom.posFromPlaceholder(anchor);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class ImageDialog {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    let imageLimitation = '';\n    if (this.options.maximumImageFileSize) {\n      const unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));\n      const readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +\n                         ' ' + ' KMGTP'[unit] + 'B';\n      imageLimitation = `<small>${this.lang.image.maximumFileSize + ' : ' + readableSize}</small>`;\n    }\n\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group note-group-select-from-files\">',\n        '<label for=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.selectFromFiles + '</label>',\n        '<input id=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-image-input form-control-file note-form-control note-input\" ',\n        ' type=\"file\" name=\"files\" accept=\"'+this.options.acceptImageFileTypes+'\" multiple=\"multiple\"/>',\n        imageLimitation,\n      '</div>',\n      '<div class=\"form-group note-group-image-url\">',\n        '<label for=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.url + '</label>',\n        '<input id=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-image-url form-control note-form-control note-input\" type=\"text\"/>',\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.image.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.image.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showImageDialog().then((data) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      if (typeof data === 'string') { // image url\n        // If onImageLinkInsert set,\n        if (this.options.callbacks.onImageLinkInsert) {\n          this.context.triggerEvent('image.link.insert', data);\n        } else {\n          this.context.invoke('editor.insertImage', data);\n        }\n      } else { // array of files\n        this.context.invoke('editor.insertImagesOrCallback', data);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show image dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showImageDialog() {\n    return $.Deferred((deferred) => {\n      const $imageInput = this.$dialog.find('.note-image-input');\n      const $imageUrl = this.$dialog.find('.note-image-url');\n      const $imageBtn = this.$dialog.find('.note-image-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // Cloning imageInput to clear element.\n        $imageInput.replaceWith($imageInput.clone().on('change', (event) => {\n          deferred.resolve(event.target.files || event.target.value);\n        }).val(''));\n\n        $imageUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($imageBtn, $imageUrl.val());\n        }).val('');\n\n        if (!env.isSupportTouch) {\n          $imageUrl.trigger('focus');\n        }\n\n        $imageBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($imageUrl.val());\n        });\n\n        this.bindEnterKey($imageUrl, $imageBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $imageInput.off();\n        $imageUrl.off();\n        $imageBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\n/**\n * Image popover module\n *  mouse events that show/hide popover will be handled by Handle.js.\n *  Handle.js will receive the events and invoke 'imagePopover.update'.\n */\nexport default class ImagePopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n\n    this.editable = context.layoutInfo.editable[0];\n    this.options = context.options;\n\n    this.events = {\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.image);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-image-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n    this.context.invoke('buttons.build', $content, this.options.popover.image);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target, event) {\n    if (dom.isImg(target)) {\n      const position = $(target).offset();\n      const containerOffset = $(this.options.container).offset();\n      let pos = {};\n      if (this.options.popatmouse) {\n        pos.left = event.pageX - 20;\n        pos.top = event.pageY;\n      } else {\n        pos = position;\n      }\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class TablePopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        this.update(e.target);\n      },\n      'summernote.keyup summernote.scroll summernote.change': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown': () => {\n        this.hide();\n      },\n      'summernote.blur': (we, e) => {\n        if (e.originalEvent && e.originalEvent.relatedTarget) {\n          if (!this.$popover[0].contains(e.originalEvent.relatedTarget)) {\n            this.hide();\n          }\n        } else {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.table);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-table-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.table);\n\n    // [workaround] Disable Firefox's default table editor\n    if (env.isFF) {\n      document.execCommand('enableInlineTableEditing', false, false);\n    }\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isCell = dom.isCell(target) || dom.isCell(target?.parentElement);\n\n    if (isCell) {\n      const pos = dom.posFromPlaceholder(target);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n\n    return isCell;\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class VideoDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group row-fluid\">',\n        `<label for=\"note-dialog-video-url-${this.options.id}\" class=\"note-form-label\">${this.lang.video.url} <small class=\"text-muted\">${this.lang.video.providers}</small></label>`,\n        `<input id=\"note-dialog-video-url-${this.options.id}\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.video.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.video.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  createVideoNode(url) {\n    // video url patterns(youtube, instagram, vimeo, dailymotion, youku, peertube, mp4, ogg, webm)\n    const ytRegExp = /\\/\\/(?:(?:www|m)\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))([\\w|-]{11})(?:(?:[\\?&]t=)(\\S+))?$/;\n    const ytRegExpForStart = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n    const ytMatch = url.match(ytRegExp);\n\n    const gdRegExp = /(?:\\.|\\/\\/)drive\\.google\\.com\\/file\\/d\\/(.[a-zA-Z0-9_-]*)\\/view/;\n    const gdMatch = url.match(gdRegExp);\n\n    const igRegExp = /(?:www\\.|\\/\\/)instagram\\.com\\/p\\/(.[a-zA-Z0-9_-]*)/;\n    const igMatch = url.match(igRegExp);\n\n    const vRegExp = /\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9]+)/;\n    const vMatch = url.match(vRegExp);\n\n    const vimRegExp = /\\/\\/(player\\.)?vimeo\\.com\\/([a-z]*\\/)*(\\d+)[?]?.*/;\n    const vimMatch = url.match(vimRegExp);\n\n    const dmRegExp = /.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?/;\n    const dmMatch = url.match(dmRegExp);\n\n    const youkuRegExp = /\\/\\/v\\.youku\\.com\\/v_show\\/id_(\\w+)=*\\.html/;\n    const youkuMatch = url.match(youkuRegExp);\n\n    const peerTubeRegExp =/\\/\\/(.*)\\/videos\\/watch\\/([^?]*)(?:\\?(?:start=(\\w*))?(?:&stop=(\\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/; \n    const peerTubeMatch = url.match(peerTubeRegExp);\n\n    const qqRegExp = /\\/\\/v\\.qq\\.com.*?vid=(.+)/;\n    const qqMatch = url.match(qqRegExp);\n\n    const qqRegExp2 = /\\/\\/v\\.qq\\.com\\/x?\\/?(page|cover).*?\\/([^\\/]+)\\.html\\??.*/;\n    const qqMatch2 = url.match(qqRegExp2);\n\n    const mp4RegExp = /^.+.(mp4|m4v)$/;\n    const mp4Match = url.match(mp4RegExp);\n\n    const oggRegExp = /^.+.(ogg|ogv)$/;\n    const oggMatch = url.match(oggRegExp);\n\n    const webmRegExp = /^.+.(webm)$/;\n    const webmMatch = url.match(webmRegExp);\n\n    const fbRegExp = /(?:www\\.|\\/\\/)facebook\\.com\\/([^\\/]+)\\/videos\\/([0-9]+)/;\n    const fbMatch = url.match(fbRegExp);\n\n    let $video;\n    if (ytMatch && ytMatch[1].length === 11) {\n      const youtubeId = ytMatch[1];\n      var start = 0;\n      if (typeof ytMatch[2] !== 'undefined') {\n        const ytMatchForStart = ytMatch[2].match(ytRegExpForStart);\n        if (ytMatchForStart) {\n          for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {\n            start += (typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0);\n          }\n        }\n      }\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : ''))\n        .attr('width', '640').attr('height', '360');\n    } else if (gdMatch && gdMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://drive.google.com/file/d/' + gdMatch[1] + '/preview')\n        .attr('width', '640').attr('height', '480');\n    } else if (igMatch && igMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/')\n        .attr('width', '612').attr('height', '710')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else if (vMatch && vMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', vMatch[0] + '/embed/simple')\n        .attr('width', '600').attr('height', '600')\n        .attr('class', 'vine-embed');\n    } else if (vimMatch && vimMatch[3].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('src', '//player.vimeo.com/video/' + vimMatch[3])\n        .attr('width', '640').attr('height', '360');\n    } else if (dmMatch && dmMatch[2].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2])\n        .attr('width', '640').attr('height', '360');\n    } else if (youkuMatch && youkuMatch[1].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '498')\n        .attr('width', '510')\n        .attr('src', '//player.youku.com/embed/' + youkuMatch[1]);\n    } else if (peerTubeMatch && peerTubeMatch[0].length){\n      var begin = 0;\n      if (peerTubeMatch[2] !== 'undefined') begin = peerTubeMatch[2];\n      var end =0;\n      if (peerTubeMatch[3] !== 'undefined') end = peerTubeMatch[3];\n      var loop = 0;\n      if (peerTubeMatch[4] !== 'undefined') loop = peerTubeMatch[4];\n      var autoplay = 0;\n      if (peerTubeMatch[5] !== 'undefined') autoplay = peerTubeMatch[5];\n      var muted = 0;\n      if (peerTubeMatch[6] !== 'undefined') muted = peerTubeMatch[6];\n      $video = $('<iframe allowfullscreen sandbox=\"allow-same-origin allow-scripts allow-popups\">')\n        .attr('frameborder', 0)\n        .attr('src', '//'+ peerTubeMatch[1] +'/videos/embed/' + peerTubeMatch[2]+\"?loop=\"+loop\n      +\"&autoplay=\"+autoplay+\"&muted=\"+muted +(begin > 0 ? '&start=' + begin : '')+(end > 0 ? '&end=' + start : ''))\n        .attr('width', '560')\n        .attr('height', '315');\n    }else if ((qqMatch && qqMatch[1].length) || (qqMatch2 && qqMatch2[2].length)) {\n      const vid = ((qqMatch && qqMatch[1].length) ? qqMatch[1] : qqMatch2[2]);\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '310')\n        .attr('width', '500')\n        .attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');\n    } else if (mp4Match || oggMatch || webmMatch) {\n      $video = $('<video controls>')\n        .attr('src', url)\n        .attr('width', '640').attr('height', '360');\n    } else if (fbMatch && fbMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560')\n        .attr('width', '560').attr('height', '301')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else {\n      // this is not a known video link. Now what, Cat? Now what?\n      return false;\n    }\n\n    $video.addClass('note-video-clip');\n\n    return $video[0];\n  }\n\n  show() {\n    const text = this.context.invoke('editor.getSelectedText');\n    this.context.invoke('editor.saveRange');\n    this.showVideoDialog(text).then((url) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      // build node\n      const $node = this.createVideoNode(url);\n\n      if ($node) {\n        // insert video node\n        this.context.invoke('editor.insertNode', $node);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show video dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showVideoDialog(/* text */) {\n    return $.Deferred((deferred) => {\n      const $videoUrl = this.$dialog.find('.note-video-url');\n      const $videoBtn = this.$dialog.find('.note-video-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        $videoUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($videoBtn, $videoUrl.val());\n        });\n\n        if (!env.isSupportTouch) {\n          $videoUrl.trigger('focus');\n        }\n\n        $videoBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($videoUrl.val());\n        });\n\n        this.bindEnterKey($videoUrl, $videoBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $videoUrl.off();\n        $videoBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\n\nexport default class HelpDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<p class=\"text-center\">',\n        '<a href=\"http://summernote.org/\" target=\"_blank\" rel=\"noopener noreferrer\">Summernote @@VERSION@@</a> · ',\n        '<a href=\"https://github.com/summernote/summernote\" target=\"_blank\" rel=\"noopener noreferrer\">Project</a> · ',\n        '<a href=\"https://github.com/summernote/summernote/issues\" target=\"_blank\" rel=\"noopener noreferrer\">Issues</a>',\n      '</p>',\n    ].join('');\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.options.help,\n      fade: this.options.dialogsFade,\n      body: this.createShortcutList(),\n      footer: body,\n      callback: ($node) => {\n        $node.find('.modal-body,.note-modal-body').css({\n          'max-height': 300,\n          'overflow': 'scroll',\n        });\n      },\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  createShortcutList() {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    return Object.keys(keyMap).map((key) => {\n      const command = keyMap[key];\n      const $row = $('<div><div class=\"help-list-item\"></div></div>');\n      $row.append($('<label><kbd>' + key + '</kdb></label>').css({\n        'width': 180,\n        'margin-right': 10,\n      })).append($('<span></span>').html(this.context.memo('help.' + command) || command));\n      return $row.html();\n    }).join('');\n  }\n\n  /**\n   * show help dialog\n   *\n   * @return {Promise}\n   */\n  showHelpDialog() {\n    return $.Deferred((deferred) => {\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n        deferred.resolve();\n      });\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showHelpDialog().then(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\n\nconst AIRMODE_POPOVER_X_OFFSET = -5;\nconst AIRMODE_POPOVER_Y_OFFSET = 5;\n\nexport default class AirPopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n\n    this.hidable = true;\n    this.onContextmenu = false;\n    this.pageX = null;\n    this.pageY = null;\n\n    this.events = {\n      'summernote.contextmenu': (e) => {\n        if (this.options.editing) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.onContextmenu = true;\n          this.update(true);\n        }\n      },\n      'summernote.mousedown': (we, e) => {\n        this.pageX = e.pageX;\n        this.pageY = e.pageY;\n      },\n      'summernote.keyup summernote.mouseup summernote.scroll': (we, e) => {\n        if (this.options.editing && !this.onContextmenu) {\n          this.pageX = e.pageX;\n          this.pageY = e.pageY;\n          this.update();\n        }\n        this.onContextmenu = false;\n      },\n      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.focusout': () => {\n        if (!this.$popover.is(':active,:focus')) {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.options.airMode && !lists.isEmpty(this.options.popover.air);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-air-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.air);\n\n    // disable hiding this popover preemptively by 'summernote.blur' event.\n    this.$popover.on('mousedown', () => { this.hidable = false; });\n    // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).\n    this.$popover.on('mouseup', () => { this.hidable = true; });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(forcelyOpen) {\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {\n      let rect = {\n        left: this.pageX,\n        top: this.pageY,\n      };\n\n      const containerOffset = $(this.options.container).offset();\n      rect.top -= containerOffset.top;\n      rect.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,\n        top: rect.top + AIRMODE_POPOVER_Y_OFFSET,\n      });\n      this.context.invoke('buttons.updateCurrentStyle', this.$popover);\n    } else {\n      this.hide();\n    }\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.hide();\n    } \n  }\n\n  hide() {\n    if (this.hidable) {\n      this.$popover.hide();\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport key from '../core/key';\n\nconst POPOVER_DIST = 5;\n\nexport default class HintPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.hint = this.options.hint || [];\n    this.direction = this.options.hintDirection || 'bottom';\n    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.hints.length > 0;\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n    this.matchingWord = null;\n    this.$popover = this.ui.popover({\n      className: 'note-hint-popover',\n      hideArrow: true,\n      direction: '',\n    }).render().appendTo(this.options.container);\n\n    this.$popover.hide();\n    this.$content = this.$popover.find('.popover-content,.note-popover-content');\n    this.$content.on('click', '.note-hint-item', (e) => {\n      this.$content.find('.active').removeClass('active');\n      $(e.currentTarget).addClass('active');\n      this.replace();\n    });\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  selectItem($item) {\n    this.$content.find('.active').removeClass('active');\n    $item.addClass('active');\n\n    this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);\n  }\n\n  moveDown() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $next = $current.next();\n\n    if ($next.length) {\n      this.selectItem($next);\n    } else {\n      let $nextGroup = $current.parent().next();\n\n      if (!$nextGroup.length) {\n        $nextGroup = this.$content.find('.note-hint-group').first();\n      }\n\n      this.selectItem($nextGroup.find('.note-hint-item').first());\n    }\n  }\n\n  moveUp() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $prev = $current.prev();\n\n    if ($prev.length) {\n      this.selectItem($prev);\n    } else {\n      let $prevGroup = $current.parent().prev();\n\n      if (!$prevGroup.length) {\n        $prevGroup = this.$content.find('.note-hint-group').last();\n      }\n\n      this.selectItem($prevGroup.find('.note-hint-item').last());\n    }\n  }\n\n  replace() {\n    const $item = this.$content.find('.note-hint-item.active');\n\n    if ($item.length) {\n      var node = this.nodeFromItem($item);\n      // If matchingWord length = 0 -> capture OK / open hint / but as mention capture \"\" (\\w*)\n      if (this.matchingWord !== null && this.matchingWord.length === 0) {\n        this.lastWordRange.so = this.lastWordRange.eo;\n      // Else si > 0 and normal case -> adjust range \"before\" for correct position of insertion\n      } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {\n        let rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;\n        if (rangeCompute > 0) {\n          this.lastWordRange.so += rangeCompute;\n        }\n      }\n      this.lastWordRange.insertNode(node);\n\n      if (this.options.hintSelect === 'next') {\n        var blank = document.createTextNode('');\n        $(node).after(blank);\n        range.createFromNodeBefore(blank).select();\n      } else {\n        range.createFromNodeAfter(node).select();\n      }\n\n      this.lastWordRange = null;\n      this.hide();\n      this.context.invoke('editor.focus');\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  nodeFromItem($item) {\n    const hint = this.hints[$item.data('index')];\n    const item = $item.data('item');\n    let node = hint.content ? hint.content(item) : item;\n    if (typeof node === 'string') {\n      node = dom.createText(node);\n    }\n    return node;\n  }\n\n  createItemTemplates(hintIdx, items) {\n    const hint = this.hints[hintIdx];\n    return items.map((item /*, idx */) => {\n      const $item = $('<div class=\"note-hint-item\"></div>');\n      $item.append(hint.template ? hint.template(item) : item + '');\n      $item.data({\n        'index': hintIdx,\n        'item': item,\n      });\n      return $item;\n    });\n  }\n\n  handleKeydown(e) {\n    if (!this.$popover.is(':visible')) {\n      return;\n    }\n\n    if (e.keyCode === key.code.ENTER) {\n      e.preventDefault();\n      this.replace();\n    } else if (e.keyCode === key.code.UP) {\n      e.preventDefault();\n      this.moveUp();\n    } else if (e.keyCode === key.code.DOWN) {\n      e.preventDefault();\n      this.moveDown();\n    }\n  }\n\n  searchKeyword(index, keyword, callback) {\n    const hint = this.hints[index];\n    if (hint && hint.match.test(keyword) && hint.search) {\n      const matches = hint.match.exec(keyword);\n      this.matchingWord = matches[0];\n      hint.search(matches[1], callback);\n    } else {\n      callback();\n    }\n  }\n\n  createGroup(idx, keyword) {\n    const $group = $('<div class=\"note-hint-group note-hint-group-' + idx + '\"></div>');\n    this.searchKeyword(idx, keyword, (items) => {\n      items = items || [];\n      if (items.length) {\n        $group.html(this.createItemTemplates(idx, items));\n        this.show();\n      }\n    });\n\n    return $group;\n  }\n\n  handleKeyup(e) {\n    if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {\n      let range = this.context.invoke('editor.getLastRange');\n      let wordRange, keyword;\n      if (this.options.hintMode === 'words') {\n        wordRange = range.getWordsRange(range);\n        keyword = wordRange.toString();\n\n        this.hints.forEach((hint) => {\n          if (hint.match.test(keyword)) {\n            wordRange = range.getWordsMatchRange(hint.match);\n            return false;\n          }\n        });\n\n        if (!wordRange) {\n          this.hide();\n          return;\n        }\n\n        keyword = wordRange.toString();\n      } else {\n        wordRange = range.getWordRange();\n        keyword = wordRange.toString();\n      }\n\n      if (this.hints.length && keyword) {\n        this.$content.empty();\n\n        const bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));\n        const containerOffset = $(this.options.container).offset();\n        if (bnd) {\n          bnd.top -= containerOffset.top;\n          bnd.left -= containerOffset.left;\n\n          this.$popover.hide();\n          this.lastWordRange = wordRange;\n          this.hints.forEach((hint, idx) => {\n            if (hint.match.test(keyword)) {\n              this.createGroup(idx, keyword).appendTo(this.$content);\n            }\n          });\n          // select first .note-hint-item\n          this.$content.find('.note-hint-item:first').addClass('active');\n\n          // set position for popover after group is created\n          if (this.direction === 'top') {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST,\n            });\n          } else {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top + bnd.height + POPOVER_DIST,\n            });\n          }\n        }\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  show() {\n    this.$popover.show();\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport '../lang/summernote-en-US';\nimport './summernote';\nimport dom from './core/dom';\nimport range from './core/range';\nimport lists from './core/lists';\nimport Editor from './module/Editor';\nimport Clipboard from './module/Clipboard';\nimport Dropzone from './module/Dropzone';\nimport Codeview from './module/Codeview';\nimport Statusbar from './module/Statusbar';\nimport Fullscreen from './module/Fullscreen';\nimport Handle from './module/Handle';\nimport AutoLink from './module/AutoLink';\nimport AutoSync from './module/AutoSync';\nimport AutoReplace from './module/AutoReplace';\nimport Placeholder from './module/Placeholder';\nimport Buttons from './module/Buttons';\nimport Toolbar from './module/Toolbar';\nimport LinkDialog from './module/LinkDialog';\nimport LinkPopover from './module/LinkPopover';\nimport ImageDialog from './module/ImageDialog';\nimport ImagePopover from './module/ImagePopover';\nimport TablePopover from './module/TablePopover';\nimport VideoDialog from './module/VideoDialog';\nimport HelpDialog from './module/HelpDialog';\nimport AirPopover from './module/AirPopover';\nimport HintPopover from './module/HintPopover';\n\n$.summernote = $.extend($.summernote, {\n  version: '@@VERSION@@',\n  plugins: {},\n\n  dom: dom,\n  range: range,\n  lists: lists,\n\n  options: {\n    langInfo: $.summernote.lang['en-US'],\n    editing: true,\n    modules: {\n      'editor': Editor,\n      'clipboard': Clipboard,\n      'dropzone': Dropzone,\n      'codeview': Codeview,\n      'statusbar': Statusbar,\n      'fullscreen': Fullscreen,\n      'handle': Handle,\n      // FIXME: HintPopover must be front of autolink\n      //  - Script error about range when Enter key is pressed on hint popover\n      'hintPopover': HintPopover,\n      'autoLink': AutoLink,\n      'autoSync': AutoSync,\n      'autoReplace': AutoReplace,\n      'placeholder': Placeholder,\n      'buttons': Buttons,\n      'toolbar': Toolbar,\n      'linkDialog': LinkDialog,\n      'linkPopover': LinkPopover,\n      'imageDialog': ImageDialog,\n      'imagePopover': ImagePopover,\n      'tablePopover': TablePopover,\n      'videoDialog': VideoDialog,\n      'helpDialog': HelpDialog,\n      'airPopover': AirPopover,\n    },\n\n    buttons: {},\n\n    lang: 'en-US',\n\n    followingToolbar: false,\n    toolbarPosition: 'top',\n    otherStaticBar: '',\n\n    // toolbar\n    codeviewKeepButton: false,\n    toolbar: [\n      ['style', ['style']],\n      ['font', ['bold', 'underline', 'clear']],\n      ['fontname', ['fontname']],\n      ['color', ['color']],\n      ['para', ['ul', 'ol', 'paragraph']],\n      ['table', ['table']],\n      ['insert', ['link', 'picture', 'video']],\n      ['view', ['fullscreen', 'codeview', 'help']],\n    ],\n\n    // popover\n    popatmouse: true,\n    popover: {\n      image: [\n        ['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n        ['float', ['floatLeft', 'floatRight', 'floatNone']],\n        ['remove', ['removeMedia']],\n      ],\n      link: [\n        ['link', ['linkDialogShow', 'unlink']],\n      ],\n      table: [\n        ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n        ['delete', ['deleteRow', 'deleteCol', 'deleteTable']],\n      ],\n      air: [\n        ['color', ['color']],\n        ['font', ['bold', 'underline', 'clear']],\n        ['para', ['ul', 'paragraph']],\n        ['table', ['table']],\n        ['insert', ['link', 'picture']],\n        ['view', ['fullscreen', 'codeview']],\n      ],\n    },\n\n    // air mode: inline editor\n    airMode: false,\n    overrideContextMenu: false, // TBD\n\n    width: null,\n    height: null,\n    linkTargetBlank: true,\n    useProtocol: true,\n    defaultProtocol: 'http://',\n\n    focus: false,\n    tabDisabled: false,\n    tabSize: 4,\n    styleWithCSS: false,\n    shortcuts: true,\n    textareaAutoSync: true,\n    tooltip: 'auto',\n    container: null,\n    maxTextLength: 0,\n    blockquoteBreakingLevel: 2,\n    spellCheck: true,\n    disableGrammar: false,\n    placeholder: null,\n    inheritPlaceholder: false,\n    // TODO: need to be documented\n    recordEveryKeystroke: false,\n    historyLimit: 200,\n\n    // TODO: need to be documented\n    showDomainOnlyForAutolink: false,\n\n    // TODO: need to be documented\n    hintMode: 'word',\n    hintSelect: 'after',\n    hintDirection: 'bottom',\n\n    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n\n    fontNames: [\n      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',\n      'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',\n      'Tahoma', 'Times New Roman', 'Verdana',\n    ],\n    fontNamesIgnoreCheck: [],\n    addDefaultFonts: true,\n\n    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],\n\n    fontSizeUnits: ['px', 'pt'],\n\n    // pallete colors(n x n)\n    colors: [\n      ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],\n      ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],\n      ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],\n      ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],\n      ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],\n      ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],\n      ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],\n      ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'],\n    ],\n\n    // http://chir.ag/projects/name-that-color/\n    colorsName: [\n      ['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'],\n      ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'],\n      ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'],\n      ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'],\n      ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'],\n      ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'],\n      ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'],\n      ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou'],\n    ],\n\n    colorButton: {\n      foreColor: '#000000',\n      backColor: '#FFFF00',\n    },\n\n    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],\n\n    tableClassName: 'table table-bordered',\n\n    insertTableMaxSize: {\n      col: 10,\n      row: 10,\n    },\n\n    // By default, dialogs are attached in container.\n    dialogsInBody: false,\n    dialogsFade: false,\n\n    maximumImageFileSize: null,\n    acceptImageFileTypes: \"image/*\",\n\n    callbacks: {\n      onBeforeCommand: null,\n      onBlur: null,\n      onBlurCodeview: null,\n      onChange: null,\n      onChangeCodeview: null,\n      onDialogShown: null,\n      onEnter: null,\n      onFocus: null,\n      onImageLinkInsert: null,\n      onImageUpload: null,\n      onImageUploadError: null,\n      onInit: null,\n      onKeydown: null,\n      onKeyup: null,\n      onMousedown: null,\n      onMouseup: null,\n      onPaste: null,\n      onScroll: null,\n    },\n\n    codemirror: {\n      mode: 'text/html',\n      htmlMode: true,\n      lineNumbers: true,\n    },\n\n    codeviewFilter: true,\n    codeviewFilterRegex: /<\\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,\n    codeviewIframeFilter: true,\n    codeviewIframeWhitelistSrc: [],\n    codeviewIframeWhitelistSrcBase: [\n      'www.youtube.com',\n      'www.youtube-nocookie.com',\n      'www.facebook.com',\n      'vine.co',\n      'instagram.com',\n      'player.vimeo.com',\n      'www.dailymotion.com',\n      'player.youku.com',\n      'jumpingbean.tv',\n      'v.qq.com',\n    ],\n\n    keyMap: {\n      pc: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CTRL+Z': 'undo',\n        'CTRL+Y': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CTRL+B': 'bold',\n        'CTRL+I': 'italic',\n        'CTRL+U': 'underline',\n        'CTRL+SHIFT+S': 'strikethrough',\n        'CTRL+BACKSLASH': 'removeFormat',\n        'CTRL+SHIFT+L': 'justifyLeft',\n        'CTRL+SHIFT+E': 'justifyCenter',\n        'CTRL+SHIFT+R': 'justifyRight',\n        'CTRL+SHIFT+J': 'justifyFull',\n        'CTRL+SHIFT+NUM7': 'insertUnorderedList',\n        'CTRL+SHIFT+NUM8': 'insertOrderedList',\n        'CTRL+LEFTBRACKET': 'outdent',\n        'CTRL+RIGHTBRACKET': 'indent',\n        'CTRL+NUM0': 'formatPara',\n        'CTRL+NUM1': 'formatH1',\n        'CTRL+NUM2': 'formatH2',\n        'CTRL+NUM3': 'formatH3',\n        'CTRL+NUM4': 'formatH4',\n        'CTRL+NUM5': 'formatH5',\n        'CTRL+NUM6': 'formatH6',\n        'CTRL+ENTER': 'insertHorizontalRule',\n        'CTRL+K': 'linkDialog.show',\n      },\n\n      mac: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CMD+Z': 'undo',\n        'CMD+SHIFT+Z': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CMD+B': 'bold',\n        'CMD+I': 'italic',\n        'CMD+U': 'underline',\n        'CMD+SHIFT+S': 'strikethrough',\n        'CMD+BACKSLASH': 'removeFormat',\n        'CMD+SHIFT+L': 'justifyLeft',\n        'CMD+SHIFT+E': 'justifyCenter',\n        'CMD+SHIFT+R': 'justifyRight',\n        'CMD+SHIFT+J': 'justifyFull',\n        'CMD+SHIFT+NUM7': 'insertUnorderedList',\n        'CMD+SHIFT+NUM8': 'insertOrderedList',\n        'CMD+LEFTBRACKET': 'outdent',\n        'CMD+RIGHTBRACKET': 'indent',\n        'CMD+NUM0': 'formatPara',\n        'CMD+NUM1': 'formatH1',\n        'CMD+NUM2': 'formatH2',\n        'CMD+NUM3': 'formatH3',\n        'CMD+NUM4': 'formatH4',\n        'CMD+NUM5': 'formatH5',\n        'CMD+NUM6': 'formatH6',\n        'CMD+ENTER': 'insertHorizontalRule',\n        'CMD+K': 'linkDialog.show',\n      },\n    },\n    icons: {\n      'align': 'note-icon-align',\n      'alignCenter': 'note-icon-align-center',\n      'alignJustify': 'note-icon-align-justify',\n      'alignLeft': 'note-icon-align-left',\n      'alignRight': 'note-icon-align-right',\n      'rowBelow': 'note-icon-row-below',\n      'colBefore': 'note-icon-col-before',\n      'colAfter': 'note-icon-col-after',\n      'rowAbove': 'note-icon-row-above',\n      'rowRemove': 'note-icon-row-remove',\n      'colRemove': 'note-icon-col-remove',\n      'indent': 'note-icon-align-indent',\n      'outdent': 'note-icon-align-outdent',\n      'arrowsAlt': 'note-icon-arrows-alt',\n      'bold': 'note-icon-bold',\n      'caret': 'note-icon-caret',\n      'circle': 'note-icon-circle',\n      'close': 'note-icon-close',\n      'code': 'note-icon-code',\n      'eraser': 'note-icon-eraser',\n      'floatLeft': 'note-icon-float-left',\n      'floatRight': 'note-icon-float-right',\n      'font': 'note-icon-font',\n      'frame': 'note-icon-frame',\n      'italic': 'note-icon-italic',\n      'link': 'note-icon-link',\n      'unlink': 'note-icon-chain-broken',\n      'magic': 'note-icon-magic',\n      'menuCheck': 'note-icon-menu-check',\n      'minus': 'note-icon-minus',\n      'orderedlist': 'note-icon-orderedlist',\n      'pencil': 'note-icon-pencil',\n      'picture': 'note-icon-picture',\n      'question': 'note-icon-question',\n      'redo': 'note-icon-redo',\n      'rollback': 'note-icon-rollback',\n      'square': 'note-icon-square',\n      'strikethrough': 'note-icon-strikethrough',\n      'subscript': 'note-icon-subscript',\n      'superscript': 'note-icon-superscript',\n      'table': 'note-icon-table',\n      'textHeight': 'note-icon-text-height',\n      'trash': 'note-icon-trash',\n      'underline': 'note-icon-underline',\n      'undo': 'note-icon-undo',\n      'unorderedlist': 'note-icon-unorderedlist',\n      'video': 'note-icon-video',\n    },\n  },\n});\n","import $ from 'jquery';\n\nclass Renderer {\n  constructor(markup, children, options, callback) {\n    this.markup = markup;\n    this.children = children;\n    this.options = options;\n    this.callback = callback;\n  }\n\n  render($parent) {\n    const $node = $(this.markup);\n\n    if (this.options && this.options.contents) {\n      $node.html(this.options.contents);\n    }\n\n    if (this.options && this.options.className) {\n      $node.addClass(this.options.className);\n    }\n\n    if (this.options && this.options.data) {\n      $.each(this.options.data, (k, v) => {\n        $node.attr('data-' + k, v);\n      });\n    }\n\n    if (this.options && this.options.click) {\n      $node.on('click', this.options.click);\n    }\n\n    if (this.children) {\n      const $container = $node.find('.note-children-container');\n      this.children.forEach((child) => {\n        child.render($container.length ? $container : $node);\n      });\n    }\n\n    if (this.callback) {\n      this.callback($node, this.options);\n    }\n\n    if (this.options && this.options.callback) {\n      this.options.callback($node);\n    }\n\n    if ($parent) {\n      $parent.append($node);\n    }\n\n    return $node;\n  }\n}\n\nexport default {\n  create: (markup, callback) => {\n    return function() {\n      const options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];\n      let children = Array.isArray(arguments[0]) ? arguments[0] : [];\n      if (options && options.children) {\n        children = options.children;\n      }\n      return new Renderer(markup, children, options, callback);\n    };\n  },\n};\n","import $ from 'jquery';\nimport '/js/settings.js';\nimport './summernote-bs3.scss';\nimport renderer from '/js/renderer';\n\nconst editor = renderer.create('<div class=\"note-editor note-frame panel panel-default\"></div>');\nconst toolbar = renderer.create('<div class=\"panel-heading note-toolbar\" role=\"toolbar\"></div>');\nconst editingArea = renderer.create('<div class=\"note-editing-area\"></div>');\nconst codable = renderer.create('<textarea class=\"note-codable\" aria-multiline=\"true\"></textarea>');\nconst editable = renderer.create('<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>');\nconst statusbar = renderer.create([\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n  '<div class=\"note-statusbar\" role=\"status\">',\n    '<div class=\"note-resizebar\" aria-label=\"Resize\">',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n    '</div>',\n  '</div>',\n].join(''));\n\nconst airEditor = renderer.create('<div class=\"note-editor note-airframe\"></div>');\nconst airEditable = renderer.create([\n  '<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>',\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n].join(''));\n\nconst buttonGroup = renderer.create('<div class=\"note-btn-group btn-group\"></div>');\n\nconst dropdown = renderer.create('<ul class=\"note-dropdown-menu dropdown-menu\"></ul>', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    const option = (typeof item === 'object') ? item.option : undefined;\n\n    const dataValue = 'data-value=\"' + value + '\"';\n    const dataOption = (option !== undefined) ? ' data-option=\"' + option + '\"' : '';\n    return '<li aria-label=\"' + value + '\"><a href=\"#\" ' + (dataValue + dataOption) + '>' + content + '</a></li>';\n  }).join('') : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownButtonContents = function(contents, options) {\n  return contents + ' ' + icon(options.icons.caret, 'span');\n};\n\nconst dropdownCheck = renderer.create('<ul class=\"note-dropdown-menu dropdown-menu note-check\"></ul>', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    return '<li aria-label=\"' + item + '\"><a href=\"#\" data-value=\"' + value + '\">' + icon(options.checkClassName) + ' ' + content + '</a></li>';\n  }).join('') : options.items;\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dialog = renderer.create('<div class=\"modal note-modal\" aria-hidden=\"false\" tabindex=\"-1\" role=\"dialog\"></div>', function($node, options) {\n  if (options.fade) {\n    $node.addClass('fade');\n  }\n  $node.attr({\n    'aria-label': options.title,\n  });\n  $node.html([\n    '<div class=\"modal-dialog\">',\n      '<div class=\"modal-content\">',\n        (options.title ? '<div class=\"modal-header\">' +\n          '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\" aria-hidden=\"true\">&times;</button>' +\n          '<h4 class=\"modal-title\">' + options.title + '</h4>' +\n        '</div>' : ''),\n        '<div class=\"modal-body\">' + options.body + '</div>',\n        (options.footer ? '<div class=\"modal-footer\">' + options.footer + '</div>' : ''),\n      '</div>',\n    '</div>',\n  ].join(''));\n});\n\nconst popover = renderer.create([\n  '<div class=\"note-popover popover in\">',\n    '<div class=\"arrow\"></div>',\n    '<div class=\"popover-content note-children-container\"></div>',\n  '</div>',\n].join(''), function($node, options) {\n  const direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';\n\n  $node.addClass(direction);\n\n  if (options.hideArrow) {\n    $node.find('.arrow').hide();\n  }\n});\n\nconst checkbox = renderer.create('<div class=\"checkbox\"></div>', function($node, options) {\n  $node.html([\n    '<label' + (options.id ? ' for=\"note-' + options.id + '\"' : '') + '>',\n      '<input type=\"checkbox\"' + (options.id ? ' id=\"note-' + options.id + '\"' : ''),\n        (options.checked ? ' checked' : ''),\n        ' aria-checked=\"' + (options.checked ? 'true' : 'false') + '\"/>',\n      (options.text ? options.text : ''),\n    '</label>',\n  ].join(''));\n});\n\nconst icon = function(iconClassName, tagName) {\n  if (iconClassName.match(/^</)) {\n    return iconClassName;\n  }\n  tagName = tagName || 'i';\n  return '<' + tagName + ' class=\"' + iconClassName + '\"></' + tagName+'>';\n};\n\nconst ui = function(editorOptions) {\n  return {\n    editor: editor,\n    toolbar: toolbar,\n    editingArea: editingArea,\n    codable: codable,\n    editable: editable,\n    statusbar: statusbar,\n    airEditor: airEditor,\n    airEditable: airEditable,\n    buttonGroup: buttonGroup,\n    dropdown: dropdown,\n    dropdownButtonContents: dropdownButtonContents,\n    dropdownCheck: dropdownCheck,\n    dialog: dialog,\n    popover: popover,\n    checkbox: checkbox,\n    icon: icon,\n    options: editorOptions,\n\n    palette: function($node, options) {\n      return renderer.create('<div class=\"note-color-palette\"></div>', function($node, options) {\n        const contents = [];\n        for (let row = 0, rowSize = options.colors.length; row < rowSize; row++) {\n          const eventName = options.eventName;\n          const colors = options.colors[row];\n          const colorsName = options.colorsName[row];\n          const buttons = [];\n          for (let col = 0, colSize = colors.length; col < colSize; col++) {\n            const color = colors[col];\n            const colorName = colorsName[col];\n            buttons.push([\n              '<button type=\"button\" class=\"note-color-btn\"',\n              'style=\"background-color:', color, '\" ',\n              'data-event=\"', eventName, '\" ',\n              'data-value=\"', color, '\" ',\n              'title=\"', colorName, '\" ',\n              'aria-label=\"', colorName, '\" ',\n              'data-toggle=\"button\" tabindex=\"-1\"></button>',\n            ].join(''));\n          }\n          contents.push('<div class=\"note-color-row\">' + buttons.join('') + '</div>');\n        }\n        $node.html(contents.join(''));\n\n        if (options.tooltip) {\n          $node.find('.note-color-btn').tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          });\n        }\n      })($node, options);\n    },\n\n    button: function($node, options) {\n      return renderer.create('<button type=\"button\" class=\"note-btn btn btn-default btn-sm\" tabindex=\"-1\"></button>', function($node, options) {\n        if (options && options.tooltip) {\n          $node.attr({\n            title: options.tooltip,\n            'aria-label': options.tooltip,\n          }).tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          }).on('click', (e) => {\n            $(e.currentTarget).tooltip('hide');\n          });\n        }\n        if (options && options.codeviewButton) {\n          $node.addClass('note-codeview-keep');\n        }\n      })($node, options);\n    },\n\n    toggleBtn: function($btn, isEnable) {\n      $btn.toggleClass('disabled', !isEnable);\n      $btn.attr('disabled', !isEnable);\n    },\n\n    toggleBtnActive: function($btn, isActive) {\n      $btn.toggleClass('active', isActive);\n    },\n\n    onDialogShown: function($dialog, handler) {\n      $dialog.one('shown.bs.modal', handler);\n    },\n\n    onDialogHidden: function($dialog, handler) {\n      $dialog.one('hidden.bs.modal', handler);\n    },\n\n    showDialog: function($dialog) {\n      $dialog.modal('show');\n    },\n\n    hideDialog: function($dialog) {\n      $dialog.modal('hide');\n    },\n\n    createLayout: function($note) {\n      const $editor = (editorOptions.airMode ? airEditor([\n        editingArea([\n          codable(),\n          airEditable(),\n        ]),\n      ]) : (editorOptions.toolbarPosition === 'bottom'\n        ? editor([\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          toolbar(),\n          statusbar(),\n        ])\n        : editor([\n          toolbar(),\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          statusbar(),\n        ])\n      )).render();\n\n      $editor.insertAfter($note);\n\n      return {\n        note: $note,\n        editor: $editor,\n        toolbar: $editor.find('.note-toolbar'),\n        editingArea: $editor.find('.note-editing-area'),\n        editable: $editor.find('.note-editable'),\n        codable: $editor.find('.note-codable'),\n        statusbar: $editor.find('.note-statusbar'),\n      };\n    },\n\n    removeLayout: function($note, layoutInfo) {\n      $note.html(layoutInfo.editable.html());\n      layoutInfo.editor.remove();\n      $note.show();\n    },\n  };\n};\n\n$.summernote = $.extend($.summernote, {\n  ui_template: ui,\n  interface: 'bs3',\n});\n"],"names":["$","summernote","lang","extend","font","bold","italic","underline","clear","height","name","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","p","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","options","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","genericFontFamilies","validFontName","fontName","inArray","toLowerCase","isFontInstalled","testFontName","testText","testSize","canvas","document","createElement","context","getContext","originalWidth","measureText","width","userAgent","navigator","isMSIE","test","browserVersion","matches","exec","parseFloat","isEdge","isSupportTouch","window","MaxTouchPoints","msMaxTouchPoints","inputEventName","isMac","appVersion","indexOf","isFF","isPhantom","isWebkit","isChrome","isSafari","isW3CRangeSupport","createRange","eq","itemA","itemB","eq2","peq2","propName","ok","fail","not","f","apply","arguments","and","fA","fB","item","self","a","invoke","obj","method","idCounter","resetUniqueId","uniqueId","prefix","id","rect2bnd","rect","$document","top","scrollTop","scrollLeft","bottom","invertObject","inverted","key","Object","prototype","hasOwnProperty","call","namespaceToCamel","namespace","split","map","substring","toUpperCase","join","debounce","func","wait","immediate","timeout","args","later","callNow","clearTimeout","setTimeout","isValidUrl","expression","head","array","last","length","initial","slice","tail","find","pred","idx","len","all","contains","sum","fn","reduce","memo","v","from","collection","result","isEmpty","clusterBy","aTail","aLast","compact","aResult","push","unique","results","next","prev","env","NBSP_CHAR","String","fromCharCode","ZERO_WIDTH_NBSP_CHAR","isEditable","node","hasClass","isControlSizing","makePredByNodeName","nodeName","isText","nodeType","isElement","isVoid","isPara","isHeading","isPre","isLi","isPurePara","isTable","isData","isInline","isBodyContainer","isList","isHr","isBlockquote","isCell","isAnchor","isParaInline","ancestor","isBodyInline","isBody","isClosestSibling","nodeA","nodeB","nextSibling","previousSibling","withClosestSiblings","siblings","blankHTML","nodeLength","nodeValue","childNodes","deepestChildIsEmpty","firstElementChild","innerHTML","paddingBlankHTML","parentNode","singleChildAncestor","listAncestor","ancestors","el","lastAncestor","filter","commonAncestor","n","listPrev","nodes","listNext","listDescendant","descendants","fnWalk","current","wrap","wrapperName","parent","wrapper","insertBefore","appendChild","insertAfter","preceding","appendChildNodes","aChild","each","child","isLeftEdgePoint","point","offset","isRightEdgePoint","isEdgePoint","isLeftEdgeOf","position","isRightEdgeOf","isLeftEdgePointOf","isRightEdgePointOf","hasChildren","prevPoint","isSkipInnerOffset","nextPoint","nextTextNode","getNextTextNode","nextPointWithEmptyNode","actual","undefined","isSamePoint","pointA","pointB","isVisiblePoint","leftNode","rightNode","prevPointUntil","nextPointUntil","isCharPoint","ch","charAt","isSpacePoint","walkPoint","startPoint","endPoint","handler","isSkipOffset","makeOffsetPath","reverse","fromOffsetPath","offsets","i","splitNode","isSkipPaddingBlankHTML","isNotSplitEdgePoint","isDiscardEmptySplits","splitText","childNode","clone","cloneNode","splitTree","root","splitPoint","topAncestor","splitRoot","container","pivot","create","createText","text","createTextNode","isRemoveChild","removeNode","removeChild","removeWhile","replace","newNode","cssText","isTextarea","value","$node","stripLinebreaks","val","html","isNewlineOnBlock","markup","regexTag","match","endSlash","isEndOfInlineContainer","isBlockNode","trim","posFromPlaceholder","placeholder","$placeholder","pos","outerHeight","attachEvents","events","keys","forEach","on","detachEvents","off","isCustomStyleTag","classList","blank","emptyPara","isBlock","isDiv","isBR","isSpan","isB","isU","isS","isI","isImg","isEmptyAnchor","dom","Context","$note","memos","modules","layoutInfo","ui","ui_template","initialize","createLayout","_initialize","hide","_destroy","removeData","removeLayout","disabled","isDisabled","code","disable","now","editor","buttons","plugins","module","initializeModule","removeModule","removeMemo","triggerEvent","isActivated","codable","editable","attr","editing","callback","callbacks","trigger","shouldInitialize","ModuleClass","withoutIntialize","destroy","event","createInvokeHandler","preventDefault","$target","target","closest","data","splits","hasSeparator","moduleName","methodName","type","isExternalAPICalled","hasInitOptions","langInfo","icons","tooltip","note","first","focus","textRangeToPoint","textRange","isStart","parentElement","tester","body","createTextRange","prevContainer","moveToElementText","compareEndPoints","textRangeStart","curTextNode","collapse","firstChild","pointTester","duplicate","setEndPoint","textCount","dummy","cont","pointToTextRange","textRangeInfo","isCollapseToStart","prevTextNodes","collapseToStart","info","moveStart","WrappedRange","sc","so","ec","eo","isOnEditable","makeIsOn","isOnList","isOnAnchor","isOnCell","isOnData","w3cRange","setStart","setEnd","nativeRng","nativeRange","selection","getSelection","rangeCount","removeAllRanges","addRange","offsetTop","Math","abs","getVisiblePoint","isLeftToRight","block","hasRightNode","hasLeftNode","getEndPoint","isCollapsed","getStartPoint","includeAncestor","fullyContains","leftEdgeNodes","startAncestor","endAncestor","boundaryPoints","getPoints","isSameContainer","rng","emptyParents","normalize","inlineSiblings","concat","para","wrapBodyInlineWithPara","deleteContents","contentsContainer","reversed","insertNode","toString","findAfter","isNotTextPoint","regex","index","s","path","e","paras","getClientRects","wrappedRange","createFromSelection","bodyElement","lastChild","createFromBodyElement","createFromNode","anchorNode","getRangeAt","startContainer","startOffset","endContainer","endOffset","textRangeEnd","isTextNode","createFromNodeBefore","createFromNodeAfter","createFromBookmark","bookmark","createFromParaBookmark","KEY_MAP","isEdit","keyCode","BACKSPACE","TAB","ENTER","SPACE","DELETE","isMove","LEFT","UP","RIGHT","DOWN","isNavigation","HOME","END","PAGEUP","PAGEDOWN","nameFromCode","readFileAsDataURL","file","Deferred","deferred","FileReader","onload","dataURL","resolve","onerror","err","reject","readAsDataURL","promise","createImage","$img","one","detach","css","display","appendTo","range","History","stack","stackOffset","$editable","emptyBookmark","contents","snapshot","recordUndo","applySnapshot","makeSnapshot","historyLimit","shift","Style","$obj","propertyNames","propertyName","properties","styleInfo","jQueryCSS","fontSize","parseInt","expandClosestSibling","onlyPartialContains","nodesInRange","tails","elem","$cont","fromNode","queryCommandState","queryCommandValue","orderedTypes","isUnordered","lineHeight","toFixed","anchor","Bullet","toggleList","clustereds","previousList","findList","wrapList","appendToPrevious","releaseList","listName","paraBookmark","wrappedParas","diffLists","listNode","prevList","nextList","isEscapseToBody","releasedParas","headList","parentItem","newList","findNextSiblings","children","lastList","middleList","rootLists","rootList","listNodes","Typing","bullet","tabsize","tab","Array","nextPara","blockquoteBreakingLevel","emptyAnchors","scrollIntoView","TableResultAction","where","domTable","_startPoint","_virtualTable","_actionCellList","setStartPoint","tagName","colPos","cellIndex","rowPos","rowIndex","setVirtualTablePosition","baseRow","baseCell","isRowSpan","isColSpan","isVirtualCell","objPosition","getActionCell","virtualTableCellObj","resultAction","virtualRowPosition","virtualColPosition","recoverCellIndex","newCellIndex","addCellInfoToVirtual","row","cell","cellHasColspan","colSpan","cellHasRowspan","rowSpan","isThisSelectedCell","rowspanNumber","attributes","rp","rowspanIndex","adjustStartPoint","colspanNumber","cp","cellspanIndex","isSelectedCell","createVirtualTable","rows","cells","getDeleteResultActionToCell","Column","SubtractSpanCount","Row","isVirtual","AddCell","RemoveCell","getAddResultActionToCell","SumSpanCount","Ignore","init","getActionList","fixedRow","fixedCol","actualPosition","canContinue","rowPosition","colPosition","requestAction","Add","Delete","Table","isShift","nextCell","currentTr","trAttributes","recoverAttributes","vTable","actions","idCell","currentCell","tdAttributes","append","baseCellTr","isTopFromRowSpan","newTd","removeAttr","setAttribute","before","lastTrIndex","after","rowsGroup","actionIndex","resultStr","attrList","specified","cellPos","virtualPosition","virtualTable","hasRowspan","nextRow","cloneRow","removeAttribute","hasColspan","colCount","rowCount","tds","tdHTML","idxCol","trs","trHTML","idxRow","$table","tableClassName","addClass","KEY_BOGUS","Editor","$editor","lastRange","typing","escape","untab","insertParagraph","insertOrderedList","insertUnorderedList","formatPara","insertHorizontalRule","commands","sCmd","beforeCommand","execCommand","afterCommand","wrapCommand","fontStyling","unit","currentStyle","fontSizeUnit","formatBlock","isLimited","getLastRange","setLastRange","insertText","textNode","pasteHTML","onApplyCustomStyle","onFormatBlock","hrNode","stylePara","createLink","linkInfo","linkUrl","linkText","isNewWindow","checkProtocol","additionalTextLength","isTextChanged","onCreateLink","defaultProtocol","anchors","styleNodes","createRangeFromList","colorInfo","foreColor","backColor","insertTable","dim","dimension","createTable","removeMedia","restoreTarget","floatMe","toggleClass","resize","hasKeyShortCut","isDefaultPrevented","handleKeyMap","preventDefaultEditableShortCuts","recordEveryKeystroke","spellCheck","disableGrammar","airMode","overrideContextMenu","outerWidth","maxHeight","minHeight","keyMap","metaKey","ctrlKey","altKey","shiftKey","keyName","eventName","tabDisable","pad","maxTextLength","lst","startRange","endRange","thenCollapse","commit","styleWithCSS","isPreventTrigger","normalizeContent","tabSize","insertTab","src","param","then","$image","min","show","files","filename","maximumImageFileSize","insertImage","onImageUpload","insertImagesAsDataURL","currentRange","$parent","removeClass","className","spans","firstSpan","noteStatusOutput","expand","$anchor","addRow","addCol","deleteRow","deleteCol","deleteTable","bKeepRatio","imageSize","newRatio","y","x","ratio","is","hasFocus","Clipboard","pasteByEvent","bind","clipboardData","originalEvent","items","kind","getAsFile","getData","Dropzone","$eventListener","documentEventHandlers","$dropzone","prependTo","disableDragAndDrop","onDrop","attachDragAndDropEvent","$dropzoneMessage","onDragenter","isCodeview","hasEditorSize","add","onDragleave","dataTransfer","types","content","substr","CodeView","$codable","CodeMirrorConstructor","CodeMirror","codemirror","getDoc","setValue","save","ESCAPE","deactivate","activate","codeviewFilter","codeviewFilterRegex","codeviewIframeFilter","whitelist","codeviewIframeWhitelistSrc","codeviewIframeWhitelistSrcBase","tag","RegExp","prettifyHtml","cmEditor","fromTextArea","tern","server","TernServer","ternServer","cm","updateArgHints","getValue","setSize","toTextArea","purify","isChange","EDITABLE_PADDING","Statusbar","$statusbar","statusbar","disableResizeEditor","stopPropagation","editableTop","editableCodeTop","onMouseMove","clientY","heightCode","minheight","max","Fullscreen","$toolbar","toolbar","$window","$scrollbar","scrollbarClassName","onResize","resizeTo","h","setsize","isFullscreen","Handle","$editingArea","editingArea","we","update","$handle","disableResizeImage","posStart","clientX","isImage","$selection","w","origImageObj","Image","sizingText","defaultScheme","linkPattern","AutoLink","handleKeyup","handleKeydown","lastWordRange","keyword","urlText","showDomainOnlyForAutolink","linkTargetBlank","wordRange","getWordRange","AutoSync","AutoReplace","PERIOD","COMMA","SEMICOLON","SLASH","previousKeydownCode","lastWord","jQuery","Node","Placeholder","inheritPlaceholder","isShow","toggle","Buttons","invertedKeyMap","editorMethod","o","button","addToolbarButtons","addImagePopoverButtons","addLinkPopoverButtons","addTablePopoverButtons","fontInstalledMap","fontNamesIgnoreCheck","buttonGroup","icon","click","$button","currentTarget","$recentColor","colorButton","dropdownButtonContents","dropdown","$dropdown","$holder","palette","colors","colorsName","render","customColors","change","$chip","$picker","$palette","prepend","$color","$currentButton","magic","styleTags","title","template","styleIdx","styleLen","representShortcut","createInvokeHandlerAndUpdateState","eraser","addDefaultFonts","fontname","isFontDeservedToAdd","fontNames","dropdownCheck","checkClassName","menuCheck","fontSizes","fontSizeUnits","colorPalette","unorderedlist","orderedlist","justifyLeft","alignLeft","justifyCenter","alignCenter","justifyRight","alignRight","justifyFull","alignJustify","textHeight","lineHeights","$catcher","insertTableMaxSize","col","mouseup","tableMoveHandler","picture","minus","arrowsAlt","question","rollback","trash","rowAbove","rowBelow","colBefore","colAfter","rowRemove","colRemove","$container","groups","groupIdx","groupLen","group","groupName","isArray","$group","btn","updateBtnStates","$item","isChecked","infos","selector","toggleBtnActive","PX_PER_EM","$dimensionDisplay","$highlighted","$unhighlighted","posOffset","offsetX","posCatcher","pageX","pageY","offsetY","c","ceil","r","Toolbar","isFollowing","followScroll","toolbarContainer","changeContainer","followingToolbar","editorHeight","editorWidth","toolbarHeight","statusbarHeight","otherBarHeight","otherStaticBar","currentOffset","editorOffsetTop","editorOffsetBottom","activateOffset","deactivateOffsetBottom","marginTop","zIndex","isIncludeCodeview","$btn","toggleBtn","LinkDialog","$body","dialogsInBody","disableLinkTarget","checkbox","checked","buttonClass","footer","$dialog","dialog","fade","dialogsFade","hideDialog","$input","$linkBtn","$linkText","$linkUrl","$openInNewWindow","$useProtocol","onDialogShown","toggleLinkBtn","bindEnterKey","isNewWindowChecked","prop","useProtocolChecked","onDialogHidden","state","showDialog","showLinkDialog","LinkPopover","relatedTarget","$popover","popover","$content","href","containerOffset","ImageDialog","imageLimitation","floor","log","readableSize","pow","acceptImageFileTypes","showImageDialog","onImageLinkInsert","$imageInput","$imageUrl","$imageBtn","replaceWith","ImagePopover","popatmouse","TablePopover","VideoDialog","ytRegExp","ytRegExpForStart","ytMatch","gdRegExp","gdMatch","igRegExp","igMatch","vRegExp","vMatch","vimRegExp","vimMatch","dmRegExp","dmMatch","youkuRegExp","youkuMatch","peerTubeRegExp","peerTubeMatch","qqRegExp","qqMatch","qqRegExp2","qqMatch2","mp4RegExp","mp4Match","oggRegExp","oggMatch","webmRegExp","webmMatch","fbRegExp","fbMatch","$video","youtubeId","start","ytMatchForStart","begin","end","loop","autoplay","muted","vid","encodeURIComponent","showVideoDialog","createVideoNode","$videoUrl","$videoBtn","HelpDialog","createShortcutList","command","$row","showHelpDialog","AIRMODE_POPOVER_X_OFFSET","AIRMODE_POPOVER_Y_OFFSET","AirPopover","hidable","onContextmenu","air","forcelyOpen","POPOVER_DIST","HintPopover","hint","direction","hintDirection","hints","matchingWord","hideArrow","innerHeight","$current","$next","selectItem","$nextGroup","$prev","$prevGroup","nodeFromItem","rangeCompute","hintSelect","hintIdx","moveUp","moveDown","search","searchKeyword","createItemTemplates","hintMode","getWordsRange","getWordsMatchRange","empty","bnd","createGroup","Codeview","version","toolbarPosition","codeviewKeepButton","tabDisabled","textareaAutoSync","onBeforeCommand","onBlur","onBlurCodeview","onChange","onChangeCodeview","onEnter","onFocus","onImageUploadError","onInit","onKeydown","onKeyup","onMousedown","onMouseup","onPaste","onScroll","mode","htmlMode","lineNumbers","pc","mac","Renderer","k","renderer","airEditor","airEditable","option","dataValue","dataOption","caret","iconClassName","editorOptions","rowSize","colSize","colorName","placement","codeviewButton","isEnable","isActive","modal"],"sourceRoot":""}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.min.css b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.css
new file mode 100644
index 0000000..cfe9c0f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.css
@@ -0,0 +1 @@
+@font-face{font-display:auto;font-family:summernote;font-style:normal;font-weight:400;src:url(font/summernote.eot?#iefix) format("embedded-opentype"),url(font/summernote.woff2) format("woff2"),url(font/summernote.woff) format("woff"),url(font/summernote.ttf) format("truetype")}[class*=" note-icon"]:before,[class^=note-icon]:before{text-rendering:auto;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;speak:none;display:inline-block;font-family:summernote;font-size:inherit;font-style:normal;text-decoration:inherit;text-transform:none;vertical-align:middle}.note-icon-fw{text-align:center;width:1.25em}.note-icon-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.note-icon-pull-left{float:left}.note-icon-pull-right{float:right}.note-icon.note-icon-pull-left{margin-right:.3em}.note-icon.note-icon-pull-right{margin-left:.3em}.note-icon-align:before{content:"\ea01"}.note-icon-align-center:before{content:"\ea02"}.note-icon-align-indent:before{content:"\ea03"}.note-icon-align-justify:before{content:"\ea04"}.note-icon-align-left:before{content:"\ea05"}.note-icon-align-outdent:before{content:"\ea06"}.note-icon-align-right:before{content:"\ea07"}.note-icon-arrow-circle-down:before{content:"\ea08"}.note-icon-arrow-circle-left:before{content:"\ea09"}.note-icon-arrow-circle-right:before{content:"\ea0a"}.note-icon-arrow-circle-up:before{content:"\ea0b"}.note-icon-arrows-alt:before{content:"\ea0c"}.note-icon-arrows-h:before{content:"\ea0d"}.note-icon-arrows-v:before{content:"\ea0e"}.note-icon-bold:before{content:"\ea0f"}.note-icon-caret:before{content:"\ea10"}.note-icon-chain-broken:before{content:"\ea11"}.note-icon-circle:before{content:"\ea12"}.note-icon-close:before{content:"\ea13"}.note-icon-code:before{content:"\ea14"}.note-icon-col-after:before{content:"\ea15"}.note-icon-col-before:before{content:"\ea16"}.note-icon-col-remove:before{content:"\ea17"}.note-icon-eraser:before{content:"\ea18"}.note-icon-float-left:before{content:"\ea19"}.note-icon-float-none:before{content:"\ea1a"}.note-icon-float-right:before{content:"\ea1b"}.note-icon-font:before{content:"\ea1c"}.note-icon-frame:before{content:"\ea1d"}.note-icon-italic:before{content:"\ea1e"}.note-icon-link:before{content:"\ea1f"}.note-icon-magic:before{content:"\ea20"}.note-icon-menu-check:before{content:"\ea21"}.note-icon-minus:before{content:"\ea22"}.note-icon-orderedlist:before{content:"\ea23"}.note-icon-pencil:before{content:"\ea24"}.note-icon-picture:before{content:"\ea25"}.note-icon-question:before{content:"\ea26"}.note-icon-redo:before{content:"\ea27"}.note-icon-rollback:before{content:"\ea28"}.note-icon-row-above:before{content:"\ea29"}.note-icon-row-below:before{content:"\ea2a"}.note-icon-row-remove:before{content:"\ea2b"}.note-icon-special-character:before{content:"\ea2c"}.note-icon-square:before{content:"\ea2d"}.note-icon-strikethrough:before{content:"\ea2e"}.note-icon-subscript:before{content:"\ea2f"}.note-icon-summernote:before{content:"\ea30"}.note-icon-superscript:before{content:"\ea31"}.note-icon-table:before{content:"\ea32"}.note-icon-text-height:before{content:"\ea33"}.note-icon-trash:before{content:"\ea34"}.note-icon-underline:before{content:"\ea35"}.note-icon-undo:before{content:"\ea36"}.note-icon-unorderedlist:before{content:"\ea37"}.note-icon-video:before{content:"\ea38"}.note-editor{position:relative}.note-editor .note-dropzone{background-color:#fff;color:#87cefa;display:none;opacity:.95;position:absolute;z-index:100}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:none}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area .note-editable img.note-float-left{margin-right:10px}.note-editor .note-editing-area .note-editable img.note-float-right{margin-left:10px}.note-editor.note-airframe,.note-editor.note-frame{border:1px solid #00000032}.note-editor.note-airframe.codeview .note-editing-area .note-editable,.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-airframe.codeview .note-editing-area .note-codable,.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-airframe .note-editing-area,.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-airframe .note-editing-area .note-editable,.note-editor.note-frame .note-editing-area .note-editable{word-wrap:break-word;overflow:auto;padding:10px}.note-editor.note-airframe .note-editing-area .note-editable[contenteditable=false],.note-editor.note-frame .note-editing-area .note-editable[contenteditable=false]{background-color:#8080801d}.note-editor.note-airframe .note-editing-area .note-codable,.note-editor.note-frame .note-editing-area .note-codable{background-color:#222;border:none;border-radius:0;box-shadow:none;-ms-box-sizing:border-box;box-sizing:border-box;color:#ccc;display:none;font-family:Menlo,Monaco,monospace,sans-serif;font-size:14px;margin-bottom:0;outline:none;padding:10px;resize:none;width:100%}.note-editor.note-airframe.fullscreen,.note-editor.note-frame.fullscreen{left:0;position:fixed;top:0;width:100%!important;z-index:1050}.note-editor.note-airframe.fullscreen .note-resizebar,.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-airframe .note-status-output,.note-editor.note-frame .note-status-output{border:0;border-top:1px solid #e2e2e2;color:#000;display:block;font-size:14px;height:20px;line-height:1.42857143;margin-bottom:0;width:100%}.note-editor.note-airframe .note-status-output:empty,.note-editor.note-frame .note-status-output:empty{border-top:0 solid transparent;height:0}.note-editor.note-airframe .note-status-output .pull-right,.note-editor.note-frame .note-status-output .pull-right{float:right!important}.note-editor.note-airframe .note-status-output .text-muted,.note-editor.note-frame .note-status-output .text-muted{color:#777}.note-editor.note-airframe .note-status-output .text-primary,.note-editor.note-frame .note-status-output .text-primary{color:#286090}.note-editor.note-airframe .note-status-output .text-success,.note-editor.note-frame .note-status-output .text-success{color:#3c763d}.note-editor.note-airframe .note-status-output .text-info,.note-editor.note-frame .note-status-output .text-info{color:#31708f}.note-editor.note-airframe .note-status-output .text-warning,.note-editor.note-frame .note-status-output .text-warning{color:#8a6d3b}.note-editor.note-airframe .note-status-output .text-danger,.note-editor.note-frame .note-status-output .text-danger{color:#a94442}.note-editor.note-airframe .note-status-output .alert,.note-editor.note-frame .note-status-output .alert{background-color:#f5f5f5;border-radius:0;color:#000;margin:-7px 0 0;padding:7px 10px 2px}.note-editor.note-airframe .note-status-output .alert .note-icon,.note-editor.note-frame .note-status-output .alert .note-icon{margin-right:5px}.note-editor.note-airframe .note-status-output .alert-success,.note-editor.note-frame .note-status-output .alert-success{background-color:#dff0d8!important;color:#3c763d!important}.note-editor.note-airframe .note-status-output .alert-info,.note-editor.note-frame .note-status-output .alert-info{background-color:#d9edf7!important;color:#31708f!important}.note-editor.note-airframe .note-status-output .alert-warning,.note-editor.note-frame .note-status-output .alert-warning{background-color:#fcf8e3!important;color:#8a6d3b!important}.note-editor.note-airframe .note-status-output .alert-danger,.note-editor.note-frame .note-status-output .alert-danger{background-color:#f2dede!important;color:#a94442!important}.note-editor.note-airframe .note-statusbar,.note-editor.note-frame .note-statusbar{background-color:#8080801d;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid #00000032}.note-editor.note-airframe .note-statusbar .note-resizebar,.note-editor.note-frame .note-statusbar .note-resizebar{cursor:ns-resize;height:9px;padding-top:1px;width:100%}.note-editor.note-airframe .note-statusbar .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{border-top:1px solid #00000032;margin:1px auto;width:20px}.note-editor.note-airframe .note-statusbar.locked .note-resizebar,.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-airframe .note-statusbar.locked .note-resizebar .note-icon-bar,.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-airframe .note-placeholder,.note-editor.note-frame .note-placeholder{padding:10px}.note-editor.note-airframe{border:0}.note-editor.note-airframe .note-editing-area .note-editable{padding:0}.note-popover.popover{display:none;max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.note-popover.popover .arrow{left:20px!important}.note-toolbar{position:relative}.note-editor .note-toolbar,.note-popover .popover-content{margin:0;padding:0 0 5px 5px}.note-editor .note-toolbar>.note-btn-group,.note-popover .popover-content>.note-btn-group{margin-left:0;margin-right:5px;margin-top:5px}.note-editor .note-toolbar .note-btn-group .note-table,.note-popover .popover-content .note-btn-group .note-table{min-width:0;padding:5px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker{font-size:18px}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{cursor:pointer;height:10em;position:absolute!important;width:10em;z-index:3}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:5em;position:relative!important;width:5em;z-index:1}.note-editor .note-toolbar .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.note-popover .popover-content .note-btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat;height:1em;position:absolute!important;width:1em;z-index:2}.note-editor .note-toolbar .note-style .dropdown-style blockquote,.note-editor .note-toolbar .note-style .dropdown-style pre,.note-popover .popover-content .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre{margin:0;padding:5px 10px}.note-editor .note-toolbar .note-style .dropdown-style h1,.note-editor .note-toolbar .note-style .dropdown-style h2,.note-editor .note-toolbar .note-style .dropdown-style h3,.note-editor .note-toolbar .note-style .dropdown-style h4,.note-editor .note-toolbar .note-style .dropdown-style h5,.note-editor .note-toolbar .note-style .dropdown-style h6,.note-editor .note-toolbar .note-style .dropdown-style p,.note-popover .popover-content .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p{margin:0;padding:0}.note-editor .note-toolbar .note-color-all .note-dropdown-menu,.note-popover .popover-content .note-color-all .note-dropdown-menu{min-width:337px}.note-editor .note-toolbar .note-color .dropdown-toggle,.note-popover .popover-content .note-color .dropdown-toggle{padding-left:5px;width:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette{display:inline-block;margin:0;width:160px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette:first-child,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette:first-child{margin:0 5px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-palette-title,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-palette-title{border-bottom:1px solid #eee;font-size:12px;margin:2px 7px;text-align:center}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select{border-radius:5px;cursor:pointer;font-size:11px;margin:3px;padding:0 3px;width:100%}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-reset:hover,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select:hover{background:#eee}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-row,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-row{height:20px}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-color-select-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-color-select-btn{display:none}.note-editor .note-toolbar .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn,.note-popover .popover-content .note-color .note-dropdown-menu .note-palette .note-holder-custom .note-color-btn{border:1px solid #eee}.note-editor .note-toolbar .note-para .note-dropdown-menu,.note-popover .popover-content .note-para .note-dropdown-menu{min-width:228px;padding:5px}.note-editor .note-toolbar .note-para .note-dropdown-menu>div+div,.note-popover .popover-content .note-para .note-dropdown-menu>div+div{margin-left:5px}.note-editor .note-toolbar .note-dropdown-menu,.note-popover .popover-content .note-dropdown-menu{min-width:160px}.note-editor .note-toolbar .note-dropdown-menu.right,.note-popover .popover-content .note-dropdown-menu.right{left:auto;right:0}.note-editor .note-toolbar .note-dropdown-menu.right:before,.note-popover .popover-content .note-dropdown-menu.right:before{left:auto!important;right:9px}.note-editor .note-toolbar .note-dropdown-menu.right:after,.note-popover .popover-content .note-dropdown-menu.right:after{left:auto!important;right:10px}.note-editor .note-toolbar .note-dropdown-menu.note-check a i,.note-popover .popover-content .note-dropdown-menu.note-check a i{color:#00bfff;visibility:hidden}.note-editor .note-toolbar .note-dropdown-menu.note-check a.checked i,.note-popover .popover-content .note-dropdown-menu.note-check a.checked i{visibility:visible}.note-editor .note-toolbar .note-fontsize-10,.note-popover .popover-content .note-fontsize-10{font-size:10px}.note-editor .note-toolbar .note-color-palette,.note-popover .popover-content .note-color-palette{line-height:1}.note-editor .note-toolbar .note-color-palette div .note-color-btn,.note-popover .popover-content .note-color-palette div .note-color-btn{border:0;border-radius:0;height:20px;margin:0;padding:0;width:20px}.note-editor .note-toolbar .note-color-palette div .note-color-btn:hover,.note-popover .popover-content .note-color-palette div .note-color-btn:hover{transform:scale(1.2);transition:all .2s}.note-modal .modal-dialog{border-radius:5px;box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}.note-modal .form-group{margin-left:0;margin-right:0}.note-modal .note-modal-form{margin:0}.note-modal .note-image-dialog .note-dropzone{border:4px dashed #d3d3d3;color:#d3d3d3;font-size:30px;line-height:4;margin-bottom:10px;min-height:100px;text-align:center}@-moz-document url-prefix(){.note-modal .note-image-input{height:auto}}.note-placeholder{color:gray;display:none;position:absolute}.note-handle .note-control-selection{border:1px solid #000;display:none;position:absolute}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{background-color:#000;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);filter:alpha(opacity=30);height:100%;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;width:100%}.note-handle .note-control-selection .note-control-handle,.note-handle .note-control-selection .note-control-holder,.note-handle .note-control-selection .note-control-sizing{border:1px solid #000;height:7px;width:7px}.note-handle .note-control-selection .note-control-sizing{background-color:#000}.note-handle .note-control-selection .note-control-nw{border-bottom:none;border-right:none;left:-5px;top:-5px}.note-handle .note-control-selection .note-control-ne{border-bottom:none;border-left:none;right:-5px;top:-5px}.note-handle .note-control-selection .note-control-sw{border-right:none;border-top:none;bottom:-5px;left:-5px}.note-handle .note-control-selection .note-control-se{bottom:-5px;cursor:se-resize;right:-5px}.note-handle .note-control-selection .note-control-se.note-control-holder{border-left:none;border-top:none;cursor:default}.note-handle .note-control-selection .note-control-selection-info{background-color:#000;border-radius:5px;bottom:0;color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(opacity=70);filter:alpha(opacity=70);font-size:12px;margin:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;padding:5px;right:0}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;overflow:auto;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block!important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{background-color:#428bca;clear:both;color:#fff;cursor:pointer;display:block;font-weight:400;line-height:1.4;outline:0;text-decoration:none;white-space:nowrap}body .note-fullscreen-body,html .note-fullscreen-body{overflow:hidden!important}
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js
new file mode 100644
index 0000000..5ac7164
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js
@@ -0,0 +1,2 @@
+/*! Summernote v0.8.20 | (c) 2013- Alan Hong and contributors | MIT license */
+!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("jQuery"));else if("function"==typeof define&&define.amd)define(["jQuery"],e);else{var n="object"==typeof exports?e(require("jQuery")):e(t.jQuery);for(var o in n)("object"==typeof exports?exports:t)[o]=n[o]}}(self,(function(t){return(()=>{"use strict";var e={9770:(t,e,n)=>{var o=n(1145),i=n.n(o);i().summernote=i().summernote||{lang:{}},i().extend(i().summernote.lang,{"en-US":{font:{bold:"Bold",italic:"Italic",underline:"Underline",clear:"Remove Font Style",height:"Line Height",name:"Font Family",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript",size:"Font Size",sizeunit:"Font Size Unit"},image:{image:"Picture",insert:"Insert Image",resizeFull:"Resize full",resizeHalf:"Resize half",resizeQuarter:"Resize quarter",resizeNone:"Original size",floatLeft:"Float Left",floatRight:"Float Right",floatNone:"Remove float",shapeRounded:"Shape: Rounded",shapeCircle:"Shape: Circle",shapeThumbnail:"Shape: Thumbnail",shapeNone:"Shape: None",dragImageHere:"Drag image or text here",dropImage:"Drop image or Text",selectFromFiles:"Select from files",maximumFileSize:"Maximum file size",maximumFileSizeError:"Maximum file size exceeded.",url:"Image URL",remove:"Remove Image",original:"Original"},video:{video:"Video",videoLink:"Video Link",insert:"Insert Video",url:"Video URL",providers:"(YouTube, Google Drive, Vimeo, Vine, Instagram, DailyMotion, Youku, Peertube)"},link:{link:"Link",insert:"Insert Link",unlink:"Unlink",edit:"Edit",textToDisplay:"Text to display",url:"To what URL should this link go?",openInNewWindow:"Open in new window",useProtocol:"Use default protocol"},table:{table:"Table",addRowAbove:"Add row above",addRowBelow:"Add row below",addColLeft:"Add column left",addColRight:"Add column right",delRow:"Delete row",delCol:"Delete column",delTable:"Delete table"},hr:{insert:"Insert Horizontal Rule"},style:{style:"Style",p:"Normal",blockquote:"Quote",pre:"Code",h1:"Header 1",h2:"Header 2",h3:"Header 3",h4:"Header 4",h5:"Header 5",h6:"Header 6"},lists:{unordered:"Unordered list",ordered:"Ordered list"},options:{help:"Help",fullscreen:"Full Screen",codeview:"Code View"},paragraph:{paragraph:"Paragraph",outdent:"Outdent",indent:"Indent",left:"Align left",center:"Align center",right:"Align right",justify:"Justify full"},color:{recent:"Recent Color",more:"More Color",background:"Background Color",foreground:"Text Color",transparent:"Transparent",setTransparent:"Set transparent",reset:"Reset",resetToDefault:"Reset to default",cpSelect:"Select"},shortcut:{shortcuts:"Keyboard shortcuts",close:"Close",textFormatting:"Text formatting",action:"Action",paragraphFormatting:"Paragraph formatting",documentStyle:"Document Style",extraKeys:"Extra keys"},help:{escape:"Escape",insertParagraph:"Insert Paragraph",undo:"Undo the last command",redo:"Redo the last command",tab:"Tab",untab:"Untab",bold:"Set a bold style",italic:"Set a italic style",underline:"Set a underline style",strikethrough:"Set a strikethrough style",removeFormat:"Clean a style",justifyLeft:"Set left align",justifyCenter:"Set center align",justifyRight:"Set right align",justifyFull:"Set full align",insertUnorderedList:"Toggle unordered list",insertOrderedList:"Toggle ordered list",outdent:"Outdent on current paragraph",indent:"Indent on current paragraph",formatPara:"Change current block's format as a paragraph(P tag)",formatH1:"Change current block's format as H1",formatH2:"Change current block's format as H2",formatH3:"Change current block's format as H3",formatH4:"Change current block's format as H4",formatH5:"Change current block's format as H5",formatH6:"Change current block's format as H6",insertHorizontalRule:"Insert horizontal rule","linkDialog.show":"Show Link Dialog"},history:{undo:"Undo",redo:"Redo"},specialChar:{specialChar:"SPECIAL CHARACTERS",select:"Select Special characters"},output:{noSelection:"No Selection Made!"}}})},1145:e=>{e.exports=t}},n={};function o(t){var i=n[t];if(void 0!==i)return i.exports;var r=n[t]={exports:{}};return e[t](r,r.exports,o),r.exports}o.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return o.d(e,{a:e}),e},o.d=(t,e)=>{for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),o.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var i={};return(()=>{o.r(i);var t=o(1145),e=o.n(t),n=(o(9770),["sans-serif","serif","monospace","cursive","fantasy"]);function r(t){return-1===e().inArray(t.toLowerCase(),n)?"'".concat(t,"'"):t}var a,s=navigator.userAgent,l=/MSIE|Trident/i.test(s);if(l){var c=/MSIE (\d+[.]\d+)/.exec(s);c&&(a=parseFloat(c[1])),(c=/Trident\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(s))&&(a=parseFloat(c[1]))}var u=/Edge\/\d+/.test(s),d="ontouchstart"in window||navigator.MaxTouchPoints>0||navigator.msMaxTouchPoints>0,h=l?"DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted":"input";const f={isMac:navigator.appVersion.indexOf("Mac")>-1,isMSIE:l,isEdge:u,isFF:!u&&/firefox/i.test(s),isPhantom:/PhantomJS/i.test(s),isWebkit:!u&&/webkit/i.test(s),isChrome:!u&&/chrome/i.test(s),isSafari:!u&&/safari/i.test(s)&&!/chrome/i.test(s),browserVersion:a,isSupportTouch:d,isFontInstalled:function(t){var e="Comic Sans MS"===t?"Courier New":"Comic Sans MS",n="mmmmmmmmmmwwwww",o=document.createElement("canvas").getContext("2d");o.font="200px '"+e+"'";var i=o.measureText(n).width;return o.font="200px "+r(t)+', "'+e+'"',i!==o.measureText(n).width},isW3CRangeSupport:!!document.createRange,inputEventName:h,genericFontFamilies:n,validFontName:r};var p=0;const v={eq:function(t){return function(e){return t===e}},eq2:function(t,e){return t===e},peq2:function(t){return function(e,n){return e[t]===n[t]}},ok:function(){return!0},fail:function(){return!1},self:function(t){return t},not:function(t){return function(){return!t.apply(t,arguments)}},and:function(t,e){return function(n){return t(n)&&e(n)}},invoke:function(t,e){return function(){return t[e].apply(t,arguments)}},resetUniqueId:function(){p=0},uniqueId:function(t){var e=++p+"";return t?t+e:e},rect2bnd:function(t){var n=e()(document);return{top:t.top+n.scrollTop(),left:t.left+n.scrollLeft(),width:t.right-t.left,height:t.bottom-t.top}},invertObject:function(t){var e={};for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[t[n]]=n);return e},namespaceToCamel:function(t,e){return(e=e||"")+t.split(".").map((function(t){return t.substring(0,1).toUpperCase()+t.substring(1)})).join("")},debounce:function(t,e,n){var o;return function(){var i=this,r=arguments,a=function(){o=null,n||t.apply(i,r)},s=n&&!o;clearTimeout(o),o=setTimeout(a,e),s&&t.apply(i,r)}},isValidUrl:function(t){return/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi.test(t)}};function m(t){return t[0]}function g(t){return t[t.length-1]}function b(t){return t.slice(1)}function y(t,e){if(t&&t.length&&e){if(t.indexOf)return-1!==t.indexOf(e);if(t.contains)return t.contains(e)}return!1}const k={head:m,last:g,initial:function(t){return t.slice(0,t.length-1)},tail:b,prev:function(t,e){if(t&&t.length&&e){var n=t.indexOf(e);return-1===n?null:t[n-1]}return null},next:function(t,e){if(t&&t.length&&e){var n=t.indexOf(e);return-1===n?null:t[n+1]}return null},find:function(t,e){for(var n=0,o=t.length;n<o;n++){var i=t[n];if(e(i))return i}},contains:y,all:function(t,e){for(var n=0,o=t.length;n<o;n++)if(!e(t[n]))return!1;return!0},sum:function(t,e){return e=e||v.self,t.reduce((function(t,n){return t+e(n)}),0)},from:function(t){for(var e=[],n=t.length,o=-1;++o<n;)e[o]=t[o];return e},isEmpty:function(t){return!t||!t.length},clusterBy:function(t,e){return t.length?b(t).reduce((function(t,n){var o=g(t);return e(g(o),n)?o[o.length]=n:t[t.length]=[n],t}),[[m(t)]]):[]},compact:function(t){for(var e=[],n=0,o=t.length;n<o;n++)t[n]&&e.push(t[n]);return e},unique:function(t){for(var e=[],n=0,o=t.length;n<o;n++)y(e,t[n])||e.push(t[n]);return e}};var w=String.fromCharCode(160);function C(t){return t&&e()(t).hasClass("note-editable")}function x(t){return t=t.toUpperCase(),function(e){return e&&e.nodeName.toUpperCase()===t}}function S(t){return t&&3===t.nodeType}function T(t){return t&&/^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(t.nodeName.toUpperCase())}function E(t){return!C(t)&&(t&&/^DIV|^P|^LI|^H[1-7]/.test(t.nodeName.toUpperCase()))}var I=x("PRE"),$=x("LI");var N=x("TABLE"),P=x("DATA");function R(t){return!(H(t)||L(t)||A(t)||E(t)||N(t)||D(t)||P(t))}function L(t){return t&&/^UL|^OL/.test(t.nodeName.toUpperCase())}var A=x("HR");function F(t){return t&&/^TD|^TH/.test(t.nodeName.toUpperCase())}var D=x("BLOCKQUOTE");function H(t){return F(t)||D(t)||C(t)}var z=x("A");var B=x("BODY");var M=f.isMSIE&&f.browserVersion<11?"&nbsp;":"<br>";function O(t){return S(t)?t.nodeValue.length:t?t.childNodes.length:0}function U(t){var e=O(t);return 0===e||(!S(t)&&1===e&&t.innerHTML===M||!(!k.all(t.childNodes,S)||""!==t.innerHTML))}function j(t){T(t)||O(t)||(t.innerHTML=M)}function W(t,e){for(;t;){if(e(t))return t;if(C(t))break;t=t.parentNode}return null}function K(t,e){e=e||v.fail;var n=[];return W(t,(function(t){return C(t)||n.push(t),e(t)})),n}function V(t,e){e=e||v.fail;for(var n=[];t&&!e(t);)n.push(t),t=t.nextSibling;return n}function q(t,e){var n=e.nextSibling,o=e.parentNode;return n?o.insertBefore(t,n):o.appendChild(t),t}function _(t,n){return e().each(n,(function(e,n){t.appendChild(n)})),t}function G(t){return 0===t.offset}function Y(t){return t.offset===O(t.node)}function Z(t){return G(t)||Y(t)}function Q(t,e){for(;t&&t!==e;){if(0!==J(t))return!1;t=t.parentNode}return!0}function X(t,e){if(!e)return!1;for(;t&&t!==e;){if(J(t)!==O(t.parentNode)-1)return!1;t=t.parentNode}return!0}function J(t){for(var e=0;t=t.previousSibling;)e+=1;return e}function tt(t){return!!(t&&t.childNodes&&t.childNodes.length)}function et(t,e){var n,o;if(0===t.offset){if(C(t.node))return null;n=t.node.parentNode,o=J(t.node)}else tt(t.node)?o=O(n=t.node.childNodes[t.offset-1]):(n=t.node,o=e?0:t.offset-1);return{node:n,offset:o}}function nt(t,e){var n,o;if(O(t.node)===t.offset){if(C(t.node))return null;var i=it(t.node);i?(n=i,o=0):(n=t.node.parentNode,o=J(t.node)+1)}else tt(t.node)?(n=t.node.childNodes[t.offset],o=0):(n=t.node,o=e?O(t.node):t.offset+1);return{node:n,offset:o}}function ot(t,e){var n,o=0;if(U(t.node))return null===t.node?null:{node:n=t.node.nextSibling,offset:o=0};if(O(t.node)===t.offset){if(C(t.node))return null;n=t.node.parentNode,o=J(t.node)+1,C(n)&&(n=t.node.nextSibling,o=0)}else if(tt(t.node)){if(o=0,U(n=t.node.childNodes[t.offset]))return U(t.node.nextSibling)?null:{node:t.node.nextSibling,offset:o}}else if(n=t.node,o=e?O(t.node):t.offset+1,U(n))return null;return{node:n,offset:o}}function it(t){if(t.nextSibling&&t.parent===t.nextSibling.parent)return S(t.nextSibling)?t.nextSibling:it(t.nextSibling)}function rt(t,e){return t.node===e.node&&t.offset===e.offset}function at(t,e){var n=e&&e.isSkipPaddingBlankHTML,o=e&&e.isNotSplitEdgePoint,i=e&&e.isDiscardEmptySplits;if(i&&(n=!0),Z(t)&&(S(t.node)||o)){if(G(t))return t.node;if(Y(t))return t.node.nextSibling}if(S(t.node))return t.node.splitText(t.offset);var r=t.node.childNodes[t.offset],a=q(t.node.cloneNode(!1),t.node);return _(a,V(r)),n||(j(t.node),j(a)),i&&(U(t.node)&&ct(t.node),U(a))?(ct(a),t.node.nextSibling):a}function st(t,e,n){var o=K(e.node,v.eq(t));return o.length?1===o.length?at(e,n):o.reduce((function(t,o){return t===e.node&&(t=at(e,n)),at({node:o,offset:t?J(t):O(o)},n)})):null}function lt(t){return document.createElement(t)}function ct(t,e){if(t&&t.parentNode){if(t.removeNode)return t.removeNode(e);var n=t.parentNode;if(!e){for(var o=[],i=0,r=t.childNodes.length;i<r;i++)o.push(t.childNodes[i]);for(var a=0,s=o.length;a<s;a++)n.insertBefore(o[a],t)}n.removeChild(t)}}var ut=x("TEXTAREA");function dt(t,e){var n=ut(t[0])?t.val():t.html();return e?n.replace(/[\n\r]/g,""):n}const ht={NBSP_CHAR:w,ZERO_WIDTH_NBSP_CHAR:"\ufeff",blank:M,emptyPara:"<p>".concat(M,"</p>"),makePredByNodeName:x,isEditable:C,isControlSizing:function(t){return t&&e()(t).hasClass("note-control-sizing")},isText:S,isElement:function(t){return t&&1===t.nodeType},isVoid:T,isPara:E,isPurePara:function(t){return E(t)&&!$(t)},isHeading:function(t){return t&&/^H[1-7]/.test(t.nodeName.toUpperCase())},isInline:R,isBlock:v.not(R),isBodyInline:function(t){return R(t)&&!W(t,E)},isBody:B,isParaInline:function(t){return R(t)&&!!W(t,E)},isPre:I,isList:L,isTable:N,isData:P,isCell:F,isBlockquote:D,isBodyContainer:H,isAnchor:z,isDiv:x("DIV"),isLi:$,isBR:x("BR"),isSpan:x("SPAN"),isB:x("B"),isU:x("U"),isS:x("S"),isI:x("I"),isImg:x("IMG"),isTextarea:ut,deepestChildIsEmpty:function(t){do{if(null===t.firstElementChild||""===t.firstElementChild.innerHTML)break}while(t=t.firstElementChild);return U(t)},isEmpty:U,isEmptyAnchor:v.and(z,U),isClosestSibling:function(t,e){return t.nextSibling===e||t.previousSibling===e},withClosestSiblings:function(t,e){e=e||v.ok;var n=[];return t.previousSibling&&e(t.previousSibling)&&n.push(t.previousSibling),n.push(t),t.nextSibling&&e(t.nextSibling)&&n.push(t.nextSibling),n},nodeLength:O,isLeftEdgePoint:G,isRightEdgePoint:Y,isEdgePoint:Z,isLeftEdgeOf:Q,isRightEdgeOf:X,isLeftEdgePointOf:function(t,e){return G(t)&&Q(t.node,e)},isRightEdgePointOf:function(t,e){return Y(t)&&X(t.node,e)},prevPoint:et,nextPoint:nt,nextPointWithEmptyNode:ot,isSamePoint:rt,isVisiblePoint:function(t){if(S(t.node)||!tt(t.node)||U(t.node))return!0;var e=t.node.childNodes[t.offset-1],n=t.node.childNodes[t.offset];return!((e&&!T(e)||n&&!T(n))&&!N(n))},prevPointUntil:function(t,e){for(;t;){if(e(t))return t;t=et(t)}return null},nextPointUntil:function(t,e){for(;t;){if(e(t))return t;t=nt(t)}return null},isCharPoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return e&&" "!==e&&e!==w},isSpacePoint:function(t){if(!S(t.node))return!1;var e=t.node.nodeValue.charAt(t.offset-1);return" "===e||e===w},walkPoint:function(t,e,n,o){for(var i=t;i&&(n(i),!rt(i,e));){i=ot(i,o&&t.node!==i.node&&e.node!==i.node)}},ancestor:W,singleChildAncestor:function(t,e){for(t=t.parentNode;t&&1===O(t);){if(e(t))return t;if(C(t))break;t=t.parentNode}return null},listAncestor:K,lastAncestor:function(t,e){var n=K(t);return k.last(n.filter(e))},listNext:V,listPrev:function(t,e){e=e||v.fail;for(var n=[];t&&!e(t);)n.push(t),t=t.previousSibling;return n},listDescendant:function(t,e){var n=[];return e=e||v.ok,function o(i){t!==i&&e(i)&&n.push(i);for(var r=0,a=i.childNodes.length;r<a;r++)o(i.childNodes[r])}(t),n},commonAncestor:function(t,e){for(var n=K(t),o=e;o;o=o.parentNode)if(n.indexOf(o)>-1)return o;return null},wrap:function(t,n){var o=t.parentNode,i=e()("<"+n+">")[0];return o.insertBefore(i,t),i.appendChild(t),i},insertAfter:q,appendChildNodes:_,position:J,hasChildren:tt,makeOffsetPath:function(t,e){return K(e,v.eq(t)).map(J).reverse()},fromOffsetPath:function(t,e){for(var n=t,o=0,i=e.length;o<i;o++)n=n.childNodes.length<=e[o]?n.childNodes[n.childNodes.length-1]:n.childNodes[e[o]];return n},splitTree:st,splitPoint:function(t,e){var n,o,i=e?E:H,r=K(t.node,i),a=k.last(r)||t.node;i(a)?(n=r[r.length-2],o=a):o=(n=a).parentNode;var s=n&&st(n,t,{isSkipPaddingBlankHTML:e,isNotSplitEdgePoint:e});return s||o!==t.node||(s=t.node.childNodes[t.offset]),{rightNode:s,container:o}},create:lt,createText:function(t){return document.createTextNode(t)},remove:ct,removeWhile:function(t,e){for(;t&&!C(t)&&e(t);){var n=t.parentNode;ct(t),t=n}},replace:function(t,e){if(t.nodeName.toUpperCase()===e.toUpperCase())return t;var n=lt(e);return t.style.cssText&&(n.style.cssText=t.style.cssText),_(n,k.from(t.childNodes)),q(n,t),ct(t),n},html:function(t,e){var n=dt(t);if(e){n=(n=n.replace(/<(\/?)(\b(?!!)[^>\s]*)(.*?)(\s*\/?>)/g,(function(t,e,n){n=n.toUpperCase();var o=/^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(n)&&!!e,i=/^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(n);return t+(o||i?"\n":"")}))).trim()}return n},value:dt,posFromPlaceholder:function(t){var n=e()(t),o=n.offset(),i=n.outerHeight(!0);return{left:o.left,top:o.top+i}},attachEvents:function(t,e){Object.keys(e).forEach((function(n){t.on(n,e[n])}))},detachEvents:function(t,e){Object.keys(e).forEach((function(n){t.off(n,e[n])}))},isCustomStyleTag:function(t){return t&&!S(t)&&k.contains(t.classList,"note-styletag")}};function ft(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var pt=function(){function t(n,o){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=n,this.memos={},this.modules={},this.layoutInfo={},this.options=e().extend(!0,{},o),e().summernote.ui=e().summernote.ui_template(this.options),this.ui=e().summernote.ui,this.initialize()}var n,o,i;return n=t,o=[{key:"initialize",value:function(){return this.layoutInfo=this.ui.createLayout(this.$note),this._initialize(),this.$note.hide(),this}},{key:"destroy",value:function(){this._destroy(),this.$note.removeData("summernote"),this.ui.removeLayout(this.$note,this.layoutInfo)}},{key:"reset",value:function(){var t=this.isDisabled();this.code(ht.emptyPara),this._destroy(),this._initialize(),t&&this.disable()}},{key:"_initialize",value:function(){var t=this;this.options.id=v.uniqueId(e().now()),this.options.container=this.options.container||this.layoutInfo.editor;var n=e().extend({},this.options.buttons);Object.keys(n).forEach((function(e){t.memo("button."+e,n[e])}));var o=e().extend({},this.options.modules,e().summernote.plugins||{});Object.keys(o).forEach((function(e){t.module(e,o[e],!0)})),Object.keys(this.modules).forEach((function(e){t.initializeModule(e)}))}},{key:"_destroy",value:function(){var t=this;Object.keys(this.modules).reverse().forEach((function(e){t.removeModule(e)})),Object.keys(this.memos).forEach((function(e){t.removeMemo(e)})),this.triggerEvent("destroy",this)}},{key:"code",value:function(t){var e=this.invoke("codeview.isActivated");if(void 0===t)return this.invoke("codeview.sync"),e?this.layoutInfo.codable.val():this.layoutInfo.editable.html();e?this.invoke("codeview.sync",t):this.layoutInfo.editable.html(t),this.$note.val(t),this.triggerEvent("change",t,this.layoutInfo.editable)}},{key:"isDisabled",value:function(){return"false"===this.layoutInfo.editable.attr("contenteditable")}},{key:"enable",value:function(){this.layoutInfo.editable.attr("contenteditable",!0),this.invoke("toolbar.activate",!0),this.triggerEvent("disable",!1),this.options.editing=!0}},{key:"disable",value:function(){this.invoke("codeview.isActivated")&&this.invoke("codeview.deactivate"),this.layoutInfo.editable.attr("contenteditable",!1),this.options.editing=!1,this.invoke("toolbar.deactivate",!0),this.triggerEvent("disable",!0)}},{key:"triggerEvent",value:function(){var t=k.head(arguments),e=k.tail(k.from(arguments)),n=this.options.callbacks[v.namespaceToCamel(t,"on")];n&&n.apply(this.$note[0],e),this.$note.trigger("summernote."+t,e)}},{key:"initializeModule",value:function(t){var e=this.modules[t];e.shouldInitialize=e.shouldInitialize||v.ok,e.shouldInitialize()&&(e.initialize&&e.initialize(),e.events&&ht.attachEvents(this.$note,e.events))}},{key:"module",value:function(t,e,n){if(1===arguments.length)return this.modules[t];this.modules[t]=new e(this),n||this.initializeModule(t)}},{key:"removeModule",value:function(t){var e=this.modules[t];e.shouldInitialize()&&(e.events&&ht.detachEvents(this.$note,e.events),e.destroy&&e.destroy()),delete this.modules[t]}},{key:"memo",value:function(t,e){if(1===arguments.length)return this.memos[t];this.memos[t]=e}},{key:"removeMemo",value:function(t){this.memos[t]&&this.memos[t].destroy&&this.memos[t].destroy(),delete this.memos[t]}},{key:"createInvokeHandlerAndUpdateState",value:function(t,e){var n=this;return function(o){n.createInvokeHandler(t,e)(o),n.invoke("buttons.updateCurrentStyle")}}},{key:"createInvokeHandler",value:function(t,n){var o=this;return function(i){i.preventDefault();var r=e()(i.target);o.invoke(t,n||r.closest("[data-value]").data("value"),r)}}},{key:"invoke",value:function(){var t=k.head(arguments),e=k.tail(k.from(arguments)),n=t.split("."),o=n.length>1,i=o&&k.head(n),r=o?k.last(n):k.head(n),a=this.modules[i||"editor"];return!i&&this[r]?this[r].apply(this,e):a&&a[r]&&a.shouldInitialize()?a[r].apply(a,e):void 0}}],o&&ft(n.prototype,o),i&&ft(n,i),t}();function vt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function mt(t,e){var n,o,i=t.parentElement(),r=document.body.createTextRange(),a=k.from(i.childNodes);for(n=0;n<a.length;n++)if(!ht.isText(a[n])){if(r.moveToElementText(a[n]),r.compareEndPoints("StartToStart",t)>=0)break;o=a[n]}if(0!==n&&ht.isText(a[n-1])){var s=document.body.createTextRange(),l=null;s.moveToElementText(o||i),s.collapse(!o),l=o?o.nextSibling:i.firstChild;var c=t.duplicate();c.setEndPoint("StartToStart",s);for(var u=c.text.replace(/[\r\n]/g,"").length;u>l.nodeValue.length&&l.nextSibling;)u-=l.nodeValue.length,l=l.nextSibling;l.nodeValue;e&&l.nextSibling&&ht.isText(l.nextSibling)&&u===l.nodeValue.length&&(u-=l.nodeValue.length,l=l.nextSibling),i=l,n=u}return{cont:i,offset:n}}function gt(t){var e=document.body.createTextRange(),n=function t(e,n){var o,i;if(ht.isText(e)){var r=ht.listPrev(e,v.not(ht.isText)),a=k.last(r).previousSibling;o=a||e.parentNode,n+=k.sum(k.tail(r),ht.nodeLength),i=!a}else{if(o=e.childNodes[n]||e,ht.isText(o))return t(o,0);n=0,i=!1}return{node:o,collapseToStart:i,offset:n}}(t.node,t.offset);return e.moveToElementText(n.node),e.collapse(n.collapseToStart),e.moveStart("character",n.offset),e}e().fn.extend({summernote:function(){var t=e().type(k.head(arguments)),n="string"===t,o="object"===t,i=e().extend({},e().summernote.options,o?k.head(arguments):{});i.langInfo=e().extend(!0,{},e().summernote.lang["en-US"],e().summernote.lang[i.lang]),i.icons=e().extend(!0,{},e().summernote.options.icons,i.icons),i.tooltip="auto"===i.tooltip?!f.isSupportTouch:i.tooltip,this.each((function(t,n){var o=e()(n);if(!o.data("summernote")){var r=new pt(o,i);o.data("summernote",r),o.data("summernote").triggerEvent("init",r.layoutInfo)}}));var r=this.first();if(r.length){var a=r.data("summernote");if(n)return a.invoke.apply(a,k.from(arguments));i.focus&&a.invoke("editor.focus")}return this}});var bt=function(){function t(e,n,o,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sc=e,this.so=n,this.ec=o,this.eo=i,this.isOnEditable=this.makeIsOn(ht.isEditable),this.isOnList=this.makeIsOn(ht.isList),this.isOnAnchor=this.makeIsOn(ht.isAnchor),this.isOnCell=this.makeIsOn(ht.isCell),this.isOnData=this.makeIsOn(ht.isData)}var n,o,i;return n=t,o=[{key:"nativeRange",value:function(){if(f.isW3CRangeSupport){var t=document.createRange();return t.setStart(this.sc,this.so),t.setEnd(this.ec,this.eo),t}var e=gt({node:this.sc,offset:this.so});return e.setEndPoint("EndToEnd",gt({node:this.ec,offset:this.eo})),e}},{key:"getPoints",value:function(){return{sc:this.sc,so:this.so,ec:this.ec,eo:this.eo}}},{key:"getStartPoint",value:function(){return{node:this.sc,offset:this.so}}},{key:"getEndPoint",value:function(){return{node:this.ec,offset:this.eo}}},{key:"select",value:function(){var t=this.nativeRange();if(f.isW3CRangeSupport){var e=document.getSelection();e.rangeCount>0&&e.removeAllRanges(),e.addRange(t)}else t.select();return this}},{key:"scrollIntoView",value:function(t){var n=e()(t).height();return t.scrollTop+n<this.sc.offsetTop&&(t.scrollTop+=Math.abs(t.scrollTop+n-this.sc.offsetTop)),this}},{key:"normalize",value:function(){var e=function(t,e){if(!t)return t;if(ht.isVisiblePoint(t)&&(!ht.isEdgePoint(t)||ht.isRightEdgePoint(t)&&!e||ht.isLeftEdgePoint(t)&&e||ht.isRightEdgePoint(t)&&e&&ht.isVoid(t.node.nextSibling)||ht.isLeftEdgePoint(t)&&!e&&ht.isVoid(t.node.previousSibling)||ht.isBlock(t.node)&&ht.isEmpty(t.node)))return t;var n=ht.ancestor(t.node,ht.isBlock),o=!1;if(!o){var i=ht.prevPoint(t)||{node:null};o=(ht.isLeftEdgePointOf(t,n)||ht.isVoid(i.node))&&!e}var r=!1;if(!r){var a=ht.nextPoint(t)||{node:null};r=(ht.isRightEdgePointOf(t,n)||ht.isVoid(a.node))&&e}if(o||r){if(ht.isVisiblePoint(t))return t;e=!e}return(e?ht.nextPointUntil(ht.nextPoint(t),ht.isVisiblePoint):ht.prevPointUntil(ht.prevPoint(t),ht.isVisiblePoint))||t},n=e(this.getEndPoint(),!1),o=this.isCollapsed()?n:e(this.getStartPoint(),!0);return new t(o.node,o.offset,n.node,n.offset)}},{key:"nodes",value:function(t,e){t=t||v.ok;var n=e&&e.includeAncestor,o=e&&e.fullyContains,i=this.getStartPoint(),r=this.getEndPoint(),a=[],s=[];return ht.walkPoint(i,r,(function(e){var i;ht.isEditable(e.node)||(o?(ht.isLeftEdgePoint(e)&&s.push(e.node),ht.isRightEdgePoint(e)&&k.contains(s,e.node)&&(i=e.node)):i=n?ht.ancestor(e.node,t):e.node,i&&t(i)&&a.push(i))}),!0),k.unique(a)}},{key:"commonAncestor",value:function(){return ht.commonAncestor(this.sc,this.ec)}},{key:"expand",value:function(e){var n=ht.ancestor(this.sc,e),o=ht.ancestor(this.ec,e);if(!n&&!o)return new t(this.sc,this.so,this.ec,this.eo);var i=this.getPoints();return n&&(i.sc=n,i.so=0),o&&(i.ec=o,i.eo=ht.nodeLength(o)),new t(i.sc,i.so,i.ec,i.eo)}},{key:"collapse",value:function(e){return e?new t(this.sc,this.so,this.sc,this.so):new t(this.ec,this.eo,this.ec,this.eo)}},{key:"splitText",value:function(){var e=this.sc===this.ec,n=this.getPoints();return ht.isText(this.ec)&&!ht.isEdgePoint(this.getEndPoint())&&this.ec.splitText(this.eo),ht.isText(this.sc)&&!ht.isEdgePoint(this.getStartPoint())&&(n.sc=this.sc.splitText(this.so),n.so=0,e&&(n.ec=n.sc,n.eo=this.eo-this.so)),new t(n.sc,n.so,n.ec,n.eo)}},{key:"deleteContents",value:function(){if(this.isCollapsed())return this;var n=this.splitText(),o=n.nodes(null,{fullyContains:!0}),i=ht.prevPointUntil(n.getStartPoint(),(function(t){return!k.contains(o,t.node)})),r=[];return e().each(o,(function(t,e){var n=e.parentNode;i.node!==n&&1===ht.nodeLength(n)&&r.push(n),ht.remove(e,!1)})),e().each(r,(function(t,e){ht.remove(e,!1)})),new t(i.node,i.offset,i.node,i.offset).normalize()}},{key:"makeIsOn",value:function(t){return function(){var e=ht.ancestor(this.sc,t);return!!e&&e===ht.ancestor(this.ec,t)}}},{key:"isLeftEdgeOf",value:function(t){if(!ht.isLeftEdgePoint(this.getStartPoint()))return!1;var e=ht.ancestor(this.sc,t);return e&&ht.isLeftEdgeOf(this.sc,e)}},{key:"isCollapsed",value:function(){return this.sc===this.ec&&this.so===this.eo}},{key:"wrapBodyInlineWithPara",value:function(){if(ht.isBodyContainer(this.sc)&&ht.isEmpty(this.sc))return this.sc.innerHTML=ht.emptyPara,new t(this.sc.firstChild,0,this.sc.firstChild,0);var e,n=this.normalize();if(ht.isParaInline(this.sc)||ht.isPara(this.sc))return n;if(ht.isInline(n.sc)){var o=ht.listAncestor(n.sc,v.not(ht.isInline));e=k.last(o),ht.isInline(e)||(e=o[o.length-2]||n.sc.childNodes[n.so])}else e=n.sc.childNodes[n.so>0?n.so-1:0];if(e){var i=ht.listPrev(e,ht.isParaInline).reverse();if((i=i.concat(ht.listNext(e.nextSibling,ht.isParaInline))).length){var r=ht.wrap(k.head(i),"p");ht.appendChildNodes(r,k.tail(i))}}return this.normalize()}},{key:"insertNode",value:function(t){var e=this;(ht.isText(t)||ht.isInline(t))&&(e=this.wrapBodyInlineWithPara().deleteContents());var n=ht.splitPoint(e.getStartPoint(),ht.isInline(t));return n.rightNode?(n.rightNode.parentNode.insertBefore(t,n.rightNode),ht.isEmpty(n.rightNode)&&ht.isPara(t)&&n.rightNode.parentNode.removeChild(n.rightNode)):n.container.appendChild(t),t}},{key:"pasteHTML",value:function(t){t=e().trim(t);var n=e()("<div></div>").html(t)[0],o=k.from(n.childNodes),i=this,r=!1;return i.so>=0&&(o=o.reverse(),r=!0),o=o.map((function(t){return i.insertNode(t)})),r&&(o=o.reverse()),o}},{key:"toString",value:function(){var t=this.nativeRange();return f.isW3CRangeSupport?t.toString():t.text}},{key:"getWordRange",value:function(e){var n=this.getEndPoint();if(!ht.isCharPoint(n))return this;var o=ht.prevPointUntil(n,(function(t){return!ht.isCharPoint(t)}));return e&&(n=ht.nextPointUntil(n,(function(t){return!ht.isCharPoint(t)}))),new t(o.node,o.offset,n.node,n.offset)}},{key:"getWordsRange",value:function(e){var n=this.getEndPoint(),o=function(t){return!ht.isCharPoint(t)&&!ht.isSpacePoint(t)};if(o(n))return this;var i=ht.prevPointUntil(n,o);return e&&(n=ht.nextPointUntil(n,o)),new t(i.node,i.offset,n.node,n.offset)}},{key:"getWordsMatchRange",value:function(e){var n=this.getEndPoint(),o=ht.prevPointUntil(n,(function(o){if(!ht.isCharPoint(o)&&!ht.isSpacePoint(o))return!0;var i=new t(o.node,o.offset,n.node,n.offset),r=e.exec(i.toString());return r&&0===r.index})),i=new t(o.node,o.offset,n.node,n.offset),r=i.toString(),a=e.exec(r);return a&&a[0].length===r.length?i:null}},{key:"bookmark",value:function(t){return{s:{path:ht.makeOffsetPath(t,this.sc),offset:this.so},e:{path:ht.makeOffsetPath(t,this.ec),offset:this.eo}}}},{key:"paraBookmark",value:function(t){return{s:{path:k.tail(ht.makeOffsetPath(k.head(t),this.sc)),offset:this.so},e:{path:k.tail(ht.makeOffsetPath(k.last(t),this.ec)),offset:this.eo}}}},{key:"getClientRects",value:function(){return this.nativeRange().getClientRects()}}],o&&vt(n.prototype,o),i&&vt(n,i),t}();const yt={create:function(t,e,n,o){if(4===arguments.length)return new bt(t,e,n,o);if(2===arguments.length)return new bt(t,e,n=t,o=e);var i=this.createFromSelection();if(!i&&1===arguments.length){var r=arguments[0];return ht.isEditable(r)&&(r=r.lastChild),this.createFromBodyElement(r,ht.emptyPara===arguments[0].innerHTML)}return i},createFromBodyElement:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.createFromNode(t);return n.collapse(e)},createFromSelection:function(){var t,e,n,o;if(f.isW3CRangeSupport){var i=document.getSelection();if(!i||0===i.rangeCount)return null;if(ht.isBody(i.anchorNode))return null;var r=i.getRangeAt(0);t=r.startContainer,e=r.startOffset,n=r.endContainer,o=r.endOffset}else{var a=document.selection.createRange(),s=a.duplicate();s.collapse(!1);var l=a;l.collapse(!0);var c=mt(l,!0),u=mt(s,!1);ht.isText(c.node)&&ht.isLeftEdgePoint(c)&&ht.isTextNode(u.node)&&ht.isRightEdgePoint(u)&&u.node.nextSibling===c.node&&(c=u),t=c.cont,e=c.offset,n=u.cont,o=u.offset}return new bt(t,e,n,o)},createFromNode:function(t){var e=t,n=0,o=t,i=ht.nodeLength(o);return ht.isVoid(e)&&(n=ht.listPrev(e).length-1,e=e.parentNode),ht.isBR(o)?(i=ht.listPrev(o).length-1,o=o.parentNode):ht.isVoid(o)&&(i=ht.listPrev(o).length,o=o.parentNode),this.create(e,n,o,i)},createFromNodeBefore:function(t){return this.createFromNode(t).collapse(!0)},createFromNodeAfter:function(t){return this.createFromNode(t).collapse()},createFromBookmark:function(t,e){var n=ht.fromOffsetPath(t,e.s.path),o=e.s.offset,i=ht.fromOffsetPath(t,e.e.path),r=e.e.offset;return new bt(n,o,i,r)},createFromParaBookmark:function(t,e){var n=t.s.offset,o=t.e.offset,i=ht.fromOffsetPath(k.head(e),t.s.path),r=ht.fromOffsetPath(k.last(e),t.e.path);return new bt(i,n,r,o)}};var kt={BACKSPACE:8,TAB:9,ENTER:13,ESCAPE:27,SPACE:32,DELETE:46,LEFT:37,UP:38,RIGHT:39,DOWN:40,NUM0:48,NUM1:49,NUM2:50,NUM3:51,NUM4:52,NUM5:53,NUM6:54,NUM7:55,NUM8:56,B:66,E:69,I:73,J:74,K:75,L:76,R:82,S:83,U:85,V:86,Y:89,Z:90,SLASH:191,LEFTBRACKET:219,BACKSLASH:220,RIGHTBRACKET:221,HOME:36,END:35,PAGEUP:33,PAGEDOWN:34};const wt={isEdit:function(t){return k.contains([kt.BACKSPACE,kt.TAB,kt.ENTER,kt.SPACE,kt.DELETE],t)},isMove:function(t){return k.contains([kt.LEFT,kt.UP,kt.RIGHT,kt.DOWN],t)},isNavigation:function(t){return k.contains([kt.HOME,kt.END,kt.PAGEUP,kt.PAGEDOWN],t)},nameFromCode:v.invertObject(kt),code:kt};function Ct(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var xt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.stack=[],this.stackOffset=-1,this.context=e,this.$editable=e.layoutInfo.editable,this.editable=this.$editable[0]}var e,n,o;return e=t,(n=[{key:"makeSnapshot",value:function(){var t=yt.create(this.editable);return{contents:this.$editable.html(),bookmark:t&&t.isOnEditable()?t.bookmark(this.editable):{s:{path:[],offset:0},e:{path:[],offset:0}}}}},{key:"applySnapshot",value:function(t){null!==t.contents&&this.$editable.html(t.contents),null!==t.bookmark&&yt.createFromBookmark(this.editable,t.bookmark).select()}},{key:"rewind",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset=0,this.applySnapshot(this.stack[this.stackOffset])}},{key:"commit",value:function(){this.stack=[],this.stackOffset=-1,this.recordUndo()}},{key:"reset",value:function(){this.stack=[],this.stackOffset=-1,this.$editable.html(""),this.recordUndo()}},{key:"undo",value:function(){this.$editable.html()!==this.stack[this.stackOffset].contents&&this.recordUndo(),this.stackOffset>0&&(this.stackOffset--,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"redo",value:function(){this.stack.length-1>this.stackOffset&&(this.stackOffset++,this.applySnapshot(this.stack[this.stackOffset]))}},{key:"recordUndo",value:function(){this.stackOffset++,this.stack.length>this.stackOffset&&(this.stack=this.stack.slice(0,this.stackOffset)),this.stack.push(this.makeSnapshot()),this.stack.length>this.context.options.historyLimit&&(this.stack.shift(),this.stackOffset-=1)}}])&&Ct(e.prototype,n),o&&Ct(e,o),t}();function St(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Tt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"jQueryCSS",value:function(t,n){var o={};return e().each(n,(function(e,n){o[n]=t.css(n)})),o}},{key:"fromNode",value:function(t){var e=this.jQueryCSS(t,["font-family","font-size","text-align","list-style-type","line-height"])||{},n=t[0].style.fontSize||e["font-size"];return e["font-size"]=parseInt(n,10),e["font-size-unit"]=n.match(/[a-z%]+$/),e}},{key:"stylePara",value:function(t,n){e().each(t.nodes(ht.isPara,{includeAncestor:!0}),(function(t,o){e()(o).css(n)}))}},{key:"styleNodes",value:function(t,n){t=t.splitText();var o=n&&n.nodeName||"SPAN",i=!(!n||!n.expandClosestSibling),r=!(!n||!n.onlyPartialContains);if(t.isCollapsed())return[t.insertNode(ht.create(o))];var a=ht.makePredByNodeName(o),s=t.nodes(ht.isText,{fullyContains:!0}).map((function(t){return ht.singleChildAncestor(t,a)||ht.wrap(t,o)}));if(i){if(r){var l=t.nodes();a=v.and(a,(function(t){return k.contains(l,t)}))}return s.map((function(t){var n=ht.withClosestSiblings(t,a),o=k.head(n),i=k.tail(n);return e().each(i,(function(t,e){ht.appendChildNodes(o,e.childNodes),ht.remove(e)})),k.head(n)}))}return s}},{key:"current",value:function(t){var n=e()(ht.isElement(t.sc)?t.sc:t.sc.parentNode),o=this.fromNode(n);try{o=e().extend(o,{"font-bold":document.queryCommandState("bold")?"bold":"normal","font-italic":document.queryCommandState("italic")?"italic":"normal","font-underline":document.queryCommandState("underline")?"underline":"normal","font-subscript":document.queryCommandState("subscript")?"subscript":"normal","font-superscript":document.queryCommandState("superscript")?"superscript":"normal","font-strikethrough":document.queryCommandState("strikethrough")?"strikethrough":"normal","font-family":document.queryCommandValue("fontname")||o["font-family"]})}catch(t){}if(t.isOnList()){var i=["circle","disc","disc-leading-zero","square"].indexOf(o["list-style-type"])>-1;o["list-style"]=i?"unordered":"ordered"}else o["list-style"]="none";var r=ht.ancestor(t.sc,ht.isPara);if(r&&r.style["line-height"])o["line-height"]=r.style.lineHeight;else{var a=parseInt(o["line-height"],10)/parseInt(o["font-size"],10);o["line-height"]=a.toFixed(1)}return o.anchor=t.isOnAnchor()&&ht.ancestor(t.sc,ht.isAnchor),o.ancestors=ht.listAncestor(t.sc,ht.isEditable),o.range=t,o}}],o&&St(n.prototype,o),i&&St(n,i),t}();function Et(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var It=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"insertOrderedList",value:function(t){this.toggleList("OL",t)}},{key:"insertUnorderedList",value:function(t){this.toggleList("UL",t)}},{key:"indent",value:function(t){var n=this,o=yt.create(t).wrapBodyInlineWithPara(),i=o.nodes(ht.isPara,{includeAncestor:!0}),r=k.clusterBy(i,v.peq2("parentNode"));e().each(r,(function(t,o){var i=k.head(o);if(ht.isLi(i)){var r=n.findList(i.previousSibling);r?o.map((function(t){return r.appendChild(t)})):(n.wrapList(o,i.parentNode.nodeName),o.map((function(t){return t.parentNode})).map((function(t){return n.appendToPrevious(t)})))}else e().each(o,(function(t,n){e()(n).css("marginLeft",(function(t,e){return(parseInt(e,10)||0)+25}))}))})),o.select()}},{key:"outdent",value:function(t){var n=this,o=yt.create(t).wrapBodyInlineWithPara(),i=o.nodes(ht.isPara,{includeAncestor:!0}),r=k.clusterBy(i,v.peq2("parentNode"));e().each(r,(function(t,o){var i=k.head(o);ht.isLi(i)?n.releaseList([o]):e().each(o,(function(t,n){e()(n).css("marginLeft",(function(t,e){return(e=parseInt(e,10)||0)>25?e-25:""}))}))})),o.select()}},{key:"toggleList",value:function(t,n){var o=this,i=yt.create(n).wrapBodyInlineWithPara(),r=i.nodes(ht.isPara,{includeAncestor:!0}),a=i.paraBookmark(r),s=k.clusterBy(r,v.peq2("parentNode"));if(k.find(r,ht.isPurePara)){var l=[];e().each(s,(function(e,n){l=l.concat(o.wrapList(n,t))})),r=l}else{var c=i.nodes(ht.isList,{includeAncestor:!0}).filter((function(n){return!e().nodeName(n,t)}));c.length?e().each(c,(function(e,n){ht.replace(n,t)})):r=this.releaseList(s,!0)}yt.createFromParaBookmark(a,r).select()}},{key:"wrapList",value:function(t,e){var n=k.head(t),o=k.last(t),i=ht.isList(n.previousSibling)&&n.previousSibling,r=ht.isList(o.nextSibling)&&o.nextSibling,a=i||ht.insertAfter(ht.create(e||"UL"),o);return t=t.map((function(t){return ht.isPurePara(t)?ht.replace(t,"LI"):t})),ht.appendChildNodes(a,t),r&&(ht.appendChildNodes(a,k.from(r.childNodes)),ht.remove(r)),t}},{key:"releaseList",value:function(t,n){var o=this,i=[];return e().each(t,(function(t,r){var a=k.head(r),s=k.last(r),l=n?ht.lastAncestor(a,ht.isList):a.parentNode,c=l.parentNode;if("LI"===l.parentNode.nodeName)r.map((function(t){var e=o.findNextSiblings(t);c.nextSibling?c.parentNode.insertBefore(t,c.nextSibling):c.parentNode.appendChild(t),e.length&&(o.wrapList(e,l.nodeName),t.appendChild(e[0].parentNode))})),0===l.children.length&&c.removeChild(l),0===c.childNodes.length&&c.parentNode.removeChild(c);else{var u=l.childNodes.length>1?ht.splitTree(l,{node:s.parentNode,offset:ht.position(s)+1},{isSkipPaddingBlankHTML:!0}):null,d=ht.splitTree(l,{node:a.parentNode,offset:ht.position(a)},{isSkipPaddingBlankHTML:!0});r=n?ht.listDescendant(d,ht.isLi):k.from(d.childNodes).filter(ht.isLi),!n&&ht.isList(l.parentNode)||(r=r.map((function(t){return ht.replace(t,"P")}))),e().each(k.from(r).reverse(),(function(t,e){ht.insertAfter(e,l)}));var h=k.compact([l,d,u]);e().each(h,(function(t,n){var o=[n].concat(ht.listDescendant(n,ht.isList));e().each(o.reverse(),(function(t,e){ht.nodeLength(e)||ht.remove(e,!0)}))}))}i=i.concat(r)})),i}},{key:"appendToPrevious",value:function(t){return t.previousSibling?ht.appendChildNodes(t.previousSibling,[t]):this.wrapList([t],"LI")}},{key:"findList",value:function(t){return t?k.find(t.children,(function(t){return["OL","UL"].indexOf(t.nodeName)>-1})):null}},{key:"findNextSiblings",value:function(t){for(var e=[];t.nextSibling;)e.push(t.nextSibling),t=t.nextSibling;return e}}],o&&Et(n.prototype,o),i&&Et(n,i),t}();function $t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Nt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.bullet=new It,this.options=e.options}var n,o,i;return n=t,o=[{key:"insertTab",value:function(t,e){var n=ht.createText(new Array(e+1).join(ht.NBSP_CHAR));(t=t.deleteContents()).insertNode(n,!0),(t=yt.create(n,e)).select()}},{key:"insertParagraph",value:function(t,n){n=(n=(n=n||yt.create(t)).deleteContents()).wrapBodyInlineWithPara();var o,i=ht.ancestor(n.sc,ht.isPara);if(i){if(ht.isLi(i)&&(ht.isEmpty(i)||ht.deepestChildIsEmpty(i)))return void this.bullet.toggleList(i.parentNode.nodeName);var r=null;if(1===this.options.blockquoteBreakingLevel?r=ht.ancestor(i,ht.isBlockquote):2===this.options.blockquoteBreakingLevel&&(r=ht.lastAncestor(i,ht.isBlockquote)),r){o=e()(ht.emptyPara)[0],ht.isRightEdgePoint(n.getStartPoint())&&ht.isBR(n.sc.nextSibling)&&e()(n.sc.nextSibling).remove();var a=ht.splitTree(r,n.getStartPoint(),{isDiscardEmptySplits:!0});a?a.parentNode.insertBefore(o,a):ht.insertAfter(o,r)}else{o=ht.splitTree(i,n.getStartPoint());var s=ht.listDescendant(i,ht.isEmptyAnchor);s=s.concat(ht.listDescendant(o,ht.isEmptyAnchor)),e().each(s,(function(t,e){ht.remove(e)})),(ht.isHeading(o)||ht.isPre(o)||ht.isCustomStyleTag(o))&&ht.isEmpty(o)&&(o=ht.replace(o,"p"))}}else{var l=n.sc.childNodes[n.so];o=e()(ht.emptyPara)[0],l?n.sc.insertBefore(o,l):n.sc.appendChild(o)}yt.create(o,0).normalize().select().scrollIntoView(t)}}],o&&$t(n.prototype,o),i&&$t(n,i),t}();function Pt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Rt=function t(e,n,o,i){var r={colPos:0,rowPos:0},a=[],s=[];function l(t,e,n,o,i,r,s){var l={baseRow:n,baseCell:o,isRowSpan:i,isColSpan:r,isVirtual:s};a[t]||(a[t]=[]),a[t][e]=l}function c(t,e,n,o){return{baseCell:t.baseCell,action:e,virtualTable:{rowIndex:n,cellIndex:o}}}function u(t,e){if(!a[t])return e;if(!a[t][e])return e;for(var n=e;a[t][n];)if(n++,!a[t][n])return n}function d(t,e){var n=u(t.rowIndex,e.cellIndex),o=e.colSpan>1,i=e.rowSpan>1,a=t.rowIndex===r.rowPos&&e.cellIndex===r.colPos;l(t.rowIndex,n,t,e,i,o,!1);var s=e.attributes.rowSpan?parseInt(e.attributes.rowSpan.value,10):0;if(s>1)for(var c=1;c<s;c++){var d=t.rowIndex+c;h(d,n,e,a),l(d,n,t,e,!0,o,!0)}var f=e.attributes.colSpan?parseInt(e.attributes.colSpan.value,10):0;if(f>1)for(var p=1;p<f;p++){var v=u(t.rowIndex,n+p);h(t.rowIndex,v,e,a),l(t.rowIndex,v,t,e,i,!0,!0)}}function h(t,e,n,o){t===r.rowPos&&r.colPos>=n.cellIndex&&n.cellIndex<=e&&!o&&r.colPos++}function f(e){switch(n){case t.where.Column:if(e.isColSpan)return t.resultAction.SubtractSpanCount;break;case t.where.Row:if(!e.isVirtual&&e.isRowSpan)return t.resultAction.AddCell;if(e.isRowSpan)return t.resultAction.SubtractSpanCount}return t.resultAction.RemoveCell}function p(e){switch(n){case t.where.Column:if(e.isColSpan)return t.resultAction.SumSpanCount;if(e.isRowSpan&&e.isVirtual)return t.resultAction.Ignore;break;case t.where.Row:if(e.isRowSpan)return t.resultAction.SumSpanCount;if(e.isColSpan&&e.isVirtual)return t.resultAction.Ignore}return t.resultAction.AddCell}this.getActionList=function(){for(var e=n===t.where.Row?r.rowPos:-1,i=n===t.where.Column?r.colPos:-1,l=0,u=!0;u;){var d=e>=0?e:l,h=i>=0?i:l,v=a[d];if(!v)return u=!1,s;var m=v[h];if(!m)return u=!1,s;var g=t.resultAction.Ignore;switch(o){case t.requestAction.Add:g=p(m);break;case t.requestAction.Delete:g=f(m)}s.push(c(m,g,d,h)),l++}return s},e&&e.tagName&&("td"===e.tagName.toLowerCase()||"th"===e.tagName.toLowerCase())&&(r.colPos=e.cellIndex,e.parentElement&&e.parentElement.tagName&&"tr"===e.parentElement.tagName.toLowerCase()&&(r.rowPos=e.parentElement.rowIndex)),function(){for(var t=i.rows,e=0;e<t.length;e++)for(var n=t[e].cells,o=0;o<n.length;o++)d(t[e],n[o])}()};Rt.where={Row:0,Column:1},Rt.requestAction={Add:0,Delete:1},Rt.resultAction={Ignore:0,SubtractSpanCount:1,RemoveCell:2,AddCell:3,SumSpanCount:4};var Lt=function(){function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,o,i;return n=t,o=[{key:"tab",value:function(t,e){var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=ht.ancestor(n,ht.isTable),i=ht.listDescendant(o,ht.isCell),r=k[e?"prev":"next"](i,n);r&&yt.create(r,0).select()}},{key:"addRow",value:function(t,n){for(var o=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(o).closest("tr"),r=this.recoverAttributes(i),a=e()("<tr"+r+"></tr>"),s=new Rt(o,Rt.where.Row,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),l=0;l<s.length;l++){var c=s[l],u=this.recoverAttributes(c.baseCell);switch(c.action){case Rt.resultAction.AddCell:a.append("<td"+u+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("top"===n&&(c.baseCell.parent?c.baseCell.closest("tr").rowIndex:0)<=i[0].rowIndex){var d=e()("<div></div>").append(e()("<td"+u+">"+ht.blank+"</td>").removeAttr("rowspan")).html();a.append(d);break}var h=parseInt(c.baseCell.rowSpan,10);h++,c.baseCell.setAttribute("rowSpan",h)}}if("top"===n)i.before(a);else{if(o.rowSpan>1){var f=i[0].rowIndex+(o.rowSpan-2);return void e()(e()(i).parent().find("tr")[f]).after(e()(a))}i.after(a)}}},{key:"addCol",value:function(t,n){var o=ht.ancestor(t.commonAncestor(),ht.isCell),i=e()(o).closest("tr");e()(i).siblings().push(i);for(var r=new Rt(o,Rt.where.Column,Rt.requestAction.Add,e()(i).closest("table")[0]).getActionList(),a=0;a<r.length;a++){var s=r[a],l=this.recoverAttributes(s.baseCell);switch(s.action){case Rt.resultAction.AddCell:"right"===n?e()(s.baseCell).after("<td"+l+">"+ht.blank+"</td>"):e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>");break;case Rt.resultAction.SumSpanCount:if("right"===n){var c=parseInt(s.baseCell.colSpan,10);c++,s.baseCell.setAttribute("colSpan",c)}else e()(s.baseCell).before("<td"+l+">"+ht.blank+"</td>")}}}},{key:"recoverAttributes",value:function(t){var e="";if(!t)return e;for(var n=t.attributes||[],o=0;o<n.length;o++)"id"!==n[o].name.toLowerCase()&&n[o].specified&&(e+=" "+n[o].name+"='"+n[o].value+"'");return e}},{key:"deleteRow",value:function(t){for(var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=e()(n).closest("tr"),i=o.children("td, th").index(e()(n)),r=o[0].rowIndex,a=new Rt(n,Rt.where.Row,Rt.requestAction.Delete,e()(o).closest("table")[0]).getActionList(),s=0;s<a.length;s++)if(a[s]){var l=a[s].baseCell,c=a[s].virtualTable,u=l.rowSpan&&l.rowSpan>1,d=u?parseInt(l.rowSpan,10):0;switch(a[s].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.AddCell:var h=o.next("tr")[0];if(!h)continue;var f=o[0].cells[i];u&&(d>2?(d--,h.insertBefore(f,h.cells[i]),h.cells[i].setAttribute("rowSpan",d),h.cells[i].innerHTML=""):2===d&&(h.insertBefore(f,h.cells[i]),h.cells[i].removeAttribute("rowSpan"),h.cells[i].innerHTML=""));continue;case Rt.resultAction.SubtractSpanCount:u&&(d>2?(d--,l.setAttribute("rowSpan",d),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")):2===d&&(l.removeAttribute("rowSpan"),c.rowIndex!==r&&l.cellIndex===i&&(l.innerHTML="")));continue;case Rt.resultAction.RemoveCell:continue}}o.remove()}},{key:"deleteCol",value:function(t){for(var n=ht.ancestor(t.commonAncestor(),ht.isCell),o=e()(n).closest("tr"),i=o.children("td, th").index(e()(n)),r=new Rt(n,Rt.where.Column,Rt.requestAction.Delete,e()(o).closest("table")[0]).getActionList(),a=0;a<r.length;a++)if(r[a])switch(r[a].action){case Rt.resultAction.Ignore:continue;case Rt.resultAction.SubtractSpanCount:var s=r[a].baseCell;if(s.colSpan&&s.colSpan>1){var l=s.colSpan?parseInt(s.colSpan,10):0;l>2?(l--,s.setAttribute("colSpan",l),s.cellIndex===i&&(s.innerHTML="")):2===l&&(s.removeAttribute("colSpan"),s.cellIndex===i&&(s.innerHTML=""))}continue;case Rt.resultAction.RemoveCell:ht.remove(r[a].baseCell,!0);continue}}},{key:"createTable",value:function(t,n,o){for(var i,r=[],a=0;a<t;a++)r.push("<td>"+ht.blank+"</td>");i=r.join("");for(var s,l=[],c=0;c<n;c++)l.push("<tr>"+i+"</tr>");s=l.join("");var u=e()("<table>"+s+"</table>");return o&&o.tableClassName&&u.addClass(o.tableClassName),u[0]}},{key:"deleteTable",value:function(t){var n=ht.ancestor(t.commonAncestor(),ht.isCell);e()(n).closest("table").remove()}}],o&&Pt(n.prototype,o),i&&Pt(n,i),t}();function At(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Ft=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$note=n.layoutInfo.note,this.$editor=n.layoutInfo.editor,this.$editable=n.layoutInfo.editable,this.options=n.options,this.lang=this.options.langInfo,this.editable=this.$editable[0],this.lastRange=null,this.snapshot=null,this.style=new Tt,this.table=new Lt,this.typing=new Nt(n),this.bullet=new It,this.history=new xt(n),this.context.memo("help.escape",this.lang.help.escape),this.context.memo("help.undo",this.lang.help.undo),this.context.memo("help.redo",this.lang.help.redo),this.context.memo("help.tab",this.lang.help.tab),this.context.memo("help.untab",this.lang.help.untab),this.context.memo("help.insertParagraph",this.lang.help.insertParagraph),this.context.memo("help.insertOrderedList",this.lang.help.insertOrderedList),this.context.memo("help.insertUnorderedList",this.lang.help.insertUnorderedList),this.context.memo("help.indent",this.lang.help.indent),this.context.memo("help.outdent",this.lang.help.outdent),this.context.memo("help.formatPara",this.lang.help.formatPara),this.context.memo("help.insertHorizontalRule",this.lang.help.insertHorizontalRule),this.context.memo("help.fontName",this.lang.help.fontName);for(var i=["bold","italic","underline","strikethrough","superscript","subscript","justifyLeft","justifyCenter","justifyRight","justifyFull","formatBlock","removeFormat","backColor"],r=0,a=i.length;r<a;r++)this[i[r]]=function(t){return function(e){o.beforeCommand(),document.execCommand(t,!1,e),o.afterCommand(!0)}}(i[r]),this.context.memo("help."+i[r],this.lang.help[i[r]]);this.fontName=this.wrapCommand((function(t){return o.fontStyling("font-family",f.validFontName(t))})),this.fontSize=this.wrapCommand((function(t){var e=o.currentStyle()["font-size-unit"];return o.fontStyling("font-size",t+e)})),this.fontSizeUnit=this.wrapCommand((function(t){var e=o.currentStyle()["font-size"];return o.fontStyling("font-size",e+t)}));for(var s=1;s<=6;s++)this["formatH"+s]=function(t){return function(){o.formatBlock("H"+t)}}(s),this.context.memo("help.formatH"+s,this.lang.help["formatH"+s]);this.insertParagraph=this.wrapCommand((function(){o.typing.insertParagraph(o.editable)})),this.insertOrderedList=this.wrapCommand((function(){o.bullet.insertOrderedList(o.editable)})),this.insertUnorderedList=this.wrapCommand((function(){o.bullet.insertUnorderedList(o.editable)})),this.indent=this.wrapCommand((function(){o.bullet.indent(o.editable)})),this.outdent=this.wrapCommand((function(){o.bullet.outdent(o.editable)})),this.insertNode=this.wrapCommand((function(t){o.isLimited(e()(t).text().length)||(o.getLastRange().insertNode(t),o.setLastRange(yt.createFromNodeAfter(t).select()))})),this.insertText=this.wrapCommand((function(t){if(!o.isLimited(t.length)){var e=o.getLastRange().insertNode(ht.createText(t));o.setLastRange(yt.create(e,ht.nodeLength(e)).select())}})),this.pasteHTML=this.wrapCommand((function(t){if(!o.isLimited(t.length)){t=o.context.invoke("codeview.purify",t);var e=o.getLastRange().pasteHTML(t);o.setLastRange(yt.createFromNodeAfter(k.last(e)).select())}})),this.formatBlock=this.wrapCommand((function(t,e){var n=o.options.callbacks.onApplyCustomStyle;n?n.call(o,e,o.context,o.onFormatBlock):o.onFormatBlock(t,e)})),this.insertHorizontalRule=this.wrapCommand((function(){var t=o.getLastRange().insertNode(ht.create("HR"));t.nextSibling&&o.setLastRange(yt.create(t.nextSibling,0).normalize().select())})),this.lineHeight=this.wrapCommand((function(t){o.style.stylePara(o.getLastRange(),{lineHeight:t})})),this.createLink=this.wrapCommand((function(t){var n=t.url,i=t.text,r=t.isNewWindow,a=t.checkProtocol,s=t.range||o.getLastRange(),l=i.length-s.toString().length;if(!(l>0&&o.isLimited(l))){var c=s.toString()!==i;"string"==typeof n&&(n=n.trim()),o.options.onCreateLink?n=o.options.onCreateLink(n):a&&(n=/^([A-Za-z][A-Za-z0-9+-.]*\:|#|\/)/.test(n)?n:o.options.defaultProtocol+n);var u=[];if(c){var d=(s=s.deleteContents()).insertNode(e()("<A>"+i+"</A>")[0]);u.push(d)}else u=o.style.styleNodes(s,{nodeName:"A",expandClosestSibling:!0,onlyPartialContains:!0});e().each(u,(function(t,o){e()(o).attr("href",n),r?e()(o).attr("target","_blank"):e()(o).removeAttr("target")})),o.setLastRange(o.createRangeFromList(u).select())}})),this.color=this.wrapCommand((function(t){var e=t.foreColor,n=t.backColor;e&&document.execCommand("foreColor",!1,e),n&&document.execCommand("backColor",!1,n)})),this.foreColor=this.wrapCommand((function(t){document.execCommand("foreColor",!1,t)})),this.insertTable=this.wrapCommand((function(t){var e=t.split("x");o.getLastRange().deleteContents().insertNode(o.table.createTable(e[0],e[1],o.options))})),this.removeMedia=this.wrapCommand((function(){var t=e()(o.restoreTarget()).parent();t.closest("figure").length?t.closest("figure").remove():t=e()(o.restoreTarget()).detach(),o.context.triggerEvent("media.delete",t,o.$editable)})),this.floatMe=this.wrapCommand((function(t){var n=e()(o.restoreTarget());n.toggleClass("note-float-left","left"===t),n.toggleClass("note-float-right","right"===t),n.css("float","none"===t?"":t)})),this.resize=this.wrapCommand((function(t){var n=e()(o.restoreTarget());0===(t=parseFloat(t))?n.css("width",""):n.css({width:100*t+"%",height:""})}))}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this;this.$editable.on("keydown",(function(e){if(e.keyCode===wt.code.ENTER&&t.context.triggerEvent("enter",e),t.context.triggerEvent("keydown",e),t.snapshot=t.history.makeSnapshot(),t.hasKeyShortCut=!1,e.isDefaultPrevented()||(t.options.shortcuts?t.hasKeyShortCut=t.handleKeyMap(e):t.preventDefaultEditableShortCuts(e)),t.isLimited(1,e)){var n=t.getLastRange();if(n.eo-n.so==0)return!1}t.setLastRange(),t.options.recordEveryKeystroke&&!1===t.hasKeyShortCut&&t.history.recordUndo()})).on("keyup",(function(e){t.setLastRange(),t.context.triggerEvent("keyup",e)})).on("focus",(function(e){t.setLastRange(),t.context.triggerEvent("focus",e)})).on("blur",(function(e){t.context.triggerEvent("blur",e)})).on("mousedown",(function(e){t.context.triggerEvent("mousedown",e)})).on("mouseup",(function(e){t.setLastRange(),t.history.recordUndo(),t.context.triggerEvent("mouseup",e)})).on("scroll",(function(e){t.context.triggerEvent("scroll",e)})).on("paste",(function(e){t.setLastRange(),t.context.triggerEvent("paste",e)})).on("input",(function(){t.isLimited(0)&&t.snapshot&&t.history.applySnapshot(t.snapshot)})),this.$editable.attr("spellcheck",this.options.spellCheck),this.$editable.attr("autocorrect",this.options.spellCheck),this.options.disableGrammar&&this.$editable.attr("data-gramm",!1),this.$editable.html(ht.html(this.$note)||ht.emptyPara),this.$editable.on(f.inputEventName,v.debounce((function(){t.context.triggerEvent("change",t.$editable.html(),t.$editable)}),10)),this.$editable.on("focusin",(function(e){t.context.triggerEvent("focusin",e)})).on("focusout",(function(e){t.context.triggerEvent("focusout",e)})),this.options.airMode?this.options.overrideContextMenu&&this.$editor.on("contextmenu",(function(e){return t.context.triggerEvent("contextmenu",e),!1})):(this.options.width&&this.$editor.outerWidth(this.options.width),this.options.height&&this.$editable.outerHeight(this.options.height),this.options.maxHeight&&this.$editable.css("max-height",this.options.maxHeight),this.options.minHeight&&this.$editable.css("min-height",this.options.minHeight)),this.history.recordUndo(),this.setLastRange()}},{key:"destroy",value:function(){this.$editable.off()}},{key:"handleKeyMap",value:function(t){var e=this.options.keyMap[f.isMac?"mac":"pc"],n=[];t.metaKey&&n.push("CMD"),t.ctrlKey&&!t.altKey&&n.push("CTRL"),t.shiftKey&&n.push("SHIFT");var o=wt.nameFromCode[t.keyCode];o&&n.push(o);var i=e[n.join("+")];if("TAB"!==o||this.options.tabDisable)if(i){if(!1!==this.context.invoke(i))return t.preventDefault(),!0}else wt.isEdit(t.keyCode)&&this.afterCommand();else this.afterCommand();return!1}},{key:"preventDefaultEditableShortCuts",value:function(t){(t.ctrlKey||t.metaKey)&&k.contains([66,73,85],t.keyCode)&&t.preventDefault()}},{key:"isLimited",value:function(t,e){return t=t||0,(void 0===e||!(wt.isMove(e.keyCode)||wt.isNavigation(e.keyCode)||e.ctrlKey||e.metaKey||k.contains([wt.code.BACKSPACE,wt.code.DELETE],e.keyCode)))&&this.options.maxTextLength>0&&this.$editable.text().length+t>this.options.maxTextLength}},{key:"createRange",value:function(){return this.focus(),this.setLastRange(),this.getLastRange()}},{key:"createRangeFromList",value:function(t){var e=yt.createFromNodeBefore(k.head(t)).getStartPoint(),n=yt.createFromNodeAfter(k.last(t)).getEndPoint();return yt.create(e.node,e.offset,n.node,n.offset)}},{key:"setLastRange",value:function(t){t?this.lastRange=t:(this.lastRange=yt.create(this.editable),0===e()(this.lastRange.sc).closest(".note-editable").length&&(this.lastRange=yt.createFromBodyElement(this.editable)))}},{key:"getLastRange",value:function(){return this.lastRange||this.setLastRange(),this.lastRange}},{key:"saveRange",value:function(t){t&&this.getLastRange().collapse().select()}},{key:"restoreRange",value:function(){this.lastRange&&(this.lastRange.select(),this.focus())}},{key:"saveTarget",value:function(t){this.$editable.data("target",t)}},{key:"clearTarget",value:function(){this.$editable.removeData("target")}},{key:"restoreTarget",value:function(){return this.$editable.data("target")}},{key:"currentStyle",value:function(){var t=yt.create();return t&&(t=t.normalize()),t?this.style.current(t):this.style.fromNode(this.$editable)}},{key:"styleFromNode",value:function(t){return this.style.fromNode(t)}},{key:"undo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.undo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"commit",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.commit(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"redo",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),this.history.redo(),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"beforeCommand",value:function(){this.context.triggerEvent("before.command",this.$editable.html()),document.execCommand("styleWithCSS",!1,this.options.styleWithCSS),this.focus()}},{key:"afterCommand",value:function(t){this.normalizeContent(),this.history.recordUndo(),t||this.context.triggerEvent("change",this.$editable.html(),this.$editable)}},{key:"tab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t);else{if(0===this.options.tabSize)return!1;this.isLimited(this.options.tabSize)||(this.beforeCommand(),this.typing.insertTab(t,this.options.tabSize),this.afterCommand())}}},{key:"untab",value:function(){var t=this.getLastRange();if(t.isCollapsed()&&t.isOnCell())this.table.tab(t,!0);else if(0===this.options.tabSize)return!1}},{key:"wrapCommand",value:function(t){return function(){this.beforeCommand(),t.apply(this,arguments),this.afterCommand()}}},{key:"insertImage",value:function(t,n){var o,i=this;return(o=t,e().Deferred((function(t){var n=e()("<img>");n.one("load",(function(){n.off("error abort"),t.resolve(n)})).one("error abort",(function(){n.off("load").detach(),t.reject(n)})).css({display:"none"}).appendTo(document.body).attr("src",o)})).promise()).then((function(t){i.beforeCommand(),"function"==typeof n?n(t):("string"==typeof n&&t.attr("data-filename",n),t.css("width",Math.min(i.$editable.width(),t.width()))),t.show(),i.getLastRange().insertNode(t[0]),i.setLastRange(yt.createFromNodeAfter(t[0]).select()),i.afterCommand()})).fail((function(t){i.context.triggerEvent("image.upload.error",t)}))}},{key:"insertImagesAsDataURL",value:function(t){var n=this;e().each(t,(function(t,o){var i=o.name;n.options.maximumImageFileSize&&n.options.maximumImageFileSize<o.size?n.context.triggerEvent("image.upload.error",n.lang.image.maximumFileSizeError):function(t){return e().Deferred((function(n){e().extend(new FileReader,{onload:function(t){var e=t.target.result;n.resolve(e)},onerror:function(t){n.reject(t)}}).readAsDataURL(t)})).promise()}(o).then((function(t){return n.insertImage(t,i)})).fail((function(){n.context.triggerEvent("image.upload.error")}))}))}},{key:"insertImagesOrCallback",value:function(t){this.options.callbacks.onImageUpload?this.context.triggerEvent("image.upload",t):this.insertImagesAsDataURL(t)}},{key:"getSelectedText",value:function(){var t=this.getLastRange();return t.isOnAnchor()&&(t=yt.createFromNode(ht.ancestor(t.sc,ht.isAnchor))),t.toString()}},{key:"onFormatBlock",value:function(t,n){if(document.execCommand("FormatBlock",!1,f.isMSIE?"<"+t+">":t),n&&n.length&&(n[0].tagName.toUpperCase()!==t.toUpperCase()&&(n=n.find(t)),n&&n.length)){var o=this.createRange(),i=e()([o.sc,o.ec]).closest(t);i.removeClass();var r=n[0].className||"";r&&i.addClass(r)}}},{key:"formatPara",value:function(){this.formatBlock("P")}},{key:"fontStyling",value:function(t,n){var o=this.getLastRange();if(""!==o){var i=this.style.styleNodes(o);if(this.$editor.find(".note-status-output").html(""),e()(i).css(t,n),o.isCollapsed()){var r=k.head(i);r&&!ht.nodeLength(r)&&(r.innerHTML=ht.ZERO_WIDTH_NBSP_CHAR,yt.createFromNode(r.firstChild).select(),this.setLastRange(),this.$editable.data("bogus",r))}else this.setLastRange(this.createRangeFromList(i).select())}else{var a=e().now();this.$editor.find(".note-status-output").html('<div id="note-status-output-'+a+'" class="alert alert-info">'+this.lang.output.noSelection+"</div>"),setTimeout((function(){e()("#note-status-output-"+a).remove()}),5e3)}}},{key:"unlink",value:function(){var t=this.getLastRange();if(t.isOnAnchor()){var e=ht.ancestor(t.sc,ht.isAnchor);(t=yt.createFromNode(e)).select(),this.setLastRange(),this.beforeCommand(),document.execCommand("unlink"),this.afterCommand()}}},{key:"getLinkInfo",value:function(){var t=this.getLastRange().expand(ht.isAnchor),n=e()(k.head(t.nodes(ht.isAnchor))),o={range:t,text:t.toString(),url:n.length?n.attr("href"):""};return n.length&&(o.isNewWindow="_blank"===n.attr("target")),o}},{key:"addRow",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addRow(e,t),this.afterCommand())}},{key:"addCol",value:function(t){var e=this.getLastRange(this.$editable);e.isCollapsed()&&e.isOnCell()&&(this.beforeCommand(),this.table.addCol(e,t),this.afterCommand())}},{key:"deleteRow",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteRow(t),this.afterCommand())}},{key:"deleteCol",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteCol(t),this.afterCommand())}},{key:"deleteTable",value:function(){var t=this.getLastRange(this.$editable);t.isCollapsed()&&t.isOnCell()&&(this.beforeCommand(),this.table.deleteTable(t),this.afterCommand())}},{key:"resizeTo",value:function(t,e,n){var o;if(n){var i=t.y/t.x,r=e.data("ratio");o={width:r>i?t.x:t.y/r,height:r>i?t.x*r:t.y}}else o={width:t.x,height:t.y};e.css(o)}},{key:"hasFocus",value:function(){return this.$editable.is(":focus")}},{key:"focus",value:function(){this.hasFocus()||this.$editable.focus()}},{key:"isEmpty",value:function(){return ht.isEmpty(this.$editable[0])||ht.emptyPara===this.$editable.html()}},{key:"empty",value:function(){this.context.invoke("code",ht.emptyPara)}},{key:"normalizeContent",value:function(){this.$editable[0].normalize()}}],o&&At(n.prototype,o),i&&At(n,i),t}();function Dt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Ht=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editable=e.layoutInfo.editable}var e,n,o;return e=t,(n=[{key:"initialize",value:function(){this.$editable.on("paste",this.pasteByEvent.bind(this))}},{key:"pasteByEvent",value:function(t){var e=this,n=t.originalEvent.clipboardData;if(n&&n.items&&n.items.length){var o=n.items.length>1?n.items[1]:k.head(n.items);"file"===o.kind&&-1!==o.type.indexOf("image/")?(this.context.invoke("editor.insertImagesOrCallback",[o.getAsFile()]),t.preventDefault()):"string"===o.kind&&this.context.invoke("editor.isLimited",n.getData("Text").length)&&t.preventDefault()}else if(window.clipboardData){var i=window.clipboardData.getData("text");this.context.invoke("editor.isLimited",i.length)&&t.preventDefault()}setTimeout((function(){e.context.invoke("editor.afterCommand")}),10)}}])&&Dt(e.prototype,n),o&&Dt(e,o),t}();function zt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Bt=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$eventListener=e()(document),this.$editor=n.layoutInfo.editor,this.$editable=n.layoutInfo.editable,this.options=n.options,this.lang=this.options.langInfo,this.documentEventHandlers={},this.$dropzone=e()(['<div class="note-dropzone">','<div class="note-dropzone-message"></div>',"</div>"].join("")).prependTo(this.$editor)}var n,o,i;return n=t,o=[{key:"initialize",value:function(){this.options.disableDragAndDrop?(this.documentEventHandlers.onDrop=function(t){t.preventDefault()},this.$eventListener=this.$dropzone,this.$eventListener.on("drop",this.documentEventHandlers.onDrop)):this.attachDragAndDropEvent()}},{key:"attachDragAndDropEvent",value:function(){var t=this,n=e()(),o=this.$dropzone.find(".note-dropzone-message");this.documentEventHandlers.onDragenter=function(e){var i=t.context.invoke("codeview.isActivated"),r=t.$editor.width()>0&&t.$editor.height()>0;i||n.length||!r||(t.$editor.addClass("dragover"),t.$dropzone.width(t.$editor.width()),t.$dropzone.height(t.$editor.height()),o.text(t.lang.image.dragImageHere)),n=n.add(e.target)},this.documentEventHandlers.onDragleave=function(o){(n=n.not(o.target)).length&&"BODY"!==o.target.nodeName||(n=e()(),t.$editor.removeClass("dragover"))},this.documentEventHandlers.onDrop=function(){n=e()(),t.$editor.removeClass("dragover")},this.$eventListener.on("dragenter",this.documentEventHandlers.onDragenter).on("dragleave",this.documentEventHandlers.onDragleave).on("drop",this.documentEventHandlers.onDrop),this.$dropzone.on("dragenter",(function(){t.$dropzone.addClass("hover"),o.text(t.lang.image.dropImage)})).on("dragleave",(function(){t.$dropzone.removeClass("hover"),o.text(t.lang.image.dragImageHere)})),this.$dropzone.on("drop",(function(n){var o=n.originalEvent.dataTransfer;n.preventDefault(),o&&o.files&&o.files.length?(t.$editable.focus(),t.context.invoke("editor.insertImagesOrCallback",o.files)):e().each(o.types,(function(n,i){if(!(i.toLowerCase().indexOf("_moz_")>-1)){var r=o.getData(i);i.toLowerCase().indexOf("text")>-1?t.context.invoke("editor.pasteHTML",r):e()(r).each((function(e,n){t.context.invoke("editor.insertNode",n)}))}}))})).on("dragover",!1)}},{key:"destroy",value:function(){var t=this;Object.keys(this.documentEventHandlers).forEach((function(e){t.$eventListener.off(e.substr(2).toLowerCase(),t.documentEventHandlers[e])})),this.documentEventHandlers={}}}],o&&zt(n.prototype,o),i&&zt(n,i),t}();function Mt(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!n){if(Array.isArray(t)||(n=function(t,e){if(!t)return;if("string"==typeof t)return Ot(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ot(t,e)}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,a=!0,s=!1;return{s:function(){n=n.call(t)},n:function(){var t=n.next();return a=t.done,t},e:function(t){s=!0,r=t},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw r}}}}function Ot(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,o=new Array(e);n<e;n++)o[n]=t[n];return o}function Ut(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var jt=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editor=e.layoutInfo.editor,this.$editable=e.layoutInfo.editable,this.$codable=e.layoutInfo.codable,this.options=e.options,this.CodeMirrorConstructor=window.CodeMirror,this.options.codemirror.CodeMirrorConstructor&&(this.CodeMirrorConstructor=this.options.codemirror.CodeMirrorConstructor)}var e,n,o;return e=t,n=[{key:"sync",value:function(t){var e=this.isActivated(),n=this.CodeMirrorConstructor;e&&(t?n?this.$codable.data("cmEditor").getDoc().setValue(t):this.$codable.val(t):n&&this.$codable.data("cmEditor").save())}},{key:"initialize",value:function(){var t=this;this.$codable.on("keyup",(function(e){e.keyCode===wt.code.ESCAPE&&t.deactivate()}))}},{key:"isActivated",value:function(){return this.$editor.hasClass("codeview")}},{key:"toggle",value:function(){this.isActivated()?this.deactivate():this.activate(),this.context.triggerEvent("codeview.toggled")}},{key:"purify",value:function(t){if(this.options.codeviewFilter&&(t=t.replace(this.options.codeviewFilterRegex,""),this.options.codeviewIframeFilter)){var e=this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);t=t.replace(/(<iframe.*?>.*?(?:<\/iframe>)?)/gi,(function(t){if(/<.+src(?==?('|"|\s)?)[\s\S]+src(?=('|"|\s)?)[^>]*?>/i.test(t))return"";var n,o=Mt(e);try{for(o.s();!(n=o.n()).done;){var i=n.value;if(new RegExp('src="(https?:)?//'+i.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+'/(.+)"').test(t))return t}}catch(t){o.e(t)}finally{o.f()}return""}))}return t}},{key:"activate",value:function(){var t=this,e=this.CodeMirrorConstructor;if(this.$codable.val(ht.html(this.$editable,this.options.prettifyHtml)),this.$codable.height(this.$editable.height()),this.context.invoke("toolbar.updateCodeview",!0),this.context.invoke("airPopover.updateCodeview",!0),this.$editor.addClass("codeview"),this.$codable.focus(),e){var n=e.fromTextArea(this.$codable[0],this.options.codemirror);if(this.options.codemirror.tern){var o=new e.TernServer(this.options.codemirror.tern);n.ternServer=o,n.on("cursorActivity",(function(t){o.updateArgHints(t)}))}n.on("blur",(function(e){t.context.triggerEvent("blur.codeview",n.getValue(),e)})),n.on("change",(function(){t.context.triggerEvent("change.codeview",n.getValue(),n)})),n.setSize(null,this.$editable.outerHeight()),this.$codable.data("cmEditor",n)}else this.$codable.on("blur",(function(e){t.context.triggerEvent("blur.codeview",t.$codable.val(),e)})),this.$codable.on("input",(function(){t.context.triggerEvent("change.codeview",t.$codable.val(),t.$codable)}))}},{key:"deactivate",value:function(){if(this.CodeMirrorConstructor){var t=this.$codable.data("cmEditor");this.$codable.val(t.getValue()),t.toTextArea()}var e=this.purify(ht.value(this.$codable,this.options.prettifyHtml)||ht.emptyPara),n=this.$editable.html()!==e;this.$editable.html(e),this.$editable.height(this.options.height?this.$codable.height():"auto"),this.$editor.removeClass("codeview"),n&&this.context.triggerEvent("change",this.$editable.html(),this.$editable),this.$editable.focus(),this.context.invoke("toolbar.updateCodeview",!1),this.context.invoke("airPopover.updateCodeview",!1)}},{key:"destroy",value:function(){this.isActivated()&&this.deactivate()}}],n&&Ut(e.prototype,n),o&&Ut(e,o),t}();function Wt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Kt=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$document=e()(document),this.$statusbar=n.layoutInfo.statusbar,this.$editable=n.layoutInfo.editable,this.$codable=n.layoutInfo.codable,this.options=n.options}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this;this.options.airMode||this.options.disableResizeEditor?this.destroy():this.$statusbar.on("mousedown",(function(e){e.preventDefault(),e.stopPropagation();var n=t.$editable.offset().top-t.$document.scrollTop(),o=t.$codable.offset().top-t.$document.scrollTop(),i=function(e){var i=e.clientY-(n+24),r=e.clientY-(o+24);i=t.options.minheight>0?Math.max(i,t.options.minheight):i,i=t.options.maxHeight>0?Math.min(i,t.options.maxHeight):i,r=t.options.minheight>0?Math.max(r,t.options.minheight):r,r=t.options.maxHeight>0?Math.min(r,t.options.maxHeight):r,t.$editable.height(i),t.$codable.height(r)};t.$document.on("mousemove",i).one("mouseup",(function(){t.$document.off("mousemove",i)}))}))}},{key:"destroy",value:function(){this.$statusbar.off(),this.$statusbar.addClass("locked")}}])&&Wt(n.prototype,o),i&&Wt(n,i),t}();function Vt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var qt=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$editor=n.layoutInfo.editor,this.$toolbar=n.layoutInfo.toolbar,this.$editable=n.layoutInfo.editable,this.$codable=n.layoutInfo.codable,this.$window=e()(window),this.$scrollbar=e()("html, body"),this.scrollbarClassName="note-fullscreen-body",this.onResize=function(){o.resizeTo({h:o.$window.height()-o.$toolbar.outerHeight()})}}var n,o,i;return n=t,(o=[{key:"resizeTo",value:function(t){this.$editable.css("height",t.h),this.$codable.css("height",t.h),this.$codable.data("cmeditor")&&this.$codable.data("cmeditor").setsize(null,t.h)}},{key:"toggle",value:function(){this.$editor.toggleClass("fullscreen");var t=this.isFullscreen();this.$scrollbar.toggleClass(this.scrollbarClassName,t),t?(this.$editable.data("orgHeight",this.$editable.css("height")),this.$editable.data("orgMaxHeight",this.$editable.css("maxHeight")),this.$editable.css("maxHeight",""),this.$window.on("resize",this.onResize).trigger("resize")):(this.$window.off("resize",this.onResize),this.resizeTo({h:this.$editable.data("orgHeight")}),this.$editable.css("maxHeight",this.$editable.css("orgMaxHeight"))),this.context.invoke("toolbar.updateFullscreen",t)}},{key:"isFullscreen",value:function(){return this.$editor.hasClass("fullscreen")}},{key:"destroy",value:function(){this.$scrollbar.removeClass(this.scrollbarClassName)}}])&&Vt(n.prototype,o),i&&Vt(n,i),t}();function _t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Gt=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$document=e()(document),this.$editingArea=n.layoutInfo.editingArea,this.options=n.options,this.lang=this.options.langInfo,this.events={"summernote.mousedown":function(t,e){o.update(e.target,e)&&e.preventDefault()},"summernote.keyup summernote.scroll summernote.change summernote.dialog.shown":function(){o.update()},"summernote.disable summernote.blur":function(){o.hide()},"summernote.codeview.toggled":function(){o.update()}}}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this;this.$handle=e()(['<div class="note-handle">','<div class="note-control-selection">','<div class="note-control-selection-bg"></div>','<div class="note-control-holder note-control-nw"></div>','<div class="note-control-holder note-control-ne"></div>','<div class="note-control-holder note-control-sw"></div>','<div class="',this.options.disableResizeImage?"note-control-holder":"note-control-sizing",' note-control-se"></div>',this.options.disableResizeImage?"":'<div class="note-control-selection-info"></div>',"</div>","</div>"].join("")).prependTo(this.$editingArea),this.$handle.on("mousedown",(function(e){if(ht.isControlSizing(e.target)){e.preventDefault(),e.stopPropagation();var n=t.$handle.find(".note-control-selection").data("target"),o=n.offset(),i=t.$document.scrollTop(),r=function(e){t.context.invoke("editor.resizeTo",{x:e.clientX-o.left,y:e.clientY-(o.top-i)},n,!e.shiftKey),t.update(n[0],e)};t.$document.on("mousemove",r).one("mouseup",(function(e){e.preventDefault(),t.$document.off("mousemove",r),t.context.invoke("editor.afterCommand")})),n.data("ratio")||n.data("ratio",n.height()/n.width())}})),this.$handle.on("wheel",(function(e){e.preventDefault(),t.update()}))}},{key:"destroy",value:function(){this.$handle.remove()}},{key:"update",value:function(t,n){if(this.context.isDisabled())return!1;var o=ht.isImg(t),i=this.$handle.find(".note-control-selection");if(this.context.invoke("imagePopover.update",t,n),o){var r=e()(t),a=r.position(),s={left:a.left+parseInt(r.css("marginLeft"),10),top:a.top+parseInt(r.css("marginTop"),10)},l={w:r.outerWidth(!1),h:r.outerHeight(!1)};i.css({display:"block",left:s.left,top:s.top,width:l.w,height:l.h}).data("target",r);var c=new Image;c.src=r.attr("src");var u=l.w+"x"+l.h+" ("+this.lang.image.original+": "+c.width+"x"+c.height+")";i.find(".note-control-selection-info").text(u),this.context.invoke("editor.saveTarget",t)}else this.hide();return o}},{key:"hide",value:function(){this.context.invoke("editor.clearTarget"),this.$handle.children().hide()}}],o&&_t(n.prototype,o),i&&_t(n,i),t}();function Yt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Zt=/^([A-Za-z][A-Za-z0-9+-.]*\:[\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@|xmpp:[A-Z0-9._%+-]+@)?(www\.)?(.+)$/i,Qt=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||n.handleKeyup(e)},"summernote.keydown":function(t,e){n.handleKeydown(e)}}}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){this.lastWordRange=null}},{key:"destroy",value:function(){this.lastWordRange=null}},{key:"replace",value:function(){if(this.lastWordRange){var t=this.lastWordRange.toString(),n=t.match(Zt);if(n&&(n[1]||n[2])){var o=n[1]?t:"http://"+t,i=this.options.showDomainOnlyForAutolink?t.replace(/^(?:https?:\/\/)?(?:tel?:?)?(?:mailto?:?)?(?:xmpp?:?)?(?:www\.)?/i,"").split("/")[0]:t,r=e()("<a></a>").html(i).attr("href",o)[0];this.context.options.linkTargetBlank&&e()(r).attr("target","_blank"),this.lastWordRange.insertNode(r),this.lastWordRange=null,this.context.invoke("editor.focus")}}}},{key:"handleKeydown",value:function(t){if(k.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWordRange=e}}},{key:"handleKeyup",value:function(t){k.contains([wt.code.ENTER,wt.code.SPACE],t.keyCode)&&this.replace()}}])&&Yt(n.prototype,o),i&&Yt(n,i),t}();function Xt(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Jt=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.$note=e.layoutInfo.note,this.events={"summernote.change":function(){n.$note.val(e.invoke("code"))}}}var e,n,o;return e=t,(n=[{key:"shouldInitialize",value:function(){return ht.isTextarea(this.$note[0])}}])&&Xt(e.prototype,n),o&&Xt(e,o),t}();function te(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ee=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.options=e.options.replace||{},this.keys=[wt.code.ENTER,wt.code.SPACE,wt.code.PERIOD,wt.code.COMMA,wt.code.SEMICOLON,wt.code.SLASH],this.previousKeydownCode=null,this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||n.handleKeyup(e)},"summernote.keydown":function(t,e){n.handleKeydown(e)}}}var e,n,o;return e=t,(n=[{key:"shouldInitialize",value:function(){return!!this.options.match}},{key:"initialize",value:function(){this.lastWord=null}},{key:"destroy",value:function(){this.lastWord=null}},{key:"replace",value:function(){if(this.lastWord){var t=this,e=this.lastWord.toString();this.options.match(e,(function(e){if(e){var n="";if("string"==typeof e?n=ht.createText(e):e instanceof jQuery?n=e[0]:e instanceof Node&&(n=e),!n)return;t.lastWord.insertNode(n),t.lastWord=null,t.context.invoke("editor.focus")}}))}}},{key:"handleKeydown",value:function(t){if(this.previousKeydownCode&&k.contains(this.keys,this.previousKeydownCode))this.previousKeydownCode=t.keyCode;else{if(k.contains(this.keys,t.keyCode)){var e=this.context.invoke("editor.createRange").getWordRange();this.lastWord=e}this.previousKeydownCode=t.keyCode}}},{key:"handleKeyup",value:function(t){k.contains(this.keys,t.keyCode)&&this.replace()}}])&&te(e.prototype,n),o&&te(e,o),t}();function ne(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var oe=function(){function t(e){var n=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=e,this.$editingArea=e.layoutInfo.editingArea,this.options=e.options,!0===this.options.inheritPlaceholder&&(this.options.placeholder=this.context.$note.attr("placeholder")||this.options.placeholder),this.events={"summernote.init summernote.change":function(){n.update()},"summernote.codeview.toggled":function(){n.update()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!!this.options.placeholder}},{key:"initialize",value:function(){var t=this;this.$placeholder=e()('<div class="note-placeholder"></div>'),this.$placeholder.on("click",(function(){t.context.invoke("focus")})).html(this.options.placeholder).prependTo(this.$editingArea),this.update()}},{key:"destroy",value:function(){this.$placeholder.remove()}},{key:"update",value:function(){var t=!this.context.invoke("codeview.isActivated")&&this.context.invoke("editor.isEmpty");this.$placeholder.toggle(t)}}])&&ne(n.prototype,o),i&&ne(n,i),t}();function ie(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var re=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.ui=e().summernote.ui,this.context=n,this.$toolbar=n.layoutInfo.toolbar,this.options=n.options,this.lang=this.options.langInfo,this.invertedKeyMap=v.invertObject(this.options.keyMap[f.isMac?"mac":"pc"])}var n,o,i;return n=t,o=[{key:"representShortcut",value:function(t){var e=this.invertedKeyMap[t];return this.options.shortcuts&&e?(f.isMac&&(e=e.replace("CMD","⌘").replace("SHIFT","⇧"))," ("+(e=e.replace("BACKSLASH","\\").replace("SLASH","/").replace("LEFTBRACKET","[").replace("RIGHTBRACKET","]"))+")"):""}},{key:"button",value:function(t){return!this.options.tooltip&&t.tooltip&&delete t.tooltip,t.container=this.options.container,this.ui.button(t)}},{key:"initialize",value:function(){this.addToolbarButtons(),this.addImagePopoverButtons(),this.addLinkPopoverButtons(),this.addTablePopoverButtons(),this.fontInstalledMap={}}},{key:"destroy",value:function(){delete this.fontInstalledMap}},{key:"isFontInstalled",value:function(t){return Object.prototype.hasOwnProperty.call(this.fontInstalledMap,t)||(this.fontInstalledMap[t]=f.isFontInstalled(t)||k.contains(this.options.fontNamesIgnoreCheck,t)),this.fontInstalledMap[t]}},{key:"isFontDeservedToAdd",value:function(t){return""!==(t=t.toLowerCase())&&this.isFontInstalled(t)&&-1===f.genericFontFamilies.indexOf(t)}},{key:"colorPalette",value:function(t,n,o,i){var r=this;return this.ui.buttonGroup({className:"note-color "+t,children:[this.button({className:"note-current-color-button",contents:this.ui.icon(this.options.icons.font+" note-recent-color"),tooltip:n,click:function(t){var n=e()(t.currentTarget);o&&i?r.context.invoke("editor.color",{backColor:n.attr("data-backColor"),foreColor:n.attr("data-foreColor")}):o?r.context.invoke("editor.color",{backColor:n.attr("data-backColor")}):i&&r.context.invoke("editor.color",{foreColor:n.attr("data-foreColor")})},callback:function(t){var e=t.find(".note-recent-color");o&&(e.css("background-color",r.options.colorButton.backColor),t.attr("data-backColor",r.options.colorButton.backColor)),i?(e.css("color",r.options.colorButton.foreColor),t.attr("data-foreColor",r.options.colorButton.foreColor)):e.css("color","transparent")}}),this.button({className:"dropdown-toggle",contents:this.ui.dropdownButtonContents("",this.options),tooltip:this.lang.color.more,data:{toggle:"dropdown"}}),this.ui.dropdown({items:(o?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.background+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="backColor" data-value="transparent">',this.lang.color.transparent,"</button>","</div>",'<div class="note-holder" data-event="backColor">\x3c!-- back colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="backColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="backColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.backColor+'" data-event="backColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="backColorPalette-'+this.options.id+'" data-event="backColor"></div>',"</div>"].join(""):"")+(i?['<div class="note-palette">','<div class="note-palette-title">'+this.lang.color.foreground+"</div>","<div>",'<button type="button" class="note-color-reset btn btn-light btn-default" data-event="removeFormat" data-value="foreColor">',this.lang.color.resetToDefault,"</button>","</div>",'<div class="note-holder" data-event="foreColor">\x3c!-- fore colors --\x3e</div>',"<div>",'<button type="button" class="note-color-select btn btn-light btn-default" data-event="openPalette" data-value="foreColorPicker-'+this.options.id+'">',this.lang.color.cpSelect,"</button>",'<input type="color" id="foreColorPicker-'+this.options.id+'" class="note-btn note-color-select-btn" value="'+this.options.colorButton.foreColor+'" data-event="foreColorPalette-'+this.options.id+'">',"</div>",'<div class="note-holder-custom" id="foreColorPalette-'+this.options.id+'" data-event="foreColor"></div>',"</div>"].join(""):""),callback:function(t){t.find(".note-holder").each((function(t,n){var o=e()(n);o.append(r.ui.palette({colors:r.options.colors,colorsName:r.options.colorsName,eventName:o.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())}));var n=[["#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF","#FFFFFF"]];t.find(".note-holder-custom").each((function(t,o){var i=e()(o);i.append(r.ui.palette({colors:n,colorsName:n,eventName:i.data("event"),container:r.options.container,tooltip:r.options.tooltip}).render())})),t.find("input[type=color]").each((function(n,o){e()(o).change((function(){var n=t.find("#"+e()(this).data("event")).find(".note-color-btn").first(),o=this.value.toUpperCase();n.css("background-color",o).attr("aria-label",o).attr("data-value",o).attr("data-original-title",o),n.click()}))}))},click:function(n){n.stopPropagation();var o=e()("."+t).find(".note-dropdown-menu"),i=e()(n.target),a=i.data("event"),s=i.attr("data-value");if("openPalette"===a){var l=o.find("#"+s),c=e()(o.find("#"+l.data("event")).find(".note-color-row")[0]),u=c.find(".note-color-btn").last().detach(),d=l.val();u.css("background-color",d).attr("aria-label",d).attr("data-value",d).attr("data-original-title",d),c.prepend(u),l.click()}else{if(k.contains(["backColor","foreColor"],a)){var h="backColor"===a?"background-color":"color",f=i.closest(".note-color").find(".note-recent-color"),p=i.closest(".note-color").find(".note-current-color-button");f.css(h,s),p.attr("data-"+a,s)}r.context.invoke("editor."+a,s)}}})]}).render()}},{key:"addToolbarButtons",value:function(){var t=this;this.context.memo("button.style",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.magic),t.options),tooltip:t.lang.style.style,data:{toggle:"dropdown"}}),t.ui.dropdown({className:"dropdown-style",items:t.options.styleTags,title:t.lang.style.style,template:function(e){"string"==typeof e&&(e={tag:e,title:Object.prototype.hasOwnProperty.call(t.lang.style,e)?t.lang.style[e]:e});var n=e.tag,o=e.title;return"<"+n+(e.style?' style="'+e.style+'" ':"")+(e.className?' class="'+e.className+'"':"")+">"+o+"</"+n+">"},click:t.context.createInvokeHandler("editor.formatBlock")})]).render()}));for(var n=function(e,n){var o=t.options.styleTags[e];t.context.memo("button.style."+o,(function(){return t.button({className:"note-btn-style-"+o,contents:'<div data-value="'+o+'">'+o.toUpperCase()+"</div>",tooltip:t.lang.style[o],click:t.context.createInvokeHandler("editor.formatBlock")}).render()}))},o=0,i=this.options.styleTags.length;o<i;o++)n(o);this.context.memo("button.bold",(function(){return t.button({className:"note-btn-bold",contents:t.ui.icon(t.options.icons.bold),tooltip:t.lang.font.bold+t.representShortcut("bold"),click:t.context.createInvokeHandlerAndUpdateState("editor.bold")}).render()})),this.context.memo("button.italic",(function(){return t.button({className:"note-btn-italic",contents:t.ui.icon(t.options.icons.italic),tooltip:t.lang.font.italic+t.representShortcut("italic"),click:t.context.createInvokeHandlerAndUpdateState("editor.italic")}).render()})),this.context.memo("button.underline",(function(){return t.button({className:"note-btn-underline",contents:t.ui.icon(t.options.icons.underline),tooltip:t.lang.font.underline+t.representShortcut("underline"),click:t.context.createInvokeHandlerAndUpdateState("editor.underline")}).render()})),this.context.memo("button.clear",(function(){return t.button({contents:t.ui.icon(t.options.icons.eraser),tooltip:t.lang.font.clear+t.representShortcut("removeFormat"),click:t.context.createInvokeHandler("editor.removeFormat")}).render()})),this.context.memo("button.strikethrough",(function(){return t.button({className:"note-btn-strikethrough",contents:t.ui.icon(t.options.icons.strikethrough),tooltip:t.lang.font.strikethrough+t.representShortcut("strikethrough"),click:t.context.createInvokeHandlerAndUpdateState("editor.strikethrough")}).render()})),this.context.memo("button.superscript",(function(){return t.button({className:"note-btn-superscript",contents:t.ui.icon(t.options.icons.superscript),tooltip:t.lang.font.superscript,click:t.context.createInvokeHandlerAndUpdateState("editor.superscript")}).render()})),this.context.memo("button.subscript",(function(){return t.button({className:"note-btn-subscript",contents:t.ui.icon(t.options.icons.subscript),tooltip:t.lang.font.subscript,click:t.context.createInvokeHandlerAndUpdateState("editor.subscript")}).render()})),this.context.memo("button.fontname",(function(){var n=t.context.invoke("editor.currentStyle");return t.options.addDefaultFonts&&e().each(n["font-family"].split(","),(function(e,n){n=n.trim().replace(/['"]+/g,""),t.isFontDeservedToAdd(n)&&-1===t.options.fontNames.indexOf(n)&&t.options.fontNames.push(n)})),t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontname"></span>',t.options),tooltip:t.lang.font.name,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontname",checkClassName:t.options.icons.menuCheck,items:t.options.fontNames.filter(t.isFontInstalled.bind(t)),title:t.lang.font.name,template:function(t){return'<span style="font-family: '+f.validFontName(t)+'">'+t+"</span>"},click:t.context.createInvokeHandlerAndUpdateState("editor.fontName")})]).render()})),this.context.memo("button.fontsize",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsize"></span>',t.options),tooltip:t.lang.font.size,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsize",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizes,title:t.lang.font.size,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSize")})]).render()})),this.context.memo("button.fontsizeunit",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents('<span class="note-current-fontsizeunit"></span>',t.options),tooltip:t.lang.font.sizeunit,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({className:"dropdown-fontsizeunit",checkClassName:t.options.icons.menuCheck,items:t.options.fontSizeUnits,title:t.lang.font.sizeunit,click:t.context.createInvokeHandlerAndUpdateState("editor.fontSizeUnit")})]).render()})),this.context.memo("button.color",(function(){return t.colorPalette("note-color-all",t.lang.color.recent,!0,!0)})),this.context.memo("button.forecolor",(function(){return t.colorPalette("note-color-fore",t.lang.color.foreground,!1,!0)})),this.context.memo("button.backcolor",(function(){return t.colorPalette("note-color-back",t.lang.color.background,!0,!1)})),this.context.memo("button.ul",(function(){return t.button({contents:t.ui.icon(t.options.icons.unorderedlist),tooltip:t.lang.lists.unordered+t.representShortcut("insertUnorderedList"),click:t.context.createInvokeHandler("editor.insertUnorderedList")}).render()})),this.context.memo("button.ol",(function(){return t.button({contents:t.ui.icon(t.options.icons.orderedlist),tooltip:t.lang.lists.ordered+t.representShortcut("insertOrderedList"),click:t.context.createInvokeHandler("editor.insertOrderedList")}).render()}));var r=this.button({contents:this.ui.icon(this.options.icons.alignLeft),tooltip:this.lang.paragraph.left+this.representShortcut("justifyLeft"),click:this.context.createInvokeHandler("editor.justifyLeft")}),a=this.button({contents:this.ui.icon(this.options.icons.alignCenter),tooltip:this.lang.paragraph.center+this.representShortcut("justifyCenter"),click:this.context.createInvokeHandler("editor.justifyCenter")}),s=this.button({contents:this.ui.icon(this.options.icons.alignRight),tooltip:this.lang.paragraph.right+this.representShortcut("justifyRight"),click:this.context.createInvokeHandler("editor.justifyRight")}),l=this.button({contents:this.ui.icon(this.options.icons.alignJustify),tooltip:this.lang.paragraph.justify+this.representShortcut("justifyFull"),click:this.context.createInvokeHandler("editor.justifyFull")}),c=this.button({contents:this.ui.icon(this.options.icons.outdent),tooltip:this.lang.paragraph.outdent+this.representShortcut("outdent"),click:this.context.createInvokeHandler("editor.outdent")}),u=this.button({contents:this.ui.icon(this.options.icons.indent),tooltip:this.lang.paragraph.indent+this.representShortcut("indent"),click:this.context.createInvokeHandler("editor.indent")});this.context.memo("button.justifyLeft",v.invoke(r,"render")),this.context.memo("button.justifyCenter",v.invoke(a,"render")),this.context.memo("button.justifyRight",v.invoke(s,"render")),this.context.memo("button.justifyFull",v.invoke(l,"render")),this.context.memo("button.outdent",v.invoke(c,"render")),this.context.memo("button.indent",v.invoke(u,"render")),this.context.memo("button.paragraph",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.alignLeft),t.options),tooltip:t.lang.paragraph.paragraph,data:{toggle:"dropdown"}}),t.ui.dropdown([t.ui.buttonGroup({className:"note-align",children:[r,a,s,l]}),t.ui.buttonGroup({className:"note-list",children:[c,u]})])]).render()})),this.context.memo("button.height",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.textHeight),t.options),tooltip:t.lang.font.height,data:{toggle:"dropdown"}}),t.ui.dropdownCheck({items:t.options.lineHeights,checkClassName:t.options.icons.menuCheck,className:"dropdown-line-height",title:t.lang.font.height,click:t.context.createInvokeHandler("editor.lineHeight")})]).render()})),this.context.memo("button.table",(function(){return t.ui.buttonGroup([t.button({className:"dropdown-toggle",contents:t.ui.dropdownButtonContents(t.ui.icon(t.options.icons.table),t.options),tooltip:t.lang.table.table,data:{toggle:"dropdown"}}),t.ui.dropdown({title:t.lang.table.table,className:"note-table",items:['<div class="note-dimension-picker">','<div class="note-dimension-picker-mousecatcher" data-event="insertTable" data-value="1x1"></div>','<div class="note-dimension-picker-highlighted"></div>','<div class="note-dimension-picker-unhighlighted"></div>',"</div>",'<div class="note-dimension-display">1 x 1</div>'].join("")})],{callback:function(e){e.find(".note-dimension-picker-mousecatcher").css({width:t.options.insertTableMaxSize.col+"em",height:t.options.insertTableMaxSize.row+"em"}).mouseup(t.context.createInvokeHandler("editor.insertTable")).on("mousemove",t.tableMoveHandler.bind(t))}}).render()})),this.context.memo("button.link",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.link+t.representShortcut("linkDialog.show"),click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.picture",(function(){return t.button({contents:t.ui.icon(t.options.icons.picture),tooltip:t.lang.image.image,click:t.context.createInvokeHandler("imageDialog.show")}).render()})),this.context.memo("button.video",(function(){return t.button({contents:t.ui.icon(t.options.icons.video),tooltip:t.lang.video.video,click:t.context.createInvokeHandler("videoDialog.show")}).render()})),this.context.memo("button.hr",(function(){return t.button({contents:t.ui.icon(t.options.icons.minus),tooltip:t.lang.hr.insert+t.representShortcut("insertHorizontalRule"),click:t.context.createInvokeHandler("editor.insertHorizontalRule")}).render()})),this.context.memo("button.fullscreen",(function(){return t.button({className:"btn-fullscreen note-codeview-keep",contents:t.ui.icon(t.options.icons.arrowsAlt),tooltip:t.lang.options.fullscreen,click:t.context.createInvokeHandler("fullscreen.toggle")}).render()})),this.context.memo("button.codeview",(function(){return t.button({className:"btn-codeview note-codeview-keep",contents:t.ui.icon(t.options.icons.code),tooltip:t.lang.options.codeview,click:t.context.createInvokeHandler("codeview.toggle")}).render()})),this.context.memo("button.redo",(function(){return t.button({contents:t.ui.icon(t.options.icons.redo),tooltip:t.lang.history.redo+t.representShortcut("redo"),click:t.context.createInvokeHandler("editor.redo")}).render()})),this.context.memo("button.undo",(function(){return t.button({contents:t.ui.icon(t.options.icons.undo),tooltip:t.lang.history.undo+t.representShortcut("undo"),click:t.context.createInvokeHandler("editor.undo")}).render()})),this.context.memo("button.help",(function(){return t.button({contents:t.ui.icon(t.options.icons.question),tooltip:t.lang.options.help,click:t.context.createInvokeHandler("helpDialog.show")}).render()}))}},{key:"addImagePopoverButtons",value:function(){var t=this;this.context.memo("button.resizeFull",(function(){return t.button({contents:'<span class="note-fontsize-10">100%</span>',tooltip:t.lang.image.resizeFull,click:t.context.createInvokeHandler("editor.resize","1")}).render()})),this.context.memo("button.resizeHalf",(function(){return t.button({contents:'<span class="note-fontsize-10">50%</span>',tooltip:t.lang.image.resizeHalf,click:t.context.createInvokeHandler("editor.resize","0.5")}).render()})),this.context.memo("button.resizeQuarter",(function(){return t.button({contents:'<span class="note-fontsize-10">25%</span>',tooltip:t.lang.image.resizeQuarter,click:t.context.createInvokeHandler("editor.resize","0.25")}).render()})),this.context.memo("button.resizeNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.resizeNone,click:t.context.createInvokeHandler("editor.resize","0")}).render()})),this.context.memo("button.floatLeft",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatLeft),tooltip:t.lang.image.floatLeft,click:t.context.createInvokeHandler("editor.floatMe","left")}).render()})),this.context.memo("button.floatRight",(function(){return t.button({contents:t.ui.icon(t.options.icons.floatRight),tooltip:t.lang.image.floatRight,click:t.context.createInvokeHandler("editor.floatMe","right")}).render()})),this.context.memo("button.floatNone",(function(){return t.button({contents:t.ui.icon(t.options.icons.rollback),tooltip:t.lang.image.floatNone,click:t.context.createInvokeHandler("editor.floatMe","none")}).render()})),this.context.memo("button.removeMedia",(function(){return t.button({contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.image.remove,click:t.context.createInvokeHandler("editor.removeMedia")}).render()}))}},{key:"addLinkPopoverButtons",value:function(){var t=this;this.context.memo("button.linkDialogShow",(function(){return t.button({contents:t.ui.icon(t.options.icons.link),tooltip:t.lang.link.edit,click:t.context.createInvokeHandler("linkDialog.show")}).render()})),this.context.memo("button.unlink",(function(){return t.button({contents:t.ui.icon(t.options.icons.unlink),tooltip:t.lang.link.unlink,click:t.context.createInvokeHandler("editor.unlink")}).render()}))}},{key:"addTablePopoverButtons",value:function(){var t=this;this.context.memo("button.addRowUp",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowAbove),tooltip:t.lang.table.addRowAbove,click:t.context.createInvokeHandler("editor.addRow","top")}).render()})),this.context.memo("button.addRowDown",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowBelow),tooltip:t.lang.table.addRowBelow,click:t.context.createInvokeHandler("editor.addRow","bottom")}).render()})),this.context.memo("button.addColLeft",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colBefore),tooltip:t.lang.table.addColLeft,click:t.context.createInvokeHandler("editor.addCol","left")}).render()})),this.context.memo("button.addColRight",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colAfter),tooltip:t.lang.table.addColRight,click:t.context.createInvokeHandler("editor.addCol","right")}).render()})),this.context.memo("button.deleteRow",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.rowRemove),tooltip:t.lang.table.delRow,click:t.context.createInvokeHandler("editor.deleteRow")}).render()})),this.context.memo("button.deleteCol",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.colRemove),tooltip:t.lang.table.delCol,click:t.context.createInvokeHandler("editor.deleteCol")}).render()})),this.context.memo("button.deleteTable",(function(){return t.button({className:"btn-md",contents:t.ui.icon(t.options.icons.trash),tooltip:t.lang.table.delTable,click:t.context.createInvokeHandler("editor.deleteTable")}).render()}))}},{key:"build",value:function(t,e){for(var n=0,o=e.length;n<o;n++){for(var i=e[n],r=Array.isArray(i)?i[0]:i,a=Array.isArray(i)?1===i.length?[i[0]]:i[1]:[i],s=this.ui.buttonGroup({className:"note-"+r}).render(),l=0,c=a.length;l<c;l++){var u=this.context.memo("button."+a[l]);u&&s.append("function"==typeof u?u(this.context):u)}s.appendTo(t)}}},{key:"updateCurrentStyle",value:function(t){var n=t||this.$toolbar,o=this.context.invoke("editor.currentStyle");if(this.updateBtnStates(n,{".note-btn-bold":function(){return"bold"===o["font-bold"]},".note-btn-italic":function(){return"italic"===o["font-italic"]},".note-btn-underline":function(){return"underline"===o["font-underline"]},".note-btn-subscript":function(){return"subscript"===o["font-subscript"]},".note-btn-superscript":function(){return"superscript"===o["font-superscript"]},".note-btn-strikethrough":function(){return"strikethrough"===o["font-strikethrough"]}}),o["font-family"]){var i=o["font-family"].split(",").map((function(t){return t.replace(/[\'\"]/g,"").replace(/\s+$/,"").replace(/^\s+/,"")})),r=k.find(i,this.isFontInstalled.bind(this));n.find(".dropdown-fontname a").each((function(t,n){var o=e()(n),i=o.data("value")+""==r+"";o.toggleClass("checked",i)})),n.find(".note-current-fontname").text(r).css("font-family",r)}if(o["font-size"]){var a=o["font-size"];n.find(".dropdown-fontsize a").each((function(t,n){var o=e()(n),i=o.data("value")+""==a+"";o.toggleClass("checked",i)})),n.find(".note-current-fontsize").text(a);var s=o["font-size-unit"];n.find(".dropdown-fontsizeunit a").each((function(t,n){var o=e()(n),i=o.data("value")+""==s+"";o.toggleClass("checked",i)})),n.find(".note-current-fontsizeunit").text(s)}if(o["line-height"]){var l=o["line-height"];n.find(".dropdown-line-height a").each((function(t,n){var o=e()(n),i=e()(n).data("value")+""==l+"";o.toggleClass("checked",i)})),n.find(".note-current-line-height").text(l)}}},{key:"updateBtnStates",value:function(t,n){var o=this;e().each(n,(function(e,n){o.ui.toggleBtnActive(t.find(e),n())}))}},{key:"tableMoveHandler",value:function(t){var n,o=e()(t.target.parentNode),i=o.next(),r=o.find(".note-dimension-picker-mousecatcher"),a=o.find(".note-dimension-picker-highlighted"),s=o.find(".note-dimension-picker-unhighlighted");if(void 0===t.offsetX){var l=e()(t.target).offset();n={x:t.pageX-l.left,y:t.pageY-l.top}}else n={x:t.offsetX,y:t.offsetY};var c=Math.ceil(n.x/18)||1,u=Math.ceil(n.y/18)||1;a.css({width:c+"em",height:u+"em"}),r.data("value",c+"x"+u),c>3&&c<this.options.insertTableMaxSize.col&&s.css({width:c+1+"em"}),u>3&&u<this.options.insertTableMaxSize.row&&s.css({height:u+1+"em"}),i.html(c+" x "+u)}}],o&&ie(n.prototype,o),i&&ie(n,i),t}();function ae(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var se=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.$window=e()(window),this.$document=e()(document),this.ui=e().summernote.ui,this.$note=n.layoutInfo.note,this.$editor=n.layoutInfo.editor,this.$toolbar=n.layoutInfo.toolbar,this.$editable=n.layoutInfo.editable,this.$statusbar=n.layoutInfo.statusbar,this.options=n.options,this.isFollowing=!1,this.followScroll=this.followScroll.bind(this)}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!this.options.airMode}},{key:"initialize",value:function(){var t=this;this.options.toolbar=this.options.toolbar||[],this.options.toolbar.length?this.context.invoke("buttons.build",this.$toolbar,this.options.toolbar):this.$toolbar.hide(),this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.changeContainer(!1),this.$note.on("summernote.keyup summernote.mouseup summernote.change",(function(){t.context.invoke("buttons.updateCurrentStyle")})),this.context.invoke("buttons.updateCurrentStyle"),this.options.followingToolbar&&this.$window.on("scroll resize",this.followScroll)}},{key:"destroy",value:function(){this.$toolbar.children().remove(),this.options.followingToolbar&&this.$window.off("scroll resize",this.followScroll)}},{key:"followScroll",value:function(){if(this.$editor.hasClass("fullscreen"))return!1;var t=this.$editor.outerHeight(),n=this.$editor.width(),o=this.$toolbar.height(),i=this.$statusbar.height(),r=0;this.options.otherStaticBar&&(r=e()(this.options.otherStaticBar).outerHeight());var a=this.$document.scrollTop(),s=this.$editor.offset().top,l=s-r,c=s+t-r-o-i;!this.isFollowing&&a>l&&a<c-o?(this.isFollowing=!0,this.$editable.css({marginTop:this.$toolbar.outerHeight()}),this.$toolbar.css({position:"fixed",top:r,width:n,zIndex:1e3})):this.isFollowing&&(a<l||a>c)&&(this.isFollowing=!1,this.$toolbar.css({position:"relative",top:0,width:"100%",zIndex:"auto"}),this.$editable.css({marginTop:""}))}},{key:"changeContainer",value:function(t){t?this.$toolbar.prependTo(this.$editor):this.options.toolbarContainer&&this.$toolbar.appendTo(this.options.toolbarContainer),this.options.followingToolbar&&this.followScroll()}},{key:"updateFullscreen",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-fullscreen"),t),this.changeContainer(t)}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$toolbar.find(".btn-codeview"),t),t?this.deactivate():this.activate()}},{key:"activate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!0)}},{key:"deactivate",value:function(t){var e=this.$toolbar.find("button");t||(e=e.not(".note-codeview-keep")),this.ui.toggleBtn(e,!1)}}])&&ae(n.prototype,o),i&&ae(n,i),t}();function le(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ce=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo,n.memo("help.linkDialog.show",this.options.langInfo.help["linkDialog.show"])}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,n=['<div class="form-group note-form-group">','<label for="note-dialog-link-txt-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.textToDisplay,"</label>"),'<input id="note-dialog-link-txt-'.concat(this.options.id,'" class="note-link-text form-control note-form-control note-input" type="text"/>'),"</div>",'<div class="form-group note-form-group">','<label for="note-dialog-link-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.link.url,"</label>"),'<input id="note-dialog-link-url-'.concat(this.options.id,'" class="note-link-url form-control note-form-control note-input" type="text" value="http://"/>'),"</div>",this.options.disableLinkTarget?"":e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-open-in-new-window",text:this.lang.link.openInNewWindow,checked:!0}).render()).html(),e()("<div></div>").append(this.ui.checkbox({className:"sn-checkbox-use-protocol",text:this.lang.link.useProtocol,checked:!0}).render()).html()].join(""),o='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-link-btn",'" value="').concat(this.lang.link.insert,'" disabled>');this.$dialog=this.ui.dialog({className:"link-dialog",title:this.lang.link.insert,fade:this.options.dialogsFade,body:n,footer:o}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"toggleLinkBtn",value:function(t,e,n){this.ui.toggleBtn(t,e.val()&&n.val())}},{key:"showLinkDialog",value:function(t){var n=this;return e().Deferred((function(e){var o=n.$dialog.find(".note-link-text"),i=n.$dialog.find(".note-link-url"),r=n.$dialog.find(".note-link-btn"),a=n.$dialog.find(".sn-checkbox-open-in-new-window input[type=checkbox]"),s=n.$dialog.find(".sn-checkbox-use-protocol input[type=checkbox]");n.ui.onDialogShown(n.$dialog,(function(){n.context.triggerEvent("dialog.shown"),!t.url&&v.isValidUrl(t.text)&&(t.url=t.text),o.on("input paste propertychange",(function(){t.text=o.val(),n.toggleLinkBtn(r,o,i)})).val(t.text),i.on("input paste propertychange",(function(){t.text||o.val(i.val()),n.toggleLinkBtn(r,o,i)})).val(t.url),f.isSupportTouch||i.trigger("focus"),n.toggleLinkBtn(r,o,i),n.bindEnterKey(i,r),n.bindEnterKey(o,r);var l=void 0!==t.isNewWindow?t.isNewWindow:n.context.options.linkTargetBlank;a.prop("checked",l);var c=!t.url&&n.context.options.useProtocol;s.prop("checked",c),r.one("click",(function(r){r.preventDefault(),e.resolve({range:t.range,url:i.val(),text:o.val(),isNewWindow:a.is(":checked"),checkProtocol:s.is(":checked")}),n.ui.hideDialog(n.$dialog)}))})),n.ui.onDialogHidden(n.$dialog,(function(){o.off(),i.off(),r.off(),"pending"===e.state()&&e.reject()})),n.ui.showDialog(n.$dialog)})).promise()}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getLinkInfo");this.context.invoke("editor.saveRange"),this.showLinkDialog(e).then((function(e){t.context.invoke("editor.restoreRange"),t.context.invoke("editor.createLink",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}}])&&le(n.prototype,o),i&&le(n,i),t}();function ue(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var de=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.events={"summernote.keyup summernote.mouseup summernote.change summernote.scroll":function(){o.update()},"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.link)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-link-popover",callback:function(t){t.find(".popover-content,.note-popover-content").prepend('<span><a target="_blank"></a>&nbsp;</span>')}}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.link),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(){if(this.context.invoke("editor.hasFocus")){var t=this.context.invoke("editor.getLastRange");if(t.isCollapsed()&&t.isOnAnchor()){var n=ht.ancestor(t.sc,ht.isAnchor),o=e()(n).attr("href");this.$popover.find("a").attr("href",o).text(o);var i=ht.posFromPlaceholder(n),r=e()(this.options.container).offset();i.top-=r.top,i.left-=r.left,this.$popover.css({display:"block",left:i.left,top:i.top})}else this.hide()}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}])&&ue(n.prototype,o),i&&ue(n,i),t}();function he(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var fe=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t="";if(this.options.maximumImageFileSize){var e=Math.floor(Math.log(this.options.maximumImageFileSize)/Math.log(1024)),n=1*(this.options.maximumImageFileSize/Math.pow(1024,e)).toFixed(2)+" "+" KMGTP"[e]+"B";t="<small>".concat(this.lang.image.maximumFileSize+" : "+n,"</small>")}var o=this.options.dialogsInBody?this.$body:this.options.container,i=['<div class="form-group note-form-group note-group-select-from-files">','<label for="note-dialog-image-file-'+this.options.id+'" class="note-form-label">'+this.lang.image.selectFromFiles+"</label>",'<input id="note-dialog-image-file-'+this.options.id+'" class="note-image-input form-control-file note-form-control note-input" ',' type="file" name="files" accept="'+this.options.acceptImageFileTypes+'" multiple="multiple"/>',t,"</div>",'<div class="form-group note-group-image-url">','<label for="note-dialog-image-url-'+this.options.id+'" class="note-form-label">'+this.lang.image.url+"</label>",'<input id="note-dialog-image-url-'+this.options.id+'" class="note-image-url form-control note-form-control note-input" type="text"/>',"</div>"].join(""),r='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-image-btn",'" value="').concat(this.lang.image.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.image.insert,fade:this.options.dialogsFade,body:i,footer:r}).render().appendTo(o)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showImageDialog().then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange"),"string"==typeof e?t.options.callbacks.onImageLinkInsert?t.context.triggerEvent("image.link.insert",e):t.context.invoke("editor.insertImage",e):t.context.invoke("editor.insertImagesOrCallback",e)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showImageDialog",value:function(){var t=this;return e().Deferred((function(e){var n=t.$dialog.find(".note-image-input"),o=t.$dialog.find(".note-image-url"),i=t.$dialog.find(".note-image-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),n.replaceWith(n.clone().on("change",(function(t){e.resolve(t.target.files||t.target.value)})).val("")),o.on("input paste propertychange",(function(){t.ui.toggleBtn(i,o.val())})).val(""),f.isSupportTouch||o.trigger("focus"),i.click((function(t){t.preventDefault(),e.resolve(o.val())})),t.bindEnterKey(o,i)})),t.ui.onDialogHidden(t.$dialog,(function(){n.off(),o.off(),i.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&he(n.prototype,o),i&&he(n,i),t}();function pe(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ve=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.editable=n.layoutInfo.editable[0],this.options=n.options,this.events={"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.image)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-image-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.image),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t,n){if(ht.isImg(t)){var o=e()(t).offset(),i=e()(this.options.container).offset(),r={};this.options.popatmouse?(r.left=n.pageX-20,r.top=n.pageY):r=o,r.top-=i.top,r.left-=i.left,this.$popover.css({display:"block",left:r.left,top:r.top})}else this.hide()}},{key:"hide",value:function(){this.$popover.hide()}}],o&&pe(n.prototype,o),i&&pe(n,i),t}();function me(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ge=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.events={"summernote.mousedown":function(t,e){o.update(e.target)},"summernote.keyup summernote.scroll summernote.change":function(){o.update()},"summernote.disable summernote.dialog.shown":function(){o.hide()},"summernote.blur":function(t,e){e.originalEvent&&e.originalEvent.relatedTarget&&o.$popover[0].contains(e.originalEvent.relatedTarget)||o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return!k.isEmpty(this.options.popover.table)}},{key:"initialize",value:function(){this.$popover=this.ui.popover({className:"note-table-popover"}).render().appendTo(this.options.container);var t=this.$popover.find(".popover-content,.note-popover-content");this.context.invoke("buttons.build",t,this.options.popover.table),f.isFF&&document.execCommand("enableInlineTableEditing",!1,!1),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){if(this.context.isDisabled())return!1;var n=ht.isCell(t)||ht.isCell(null==t?void 0:t.parentElement);if(n){var o=ht.posFromPlaceholder(t),i=e()(this.options.container).offset();o.top-=i.top,o.left-=i.left,this.$popover.css({display:"block",left:o.left,top:o.top})}else this.hide();return n}},{key:"hide",value:function(){this.$popover.hide()}}],o&&me(n.prototype,o),i&&me(n,i),t}();function be(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var ye=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,(o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<div class="form-group note-form-group row-fluid">','<label for="note-dialog-video-url-'.concat(this.options.id,'" class="note-form-label">').concat(this.lang.video.url,' <small class="text-muted">').concat(this.lang.video.providers,"</small></label>"),'<input id="note-dialog-video-url-'.concat(this.options.id,'" class="note-video-url form-control note-form-control note-input" type="text"/>'),"</div>"].join(""),n='<input type="button" href="#" class="'.concat("btn btn-primary note-btn note-btn-primary note-video-btn",'" value="').concat(this.lang.video.insert,'" disabled>');this.$dialog=this.ui.dialog({title:this.lang.video.insert,fade:this.options.dialogsFade,body:e,footer:n}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"bindEnterKey",value:function(t,e){t.on("keypress",(function(t){t.keyCode===wt.code.ENTER&&(t.preventDefault(),e.trigger("click"))}))}},{key:"createVideoNode",value:function(t){var n,o=t.match(/\/\/(?:(?:www|m)\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))([\w|-]{11})(?:(?:[\?&]t=)(\S+))?$/),i=t.match(/(?:\.|\/\/)drive\.google\.com\/file\/d\/(.[a-zA-Z0-9_-]*)\/view/),r=t.match(/(?:www\.|\/\/)instagram\.com\/p\/(.[a-zA-Z0-9_-]*)/),a=t.match(/\/\/vine\.co\/v\/([a-zA-Z0-9]+)/),s=t.match(/\/\/(player\.)?vimeo\.com\/([a-z]*\/)*(\d+)[?]?.*/),l=t.match(/.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/),c=t.match(/\/\/v\.youku\.com\/v_show\/id_(\w+)=*\.html/),u=t.match(/\/\/(.*)\/videos\/watch\/([^?]*)(?:\?(?:start=(\w*))?(?:&stop=(\w*))?(?:&loop=([10]))?(?:&autoplay=([10]))?(?:&muted=([10]))?)?/),d=t.match(/\/\/v\.qq\.com.*?vid=(.+)/),h=t.match(/\/\/v\.qq\.com\/x?\/?(page|cover).*?\/([^\/]+)\.html\??.*/),f=t.match(/^.+.(mp4|m4v)$/),p=t.match(/^.+.(ogg|ogv)$/),v=t.match(/^.+.(webm)$/),m=t.match(/(?:www\.|\/\/)facebook\.com\/([^\/]+)\/videos\/([0-9]+)/);if(o&&11===o[1].length){var g=o[1],b=0;if(void 0!==o[2]){var y=o[2].match(/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/);if(y)for(var k=[3600,60,1],w=0,C=k.length;w<C;w++)b+=void 0!==y[w+1]?k[w]*parseInt(y[w+1],10):0}n=e()("<iframe>").attr("frameborder",0).attr("src","//www.youtube.com/embed/"+g+(b>0?"?start="+b:"")).attr("width","640").attr("height","360")}else if(i&&i[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src","https://drive.google.com/file/d/"+i[1]+"/preview").attr("width","640").attr("height","480");else if(r&&r[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src","https://instagram.com/p/"+r[1]+"/embed/").attr("width","612").attr("height","710").attr("scrolling","no").attr("allowtransparency","true");else if(a&&a[0].length)n=e()("<iframe>").attr("frameborder",0).attr("src",a[0]+"/embed/simple").attr("width","600").attr("height","600").attr("class","vine-embed");else if(s&&s[3].length)n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("src","//player.vimeo.com/video/"+s[3]).attr("width","640").attr("height","360");else if(l&&l[2].length)n=e()("<iframe>").attr("frameborder",0).attr("src","//www.dailymotion.com/embed/video/"+l[2]).attr("width","640").attr("height","360");else if(c&&c[1].length)n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","498").attr("width","510").attr("src","//player.youku.com/embed/"+c[1]);else if(u&&u[0].length){var x=0;"undefined"!==u[2]&&(x=u[2]);var S=0;"undefined"!==u[3]&&(S=u[3]);var T=0;"undefined"!==u[4]&&(T=u[4]);var E=0;"undefined"!==u[5]&&(E=u[5]);var I=0;"undefined"!==u[6]&&(I=u[6]),n=e()('<iframe allowfullscreen sandbox="allow-same-origin allow-scripts allow-popups">').attr("frameborder",0).attr("src","//"+u[1]+"/videos/embed/"+u[2]+"?loop="+T+"&autoplay="+E+"&muted="+I+(x>0?"&start="+x:"")+(S>0?"&end="+b:"")).attr("width","560").attr("height","315")}else if(d&&d[1].length||h&&h[2].length){var $=d&&d[1].length?d[1]:h[2];n=e()("<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>").attr("frameborder",0).attr("height","310").attr("width","500").attr("src","https://v.qq.com/txp/iframe/player.html?vid="+$+"&amp;auto=0")}else if(f||p||v)n=e()("<video controls>").attr("src",t).attr("width","640").attr("height","360");else{if(!m||!m[0].length)return!1;n=e()("<iframe>").attr("frameborder",0).attr("src","https://www.facebook.com/plugins/video.php?href="+encodeURIComponent(m[0])+"&show_text=0&width=560").attr("width","560").attr("height","301").attr("scrolling","no").attr("allowtransparency","true")}return n.addClass("note-video-clip"),n[0]}},{key:"show",value:function(){var t=this,e=this.context.invoke("editor.getSelectedText");this.context.invoke("editor.saveRange"),this.showVideoDialog(e).then((function(e){t.ui.hideDialog(t.$dialog),t.context.invoke("editor.restoreRange");var n=t.createVideoNode(e);n&&t.context.invoke("editor.insertNode",n)})).fail((function(){t.context.invoke("editor.restoreRange")}))}},{key:"showVideoDialog",value:function(){var t=this;return e().Deferred((function(e){var n=t.$dialog.find(".note-video-url"),o=t.$dialog.find(".note-video-btn");t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),n.on("input paste propertychange",(function(){t.ui.toggleBtn(o,n.val())})),f.isSupportTouch||n.trigger("focus"),o.click((function(t){t.preventDefault(),e.resolve(n.val())})),t.bindEnterKey(n,o)})),t.ui.onDialogHidden(t.$dialog,(function(){n.off(),o.off(),"pending"===e.state()&&e.reject()})),t.ui.showDialog(t.$dialog)}))}}])&&be(n.prototype,o),i&&be(n,i),t}();function ke(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var we=function(){function t(n){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$body=e()(document.body),this.$editor=n.layoutInfo.editor,this.options=n.options,this.lang=this.options.langInfo}var n,o,i;return n=t,o=[{key:"initialize",value:function(){var t=this.options.dialogsInBody?this.$body:this.options.container,e=['<p class="text-center">','<a href="http://summernote.org/" target="_blank" rel="noopener noreferrer">Summernote 0.8.20</a> · ','<a href="https://github.com/summernote/summernote" target="_blank" rel="noopener noreferrer">Project</a> · ','<a href="https://github.com/summernote/summernote/issues" target="_blank" rel="noopener noreferrer">Issues</a>',"</p>"].join("");this.$dialog=this.ui.dialog({title:this.lang.options.help,fade:this.options.dialogsFade,body:this.createShortcutList(),footer:e,callback:function(t){t.find(".modal-body,.note-modal-body").css({"max-height":300,overflow:"scroll"})}}).render().appendTo(t)}},{key:"destroy",value:function(){this.ui.hideDialog(this.$dialog),this.$dialog.remove()}},{key:"createShortcutList",value:function(){var t=this,n=this.options.keyMap[f.isMac?"mac":"pc"];return Object.keys(n).map((function(o){var i=n[o],r=e()('<div><div class="help-list-item"></div></div>');return r.append(e()("<label><kbd>"+o+"</kdb></label>").css({width:180,"margin-right":10})).append(e()("<span></span>").html(t.context.memo("help."+i)||i)),r.html()})).join("")}},{key:"showHelpDialog",value:function(){var t=this;return e().Deferred((function(e){t.ui.onDialogShown(t.$dialog,(function(){t.context.triggerEvent("dialog.shown"),e.resolve()})),t.ui.showDialog(t.$dialog)})).promise()}},{key:"show",value:function(){var t=this;this.context.invoke("editor.saveRange"),this.showHelpDialog().then((function(){t.context.invoke("editor.restoreRange")}))}}],o&&ke(n.prototype,o),i&&ke(n,i),t}();function Ce(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var xe=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.options=n.options,this.hidable=!0,this.onContextmenu=!1,this.pageX=null,this.pageY=null,this.events={"summernote.contextmenu":function(t){o.options.editing&&(t.preventDefault(),t.stopPropagation(),o.onContextmenu=!0,o.update(!0))},"summernote.mousedown":function(t,e){o.pageX=e.pageX,o.pageY=e.pageY},"summernote.keyup summernote.mouseup summernote.scroll":function(t,e){o.options.editing&&!o.onContextmenu&&(o.pageX=e.pageX,o.pageY=e.pageY,o.update()),o.onContextmenu=!1},"summernote.disable summernote.change summernote.dialog.shown summernote.blur":function(){o.hide()},"summernote.focusout":function(){o.$popover.is(":active,:focus")||o.hide()}}}var n,o,i;return n=t,(o=[{key:"shouldInitialize",value:function(){return this.options.airMode&&!k.isEmpty(this.options.popover.air)}},{key:"initialize",value:function(){var t=this;this.$popover=this.ui.popover({className:"note-air-popover"}).render().appendTo(this.options.container);var e=this.$popover.find(".popover-content");this.context.invoke("buttons.build",e,this.options.popover.air),this.$popover.on("mousedown",(function(){t.hidable=!1})),this.$popover.on("mouseup",(function(){t.hidable=!0}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"update",value:function(t){var n=this.context.invoke("editor.currentStyle");if(!n.range||n.range.isCollapsed()&&!t)this.hide();else{var o={left:this.pageX,top:this.pageY},i=e()(this.options.container).offset();o.top-=i.top,o.left-=i.left,this.$popover.css({display:"block",left:Math.max(o.left,0)+-5,top:o.top+5}),this.context.invoke("buttons.updateCurrentStyle",this.$popover)}}},{key:"updateCodeview",value:function(t){this.ui.toggleBtnActive(this.$popover.find(".btn-codeview"),t),t&&this.hide()}},{key:"hide",value:function(){this.hidable&&this.$popover.hide()}}])&&Ce(n.prototype,o),i&&Ce(n,i),t}();function Se(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var Te=function(){function t(n){var o=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.context=n,this.ui=e().summernote.ui,this.$editable=n.layoutInfo.editable,this.options=n.options,this.hint=this.options.hint||[],this.direction=this.options.hintDirection||"bottom",this.hints=Array.isArray(this.hint)?this.hint:[this.hint],this.events={"summernote.keyup":function(t,e){e.isDefaultPrevented()||o.handleKeyup(e)},"summernote.keydown":function(t,e){o.handleKeydown(e)},"summernote.disable summernote.dialog.shown summernote.blur":function(){o.hide()}}}var n,o,i;return n=t,o=[{key:"shouldInitialize",value:function(){return this.hints.length>0}},{key:"initialize",value:function(){var t=this;this.lastWordRange=null,this.matchingWord=null,this.$popover=this.ui.popover({className:"note-hint-popover",hideArrow:!0,direction:""}).render().appendTo(this.options.container),this.$popover.hide(),this.$content=this.$popover.find(".popover-content,.note-popover-content"),this.$content.on("click",".note-hint-item",(function(n){t.$content.find(".active").removeClass("active"),e()(n.currentTarget).addClass("active"),t.replace()})),this.$popover.on("mousedown",(function(t){t.preventDefault()}))}},{key:"destroy",value:function(){this.$popover.remove()}},{key:"selectItem",value:function(t){this.$content.find(".active").removeClass("active"),t.addClass("active"),this.$content[0].scrollTop=t[0].offsetTop-this.$content.innerHeight()/2}},{key:"moveDown",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.next();if(e.length)this.selectItem(e);else{var n=t.parent().next();n.length||(n=this.$content.find(".note-hint-group").first()),this.selectItem(n.find(".note-hint-item").first())}}},{key:"moveUp",value:function(){var t=this.$content.find(".note-hint-item.active"),e=t.prev();if(e.length)this.selectItem(e);else{var n=t.parent().prev();n.length||(n=this.$content.find(".note-hint-group").last()),this.selectItem(n.find(".note-hint-item").last())}}},{key:"replace",value:function(){var t=this.$content.find(".note-hint-item.active");if(t.length){var n=this.nodeFromItem(t);if(null!==this.matchingWord&&0===this.matchingWord.length)this.lastWordRange.so=this.lastWordRange.eo;else if(null!==this.matchingWord&&this.matchingWord.length>0&&!this.lastWordRange.isCollapsed()){var o=this.lastWordRange.eo-this.lastWordRange.so-this.matchingWord.length;o>0&&(this.lastWordRange.so+=o)}if(this.lastWordRange.insertNode(n),"next"===this.options.hintSelect){var i=document.createTextNode("");e()(n).after(i),yt.createFromNodeBefore(i).select()}else yt.createFromNodeAfter(n).select();this.lastWordRange=null,this.hide(),this.context.invoke("editor.focus"),this.context.triggerEvent("change",this.$editable.html(),this.$editable)}}},{key:"nodeFromItem",value:function(t){var e=this.hints[t.data("index")],n=t.data("item"),o=e.content?e.content(n):n;return"string"==typeof o&&(o=ht.createText(o)),o}},{key:"createItemTemplates",value:function(t,n){var o=this.hints[t];return n.map((function(n){var i=e()('<div class="note-hint-item"></div>');return i.append(o.template?o.template(n):n+""),i.data({index:t,item:n}),i}))}},{key:"handleKeydown",value:function(t){this.$popover.is(":visible")&&(t.keyCode===wt.code.ENTER?(t.preventDefault(),this.replace()):t.keyCode===wt.code.UP?(t.preventDefault(),this.moveUp()):t.keyCode===wt.code.DOWN&&(t.preventDefault(),this.moveDown()))}},{key:"searchKeyword",value:function(t,e,n){var o=this.hints[t];if(o&&o.match.test(e)&&o.search){var i=o.match.exec(e);this.matchingWord=i[0],o.search(i[1],n)}else n()}},{key:"createGroup",value:function(t,n){var o=this,i=e()('<div class="note-hint-group note-hint-group-'+t+'"></div>');return this.searchKeyword(t,n,(function(e){(e=e||[]).length&&(i.html(o.createItemTemplates(t,e)),o.show())})),i}},{key:"handleKeyup",value:function(t){var n=this;if(!k.contains([wt.code.ENTER,wt.code.UP,wt.code.DOWN],t.keyCode)){var o,i,r=this.context.invoke("editor.getLastRange");if("words"===this.options.hintMode){if(o=r.getWordsRange(r),i=o.toString(),this.hints.forEach((function(t){if(t.match.test(i))return o=r.getWordsMatchRange(t.match),!1})),!o)return void this.hide();i=o.toString()}else o=r.getWordRange(),i=o.toString();if(this.hints.length&&i){this.$content.empty();var a=v.rect2bnd(k.last(o.getClientRects())),s=e()(this.options.container).offset();a&&(a.top-=s.top,a.left-=s.left,this.$popover.hide(),this.lastWordRange=o,this.hints.forEach((function(t,e){t.match.test(i)&&n.createGroup(e,i).appendTo(n.$content)})),this.$content.find(".note-hint-item:first").addClass("active"),"top"===this.direction?this.$popover.css({left:a.left,top:a.top-this.$popover.outerHeight()-5}):this.$popover.css({left:a.left,top:a.top+a.height+5}))}else this.hide()}}},{key:"show",value:function(){this.$popover.show()}},{key:"hide",value:function(){this.$popover.hide()}}],o&&Se(n.prototype,o),i&&Se(n,i),t}();function Ee(t){return Ee="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ee(t)}function Ie(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}e().summernote=e().extend(e().summernote,{version:"0.8.20",plugins:{},dom:ht,range:yt,lists:k,options:{langInfo:e().summernote.lang["en-US"],editing:!0,modules:{editor:Ft,clipboard:Ht,dropzone:Bt,codeview:jt,statusbar:Kt,fullscreen:qt,handle:Gt,hintPopover:Te,autoLink:Qt,autoSync:Jt,autoReplace:ee,placeholder:oe,buttons:re,toolbar:se,linkDialog:ce,linkPopover:de,imageDialog:fe,imagePopover:ve,tablePopover:ge,videoDialog:ye,helpDialog:we,airPopover:xe},buttons:{},lang:"en-US",followingToolbar:!1,toolbarPosition:"top",otherStaticBar:"",codeviewKeepButton:!1,toolbar:[["style",["style"]],["font",["bold","underline","clear"]],["fontname",["fontname"]],["color",["color"]],["para",["ul","ol","paragraph"]],["table",["table"]],["insert",["link","picture","video"]],["view",["fullscreen","codeview","help"]]],popatmouse:!0,popover:{image:[["resize",["resizeFull","resizeHalf","resizeQuarter","resizeNone"]],["float",["floatLeft","floatRight","floatNone"]],["remove",["removeMedia"]]],link:[["link",["linkDialogShow","unlink"]]],table:[["add",["addRowDown","addRowUp","addColLeft","addColRight"]],["delete",["deleteRow","deleteCol","deleteTable"]]],air:[["color",["color"]],["font",["bold","underline","clear"]],["para",["ul","paragraph"]],["table",["table"]],["insert",["link","picture"]],["view",["fullscreen","codeview"]]]},airMode:!1,overrideContextMenu:!1,width:null,height:null,linkTargetBlank:!0,useProtocol:!0,defaultProtocol:"http://",focus:!1,tabDisabled:!1,tabSize:4,styleWithCSS:!1,shortcuts:!0,textareaAutoSync:!0,tooltip:"auto",container:null,maxTextLength:0,blockquoteBreakingLevel:2,spellCheck:!0,disableGrammar:!1,placeholder:null,inheritPlaceholder:!1,recordEveryKeystroke:!1,historyLimit:200,showDomainOnlyForAutolink:!1,hintMode:"word",hintSelect:"after",hintDirection:"bottom",styleTags:["p","blockquote","pre","h1","h2","h3","h4","h5","h6"],fontNames:["Arial","Arial Black","Comic Sans MS","Courier New","Helvetica Neue","Helvetica","Impact","Lucida Grande","Tahoma","Times New Roman","Verdana"],fontNamesIgnoreCheck:[],addDefaultFonts:!0,fontSizes:["8","9","10","11","12","14","18","24","36"],fontSizeUnits:["px","pt"],colors:[["#000000","#424242","#636363","#9C9C94","#CEC6CE","#EFEFEF","#F7F7F7","#FFFFFF"],["#FF0000","#FF9C00","#FFFF00","#00FF00","#00FFFF","#0000FF","#9C00FF","#FF00FF"],["#F7C6CE","#FFE7CE","#FFEFC6","#D6EFD6","#CEDEE7","#CEE7F7","#D6D6E7","#E7D6DE"],["#E79C9C","#FFC69C","#FFE79C","#B5D6A5","#A5C6CE","#9CC6EF","#B5A5D6","#D6A5BD"],["#E76363","#F7AD6B","#FFD663","#94BD7B","#73A5AD","#6BADDE","#8C7BC6","#C67BA5"],["#CE0000","#E79439","#EFC631","#6BA54A","#4A7B8C","#3984C6","#634AA5","#A54A7B"],["#9C0000","#B56308","#BD9400","#397B21","#104A5A","#085294","#311873","#731842"],["#630000","#7B3900","#846300","#295218","#083139","#003163","#21104A","#4A1031"]],colorsName:[["Black","Tundora","Dove Gray","Star Dust","Pale Slate","Gallery","Alabaster","White"],["Red","Orange Peel","Yellow","Green","Cyan","Blue","Electric Violet","Magenta"],["Azalea","Karry","Egg White","Zanah","Botticelli","Tropical Blue","Mischka","Twilight"],["Tonys Pink","Peach Orange","Cream Brulee","Sprout","Casper","Perano","Cold Purple","Careys Pink"],["Mandy","Rajah","Dandelion","Olivine","Gulf Stream","Viking","Blue Marguerite","Puce"],["Guardsman Red","Fire Bush","Golden Dream","Chelsea Cucumber","Smalt Blue","Boston Blue","Butterfly Bush","Cadillac"],["Sangria","Mai Tai","Buddha Gold","Forest Green","Eden","Venice Blue","Meteorite","Claret"],["Rosewood","Cinnamon","Olive","Parsley","Tiber","Midnight Blue","Valentino","Loulou"]],colorButton:{foreColor:"#000000",backColor:"#FFFF00"},lineHeights:["1.0","1.2","1.4","1.5","1.6","1.8","2.0","3.0"],tableClassName:"table table-bordered",insertTableMaxSize:{col:10,row:10},dialogsInBody:!1,dialogsFade:!1,maximumImageFileSize:null,acceptImageFileTypes:"image/*",callbacks:{onBeforeCommand:null,onBlur:null,onBlurCodeview:null,onChange:null,onChangeCodeview:null,onDialogShown:null,onEnter:null,onFocus:null,onImageLinkInsert:null,onImageUpload:null,onImageUploadError:null,onInit:null,onKeydown:null,onKeyup:null,onMousedown:null,onMouseup:null,onPaste:null,onScroll:null},codemirror:{mode:"text/html",htmlMode:!0,lineNumbers:!0},codeviewFilter:!0,codeviewFilterRegex:/<\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,codeviewIframeFilter:!0,codeviewIframeWhitelistSrc:[],codeviewIframeWhitelistSrcBase:["www.youtube.com","www.youtube-nocookie.com","www.facebook.com","vine.co","instagram.com","player.vimeo.com","www.dailymotion.com","player.youku.com","jumpingbean.tv","v.qq.com"],keyMap:{pc:{ESC:"escape",ENTER:"insertParagraph","CTRL+Z":"undo","CTRL+Y":"redo",TAB:"tab","SHIFT+TAB":"untab","CTRL+B":"bold","CTRL+I":"italic","CTRL+U":"underline","CTRL+SHIFT+S":"strikethrough","CTRL+BACKSLASH":"removeFormat","CTRL+SHIFT+L":"justifyLeft","CTRL+SHIFT+E":"justifyCenter","CTRL+SHIFT+R":"justifyRight","CTRL+SHIFT+J":"justifyFull","CTRL+SHIFT+NUM7":"insertUnorderedList","CTRL+SHIFT+NUM8":"insertOrderedList","CTRL+LEFTBRACKET":"outdent","CTRL+RIGHTBRACKET":"indent","CTRL+NUM0":"formatPara","CTRL+NUM1":"formatH1","CTRL+NUM2":"formatH2","CTRL+NUM3":"formatH3","CTRL+NUM4":"formatH4","CTRL+NUM5":"formatH5","CTRL+NUM6":"formatH6","CTRL+ENTER":"insertHorizontalRule","CTRL+K":"linkDialog.show"},mac:{ESC:"escape",ENTER:"insertParagraph","CMD+Z":"undo","CMD+SHIFT+Z":"redo",TAB:"tab","SHIFT+TAB":"untab","CMD+B":"bold","CMD+I":"italic","CMD+U":"underline","CMD+SHIFT+S":"strikethrough","CMD+BACKSLASH":"removeFormat","CMD+SHIFT+L":"justifyLeft","CMD+SHIFT+E":"justifyCenter","CMD+SHIFT+R":"justifyRight","CMD+SHIFT+J":"justifyFull","CMD+SHIFT+NUM7":"insertUnorderedList","CMD+SHIFT+NUM8":"insertOrderedList","CMD+LEFTBRACKET":"outdent","CMD+RIGHTBRACKET":"indent","CMD+NUM0":"formatPara","CMD+NUM1":"formatH1","CMD+NUM2":"formatH2","CMD+NUM3":"formatH3","CMD+NUM4":"formatH4","CMD+NUM5":"formatH5","CMD+NUM6":"formatH6","CMD+ENTER":"insertHorizontalRule","CMD+K":"linkDialog.show"}},icons:{align:"note-icon-align",alignCenter:"note-icon-align-center",alignJustify:"note-icon-align-justify",alignLeft:"note-icon-align-left",alignRight:"note-icon-align-right",rowBelow:"note-icon-row-below",colBefore:"note-icon-col-before",colAfter:"note-icon-col-after",rowAbove:"note-icon-row-above",rowRemove:"note-icon-row-remove",colRemove:"note-icon-col-remove",indent:"note-icon-align-indent",outdent:"note-icon-align-outdent",arrowsAlt:"note-icon-arrows-alt",bold:"note-icon-bold",caret:"note-icon-caret",circle:"note-icon-circle",close:"note-icon-close",code:"note-icon-code",eraser:"note-icon-eraser",floatLeft:"note-icon-float-left",floatRight:"note-icon-float-right",font:"note-icon-font",frame:"note-icon-frame",italic:"note-icon-italic",link:"note-icon-link",unlink:"note-icon-chain-broken",magic:"note-icon-magic",menuCheck:"note-icon-menu-check",minus:"note-icon-minus",orderedlist:"note-icon-orderedlist",pencil:"note-icon-pencil",picture:"note-icon-picture",question:"note-icon-question",redo:"note-icon-redo",rollback:"note-icon-rollback",square:"note-icon-square",strikethrough:"note-icon-strikethrough",subscript:"note-icon-subscript",superscript:"note-icon-superscript",table:"note-icon-table",textHeight:"note-icon-text-height",trash:"note-icon-trash",underline:"note-icon-underline",undo:"note-icon-undo",unorderedlist:"note-icon-unorderedlist",video:"note-icon-video"}}});var $e=function(){function t(e,n,o,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.markup=e,this.children=n,this.options=o,this.callback=i}var n,o,i;return n=t,(o=[{key:"render",value:function(t){var n=e()(this.markup);if(this.options&&this.options.contents&&n.html(this.options.contents),this.options&&this.options.className&&n.addClass(this.options.className),this.options&&this.options.data&&e().each(this.options.data,(function(t,e){n.attr("data-"+t,e)})),this.options&&this.options.click&&n.on("click",this.options.click),this.children){var o=n.find(".note-children-container");this.children.forEach((function(t){t.render(o.length?o:n)}))}return this.callback&&this.callback(n,this.options),this.options&&this.options.callback&&this.options.callback(n),t&&t.append(n),n}}])&&Ie(n.prototype,o),i&&Ie(n,i),t}();const Ne=function(t,e){return function(){var n="object"===Ee(arguments[1])?arguments[1]:arguments[0],o=Array.isArray(arguments[0])?arguments[0]:[];return n&&n.children&&(o=n.children),new $e(t,o,n,e)}};function Pe(t){return Pe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Pe(t)}var Re=Ne('<div class="note-editor note-frame panel panel-default"></div>'),Le=Ne('<div class="panel-heading note-toolbar" role="toolbar"></div>'),Ae=Ne('<div class="note-editing-area"></div>'),Fe=Ne('<textarea class="note-codable" aria-multiline="true"></textarea>'),De=Ne('<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>'),He=Ne(['<output class="note-status-output" role="status" aria-live="polite"></output>','<div class="note-statusbar" role="status">','<div class="note-resizebar" aria-label="Resize">','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>','<div class="note-icon-bar"></div>',"</div>","</div>"].join("")),ze=Ne('<div class="note-editor note-airframe"></div>'),Be=Ne(['<div class="note-editable" contentEditable="true" role="textbox" aria-multiline="true"></div>','<output class="note-status-output" role="status" aria-live="polite"></output>'].join("")),Me=Ne('<div class="note-btn-group btn-group"></div>'),Oe=Ne('<ul class="note-dropdown-menu dropdown-menu"></ul>',(function(t,e){var n=Array.isArray(e.items)?e.items.map((function(t){var n="string"==typeof t?t:t.value||"",o=e.template?e.template(t):t,i="object"===Pe(t)?t.option:void 0;return'<li aria-label="'+n+'"><a href="#" '+('data-value="'+n+'"'+(void 0!==i?' data-option="'+i+'"':""))+">"+o+"</a></li>"})).join(""):e.items;t.html(n).attr({"aria-label":e.title}),e&&e.codeviewKeepButton&&t.addClass("note-codeview-keep")})),Ue=function(t,e){return t+" "+qe(e.icons.caret,"span")},je=Ne('<ul class="note-dropdown-menu dropdown-menu note-check"></ul>',(function(t,e){var n=Array.isArray(e.items)?e.items.map((function(t){var n="string"==typeof t?t:t.value||"",o=e.template?e.template(t):t;return'<li aria-label="'+t+'"><a href="#" data-value="'+n+'">'+qe(e.checkClassName)+" "+o+"</a></li>"})).join(""):e.items;t.html(n).attr({"aria-label":e.title}),e&&e.codeviewKeepButton&&t.addClass("note-codeview-keep")})),We=Ne('<div class="modal note-modal" aria-hidden="false" tabindex="-1" role="dialog"></div>',(function(t,e){e.fade&&t.addClass("fade"),t.attr({"aria-label":e.title}),t.html(['<div class="modal-dialog">','<div class="modal-content">',e.title?'<div class="modal-header"><button type="button" class="close" data-dismiss="modal" aria-label="Close" aria-hidden="true">&times;</button><h4 class="modal-title">'+e.title+"</h4></div>":"",'<div class="modal-body">'+e.body+"</div>",e.footer?'<div class="modal-footer">'+e.footer+"</div>":"","</div>","</div>"].join(""))})),Ke=Ne(['<div class="note-popover popover in">','<div class="arrow"></div>','<div class="popover-content note-children-container"></div>',"</div>"].join(""),(function(t,e){var n=void 0!==e.direction?e.direction:"bottom";t.addClass(n),e.hideArrow&&t.find(".arrow").hide()})),Ve=Ne('<div class="checkbox"></div>',(function(t,e){t.html(["<label"+(e.id?' for="note-'+e.id+'"':"")+">",'<input type="checkbox"'+(e.id?' id="note-'+e.id+'"':""),e.checked?" checked":"",' aria-checked="'+(e.checked?"true":"false")+'"/>',e.text?e.text:"","</label>"].join(""))})),qe=function(t,e){return t.match(/^</)?t:"<"+(e=e||"i")+' class="'+t+'"></'+e+">"};e().summernote=e().extend(e().summernote,{ui_template:function(t){return{editor:Re,toolbar:Le,editingArea:Ae,codable:Fe,editable:De,statusbar:He,airEditor:ze,airEditable:Be,buttonGroup:Me,dropdown:Oe,dropdownButtonContents:Ue,dropdownCheck:je,dialog:We,popover:Ke,checkbox:Ve,icon:qe,options:t,palette:function(e,n){return Ne('<div class="note-color-palette"></div>',(function(e,n){for(var o=[],i=0,r=n.colors.length;i<r;i++){for(var a=n.eventName,s=n.colors[i],l=n.colorsName[i],c=[],u=0,d=s.length;u<d;u++){var h=s[u],f=l[u];c.push(['<button type="button" class="note-color-btn"','style="background-color:',h,'" ','data-event="',a,'" ','data-value="',h,'" ','title="',f,'" ','aria-label="',f,'" ','data-toggle="button" tabindex="-1"></button>'].join(""))}o.push('<div class="note-color-row">'+c.join("")+"</div>")}e.html(o.join("")),n.tooltip&&e.find(".note-color-btn").tooltip({container:n.container||t.container,trigger:"hover",placement:"bottom"})}))(e,n)},button:function(n,o){return Ne('<button type="button" class="note-btn btn btn-default btn-sm" tabindex="-1"></button>',(function(n,o){o&&o.tooltip&&n.attr({title:o.tooltip,"aria-label":o.tooltip}).tooltip({container:o.container||t.container,trigger:"hover",placement:"bottom"}).on("click",(function(t){e()(t.currentTarget).tooltip("hide")})),o&&o.codeviewButton&&n.addClass("note-codeview-keep")}))(n,o)},toggleBtn:function(t,e){t.toggleClass("disabled",!e),t.attr("disabled",!e)},toggleBtnActive:function(t,e){t.toggleClass("active",e)},onDialogShown:function(t,e){t.one("shown.bs.modal",e)},onDialogHidden:function(t,e){t.one("hidden.bs.modal",e)},showDialog:function(t){t.modal("show")},hideDialog:function(t){t.modal("hide")},createLayout:function(e){var n=(t.airMode?ze([Ae([Fe(),Be()])]):"bottom"===t.toolbarPosition?Re([Ae([Fe(),De()]),Le(),He()]):Re([Le(),Ae([Fe(),De()]),He()])).render();return n.insertAfter(e),{note:e,editor:n,toolbar:n.find(".note-toolbar"),editingArea:n.find(".note-editing-area"),editable:n.find(".note-editable"),codable:n.find(".note-codable"),statusbar:n.find(".note-statusbar")}},removeLayout:function(t,e){t.html(e.editable.html()),e.editor.remove(),t.show()}}},interface:"bs3"})})(),i})()}));
\ No newline at end of file
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.LICENSE.txt b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.LICENSE.txt
new file mode 100644
index 0000000..3b0558d
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.LICENSE.txt
@@ -0,0 +1 @@
+/*! Summernote v0.8.18 | (c) 2013- Alan Hong and other contributors | MIT license */
diff --git a/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.map b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.map
new file mode 100644
index 0000000..df2112f
--- /dev/null
+++ b/public_html/vendor/admin-lte-plugins/summernote/summernote.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///external {\"root\":\"jQuery\",\"commonjs2\":\"jquery\",\"commonjs\":\"jquery\",\"amd\":\"jquery\"}","webpack:///./src/js/base/renderer.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///./src/js/base/summernote-en-US.js","webpack:///./src/js/base/core/env.js","webpack:///./src/js/base/core/func.js","webpack:///./src/js/base/core/lists.js","webpack:///./src/js/base/core/dom.js","webpack:///./src/js/base/Context.js","webpack:///./src/js/base/core/range.js","webpack:///./src/js/summernote.js","webpack:///./src/js/base/core/key.js","webpack:///./src/js/base/editing/History.js","webpack:///./src/js/base/editing/Style.js","webpack:///./src/js/base/editing/Bullet.js","webpack:///./src/js/base/editing/Typing.js","webpack:///./src/js/base/editing/Table.js","webpack:///./src/js/base/module/Editor.js","webpack:///./src/js/base/core/async.js","webpack:///./src/js/base/module/Clipboard.js","webpack:///./src/js/base/module/Dropzone.js","webpack:///./src/js/base/module/Codeview.js","webpack:///./src/js/base/module/Statusbar.js","webpack:///./src/js/base/module/Fullscreen.js","webpack:///./src/js/base/module/Handle.js","webpack:///./src/js/base/module/AutoLink.js","webpack:///./src/js/base/module/AutoSync.js","webpack:///./src/js/base/module/AutoReplace.js","webpack:///./src/js/base/module/Placeholder.js","webpack:///./src/js/base/module/Buttons.js","webpack:///./src/js/base/module/Toolbar.js","webpack:///./src/js/base/module/LinkDialog.js","webpack:///./src/js/base/module/LinkPopover.js","webpack:///./src/js/base/module/ImageDialog.js","webpack:///./src/js/base/module/ImagePopover.js","webpack:///./src/js/base/module/TablePopover.js","webpack:///./src/js/base/module/VideoDialog.js","webpack:///./src/js/base/module/HelpDialog.js","webpack:///./src/js/base/module/AirPopover.js","webpack:///./src/js/base/module/HintPopover.js","webpack:///./src/js/base/settings.js","webpack:///./src/js/bs3/ui.js","webpack:///./src/js/bs3/settings.js"],"names":["root","factory","exports","module","require","define","amd","a","i","window","__WEBPACK_EXTERNAL_MODULE__0__","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Renderer","markup","children","options","callback","this","$parent","$node","$","contents","html","className","addClass","data","each","k","v","attr","click","on","$container","find","forEach","child","render","length","append","arguments","Array","isArray","__webpack_amd_options__","summernote","lang","extend","font","bold","italic","underline","clear","height","strikethrough","subscript","superscript","size","sizeunit","image","insert","resizeFull","resizeHalf","resizeQuarter","resizeNone","floatLeft","floatRight","floatNone","shapeRounded","shapeCircle","shapeThumbnail","shapeNone","dragImageHere","dropImage","selectFromFiles","maximumFileSize","maximumFileSizeError","url","remove","original","video","videoLink","providers","link","unlink","edit","textToDisplay","openInNewWindow","useProtocol","table","addRowAbove","addRowBelow","addColLeft","addColRight","delRow","delCol","delTable","hr","style","blockquote","pre","h1","h2","h3","h4","h5","h6","lists","unordered","ordered","help","fullscreen","codeview","paragraph","outdent","indent","left","center","right","justify","color","recent","more","background","foreground","transparent","setTransparent","reset","resetToDefault","cpSelect","shortcut","shortcuts","close","textFormatting","action","paragraphFormatting","documentStyle","extraKeys","history","undo","redo","specialChar","select","output","noSelection","isSupportAmd","genericFontFamilies","validFontName","fontName","inArray","toLowerCase","browserVersion","userAgent","navigator","isMSIE","test","matches","exec","parseFloat","isEdge","isSupportTouch","MaxTouchPoints","msMaxTouchPoints","inputEventName","isMac","appVersion","indexOf","isFF","isPhantom","isWebkit","isChrome","isSafari","jqueryVersion","fn","jquery","isFontInstalled","testFontName","context","document","createElement","getContext","testSize","originalWidth","measureText","width","isW3CRangeSupport","createRange","idCounter","eq","itemA","itemB","eq2","peq2","propName","ok","fail","self","not","f","apply","and","fA","fB","item","invoke","obj","method","resetUniqueId","uniqueId","prefix","id","rect2bnd","rect","$document","top","scrollTop","scrollLeft","bottom","invertObject","inverted","namespaceToCamel","namespace","split","map","substring","toUpperCase","join","debounce","func","wait","immediate","timeout","args","later","callNow","clearTimeout","setTimeout","isValidUrl","head","array","last","tail","slice","contains","initial","prev","idx","next","pred","len","all","sum","reduce","memo","from","collection","result","isEmpty","clusterBy","aLast","compact","aResult","push","unique","results","NBSP_CHAR","String","fromCharCode","isEditable","node","hasClass","makePredByNodeName","nodeName","isText","nodeType","isVoid","isPara","isPre","isLi","isTable","isData","isInline","isBodyContainer","isList","isHr","isBlockquote","isCell","isAnchor","isBody","blankHTML","env","nodeLength","nodeValue","childNodes","innerHTML","paddingBlankHTML","ancestor","parentNode","listAncestor","ancestors","el","listNext","nodes","nextSibling","insertAfter","preceding","parent","insertBefore","appendChild","appendChildNodes","aChild","isLeftEdgePoint","point","offset","isRightEdgePoint","isEdgePoint","isLeftEdgeOf","position","isRightEdgeOf","previousSibling","hasChildren","prevPoint","isSkipInnerOffset","nextPoint","nextTextNode","getNextTextNode","nextPointWithEmptyNode","actual","isSamePoint","pointA","pointB","splitNode","isSkipPaddingBlankHTML","isNotSplitEdgePoint","isDiscardEmptySplits","splitText","childNode","clone","cloneNode","splitTree","isRemoveChild","removeNode","removeChild","isTextarea","stripLinebreaks","val","replace","ZERO_WIDTH_NBSP_CHAR","blank","emptyPara","isControlSizing","isElement","isPurePara","isHeading","isBlock","isBodyInline","isParaInline","isDiv","isBR","isSpan","isB","isU","isS","isI","isImg","deepestChildIsEmpty","firstElementChild","isEmptyAnchor","isClosestSibling","nodeA","nodeB","withClosestSiblings","siblings","isLeftEdgePointOf","isRightEdgePointOf","isVisiblePoint","leftNode","rightNode","prevPointUntil","nextPointUntil","isCharPoint","ch","charAt","isSpacePoint","walkPoint","startPoint","endPoint","handler","singleChildAncestor","lastAncestor","filter","listPrev","listDescendant","descendants","fnWalk","current","commonAncestor","wrap","wrapperName","wrapper","makeOffsetPath","reverse","fromOffsetPath","offsets","splitPoint","splitRoot","container","topAncestor","pivot","createText","text","createTextNode","removeWhile","newNode","cssText","isNewlineOnBlock","match","endSlash","isEndOfInlineContainer","isBlockNode","trim","posFromPlaceholder","placeholder","$placeholder","pos","outerHeight","attachEvents","events","keys","detachEvents","off","isCustomStyleTag","classList","Context","$note","memos","layoutInfo","ui","ui_template","initialize","createLayout","_initialize","hide","_destroy","removeData","removeLayout","disabled","isDisabled","code","dom","disable","now","editor","buttons","plugins","initializeModule","removeModule","removeMemo","triggerEvent","isActivated","undefined","codable","editable","editing","callbacks","trigger","shouldInitialize","ModuleClass","withoutIntialize","destroy","event","createInvokeHandler","preventDefault","$target","target","closest","splits","hasSeparator","moduleName","methodName","textRangeToPoint","textRange","isStart","prevContainer","parentElement","tester","body","createTextRange","moveToElementText","compareEndPoints","textRangeStart","curTextNode","collapse","firstChild","pointTester","duplicate","setEndPoint","textCount","cont","pointToTextRange","info","textRangeInfo","isCollapseToStart","prevTextNodes","collapseToStart","moveStart","type","isExternalAPICalled","hasInitOptions","langInfo","icons","tooltip","note","first","focus","WrappedRange","sc","so","ec","eo","isOnEditable","makeIsOn","isOnList","isOnAnchor","isOnCell","isOnData","w3cRange","setStart","setEnd","nativeRng","nativeRange","selection","getSelection","rangeCount","removeAllRanges","addRange","offsetTop","Math","abs","getVisiblePoint","isLeftToRight","block","hasRightNode","hasLeftNode","getEndPoint","isCollapsed","getStartPoint","includeAncestor","fullyContains","leftEdgeNodes","startAncestor","endAncestor","boundaryPoints","getPoints","isSameContainer","rng","emptyParents","normalize","inlineSiblings","concat","para","wrapBodyInlineWithPara","deleteContents","contentsContainer","reversed","insertNode","toString","findAfter","isNotTextPoint","regex","index","path","e","paras","getClientRects","wrappedRange","createFromSelection","bodyElement","lastChild","createFromBodyElement","createFromNode","anchorNode","getRangeAt","startContainer","startOffset","endContainer","endOffset","textRangeEnd","isTextNode","createFromNodeBefore","createFromNodeAfter","createFromBookmark","bookmark","createFromParaBookmark","KEY_MAP","isEdit","keyCode","BACKSPACE","TAB","ENTER","SPACE","DELETE","isMove","LEFT","UP","RIGHT","DOWN","isNavigation","HOME","END","PAGEUP","PAGEDOWN","nameFromCode","History","stack","stackOffset","$editable","range","snapshot","recordUndo","applySnapshot","makeSnapshot","historyLimit","shift","Style","$obj","propertyNames","propertyName","css","styleInfo","jQueryCSS","fontSize","parseInt","expandClosestSibling","onlyPartialContains","nodesInRange","tails","elem","$cont","fromNode","queryCommandState","queryCommandValue","isUnordered","lineHeight","toFixed","anchor","Bullet","toggleList","clustereds","previousList","findList","wrapList","appendToPrevious","releaseList","listName","paraBookmark","wrappedParas","diffLists","listNode","prevList","nextList","isEscapseToBody","releasedParas","headList","parentItem","newList","findNextSiblings","lastList","middleList","rootLists","rootList","listNodes","Typing","bullet","tabsize","tab","nextPara","blockquoteBreakingLevel","emptyAnchors","scrollIntoView","TableResultAction","where","domTable","_startPoint","_virtualTable","_actionCellList","setVirtualTablePosition","rowIndex","cellIndex","baseRow","baseCell","isRowSpan","isColSpan","isVirtualCell","objPosition","getActionCell","virtualTableCellObj","resultAction","virtualRowPosition","virtualColPosition","recoverCellIndex","newCellIndex","addCellInfoToVirtual","row","cell","cellHasColspan","colSpan","cellHasRowspan","rowSpan","isThisSelectedCell","rowPos","colPos","rowspanNumber","attributes","rp","rowspanIndex","adjustStartPoint","colspanNumber","cp","cellspanIndex","isSelectedCell","getDeleteResultActionToCell","Column","SubtractSpanCount","Row","isVirtual","AddCell","RemoveCell","getAddResultActionToCell","SumSpanCount","Ignore","getActionList","fixedRow","fixedCol","actualPosition","canContinue","rowPosition","colPosition","requestAction","Add","Delete","tagName","rows","cells","createVirtualTable","Table","isShift","nextCell","currentTr","trAttributes","recoverAttributes","actions","idCell","currentCell","tdAttributes","newTd","removeAttr","setAttribute","before","lastTrIndex","after","actionIndex","resultStr","attrList","specified","cellPos","virtualPosition","virtualTable","hasRowspan","nextRow","cloneRow","removeAttribute","colCount","rowCount","tdHTML","tds","idxCol","trHTML","trs","idxRow","$table","tableClassName","Editor","$editor","lastRange","typing","escape","untab","insertParagraph","insertOrderedList","insertUnorderedList","formatPara","insertHorizontalRule","commands","sCmd","beforeCommand","execCommand","afterCommand","wrapCommand","fontStyling","unit","currentStyle","fontSizeUnit","formatBlock","isLimited","getLastRange","setLastRange","insertText","textNode","pasteHTML","onApplyCustomStyle","onFormatBlock","hrNode","stylePara","createLink","linkInfo","linkUrl","linkText","isNewWindow","checkProtocol","additionalTextLength","isTextChanged","onCreateLink","defaultProtocol","anchors","styleNodes","createRangeFromList","colorInfo","foreColor","backColor","insertTable","dim","dimension","createTable","removeMedia","restoreTarget","detach","floatMe","toggleClass","resize","hasKeyShortCut","isDefaultPrevented","handleKeyMap","preventDefaultEditableShortCuts","recordEveryKeystroke","spellCheck","disableGrammar","airMode","overrideContextMenu","outerWidth","maxHeight","minHeight","keyMap","metaKey","ctrlKey","altKey","shiftKey","keyName","eventName","tabDisable","pad","maxTextLength","lst","thenCollapse","commit","styleWithCSS","isPreventTrigger","normalizeContent","tabSize","insertTab","src","param","Deferred","deferred","$img","one","resolve","reject","display","appendTo","promise","then","$image","min","show","files","file","filename","maximumImageFileSize","FileReader","onload","dataURL","onerror","err","readAsDataURL","readFileAsDataURL","insertImage","onImageUpload","insertImagesAsDataURL","currentRange","spans","firstSpan","noteStatusOutput","expand","$anchor","addRow","addCol","deleteRow","deleteCol","deleteTable","bKeepRatio","imageSize","newRatio","y","x","ratio","is","hasFocus","Clipboard","pasteByEvent","clipboardData","originalEvent","items","kind","getAsFile","getData","Dropzone","$eventListener","documentEventHandlers","$dropzone","prependTo","disableDragAndDrop","onDrop","attachDragAndDropEvent","$dropzoneMessage","onDragenter","isCodeview","hasEditorSize","add","onDragleave","removeClass","dataTransfer","types","content","substr","CodeView","$codable","CodeMirrorConstructor","CodeMirror","codemirror","getDoc","setValue","save","ESCAPE","deactivate","activate","codeviewFilter","codeviewFilterRegex","codeviewIframeFilter","whitelist","codeviewIframeWhitelistSrc","codeviewIframeWhitelistSrcBase","tag","RegExp","prettifyHtml","cmEditor","fromTextArea","tern","server","TernServer","ternServer","cm","updateArgHints","getValue","setSize","toTextArea","purify","isChange","Statusbar","$statusbar","statusbar","disableResizeEditor","stopPropagation","editableTop","onMouseMove","clientY","minheight","max","Fullscreen","$toolbar","toolbar","$window","$scrollbar","onResize","resizeTo","h","setsize","isFullscreen","Handle","$editingArea","editingArea","we","update","$handle","disableResizeImage","posStart","clientX","isImage","$selection","w","origImageObj","Image","sizingText","linkPattern","AutoLink","handleKeyup","handleKeydown","lastWordRange","keyword","urlText","showDomainOnlyForAutolink","linkTargetBlank","wordRange","getWordRange","AutoSync","AutoReplace","PERIOD","COMMA","SEMICOLON","SLASH","previousKeydownCode","lastWord","jQuery","Node","Placeholder","inheritPlaceholder","isShow","toggle","Buttons","invertedKeyMap","editorMethod","button","addToolbarButtons","addImagePopoverButtons","addLinkPopoverButtons","addTablePopoverButtons","fontInstalledMap","fontNamesIgnoreCheck","buttonGroup","icon","$button","currentTarget","$recentColor","colorButton","dropdownButtonContents","dropdown","$dropdown","$holder","palette","colors","colorsName","customColors","change","$chip","$picker","$palette","prepend","$color","$currentButton","magic","styleTags","title","template","styleIdx","styleLen","representShortcut","createInvokeHandlerAndUpdateState","eraser","addDefaultFonts","fontname","isFontDeservedToAdd","fontNames","dropdownCheck","checkClassName","menuCheck","fontSizes","fontSizeUnits","colorPalette","unorderedlist","orderedlist","justifyLeft","alignLeft","justifyCenter","alignCenter","justifyRight","alignRight","justifyFull","alignJustify","textHeight","lineHeights","insertTableMaxSize","col","mousedown","tableMoveHandler","picture","minus","arrowsAlt","question","rollback","trash","rowAbove","rowBelow","colBefore","colAfter","rowRemove","colRemove","groups","groupIdx","groupLen","group","groupName","$group","btn","updateBtnStates","$item","isChecked","infos","selector","toggleBtnActive","posOffset","$dimensionDisplay","$catcher","$highlighted","$unhighlighted","offsetX","posCatcher","pageX","pageY","offsetY","ceil","Toolbar","isFollowing","followScroll","toolbarContainer","changeContainer","followingToolbar","editorHeight","editorWidth","toolbarHeight","statusbarHeight","otherBarHeight","otherStaticBar","currentOffset","editorOffsetTop","activateOffset","deactivateOffsetBottom","marginTop","zIndex","isIncludeCodeview","$btn","toggleBtn","LinkDialog","$body","dialogsInBody","disableLinkTarget","checkbox","checked","footer","$dialog","dialog","fade","dialogsFade","hideDialog","$input","$linkBtn","$linkText","$linkUrl","$openInNewWindow","$useProtocol","onDialogShown","toggleLinkBtn","bindEnterKey","isNewWindowChecked","prop","useProtocolChecked","onDialogHidden","state","showDialog","showLinkDialog","LinkPopover","popover","$popover","$content","href","containerOffset","ImageDialog","imageLimitation","floor","log","readableSize","pow","showImageDialog","onImageLinkInsert","$imageInput","$imageUrl","$imageBtn","replaceWith","ImagePopover","popatmouse","TablePopover","VideoDialog","$video","ytMatch","igMatch","vMatch","vimMatch","dmMatch","youkuMatch","qqMatch","qqMatch2","mp4Match","oggMatch","webmMatch","fbMatch","youtubeId","start","ytMatchForStart","vid","encodeURIComponent","showVideoDialog","createVideoNode","$videoUrl","$videoBtn","HelpDialog","createShortcutList","command","$row","showHelpDialog","AirPopover","hidable","onContextmenu","air","forcelyOpen","HintPopover","hint","direction","hintDirection","hints","matchingWord","hideArrow","innerHeight","$current","$next","selectItem","$nextGroup","$prev","$prevGroup","nodeFromItem","rangeCompute","hintSelect","hintIdx","moveUp","moveDown","search","searchKeyword","createItemTemplates","hintMode","getWordsRange","getWordsMatchRange","empty","bnd","createGroup","version","Codeview","toolbarPosition","codeviewKeepButton","tabDisabled","textareaAutoSync","onBeforeCommand","onBlur","onBlurCodeview","onChange","onChangeCodeview","onEnter","onFocus","onImageUploadError","onInit","onKeydown","onKeyup","onMousedown","onMouseup","onPaste","onScroll","htmlMode","lineNumbers","pc","mac","renderer","airEditor","airEditable","option","caret","iconClassName","editorOptions","rowSize","colSize","colorName","placement","codeviewButton","isEnable","isActive","modal","interface"],"mappings":";CAAA,SAA2CA,EAAMC,GAChD,GAAsB,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,EAAQG,QAAQ,gBAC7B,GAAqB,mBAAXC,QAAyBA,OAAOC,IAC9CD,OAAO,CAAC,UAAWJ,OACf,CACJ,IAAIM,EAAuB,iBAAZL,QAAuBD,EAAQG,QAAQ,WAAaH,EAAQD,EAAa,QACxF,IAAI,IAAIQ,KAAKD,GAAuB,iBAAZL,QAAuBA,QAAUF,GAAMQ,GAAKD,EAAEC,IAPxE,CASGC,QAAQ,SAASC,GACpB,O,YCTE,IAAIC,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUX,QAGnC,IAAIC,EAASQ,EAAiBE,GAAY,CACzCL,EAAGK,EACHC,GAAG,EACHZ,QAAS,IAUV,OANAa,EAAQF,GAAUG,KAAKb,EAAOD,QAASC,EAAQA,EAAOD,QAASU,GAG/DT,EAAOW,GAAI,EAGJX,EAAOD,QA0Df,OArDAU,EAAoBK,EAAIF,EAGxBH,EAAoBM,EAAIP,EAGxBC,EAAoBO,EAAI,SAASjB,EAASkB,EAAMC,GAC3CT,EAAoBU,EAAEpB,EAASkB,IAClCG,OAAOC,eAAetB,EAASkB,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhET,EAAoBe,EAAI,SAASzB,GACX,oBAAX0B,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAetB,EAAS0B,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAetB,EAAS,aAAc,CAAE4B,OAAO,KAQvDlB,EAAoBmB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQlB,EAAoBkB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFAvB,EAAoBe,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOlB,EAAoBO,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRtB,EAAoB0B,EAAI,SAASnC,GAChC,IAAIkB,EAASlB,GAAUA,EAAO8B,WAC7B,WAAwB,OAAO9B,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAS,EAAoBO,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRT,EAAoBU,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG5B,EAAoB+B,EAAI,GAIjB/B,EAAoBA,EAAoBgC,EAAI,I,kBClFrDzC,EAAOD,QAAUQ,G,kcCEXmC,E,WACJ,WAAYC,EAAQC,EAAUC,EAASC,I,4FAAU,SAC/CC,KAAKJ,OAASA,EACdI,KAAKH,SAAWA,EAChBG,KAAKF,QAAUA,EACfE,KAAKD,SAAWA,E,sDAGXE,GACL,IAAMC,EAAQC,IAAEH,KAAKJ,QAoBrB,GAlBII,KAAKF,SAAWE,KAAKF,QAAQM,UAC/BF,EAAMG,KAAKL,KAAKF,QAAQM,UAGtBJ,KAAKF,SAAWE,KAAKF,QAAQQ,WAC/BJ,EAAMK,SAASP,KAAKF,QAAQQ,WAG1BN,KAAKF,SAAWE,KAAKF,QAAQU,MAC/BL,IAAEM,KAAKT,KAAKF,QAAQU,MAAM,SAACE,EAAGC,GAC5BT,EAAMU,KAAK,QAAUF,EAAGC,MAIxBX,KAAKF,SAAWE,KAAKF,QAAQe,OAC/BX,EAAMY,GAAG,QAASd,KAAKF,QAAQe,OAG7Bb,KAAKH,SAAU,CACjB,IAAMkB,EAAab,EAAMc,KAAK,4BAC9BhB,KAAKH,SAASoB,SAAQ,SAACC,GACrBA,EAAMC,OAAOJ,EAAWK,OAASL,EAAab,MAgBlD,OAZIF,KAAKD,UACPC,KAAKD,SAASG,EAAOF,KAAKF,SAGxBE,KAAKF,SAAWE,KAAKF,QAAQC,UAC/BC,KAAKF,QAAQC,SAASG,GAGpBD,GACFA,EAAQoB,OAAOnB,GAGVA,O,gCAII,KACbjB,OAAQ,SAACW,EAAQG,GACf,OAAO,WACL,IAAMD,EAAkC,WAAxB,EAAOwB,UAAU,IAAkBA,UAAU,GAAKA,UAAU,GACxEzB,EAAW0B,MAAMC,QAAQF,UAAU,IAAMA,UAAU,GAAK,GAI5D,OAHIxB,GAAWA,EAAQD,WACrBA,EAAWC,EAAQD,UAEd,IAAIF,EAASC,EAAQC,EAAUC,EAASC,O,iBC9DrD,YACA9C,EAAOD,QAAUyE,I,kECCjBtB,IAAEuB,WAAavB,IAAEuB,YAAc,CAC7BC,KAAM,IAGRxB,IAAEyB,OAAOzB,IAAEuB,WAAWC,KAAM,CAC1B,QAAS,CACPE,KAAM,CACJC,KAAM,OACNC,OAAQ,SACRC,UAAW,YACXC,MAAO,oBACPC,OAAQ,cACRhE,KAAM,cACNiE,cAAe,gBACfC,UAAW,YACXC,YAAa,cACbC,KAAM,YACNC,SAAU,kBAEZC,MAAO,CACLA,MAAO,UACPC,OAAQ,eACRC,WAAY,cACZC,WAAY,cACZC,cAAe,iBACfC,WAAY,gBACZC,UAAW,aACXC,WAAY,cACZC,UAAW,eACXC,aAAc,iBACdC,YAAa,gBACbC,eAAgB,mBAChBC,UAAW,cACXC,cAAe,0BACfC,UAAW,qBACXC,gBAAiB,oBACjBC,gBAAiB,oBACjBC,qBAAsB,8BACtBC,IAAK,YACLC,OAAQ,eACRC,SAAU,YAEZC,MAAO,CACLA,MAAO,QACPC,UAAW,aACXrB,OAAQ,eACRiB,IAAK,YACLK,UAAW,2DAEbC,KAAM,CACJA,KAAM,OACNvB,OAAQ,cACRwB,OAAQ,SACRC,KAAM,OACNC,cAAe,kBACfT,IAAK,mCACLU,gBAAiB,qBACjBC,YAAa,wBAEfC,MAAO,CACLA,MAAO,QACPC,YAAa,gBACbC,YAAa,gBACbC,WAAY,kBACZC,YAAa,mBACbC,OAAQ,aACRC,OAAQ,gBACRC,SAAU,gBAEZC,GAAI,CACFrC,OAAQ,0BAEVsC,MAAO,CACLA,MAAO,QACPtF,EAAG,SACHuF,WAAY,QACZC,IAAK,OACLC,GAAI,WACJC,GAAI,WACJC,GAAI,WACJC,GAAI,WACJC,GAAI,WACJC,GAAI,YAENC,MAAO,CACLC,UAAW,iBACXC,QAAS,gBAEX5F,QAAS,CACP6F,KAAM,OACNC,WAAY,cACZC,SAAU,aAEZC,UAAW,CACTA,UAAW,YACXC,QAAS,UACTC,OAAQ,SACRC,KAAM,aACNC,OAAQ,eACRC,MAAO,cACPC,QAAS,gBAEXC,MAAO,CACLC,OAAQ,eACRC,KAAM,aACNC,WAAY,mBACZC,WAAY,aACZC,YAAa,cACbC,eAAgB,kBAChBC,MAAO,QACPC,eAAgB,mBAChBC,SAAU,UAEZC,SAAU,CACRC,UAAW,qBACXC,MAAO,QACPC,eAAgB,kBAChBC,OAAQ,SACRC,oBAAqB,uBACrBC,cAAe,iBACfC,UAAW,cAEb3B,KAAM,CACJ,OAAU,SACV,gBAAmB,mBACnB,KAAQ,wBACR,KAAQ,wBACR,IAAO,MACP,MAAS,QACT,KAAQ,mBACR,OAAU,qBACV,UAAa,wBACb,cAAiB,4BACjB,aAAgB,gBAChB,YAAe,iBACf,cAAiB,mBACjB,aAAgB,kBAChB,YAAe,iBACf,oBAAuB,wBACvB,kBAAqB,sBACrB,QAAW,+BACX,OAAU,8BACV,WAAc,sDACd,SAAY,sCACZ,SAAY,sCACZ,SAAY,sCACZ,SAAY,sCACZ,SAAY,sCACZ,SAAY,sCACZ,qBAAwB,yBACxB,kBAAmB,oBAErB4B,QAAS,CACPC,KAAM,OACNC,KAAM,QAERC,YAAa,CACXA,YAAa,qBACbC,OAAQ,6BAEVC,OAAQ,CACNC,YAAa,yBClKnB,IAAMC,EAAiC,mBAAX3K,QAAyBA,KAQ/C4K,EAAsB,CAAC,aAAc,QAAS,YAAa,UAAW,WAE5E,SAASC,EAAcC,GACrB,OAAoE,IAA5D9H,IAAE+H,QAAQD,EAASE,cAAeJ,GAAnC,WAAsEE,EAAtE,KAAoFA,EAoB7F,IAEIG,EAFEC,EAAYC,UAAUD,UACtBE,EAAS,gBAAgBC,KAAKH,GAEpC,GAAIE,EAAQ,CACV,IAAIE,EAAU,mBAAmBC,KAAKL,GAClCI,IACFL,EAAiBO,WAAWF,EAAQ,MAEtCA,EAAU,sCAAsCC,KAAKL,MAEnDD,EAAiBO,WAAWF,EAAQ,KAIxC,IAAMG,EAAS,YAAYJ,KAAKH,GAE1BQ,EACF,iBAAkBtL,QAClB+K,UAAUQ,eAAiB,GAC3BR,UAAUS,iBAAmB,EAI3BC,EAAkBT,EAAU,8DAAgE,QAUnF,GACbU,MAAOX,UAAUY,WAAWC,QAAQ,QAAU,EAC9CZ,SACAK,SACAQ,MAAOR,GAAU,WAAWJ,KAAKH,GACjCgB,UAAW,aAAab,KAAKH,GAC7BiB,UAAWV,GAAU,UAAUJ,KAAKH,GACpCkB,UAAWX,GAAU,UAAUJ,KAAKH,GACpCmB,UAAWZ,GAAU,UAAUJ,KAAKH,KAAgB,UAAUG,KAAKH,GACnED,iBACAqB,cAAed,WAAWxI,IAAEuJ,GAAGC,QAC/B7B,eACAe,iBACAe,gBA/DF,SAAyB3B,GACvB,IAAM4B,EAA4B,kBAAb5B,EAA+B,cAAgB,gBAKhE6B,EADSC,SAASC,cAAc,UACfC,WAAW,MAEhCH,EAAQjI,KAAOqI,UAAkBL,EAAe,IAChD,IAAMM,EAAgBL,EAAQM,YAPb,mBAOmCC,MAKpD,OAHAP,EAAQjI,KAAOqI,SAAiBlC,EAAcC,GAAY,MAAQ4B,EAAe,IAG1EM,IAFOL,EAAQM,YAVL,mBAU2BC,OAoD5CC,oBAAqBP,SAASQ,YAC9BvB,iBACAjB,sBACAC,iBC1BF,IAAIwC,EAAY,EA8GD,OACbC,GA7JF,SAAYC,GACV,OAAO,SAASC,GACd,OAAOD,IAAUC,IA4JnBC,IAxJF,SAAaF,EAAOC,GAClB,OAAOD,IAAUC,GAwJjBE,KArJF,SAAcC,GACZ,OAAO,SAASJ,EAAOC,GACrB,OAAOD,EAAMI,KAAcH,EAAMG,KAoJnCC,GAhJF,WACE,OAAO,GAgJPC,KA7IF,WACE,OAAO,GA6IPC,KA9HF,SAAc5N,GACZ,OAAOA,GA8HP6N,IA3IF,SAAaC,GACX,OAAO,WACL,OAAQA,EAAEC,MAAMD,EAAG7J,aA0IrB+J,IAtIF,SAAaC,EAAIC,GACf,OAAO,SAASC,GACd,OAAOF,EAAGE,IAASD,EAAGC,KAqIxBC,OA7HF,SAAgBC,EAAKC,GACnB,OAAO,WACL,OAAOD,EAAIC,GAAQP,MAAMM,EAAKpK,aA4HhCsK,cAlHF,WACEpB,EAAY,GAkHZqB,SA1GF,SAAkBC,GAChB,IAAMC,IAAOvB,EAAY,GACzB,OAAOsB,EAASA,EAASC,EAAKA,GAyG9BC,SAzFF,SAAkBC,GAChB,IAAMC,EAAY/L,IAAE4J,UACpB,MAAO,CACLoC,IAAKF,EAAKE,IAAMD,EAAUE,YAC1BnG,KAAMgG,EAAKhG,KAAOiG,EAAUG,aAC5BhC,MAAO4B,EAAK9F,MAAQ8F,EAAKhG,KACzB/D,OAAQ+J,EAAKK,OAASL,EAAKE,MAoF7BI,aA3EF,SAAsBb,GACpB,IAAMc,EAAW,GACjB,IAAK,IAAMtN,KAAOwM,EACZrN,OAAOkB,UAAUC,eAAe1B,KAAK4N,EAAKxM,KAC5CsN,EAASd,EAAIxM,IAAQA,GAGzB,OAAOsN,GAqEPC,iBA7DF,SAA0BC,EAAWZ,GAEnC,OADAA,EAASA,GAAU,IACHY,EAAUC,MAAM,KAAKC,KAAI,SAAS1O,GAChD,OAAOA,EAAK2O,UAAU,EAAG,GAAGC,cAAgB5O,EAAK2O,UAAU,MAC1DE,KAAK,KA0DRC,SA7CF,SAAkBC,EAAMC,EAAMC,GAC5B,IAAIC,EACJ,OAAO,WACL,IAAMtD,EAAU9J,KACVqN,EAAO/L,UACPgM,EAAQ,WACZF,EAAU,KACLD,GACHF,EAAK7B,MAAMtB,EAASuD,IAGlBE,EAAUJ,IAAcC,EAC9BI,aAAaJ,GACbA,EAAUK,WAAWH,EAAOJ,GACxBK,GACFN,EAAK7B,MAAMtB,EAASuD,KA+BxBK,WArBF,SAAoBhK,GAElB,MADmB,6EACD8E,KAAK9E,KC5JzB,SAASiK,EAAKC,GACZ,OAAOA,EAAM,GAQf,SAASC,EAAKD,GACZ,OAAOA,EAAMA,EAAMxM,OAAS,GAiB9B,SAAS0M,EAAKF,GACZ,OAAOA,EAAMG,MAAM,GA8BrB,SAASC,EAASJ,EAAOpC,GACvB,GAAIoC,GAASA,EAAMxM,QAAUoK,EAAM,CACjC,GAAIoC,EAAMzE,QACR,OAAgC,IAAzByE,EAAMzE,QAAQqC,GAChB,GAAIoC,EAAMI,SAEf,OAAOJ,EAAMI,SAASxC,GAG1B,OAAO,EAyHM,OACbmC,OACAE,OACAI,QA7KF,SAAiBL,GACf,OAAOA,EAAMG,MAAM,EAAGH,EAAMxM,OAAS,IA6KrC0M,OACAI,KArBF,SAAcN,EAAOpC,GACnB,GAAIoC,GAASA,EAAMxM,QAAUoK,EAAM,CACjC,IAAM2C,EAAMP,EAAMzE,QAAQqC,GAC1B,OAAgB,IAAT2C,EAAa,KAAOP,EAAMO,EAAM,GAEzC,OAAO,MAiBPC,KAlCF,SAAcR,EAAOpC,GACnB,GAAIoC,GAASA,EAAMxM,QAAUoK,EAAM,CACjC,IAAM2C,EAAMP,EAAMzE,QAAQqC,GAC1B,OAAgB,IAAT2C,EAAa,KAAOP,EAAMO,EAAM,GAEzC,OAAO,MA8BPnN,KAjKF,SAAc4M,EAAOS,GACnB,IAAK,IAAIF,EAAM,EAAGG,EAAMV,EAAMxM,OAAQ+M,EAAMG,EAAKH,IAAO,CACtD,IAAM3C,EAAOoC,EAAMO,GACnB,GAAIE,EAAK7C,GACP,OAAOA,IA8JXwC,WACAO,IAvJF,SAAaX,EAAOS,GAClB,IAAK,IAAIF,EAAM,EAAGG,EAAMV,EAAMxM,OAAQ+M,EAAMG,EAAKH,IAC/C,IAAKE,EAAKT,EAAMO,IACd,OAAO,EAGX,OAAO,GAkJPK,IA1HF,SAAaZ,EAAOlE,GAElB,OADAA,EAAKA,GAAMuD,EAAKhC,KACT2C,EAAMa,QAAO,SAASC,EAAM/N,GACjC,OAAO+N,EAAOhF,EAAG/I,KAChB,IAuHHgO,KAhHF,SAAcC,GAIZ,IAHA,IAAMC,EAAS,GACTzN,EAASwN,EAAWxN,OACtB+M,GAAO,IACFA,EAAM/M,GACbyN,EAAOV,GAAOS,EAAWT,GAE3B,OAAOU,GA0GPC,QApGF,SAAiBlB,GACf,OAAQA,IAAUA,EAAMxM,QAoGxB2N,UA1FF,SAAmBnB,EAAOlE,GACxB,OAAKkE,EAAMxM,OACG0M,EAAKF,GACNa,QAAO,SAASC,EAAM/N,GACjC,IAAMqO,EAAQnB,EAAKa,GAMnB,OALIhF,EAAGmE,EAAKmB,GAAQrO,GAClBqO,EAAMA,EAAM5N,QAAUT,EAEtB+N,EAAKA,EAAKtN,QAAU,CAACT,GAEhB+N,IACN,CAAC,CAACf,EAAKC,MAVkB,IA0F5BqB,QAvEF,SAAiBrB,GAEf,IADA,IAAMsB,EAAU,GACPf,EAAM,EAAGG,EAAMV,EAAMxM,OAAQ+M,EAAMG,EAAKH,IAC3CP,EAAMO,IAAQe,EAAQC,KAAKvB,EAAMO,IAEvC,OAAOe,GAmEPE,OA3DF,SAAgBxB,GAGd,IAFA,IAAMyB,EAAU,GAEPlB,EAAM,EAAGG,EAAMV,EAAMxM,OAAQ+M,EAAMG,EAAKH,IAC1CH,EAASqB,EAASzB,EAAMO,KAC3BkB,EAAQF,KAAKvB,EAAMO,IAIvB,OAAOkB,IC3JHC,EAAYC,OAAOC,aAAa,KAWtC,SAASC,EAAWC,GAClB,OAAOA,GAAQvP,IAAEuP,GAAMC,SAAS,iBAuBlC,SAASC,EAAmBC,GAE1B,OADAA,EAAWA,EAAS/C,cACb,SAAS4C,GACd,OAAOA,GAAQA,EAAKG,SAAS/C,gBAAkB+C,GAYnD,SAASC,EAAOJ,GACd,OAAOA,GAA0B,IAAlBA,EAAKK,SAmBtB,SAASC,EAAON,GACd,OAAOA,GAAQ,2DAA2DlH,KAAKkH,EAAKG,SAAS/C,eAG/F,SAASmD,EAAOP,GACd,OAAID,EAAWC,KAKRA,GAAQ,sBAAsBlH,KAAKkH,EAAKG,SAAS/C,gBAO1D,IAAMoD,EAAQN,EAAmB,OAE3BO,EAAOP,EAAmB,MAMhC,IAAMQ,EAAUR,EAAmB,SAE7BS,EAAST,EAAmB,QAElC,SAASU,EAASZ,GAChB,QAAQa,EAAgBb,IAChBc,EAAOd,IACPe,EAAKf,IACLO,EAAOP,IACPU,EAAQV,IACRgB,EAAahB,IACbW,EAAOX,IAGjB,SAASc,EAAOd,GACd,OAAOA,GAAQ,UAAUlH,KAAKkH,EAAKG,SAAS/C,eAG9C,IAAM2D,EAAOb,EAAmB,MAEhC,SAASe,EAAOjB,GACd,OAAOA,GAAQ,UAAUlH,KAAKkH,EAAKG,SAAS/C,eAG9C,IAAM4D,EAAed,EAAmB,cAExC,SAASW,EAAgBb,GACvB,OAAOiB,EAAOjB,IAASgB,EAAahB,IAASD,EAAWC,GAG1D,IAAMkB,EAAWhB,EAAmB,KAUpC,IAAMiB,EAASjB,EAAmB,QAwClC,IAAMkB,EAAYC,EAAIxI,QAAUwI,EAAI3I,eAAiB,GAAK,SAAW,OASrE,SAAS4I,EAAWtB,GAClB,OAAII,EAAOJ,GACFA,EAAKuB,UAAU7P,OAGpBsO,EACKA,EAAKwB,WAAW9P,OAGlB,EAuBT,SAAS0N,EAAQY,GACf,IAAMpB,EAAM0C,EAAWtB,GAEvB,OAAY,IAARpB,KAEQwB,EAAOJ,IAAiB,IAARpB,GAAaoB,EAAKyB,YAAcL,MAGjDtL,EAAM+I,IAAImB,EAAKwB,WAAYpB,IAA8B,KAAnBJ,EAAKyB,YAWxD,SAASC,EAAiB1B,GACnBM,EAAON,IAAUsB,EAAWtB,KAC/BA,EAAKyB,UAAYL,GAUrB,SAASO,EAAS3B,EAAMrB,GACtB,KAAOqB,GAAM,CACX,GAAIrB,EAAKqB,GAAS,OAAOA,EACzB,GAAID,EAAWC,GAAS,MAExBA,EAAOA,EAAK4B,WAEd,OAAO,KA4BT,SAASC,EAAa7B,EAAMrB,GAC1BA,EAAOA,GAAQpB,EAAKjC,KAEpB,IAAMwG,EAAY,GAQlB,OAPAH,EAAS3B,GAAM,SAAS+B,GAKtB,OAJKhC,EAAWgC,IACdD,EAAUrC,KAAKsC,GAGVpD,EAAKoD,MAEPD,EAiDT,SAASE,EAAShC,EAAMrB,GACtBA,EAAOA,GAAQpB,EAAKjC,KAGpB,IADA,IAAM2G,EAAQ,GACPjC,IACDrB,EAAKqB,IACTiC,EAAMxC,KAAKO,GACXA,EAAOA,EAAKkC,YAEd,OAAOD,EAiDT,SAASE,EAAYnC,EAAMoC,GACzB,IAAM1D,EAAO0D,EAAUF,YACnBG,EAASD,EAAUR,WAMvB,OALIlD,EACF2D,EAAOC,aAAatC,EAAMtB,GAE1B2D,EAAOE,YAAYvC,GAEdA,EAST,SAASwC,EAAiBxC,EAAMyC,GAI9B,OAHAhS,IAAEM,KAAK0R,GAAQ,SAAShE,EAAKjN,GAC3BwO,EAAKuC,YAAY/Q,MAEZwO,EAST,SAAS0C,EAAgBC,GACvB,OAAwB,IAAjBA,EAAMC,OASf,SAASC,EAAiBF,GACxB,OAAOA,EAAMC,SAAWtB,EAAWqB,EAAM3C,MAS3C,SAAS8C,EAAYH,GACnB,OAAOD,EAAgBC,IAAUE,EAAiBF,GAUpD,SAASI,EAAa/C,EAAM2B,GAC1B,KAAO3B,GAAQA,IAAS2B,GAAU,CAChC,GAAuB,IAAnBqB,GAAShD,GACX,OAAO,EAETA,EAAOA,EAAK4B,WAGd,OAAO,EAUT,SAASqB,GAAcjD,EAAM2B,GAC3B,IAAKA,EACH,OAAO,EAET,KAAO3B,GAAQA,IAAS2B,GAAU,CAChC,GAAIqB,GAAShD,KAAUsB,EAAWtB,EAAK4B,YAAc,EACnD,OAAO,EAET5B,EAAOA,EAAK4B,WAGd,OAAO,EA4BT,SAASoB,GAAShD,GAEhB,IADA,IAAI4C,EAAS,EACL5C,EAAOA,EAAKkD,iBAClBN,GAAU,EAEZ,OAAOA,EAGT,SAASO,GAAYnD,GACnB,SAAUA,GAAQA,EAAKwB,YAAcxB,EAAKwB,WAAW9P,QAUvD,SAAS0R,GAAUT,EAAOU,GACxB,IAAIrD,EACA4C,EAEJ,GAAqB,IAAjBD,EAAMC,OAAc,CACtB,GAAI7C,EAAW4C,EAAM3C,MACnB,OAAO,KAGTA,EAAO2C,EAAM3C,KAAK4B,WAClBgB,EAASI,GAASL,EAAM3C,WACfmD,GAAYR,EAAM3C,MAE3B4C,EAAStB,EADTtB,EAAO2C,EAAM3C,KAAKwB,WAAWmB,EAAMC,OAAS,KAG5C5C,EAAO2C,EAAM3C,KACb4C,EAASS,EAAoB,EAAIV,EAAMC,OAAS,GAGlD,MAAO,CACL5C,KAAMA,EACN4C,OAAQA,GAWZ,SAASU,GAAUX,EAAOU,GACxB,IAAIrD,EAAM4C,EAEV,GAAItB,EAAWqB,EAAM3C,QAAU2C,EAAMC,OAAQ,CAC3C,GAAI7C,EAAW4C,EAAM3C,MACnB,OAAO,KAGT,IAAIuD,EAAeC,GAAgBb,EAAM3C,MACrCuD,GACFvD,EAAOuD,EACPX,EAAS,IAET5C,EAAO2C,EAAM3C,KAAK4B,WAClBgB,EAASI,GAASL,EAAM3C,MAAQ,QAEzBmD,GAAYR,EAAM3C,OAC3BA,EAAO2C,EAAM3C,KAAKwB,WAAWmB,EAAMC,QACnCA,EAAS,IAET5C,EAAO2C,EAAM3C,KACb4C,EAASS,EAAoB/B,EAAWqB,EAAM3C,MAAQ2C,EAAMC,OAAS,GAGvE,MAAO,CACL5C,KAAMA,EACN4C,OAAQA,GAWZ,SAASa,GAAuBd,EAAOU,GACrC,IAAIrD,EAAM4C,EAGV,GAAIxD,EAAQuD,EAAM3C,MAIhB,MAAO,CACLA,KAJFA,EAAO2C,EAAM3C,KAAKkC,YAKhBU,OAJFA,EAAS,GAQX,GAAItB,EAAWqB,EAAM3C,QAAU2C,EAAMC,OAAQ,CAC3C,GAAI7C,EAAW4C,EAAM3C,MACnB,OAAO,KAGT,IAAIuD,EAAeC,GAAgBb,EAAM3C,MACrCuD,GACFvD,EAAOuD,EACPX,EAAS,IAET5C,EAAO2C,EAAM3C,KAAK4B,WAClBgB,EAASI,GAASL,EAAM3C,MAAQ,GAI9BD,EAAWC,KACbA,EAAO2C,EAAM3C,KAAKkC,YAClBU,EAAS,QAEN,GAAIO,GAAYR,EAAM3C,OAG3B,GADA4C,EAAS,EACLxD,EAFJY,EAAO2C,EAAM3C,KAAKwB,WAAWmB,EAAMC,SAGjC,OAAO,UAMT,GAHA5C,EAAO2C,EAAM3C,KACb4C,EAASS,EAAoB/B,EAAWqB,EAAM3C,MAAQ2C,EAAMC,OAAS,EAEjExD,EAAQY,GACV,OAAO,KAIX,MAAO,CACLA,KAAMA,EACN4C,OAAQA,GAOZ,SAASY,GAAgBE,GACvB,GAAKA,EAAOxB,aACRwB,EAAOrB,SAAWqB,EAAOxB,YAAYG,OACzC,OAAIjC,EAAOsD,EAAOxB,aAAqBwB,EAAOxB,YACvCsB,GAAgBE,EAAOxB,aAUhC,SAASyB,GAAYC,EAAQC,GAC3B,OAAOD,EAAO5D,OAAS6D,EAAO7D,MAAQ4D,EAAOhB,SAAWiB,EAAOjB,OAiKjE,SAASkB,GAAUnB,EAAOvS,GACxB,IAAI2T,EAAyB3T,GAAWA,EAAQ2T,uBAC1CC,EAAsB5T,GAAWA,EAAQ4T,oBACzCC,EAAuB7T,GAAWA,EAAQ6T,qBAOhD,GALIA,IACFF,GAAyB,GAIvBjB,EAAYH,KAAWvC,EAAOuC,EAAM3C,OAASgE,GAAsB,CACrE,GAAItB,EAAgBC,GAClB,OAAOA,EAAM3C,KACR,GAAI6C,EAAiBF,GAC1B,OAAOA,EAAM3C,KAAKkC,YAKtB,GAAI9B,EAAOuC,EAAM3C,MACf,OAAO2C,EAAM3C,KAAKkE,UAAUvB,EAAMC,QAElC,IAAMuB,EAAYxB,EAAM3C,KAAKwB,WAAWmB,EAAMC,QACxCwB,EAAQjC,EAAYQ,EAAM3C,KAAKqE,WAAU,GAAQ1B,EAAM3C,MAQ7D,OAPAwC,EAAiB4B,EAAOpC,EAASmC,IAE5BJ,IACHrC,EAAiBiB,EAAM3C,MACvB0B,EAAiB0C,IAGfH,IACE7E,EAAQuD,EAAM3C,OAChB/L,GAAO0O,EAAM3C,MAEXZ,EAAQgF,KACVnQ,GAAOmQ,GACAzB,EAAM3C,KAAKkC,aAIfkC,EAgBX,SAASE,GAAUlX,EAAMuV,EAAOvS,GAE9B,IAAM0R,EAAYD,EAAac,EAAM3C,KAAMzC,EAAKxC,GAAG3N,IAEnD,OAAK0U,EAAUpQ,OAEiB,IAArBoQ,EAAUpQ,OACZoS,GAAUnB,EAAOvS,GAGnB0R,EAAU/C,QAAO,SAASiB,EAAMqC,GAKrC,OAJIrC,IAAS2C,EAAM3C,OACjBA,EAAO8D,GAAUnB,EAAOvS,IAGnB0T,GAAU,CACf9D,KAAMqC,EACNO,OAAQ5C,EAAOgD,GAAShD,GAAQsB,EAAWe,IAC1CjS,MAbI,KA0DX,SAASb,GAAO4Q,GACd,OAAO9F,SAASC,cAAc6F,GAehC,SAASlM,GAAO+L,EAAMuE,GACpB,GAAKvE,GAASA,EAAK4B,WAAnB,CACA,GAAI5B,EAAKwE,WAAc,OAAOxE,EAAKwE,WAAWD,GAE9C,IAAMlC,EAASrC,EAAK4B,WACpB,IAAK2C,EAAe,CAElB,IADA,IAAMtC,EAAQ,GACLrU,EAAI,EAAGgR,EAAMoB,EAAKwB,WAAW9P,OAAQ9D,EAAIgR,EAAKhR,IACrDqU,EAAMxC,KAAKO,EAAKwB,WAAW5T,IAG7B,IAAK,IAAIA,EAAI,EAAGgR,EAAMqD,EAAMvQ,OAAQ9D,EAAIgR,EAAKhR,IAC3CyU,EAAOC,aAAaL,EAAMrU,GAAIoS,GAIlCqC,EAAOoC,YAAYzE,IAgDrB,IAAM0E,GAAaxE,EAAmB,YAMtC,SAAShR,GAAMsB,EAAOmU,GACpB,IAAMC,EAAMF,GAAWlU,EAAM,IAAMA,EAAMoU,MAAQpU,EAAMG,OACvD,OAAIgU,EACKC,EAAIC,QAAQ,UAAW,IAEzBD,EAiEM,QAEbhF,YAEAkF,qBA9lC2B,SAgmC3BC,MAAO3D,EAEP4D,UAAW,MAAF,OAAQ5D,EAAR,QACTlB,qBACAH,aACAkF,gBA/kCF,SAAyBjF,GACvB,OAAOA,GAAQvP,IAAEuP,GAAMC,SAAS,wBA+kChCG,SACA8E,UA1iCF,SAAmBlF,GACjB,OAAOA,GAA0B,IAAlBA,EAAKK,UA0iCpBC,SACAC,SACA4E,WAhhCF,SAAoBnF,GAClB,OAAOO,EAAOP,KAAUS,EAAKT,IAghC7BoF,UAzhCF,SAAmBpF,GACjB,OAAOA,GAAQ,UAAUlH,KAAKkH,EAAKG,SAAS/C,gBAyhC5CwD,WACAyE,QAAS9H,EAAK/B,IAAIoF,GAClB0E,aA5+BF,SAAsBtF,GACpB,OAAOY,EAASZ,KAAU2B,EAAS3B,EAAMO,IA4+BzCY,SACAoE,aAl/BF,SAAsBvF,GACpB,OAAOY,EAASZ,MAAW2B,EAAS3B,EAAMO,IAk/B1CC,QACAM,SACAJ,UACAC,SACAM,SACAD,eACAH,kBACAK,WACAsE,MAAOtF,EAAmB,OAC1BO,OACAgF,KAAMvF,EAAmB,MACzBwF,OAAQxF,EAAmB,QAC3ByF,IAAKzF,EAAmB,KACxB0F,IAAK1F,EAAmB,KACxB2F,IAAK3F,EAAmB,KACxB4F,IAAK5F,EAAmB,KACxB6F,MAAO7F,EAAmB,OAC1BwE,cACAsB,oBA17BF,SAA6BhG,GAC3B,GACE,GAA+B,OAA3BA,EAAKiG,mBAAmE,KAArCjG,EAAKiG,kBAAkBxE,UAAkB,YACxEzB,EAAOA,EAAKiG,mBAEtB,OAAO7G,EAAQY,IAs7BfZ,UACA8G,cAAe3I,EAAK5B,IAAIuF,EAAU9B,GAClC+G,iBAv/BF,SAA0BC,EAAOC,GAC/B,OAAOD,EAAMlE,cAAgBmE,GACtBD,EAAMlD,kBAAoBmD,GAs/BjCC,oBA5+BF,SAA6BtG,EAAMrB,GACjCA,EAAOA,GAAQpB,EAAKlC,GAEpB,IAAMkL,EAAW,GAQjB,OAPIvG,EAAKkD,iBAAmBvE,EAAKqB,EAAKkD,kBACpCqD,EAAS9G,KAAKO,EAAKkD,iBAErBqD,EAAS9G,KAAKO,GACVA,EAAKkC,aAAevD,EAAKqB,EAAKkC,cAChCqE,EAAS9G,KAAKO,EAAKkC,aAEdqE,GAk+BPjF,aACAoB,kBACAG,mBACAC,cACAC,eACAE,iBACAuD,kBA5pBF,SAA2B7D,EAAOhB,GAChC,OAAOe,EAAgBC,IAAUI,EAAaJ,EAAM3C,KAAM2B,IA4pB1D8E,mBAnpBF,SAA4B9D,EAAOhB,GACjC,OAAOkB,EAAiBF,IAAUM,GAAcN,EAAM3C,KAAM2B,IAmpB5DyB,aACAE,aACAG,0BACAE,eACA+C,eAteF,SAAwB/D,GACtB,GAAIvC,EAAOuC,EAAM3C,QAAUmD,GAAYR,EAAM3C,OAASZ,EAAQuD,EAAM3C,MAClE,OAAO,EAGT,IAAM2G,EAAWhE,EAAM3C,KAAKwB,WAAWmB,EAAMC,OAAS,GAChDgE,EAAYjE,EAAM3C,KAAKwB,WAAWmB,EAAMC,QAC9C,QAAM+D,IAAYrG,EAAOqG,IAAgBC,IAAatG,EAAOsG,KAge7DC,eAldF,SAAwBlE,EAAOhE,GAC7B,KAAOgE,GAAO,CACZ,GAAIhE,EAAKgE,GACP,OAAOA,EAGTA,EAAQS,GAAUT,GAGpB,OAAO,MA0cPmE,eAhcF,SAAwBnE,EAAOhE,GAC7B,KAAOgE,GAAO,CACZ,GAAIhE,EAAKgE,GACP,OAAOA,EAGTA,EAAQW,GAAUX,GAGpB,OAAO,MAwbPoE,YA/aF,SAAqBpE,GACnB,IAAKvC,EAAOuC,EAAM3C,MAChB,OAAO,EAGT,IAAMgH,EAAKrE,EAAM3C,KAAKuB,UAAU0F,OAAOtE,EAAMC,OAAS,GACtD,OAAOoE,GAAc,MAAPA,GAAcA,IAAOpH,GA0anCsH,aAjaF,SAAsBvE,GACpB,IAAKvC,EAAOuC,EAAM3C,MAChB,OAAO,EAGT,IAAMgH,EAAKrE,EAAM3C,KAAKuB,UAAU0F,OAAOtE,EAAMC,OAAS,GACtD,MAAc,MAAPoE,GAAcA,IAAOpH,GA4Z5BuH,UAjZF,SAAmBC,EAAYC,EAAUC,EAASjE,GAGhD,IAFA,IAAIV,EAAQyE,EAELzE,IACL2E,EAAQ3E,IAEJgB,GAAYhB,EAAO0E,KAHX,CAUZ1E,EAAQc,GAAuBd,EAHVU,GACF+D,EAAWpH,OAAS2C,EAAM3C,MAC1BqH,EAASrH,OAAS2C,EAAM3C,QAsY7C2B,WACA4F,oBAr5BF,SAA6BvH,EAAMrB,GAGjC,IAFAqB,EAAOA,EAAK4B,WAEL5B,GACoB,IAArBsB,EAAWtB,IADJ,CAEX,GAAIrB,EAAKqB,GAAS,OAAOA,EACzB,GAAID,EAAWC,GAAS,MAExBA,EAAOA,EAAK4B,WAEd,OAAO,MA44BPC,eACA2F,aAn3BF,SAAsBxH,EAAMrB,GAC1B,IAAMmD,EAAYD,EAAa7B,GAC/B,OAAOlK,EAAMqI,KAAK2D,EAAU2F,OAAO9I,KAk3BnCqD,WACA0F,SA51BF,SAAkB1H,EAAMrB,GACtBA,EAAOA,GAAQpB,EAAKjC,KAGpB,IADA,IAAM2G,EAAQ,GACPjC,IACDrB,EAAKqB,IACTiC,EAAMxC,KAAKO,GACXA,EAAOA,EAAKkD,gBAEd,OAAOjB,GAo1BP0F,eAzzBF,SAAwB3H,EAAMrB,GAC5B,IAAMiJ,EAAc,GAapB,OAZAjJ,EAAOA,GAAQpB,EAAKlC,GAGpB,SAAUwM,EAAOC,GACX9H,IAAS8H,GAAWnJ,EAAKmJ,IAC3BF,EAAYnI,KAAKqI,GAEnB,IAAK,IAAIrJ,EAAM,EAAGG,EAAMkJ,EAAQtG,WAAW9P,OAAQ+M,EAAMG,EAAKH,IAC5DoJ,EAAOC,EAAQtG,WAAW/C,IAL9B,CAOGuB,GAEI4H,GA4yBPG,eA52BF,SAAwB3B,EAAOC,GAE7B,IADA,IAAMvE,EAAYD,EAAauE,GACtB1W,EAAI2W,EAAO3W,EAAGA,EAAIA,EAAEkS,WAC3B,GAAIE,EAAUrI,QAAQ/J,IAAM,EAAG,OAAOA,EAExC,OAAO,MAw2BPsY,KAnyBF,SAAchI,EAAMiI,GAClB,IAAM5F,EAASrC,EAAK4B,WACdsG,EAAUzX,IAAE,IAAMwX,EAAc,KAAK,GAK3C,OAHA5F,EAAOC,aAAa4F,EAASlI,GAC7BkI,EAAQ3F,YAAYvC,GAEbkI,GA6xBP/F,cACAK,mBACAQ,YACAG,eACAgF,eAtYF,SAAwBxG,EAAU3B,GAEhC,OADkB6B,EAAa7B,EAAMzC,EAAKxC,GAAG4G,IAC5BzE,IAAI8F,IAAUoF,WAqY/BC,eA1XF,SAAwB1G,EAAU2G,GAEhC,IADA,IAAIR,EAAUnG,EACL/T,EAAI,EAAGgR,EAAM0J,EAAQ5W,OAAQ9D,EAAIgR,EAAKhR,IAE3Cka,EADEA,EAAQtG,WAAW9P,QAAU4W,EAAQ1a,GAC7Bka,EAAQtG,WAAWsG,EAAQtG,WAAW9P,OAAS,GAE/CoW,EAAQtG,WAAW8G,EAAQ1a,IAGzC,OAAOka,GAkXPxD,aACAiE,WA9QF,SAAoB5F,EAAO/B,GAIzB,IAII4H,EAAWC,EAJT9J,EAAOiC,EAAWL,EAASM,EAC3BiB,EAAYD,EAAac,EAAM3C,KAAMrB,GACrC+J,EAAc5S,EAAMqI,KAAK2D,IAAca,EAAM3C,KAG/CrB,EAAK+J,IACPF,EAAY1G,EAAUA,EAAUpQ,OAAS,GACzC+W,EAAYC,GAGZD,GADAD,EAAYE,GACU9G,WAIxB,IAAI+G,EAAQH,GAAalE,GAAUkE,EAAW7F,EAAO,CACnDoB,uBAAwBnD,EACxBoD,oBAAqBpD,IAQvB,OAJK+H,GAASF,IAAc9F,EAAM3C,OAChC2I,EAAQhG,EAAM3C,KAAKwB,WAAWmB,EAAMC,SAG/B,CACLgE,UAAW+B,EACXF,UAAWA,IAiPblZ,UACAqZ,WA1OF,SAAoBC,GAClB,OAAOxO,SAASyO,eAAeD,IA0O/B5U,UACA8U,YAvMF,SAAqB/I,EAAMrB,GACzB,KAAOqB,IACDD,EAAWC,IAAUrB,EAAKqB,IADnB,CAKX,IAAMqC,EAASrC,EAAK4B,WACpB3N,GAAO+L,GACPA,EAAOqC,IAgMTwC,QAnLF,SAAiB7E,EAAMG,GACrB,GAAIH,EAAKG,SAAS/C,gBAAkB+C,EAAS/C,cAC3C,OAAO4C,EAGT,IAAMgJ,EAAUzZ,GAAO4Q,GAUvB,OARIH,EAAK3K,MAAM4T,UACbD,EAAQ3T,MAAM4T,QAAUjJ,EAAK3K,MAAM4T,SAGrCzG,EAAiBwG,EAASlT,EAAMmJ,KAAKe,EAAKwB,aAC1CW,EAAY6G,EAAShJ,GACrB/L,GAAO+L,GAEAgJ,GAqKPrY,KA5IF,SAAcH,EAAO0Y,GACnB,IAAIhZ,EAAShB,GAAMsB,GAEnB,GAAI0Y,EAAkB,CAUpBhZ,GARAA,EAASA,EAAO2U,QADC,yCACiB,SAASsE,EAAOC,EAAU5a,GAC1DA,EAAOA,EAAK4O,cACZ,IAAMiM,EAAyB,8BAA8BvQ,KAAKtK,MACnC4a,EACzBE,EAAc,4CAA4CxQ,KAAKtK,GAErE,OAAO2a,GAAUE,GAA0BC,EAAe,KAAO,QAEnDC,OAGlB,OAAOrZ,GA6HPhB,SACAsa,mBA3HF,SAA4BC,GAC1B,IAAMC,EAAejZ,IAAEgZ,GACjBE,EAAMD,EAAa9G,SACnBpQ,EAASkX,EAAaE,aAAY,GAExC,MAAO,CACLrT,KAAMoT,EAAIpT,KACVkG,IAAKkN,EAAIlN,IAAMjK,IAqHjBqX,aAjHF,SAAsBrZ,EAAOsZ,GAC3Bnb,OAAOob,KAAKD,GAAQvY,SAAQ,SAAS/B,GACnCgB,EAAMY,GAAG5B,EAAKsa,EAAOta,QAgHvBwa,aA5GF,SAAsBxZ,EAAOsZ,GAC3Bnb,OAAOob,KAAKD,GAAQvY,SAAQ,SAAS/B,GACnCgB,EAAMyZ,IAAIza,EAAKsa,EAAOta,QA2GxB0a,iBA/FF,SAA0BlK,GACxB,OAAOA,IAASI,EAAOJ,IAASlK,EAAMwI,SAAS0B,EAAKmK,UAAW,mB,2KCxlC5CC,G,WAKnB,WAAYC,EAAOja,I,4FAAS,SAC1BE,KAAK+Z,MAAQA,EAEb/Z,KAAKga,MAAQ,GACbha,KAAKnC,QAAU,GACfmC,KAAKia,WAAa,GAClBja,KAAKF,QAAUK,IAAEyB,QAAO,EAAM,GAAI9B,GAGlCK,IAAEuB,WAAWwY,GAAK/Z,IAAEuB,WAAWyY,YAAYna,KAAKF,SAChDE,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GAEvBla,KAAKoa,a,4DAUL,OAHApa,KAAKia,WAAaja,KAAKka,GAAGG,aAAara,KAAK+Z,OAC5C/Z,KAAKsa,cACLta,KAAK+Z,MAAMQ,OACJva,O,gCAOPA,KAAKwa,WACLxa,KAAK+Z,MAAMU,WAAW,cACtBza,KAAKka,GAAGQ,aAAa1a,KAAK+Z,MAAO/Z,KAAKia,c,8BAOtC,IAAMU,EAAW3a,KAAK4a,aACtB5a,KAAK6a,KAAKC,GAAIpG,WACd1U,KAAKwa,WACLxa,KAAKsa,cAEDK,GACF3a,KAAK+a,Y,oCAIK,WAEZ/a,KAAKF,QAAQiM,GAAKkB,EAAKpB,SAAS1L,IAAE6a,OAElChb,KAAKF,QAAQqY,UAAYnY,KAAKF,QAAQqY,WAAanY,KAAKia,WAAWgB,OAGnE,IAAMC,EAAU/a,IAAEyB,OAAO,GAAI5B,KAAKF,QAAQob,SAC1C7c,OAAOob,KAAKyB,GAASja,SAAQ,SAAC/B,GAC5B,EAAKwP,KAAK,UAAYxP,EAAKgc,EAAQhc,OAGrC,IAAMrB,EAAUsC,IAAEyB,OAAO,GAAI5B,KAAKF,QAAQjC,QAASsC,IAAEuB,WAAWyZ,SAAW,IAG3E9c,OAAOob,KAAK5b,GAASoD,SAAQ,SAAC/B,GAC5B,EAAKjC,OAAOiC,EAAKrB,EAAQqB,IAAM,MAGjCb,OAAOob,KAAKzZ,KAAKnC,SAASoD,SAAQ,SAAC/B,GACjC,EAAKkc,iBAAiBlc,Q,iCAIf,WAETb,OAAOob,KAAKzZ,KAAKnC,SAASia,UAAU7W,SAAQ,SAAC/B,GAC3C,EAAKmc,aAAanc,MAGpBb,OAAOob,KAAKzZ,KAAKga,OAAO/Y,SAAQ,SAAC/B,GAC/B,EAAKoc,WAAWpc,MAGlBc,KAAKub,aAAa,UAAWvb,Q,2BAG1BK,GACH,IAAMmb,EAAcxb,KAAKyL,OAAO,wBAEhC,QAAagQ,IAATpb,EAEF,OADAL,KAAKyL,OAAO,iBACL+P,EAAcxb,KAAKia,WAAWyB,QAAQpH,MAAQtU,KAAKia,WAAW0B,SAAStb,OAE1Emb,EACFxb,KAAKyL,OAAO,gBAAiBpL,GAE7BL,KAAKia,WAAW0B,SAAStb,KAAKA,GAEhCL,KAAK+Z,MAAMzF,IAAIjU,GACfL,KAAKub,aAAa,SAAUlb,EAAML,KAAKia,WAAW0B,Y,mCAKpD,MAA4D,UAArD3b,KAAKia,WAAW0B,SAAS/a,KAAK,qB,+BAIrCZ,KAAKia,WAAW0B,SAAS/a,KAAK,mBAAmB,GACjDZ,KAAKyL,OAAO,oBAAoB,GAChCzL,KAAKub,aAAa,WAAW,GAC7Bvb,KAAKF,QAAQ8b,SAAU,I,gCAKnB5b,KAAKyL,OAAO,yBACdzL,KAAKyL,OAAO,uBAEdzL,KAAKia,WAAW0B,SAAS/a,KAAK,mBAAmB,GACjDZ,KAAKF,QAAQ8b,SAAU,EACvB5b,KAAKyL,OAAO,sBAAsB,GAElCzL,KAAKub,aAAa,WAAW,K,qCAI7B,IAAM7O,EAAYlH,EAAMmI,KAAKrM,WACvB+L,EAAO7H,EAAMsI,KAAKtI,EAAMmJ,KAAKrN,YAE7BvB,EAAWC,KAAKF,QAAQ+b,UAAU5O,EAAKR,iBAAiBC,EAAW,OACrE3M,GACFA,EAASqL,MAAMpL,KAAK+Z,MAAM,GAAI1M,GAEhCrN,KAAK+Z,MAAM+B,QAAQ,cAAgBpP,EAAWW,K,uCAG/BnO,GACf,IAAMjC,EAAS+C,KAAKnC,QAAQqB,GAC5BjC,EAAO8e,iBAAmB9e,EAAO8e,kBAAoB9O,EAAKlC,GACrD9N,EAAO8e,qBAKR9e,EAAOmd,YACTnd,EAAOmd,aAILnd,EAAOuc,QACTsB,GAAIvB,aAAavZ,KAAK+Z,MAAO9c,EAAOuc,W,6BAIjCta,EAAK8c,EAAaC,GACvB,GAAyB,IAArB3a,UAAUF,OACZ,OAAOpB,KAAKnC,QAAQqB,GAGtBc,KAAKnC,QAAQqB,GAAO,IAAI8c,EAAYhc,MAE/Bic,GACHjc,KAAKob,iBAAiBlc,K,mCAIbA,GACX,IAAMjC,EAAS+C,KAAKnC,QAAQqB,GACxBjC,EAAO8e,qBACL9e,EAAOuc,QACTsB,GAAIpB,aAAa1Z,KAAK+Z,MAAO9c,EAAOuc,QAGlCvc,EAAOif,SACTjf,EAAOif,kBAIJlc,KAAKnC,QAAQqB,K,2BAGjBA,EAAKwM,GACR,GAAyB,IAArBpK,UAAUF,OACZ,OAAOpB,KAAKga,MAAM9a,GAEpBc,KAAKga,MAAM9a,GAAOwM,I,iCAGTxM,GACLc,KAAKga,MAAM9a,IAAQc,KAAKga,MAAM9a,GAAKgd,SACrClc,KAAKga,MAAM9a,GAAKgd,iBAGXlc,KAAKga,MAAM9a,K,wDAMcwN,EAAW9N,GAAO,WAClD,OAAO,SAACud,GACN,EAAKC,oBAAoB1P,EAAW9N,EAApC,CAA2Cud,GAC3C,EAAK1Q,OAAO,iC,0CAIIiB,EAAW9N,GAAO,WACpC,OAAO,SAACud,GACNA,EAAME,iBACN,IAAMC,EAAUnc,IAAEgc,EAAMI,QACxB,EAAK9Q,OAAOiB,EAAW9N,GAAS0d,EAAQE,QAAQ,gBAAgBhc,KAAK,SAAU8b,M,+BAKjF,IAAM5P,EAAYlH,EAAMmI,KAAKrM,WACvB+L,EAAO7H,EAAMsI,KAAKtI,EAAMmJ,KAAKrN,YAE7Bmb,EAAS/P,EAAUC,MAAM,KACzB+P,EAAeD,EAAOrb,OAAS,EAC/Bub,EAAaD,GAAgBlX,EAAMmI,KAAK8O,GACxCG,EAAaF,EAAelX,EAAMqI,KAAK4O,GAAUjX,EAAMmI,KAAK8O,GAE5Dxf,EAAS+C,KAAKnC,QAAQ8e,GAAc,UAC1C,OAAKA,GAAc3c,KAAK4c,GACf5c,KAAK4c,GAAYxR,MAAMpL,KAAMqN,GAC3BpQ,GAAUA,EAAO2f,IAAe3f,EAAO8e,mBACzC9e,EAAO2f,GAAYxR,MAAMnO,EAAQoQ,QADnC,O,yMC7NX,SAASwP,GAAiBC,EAAWC,GACnC,IACIzK,EAGA0K,EAJA7E,EAAY2E,EAAUG,gBAGpBC,EAASnT,SAASoT,KAAKC,kBAEvBlM,EAAa1L,EAAMmJ,KAAKwJ,EAAUjH,YACxC,IAAKoB,EAAS,EAAGA,EAASpB,EAAW9P,OAAQkR,IAC3C,IAAIwI,GAAIhL,OAAOoB,EAAWoB,IAA1B,CAIA,GADA4K,EAAOG,kBAAkBnM,EAAWoB,IAChC4K,EAAOI,iBAAiB,eAAgBR,IAAc,EACxD,MAEFE,EAAgB9L,EAAWoB,GAG7B,GAAe,IAAXA,GAAgBwI,GAAIhL,OAAOoB,EAAWoB,EAAS,IAAK,CACtD,IAAMiL,EAAiBxT,SAASoT,KAAKC,kBACjCI,EAAc,KAClBD,EAAeF,kBAAkBL,GAAiB7E,GAClDoF,EAAeE,UAAUT,GACzBQ,EAAcR,EAAgBA,EAAcpL,YAAcuG,EAAUuF,WAEpE,IAAMC,EAAcb,EAAUc,YAC9BD,EAAYE,YAAY,eAAgBN,GAGxC,IAFA,IAAIO,EAAYH,EAAYpF,KAAKhE,QAAQ,UAAW,IAAInT,OAEjD0c,EAAYN,EAAYvM,UAAU7P,QAAUoc,EAAY5L,aAC7DkM,GAAaN,EAAYvM,UAAU7P,OACnCoc,EAAcA,EAAY5L,YAId4L,EAAYvM,UAEtB8L,GAAWS,EAAY5L,aAAekJ,GAAIhL,OAAO0N,EAAY5L,cAC/DkM,IAAcN,EAAYvM,UAAU7P,SACpC0c,GAAaN,EAAYvM,UAAU7P,OACnCoc,EAAcA,EAAY5L,aAG5BuG,EAAYqF,EACZlL,EAASwL,EAGX,MAAO,CACLC,KAAM5F,EACN7F,OAAQA,GASZ,SAAS0L,GAAiB3L,GACxB,IA0BMyK,EAAY/S,SAASoT,KAAKC,kBAC1Ba,EA3BgB,SAAhBC,EAAyB/F,EAAW7F,GACxC,IAAI5C,EAAMyO,EAEV,GAAIrD,GAAIhL,OAAOqI,GAAY,CACzB,IAAMiG,EAAgBtD,GAAI1D,SAASe,EAAWlL,EAAK/B,IAAI4P,GAAIhL,SACrDkN,EAAgBxX,EAAMqI,KAAKuQ,GAAexL,gBAChDlD,EAAOsN,GAAiB7E,EAAU7G,WAClCgB,GAAU9M,EAAMgJ,IAAIhJ,EAAMsI,KAAKsQ,GAAgBtD,GAAI9J,YACnDmN,GAAqBnB,MAChB,CAEL,GADAtN,EAAOyI,EAAUjH,WAAWoB,IAAW6F,EACnC2C,GAAIhL,OAAOJ,GACb,OAAOwO,EAAcxO,EAAM,GAG7B4C,EAAS,EACT6L,GAAoB,EAGtB,MAAO,CACLzO,KAAMA,EACN2O,gBAAiBF,EACjB7L,OAAQA,GAKC4L,CAAc7L,EAAM3C,KAAM2C,EAAMC,QAK7C,OAHAwK,EAAUO,kBAAkBY,EAAKvO,MACjCoN,EAAUW,SAASQ,EAAKI,iBACxBvB,EAAUwB,UAAU,YAAaL,EAAK3L,QAC/BwK,ECrGT3c,IAAEuJ,GAAG9H,OAAO,CAOVF,WAAY,WACV,IAAM6c,EAAOpe,IAAEoe,KAAK/Y,EAAMmI,KAAKrM,YACzBkd,EAA+B,WAATD,EACtBE,EAA0B,WAATF,EAEjBze,EAAUK,IAAEyB,OAAO,GAAIzB,IAAEuB,WAAW5B,QAAS2e,EAAiBjZ,EAAMmI,KAAKrM,WAAa,IAG5FxB,EAAQ4e,SAAWve,IAAEyB,QAAO,EAAM,GAAIzB,IAAEuB,WAAWC,KAAK,SAAUxB,IAAEuB,WAAWC,KAAK7B,EAAQ6B,OAC5F7B,EAAQ6e,MAAQxe,IAAEyB,QAAO,EAAM,GAAIzB,IAAEuB,WAAW5B,QAAQ6e,MAAO7e,EAAQ6e,OACvE7e,EAAQ8e,QAA8B,SAApB9e,EAAQ8e,SAAsB7N,EAAIlI,eAAiB/I,EAAQ8e,QAE7E5e,KAAKS,MAAK,SAAC0N,EAAK0Q,GACd,IAAM9E,EAAQ5Z,IAAE0e,GAChB,IAAK9E,EAAMvZ,KAAK,cAAe,CAC7B,IAAMsJ,EAAU,IAAIgQ,GAAQC,EAAOja,GACnCia,EAAMvZ,KAAK,aAAcsJ,GACzBiQ,EAAMvZ,KAAK,cAAc+a,aAAa,OAAQzR,EAAQmQ,gBAI1D,IAAMF,EAAQ/Z,KAAK8e,QACnB,GAAI/E,EAAM3Y,OAAQ,CAChB,IAAM0I,EAAUiQ,EAAMvZ,KAAK,cAC3B,GAAIge,EACF,OAAO1U,EAAQ2B,OAAOL,MAAMtB,EAAStE,EAAMmJ,KAAKrN,YACvCxB,EAAQif,OACjBjV,EAAQ2B,OAAO,gBAInB,OAAOzL,Q,ID2ELgf,G,WACJ,WAAYC,EAAIC,EAAIC,EAAIC,I,4FAAI,SAC1Bpf,KAAKif,GAAKA,EACVjf,KAAKkf,GAAKA,EACVlf,KAAKmf,GAAKA,EACVnf,KAAKof,GAAKA,EAGVpf,KAAKqf,aAAerf,KAAKsf,SAASxE,GAAIrL,YAEtCzP,KAAKuf,SAAWvf,KAAKsf,SAASxE,GAAItK,QAElCxQ,KAAKwf,WAAaxf,KAAKsf,SAASxE,GAAIlK,UAEpC5Q,KAAKyf,SAAWzf,KAAKsf,SAASxE,GAAInK,QAElC3Q,KAAK0f,SAAW1f,KAAKsf,SAASxE,GAAIzK,Q,6DAKlC,GAAIU,EAAIzG,kBAAmB,CACzB,IAAMqV,EAAW5V,SAASQ,cAI1B,OAHAoV,EAASC,SAAS5f,KAAKif,GAAIjf,KAAKkf,IAChCS,EAASE,OAAO7f,KAAKmf,GAAInf,KAAKof,IAEvBO,EAEP,IAAM7C,EAAYkB,GAAiB,CACjCtO,KAAM1P,KAAKif,GACX3M,OAAQtS,KAAKkf,KAQf,OALApC,EAAUe,YAAY,WAAYG,GAAiB,CACjDtO,KAAM1P,KAAKmf,GACX7M,OAAQtS,KAAKof,MAGRtC,I,kCAKT,MAAO,CACLmC,GAAIjf,KAAKif,GACTC,GAAIlf,KAAKkf,GACTC,GAAInf,KAAKmf,GACTC,GAAIpf,KAAKof,M,sCAKX,MAAO,CACL1P,KAAM1P,KAAKif,GACX3M,OAAQtS,KAAKkf,M,oCAKf,MAAO,CACLxP,KAAM1P,KAAKmf,GACX7M,OAAQtS,KAAKof,M,+BAQf,IAAMU,EAAY9f,KAAK+f,cACvB,GAAIhP,EAAIzG,kBAAmB,CACzB,IAAM0V,EAAYjW,SAASkW,eACvBD,EAAUE,WAAa,GACzBF,EAAUG,kBAEZH,EAAUI,SAASN,QAEnBA,EAAUnY,SAGZ,OAAO3H,O,qCAQMmY,GACb,IAAMjW,EAAS/B,IAAEgY,GAAWjW,SAK5B,OAJIiW,EAAU/L,UAAYlK,EAASlC,KAAKif,GAAGoB,YACzClI,EAAU/L,WAAakU,KAAKC,IAAIpI,EAAU/L,UAAYlK,EAASlC,KAAKif,GAAGoB,YAGlErgB,O,kCAaP,IAAMwgB,EAAkB,SAASnO,EAAOoO,GACtC,IAAKpO,EACH,OAAOA,EAUT,GAAIyI,GAAI1E,eAAe/D,MAChByI,GAAItI,YAAYH,IAChByI,GAAIvI,iBAAiBF,KAAWoO,GAChC3F,GAAI1I,gBAAgBC,IAAUoO,GAC9B3F,GAAIvI,iBAAiBF,IAAUoO,GAAiB3F,GAAI9K,OAAOqC,EAAM3C,KAAKkC,cACtEkJ,GAAI1I,gBAAgBC,KAAWoO,GAAiB3F,GAAI9K,OAAOqC,EAAM3C,KAAKkD,kBACtEkI,GAAI/F,QAAQ1C,EAAM3C,OAASoL,GAAIhM,QAAQuD,EAAM3C,OAChD,OAAO2C,EAKX,IAAMqO,EAAQ5F,GAAIzJ,SAASgB,EAAM3C,KAAMoL,GAAI/F,SACvC4L,GAAe,EAEnB,IAAKA,EAAc,CACjB,IAAM7N,EAAYgI,GAAIhI,UAAUT,IAAU,CAAE3C,KAAM,MAClDiR,GAAgB7F,GAAI5E,kBAAkB7D,EAAOqO,IAAU5F,GAAI9K,OAAO8C,EAAUpD,SAAW+Q,EAGzF,IAAIG,GAAc,EAClB,IAAKA,EAAa,CAChB,IAAM5N,EAAY8H,GAAI9H,UAAUX,IAAU,CAAE3C,KAAM,MAClDkR,GAAe9F,GAAI3E,mBAAmB9D,EAAOqO,IAAU5F,GAAI9K,OAAOgD,EAAUtD,QAAU+Q,EAGxF,GAAIE,GAAgBC,EAAa,CAE/B,GAAI9F,GAAI1E,eAAe/D,GACrB,OAAOA,EAGToO,GAAiBA,EAKnB,OAFkBA,EAAgB3F,GAAItE,eAAesE,GAAI9H,UAAUX,GAAQyI,GAAI1E,gBAC3E0E,GAAIvE,eAAeuE,GAAIhI,UAAUT,GAAQyI,GAAI1E,kBAC7B/D,GAGhB0E,EAAWyJ,EAAgBxgB,KAAK6gB,eAAe,GAC/C/J,EAAa9W,KAAK8gB,cAAgB/J,EAAWyJ,EAAgBxgB,KAAK+gB,iBAAiB,GAEzF,OAAO,IAAI/B,EACTlI,EAAWpH,KACXoH,EAAWxE,OACXyE,EAASrH,KACTqH,EAASzE,U,4BAaPjE,EAAMvO,GACVuO,EAAOA,GAAQpB,EAAKlC,GAEpB,IAAMiW,EAAkBlhB,GAAWA,EAAQkhB,gBACrCC,EAAgBnhB,GAAWA,EAAQmhB,cAGnCnK,EAAa9W,KAAK+gB,gBAClBhK,EAAW/W,KAAK6gB,cAEhBlP,EAAQ,GACRuP,EAAgB,GA0BtB,OAxBApG,GAAIjE,UAAUC,EAAYC,GAAU,SAAS1E,GAK3C,IAAI3C,EAJAoL,GAAIrL,WAAW4C,EAAM3C,QAKrBuR,GACEnG,GAAI1I,gBAAgBC,IACtB6O,EAAc/R,KAAKkD,EAAM3C,MAEvBoL,GAAIvI,iBAAiBF,IAAU7M,EAAMwI,SAASkT,EAAe7O,EAAM3C,QACrEA,EAAO2C,EAAM3C,OAGfA,EADSsR,EACFlG,GAAIzJ,SAASgB,EAAM3C,KAAMrB,GAEzBgE,EAAM3C,KAGXA,GAAQrB,EAAKqB,IACfiC,EAAMxC,KAAKO,OAEZ,GAEIlK,EAAM4J,OAAOuC,K,uCAQpB,OAAOmJ,GAAIrD,eAAezX,KAAKif,GAAIjf,KAAKmf,M,6BASnC9Q,GACL,IAAM8S,EAAgBrG,GAAIzJ,SAASrR,KAAKif,GAAI5Q,GACtC+S,EAActG,GAAIzJ,SAASrR,KAAKmf,GAAI9Q,GAE1C,IAAK8S,IAAkBC,EACrB,OAAO,IAAIpC,EAAahf,KAAKif,GAAIjf,KAAKkf,GAAIlf,KAAKmf,GAAInf,KAAKof,IAG1D,IAAMiC,EAAiBrhB,KAAKshB,YAY5B,OAVIH,IACFE,EAAepC,GAAKkC,EACpBE,EAAenC,GAAK,GAGlBkC,IACFC,EAAelC,GAAKiC,EACpBC,EAAejC,GAAKtE,GAAI9J,WAAWoQ,IAG9B,IAAIpC,EACTqC,EAAepC,GACfoC,EAAenC,GACfmC,EAAelC,GACfkC,EAAejC,M,+BAQVjB,GACP,OAAIA,EACK,IAAIa,EAAahf,KAAKif,GAAIjf,KAAKkf,GAAIlf,KAAKif,GAAIjf,KAAKkf,IAEjD,IAAIF,EAAahf,KAAKmf,GAAInf,KAAKof,GAAIpf,KAAKmf,GAAInf,KAAKof,M,kCAQ1D,IAAMmC,EAAkBvhB,KAAKif,KAAOjf,KAAKmf,GACnCkC,EAAiBrhB,KAAKshB,YAgB5B,OAdIxG,GAAIhL,OAAO9P,KAAKmf,MAAQrE,GAAItI,YAAYxS,KAAK6gB,gBAC/C7gB,KAAKmf,GAAGvL,UAAU5T,KAAKof,IAGrBtE,GAAIhL,OAAO9P,KAAKif,MAAQnE,GAAItI,YAAYxS,KAAK+gB,mBAC/CM,EAAepC,GAAKjf,KAAKif,GAAGrL,UAAU5T,KAAKkf,IAC3CmC,EAAenC,GAAK,EAEhBqC,IACFF,EAAelC,GAAKkC,EAAepC,GACnCoC,EAAejC,GAAKpf,KAAKof,GAAKpf,KAAKkf,KAIhC,IAAIF,EACTqC,EAAepC,GACfoC,EAAenC,GACfmC,EAAelC,GACfkC,EAAejC,M,uCASjB,GAAIpf,KAAK8gB,cACP,OAAO9gB,KAGT,IAAMwhB,EAAMxhB,KAAK4T,YACXjC,EAAQ6P,EAAI7P,MAAM,KAAM,CAC5BsP,eAAe,IAIX5O,EAAQyI,GAAIvE,eAAeiL,EAAIT,iBAAiB,SAAS1O,GAC7D,OAAQ7M,EAAMwI,SAAS2D,EAAOU,EAAM3C,SAGhC+R,EAAe,GAerB,OAdAthB,IAAEM,KAAKkR,GAAO,SAASxD,EAAKuB,GAE1B,IAAMqC,EAASrC,EAAK4B,WAChBe,EAAM3C,OAASqC,GAAqC,IAA3B+I,GAAI9J,WAAWe,IAC1C0P,EAAatS,KAAK4C,GAEpB+I,GAAInX,OAAO+L,GAAM,MAInBvP,IAAEM,KAAKghB,GAAc,SAAStT,EAAKuB,GACjCoL,GAAInX,OAAO+L,GAAM,MAGZ,IAAIsP,EACT3M,EAAM3C,KACN2C,EAAMC,OACND,EAAM3C,KACN2C,EAAMC,QACNoP,c,+BAMKrT,GACP,OAAO,WACL,IAAMgD,EAAWyJ,GAAIzJ,SAASrR,KAAKif,GAAI5Q,GACvC,QAASgD,GAAaA,IAAayJ,GAAIzJ,SAASrR,KAAKmf,GAAI9Q,M,mCAQhDA,GACX,IAAKyM,GAAI1I,gBAAgBpS,KAAK+gB,iBAC5B,OAAO,EAGT,IAAMrR,EAAOoL,GAAIzJ,SAASrR,KAAKif,GAAI5Q,GACnC,OAAOqB,GAAQoL,GAAIrI,aAAazS,KAAKif,GAAIvP,K,oCAOzC,OAAO1P,KAAKif,KAAOjf,KAAKmf,IAAMnf,KAAKkf,KAAOlf,KAAKof,K,+CAS/C,GAAItE,GAAIvK,gBAAgBvQ,KAAKif,KAAOnE,GAAIhM,QAAQ9O,KAAKif,IAEnD,OADAjf,KAAKif,GAAG9N,UAAY2J,GAAIpG,UACjB,IAAIsK,EAAahf,KAAKif,GAAGvB,WAAY,EAAG1d,KAAKif,GAAGvB,WAAY,GAQrE,IAMItF,EANEoJ,EAAMxhB,KAAK0hB,YACjB,GAAI5G,GAAI7F,aAAajV,KAAKif,KAAOnE,GAAI7K,OAAOjQ,KAAKif,IAC/C,OAAOuC,EAKT,GAAI1G,GAAIxK,SAASkR,EAAIvC,IAAK,CACxB,IAAMzN,EAAYsJ,GAAIvJ,aAAaiQ,EAAIvC,GAAIhS,EAAK/B,IAAI4P,GAAIxK,WACxD8H,EAAc5S,EAAMqI,KAAK2D,GACpBsJ,GAAIxK,SAAS8H,KAChBA,EAAc5G,EAAUA,EAAUpQ,OAAS,IAAMogB,EAAIvC,GAAG/N,WAAWsQ,EAAItC,UAGzE9G,EAAcoJ,EAAIvC,GAAG/N,WAAWsQ,EAAItC,GAAK,EAAIsC,EAAItC,GAAK,EAAI,GAG5D,GAAI9G,EAAa,CAEf,IAAIuJ,EAAiB7G,GAAI1D,SAASgB,EAAa0C,GAAI7F,cAAc6C,UAIjE,IAHA6J,EAAiBA,EAAeC,OAAO9G,GAAIpJ,SAAS0G,EAAYxG,YAAakJ,GAAI7F,gBAG9D7T,OAAQ,CACzB,IAAMygB,EAAO/G,GAAIpD,KAAKlS,EAAMmI,KAAKgU,GAAiB,KAClD7G,GAAI5I,iBAAiB2P,EAAMrc,EAAMsI,KAAK6T,KAI1C,OAAO3hB,KAAK0hB,c,iCASHhS,GACT,IAAI8R,EAAMxhB,MAEN8a,GAAIhL,OAAOJ,IAASoL,GAAIxK,SAASZ,MACnC8R,EAAMxhB,KAAK8hB,yBAAyBC,kBAGtC,IAAM9D,EAAOnD,GAAI7C,WAAWuJ,EAAIT,gBAAiBjG,GAAIxK,SAASZ,IAU9D,OATIuO,EAAK3H,WACP2H,EAAK3H,UAAUhF,WAAWU,aAAatC,EAAMuO,EAAK3H,WAC9CwE,GAAIhM,QAAQmP,EAAK3H,YAAcwE,GAAI7K,OAAOP,IAC5CuO,EAAK3H,UAAUhF,WAAW6C,YAAY8J,EAAK3H,YAG7C2H,EAAK9F,UAAUlG,YAAYvC,GAGtBA,I,gCAMC9P,GACRA,EAASO,IAAE8Y,KAAKrZ,GAEhB,IAAMoiB,EAAoB7hB,IAAE,eAAeE,KAAKT,GAAQ,GACpDsR,EAAa1L,EAAMmJ,KAAKqT,EAAkB9Q,YAGxCsQ,EAAMxhB,KACRiiB,GAAW,EAcf,OAZIT,EAAItC,IAAM,IACZhO,EAAaA,EAAW4G,UACxBmK,GAAW,GAGb/Q,EAAaA,EAAWtE,KAAI,SAASiH,GACnC,OAAO2N,EAAIU,WAAWrO,MAGpBoO,IACF/Q,EAAaA,EAAW4G,WAEnB5G,I,iCASP,IAAM4O,EAAY9f,KAAK+f,cACvB,OAAOhP,EAAIzG,kBAAoBwV,EAAUqC,WAAarC,EAAUvH,O,mCASrD6J,GACX,IAAIrL,EAAW/W,KAAK6gB,cAEpB,IAAK/F,GAAIrE,YAAYM,GACnB,OAAO/W,KAGT,IAAM8W,EAAagE,GAAIvE,eAAeQ,GAAU,SAAS1E,GACvD,OAAQyI,GAAIrE,YAAYpE,MAS1B,OANI+P,IACFrL,EAAW+D,GAAItE,eAAeO,GAAU,SAAS1E,GAC/C,OAAQyI,GAAIrE,YAAYpE,OAIrB,IAAI2M,EACTlI,EAAWpH,KACXoH,EAAWxE,OACXyE,EAASrH,KACTqH,EAASzE,U,oCAUC8P,GACZ,IAAIrL,EAAW/W,KAAK6gB,cAEhBwB,EAAiB,SAAShQ,GAC5B,OAAQyI,GAAIrE,YAAYpE,KAAWyI,GAAIlE,aAAavE,IAGtD,GAAIgQ,EAAetL,GACjB,OAAO/W,KAGT,IAAI8W,EAAagE,GAAIvE,eAAeQ,EAAUsL,GAM9C,OAJID,IACFrL,EAAW+D,GAAItE,eAAeO,EAAUsL,IAGnC,IAAIrD,EACTlI,EAAWpH,KACXoH,EAAWxE,OACXyE,EAASrH,KACTqH,EAASzE,U,yCAeMgQ,GACjB,IAAIvL,EAAW/W,KAAK6gB,cAEhB/J,EAAagE,GAAIvE,eAAeQ,GAAU,SAAS1E,GACrD,IAAKyI,GAAIrE,YAAYpE,KAAWyI,GAAIlE,aAAavE,GAC/C,OAAO,EAET,IAAImP,EAAM,IAAIxC,EACZ3M,EAAM3C,KACN2C,EAAMC,OACNyE,EAASrH,KACTqH,EAASzE,QAEPzD,EAASyT,EAAM5Z,KAAK8Y,EAAIW,YAC5B,OAAOtT,GAA2B,IAAjBA,EAAO0T,SAGtBf,EAAM,IAAIxC,EACZlI,EAAWpH,KACXoH,EAAWxE,OACXyE,EAASrH,KACTqH,EAASzE,QAGPiG,EAAOiJ,EAAIW,WACXtT,EAASyT,EAAM5Z,KAAK6P,GAExB,OAAI1J,GAAUA,EAAO,GAAGzN,SAAWmX,EAAKnX,OAC/BogB,EAEA,O,+BASF7F,GACP,MAAO,CACLjc,EAAG,CACD8iB,KAAM1H,GAAIjD,eAAe8D,EAAU3b,KAAKif,IACxC3M,OAAQtS,KAAKkf,IAEfuD,EAAG,CACDD,KAAM1H,GAAIjD,eAAe8D,EAAU3b,KAAKmf,IACxC7M,OAAQtS,KAAKof,O,mCAUNsD,GACX,MAAO,CACLhjB,EAAG,CACD8iB,KAAMhd,EAAMsI,KAAKgN,GAAIjD,eAAerS,EAAMmI,KAAK+U,GAAQ1iB,KAAKif,KAC5D3M,OAAQtS,KAAKkf,IAEfuD,EAAG,CACDD,KAAMhd,EAAMsI,KAAKgN,GAAIjD,eAAerS,EAAMqI,KAAK6U,GAAQ1iB,KAAKmf,KAC5D7M,OAAQtS,KAAKof,O,uCAWjB,OADkBpf,KAAK+f,cACN4C,sB,kCAWN,IAUb1jB,OAAQ,SAASggB,EAAIC,EAAIC,EAAIC,GAC3B,GAAyB,IAArB9d,UAAUF,OACZ,OAAO,IAAI4d,GAAaC,EAAIC,EAAIC,EAAIC,GAC/B,GAAyB,IAArB9d,UAAUF,OAGnB,OAAO,IAAI4d,GAAaC,EAAIC,EAF5BC,EAAKF,EACLG,EAAKF,GAGL,IAAI0D,EAAe5iB,KAAK6iB,sBAExB,IAAKD,GAAqC,IAArBthB,UAAUF,OAAc,CAC3C,IAAI0hB,EAAcxhB,UAAU,GAI5B,OAHIwZ,GAAIrL,WAAWqT,KACjBA,EAAcA,EAAYC,WAErB/iB,KAAKgjB,sBAAsBF,EAAahI,GAAIpG,YAAcpT,UAAU,GAAG6P,WAEhF,OAAOyR,GAIXI,sBAAuB,SAASF,GAAwC,IAA3B3E,EAA2B,wDAClEyE,EAAe5iB,KAAKijB,eAAeH,GACvC,OAAOF,EAAanF,SAASU,IAG/B0E,oBAAqB,WACnB,IAAI5D,EAAIC,EAAIC,EAAIC,EAChB,GAAIrO,EAAIzG,kBAAmB,CACzB,IAAM0V,EAAYjW,SAASkW,eAC3B,IAAKD,GAAsC,IAAzBA,EAAUE,WAC1B,OAAO,KACF,GAAIpF,GAAIjK,OAAOmP,EAAUkD,YAG9B,OAAO,KAGT,IAAMpD,EAAYE,EAAUmD,WAAW,GACvClE,EAAKa,EAAUsD,eACflE,EAAKY,EAAUuD,YACflE,EAAKW,EAAUwD,aACflE,EAAKU,EAAUyD,cACV,CACL,IAAMzG,EAAY/S,SAASiW,UAAUzV,cAC/BiZ,EAAe1G,EAAUc,YAC/B4F,EAAa/F,UAAS,GACtB,IAAMF,EAAiBT,EACvBS,EAAeE,UAAS,GAExB,IAAI3G,EAAa+F,GAAiBU,GAAgB,GAC9CxG,EAAW8F,GAAiB2G,GAAc,GAG1C1I,GAAIhL,OAAOgH,EAAWpH,OAASoL,GAAI1I,gBAAgB0E,IACrDgE,GAAI2I,WAAW1M,EAASrH,OAASoL,GAAIvI,iBAAiBwE,IACtDA,EAASrH,KAAKkC,cAAgBkF,EAAWpH,OACzCoH,EAAaC,GAGfkI,EAAKnI,EAAWiH,KAChBmB,EAAKpI,EAAWxE,OAChB6M,EAAKpI,EAASgH,KACdqB,EAAKrI,EAASzE,OAGhB,OAAO,IAAI0M,GAAaC,EAAIC,EAAIC,EAAIC,IAWtC6D,eAAgB,SAASvT,GACvB,IAAIuP,EAAKvP,EACLwP,EAAK,EACLC,EAAKzP,EACL0P,EAAKtE,GAAI9J,WAAWmO,GAexB,OAZIrE,GAAI9K,OAAOiP,KACbC,EAAKpE,GAAI1D,SAAS6H,GAAI7d,OAAS,EAC/B6d,EAAKA,EAAG3N,YAENwJ,GAAI3F,KAAKgK,IACXC,EAAKtE,GAAI1D,SAAS+H,GAAI/d,OAAS,EAC/B+d,EAAKA,EAAG7N,YACCwJ,GAAI9K,OAAOmP,KACpBC,EAAKtE,GAAI1D,SAAS+H,GAAI/d,OACtB+d,EAAKA,EAAG7N,YAGHtR,KAAKf,OAAOggB,EAAIC,EAAIC,EAAIC,IASjCsE,qBAAsB,SAAShU,GAC7B,OAAO1P,KAAKijB,eAAevT,GAAM+N,UAAS,IAS5CkG,oBAAqB,SAASjU,GAC5B,OAAO1P,KAAKijB,eAAevT,GAAM+N,YAYnCmG,mBAAoB,SAASjI,EAAUkI,GACrC,IAAM5E,EAAKnE,GAAI/C,eAAe4D,EAAUkI,EAASnkB,EAAE8iB,MAC7CtD,EAAK2E,EAASnkB,EAAE4S,OAChB6M,EAAKrE,GAAI/C,eAAe4D,EAAUkI,EAASpB,EAAED,MAC7CpD,EAAKyE,EAASpB,EAAEnQ,OACtB,OAAO,IAAI0M,GAAaC,EAAIC,EAAIC,EAAIC,IAYtC0E,uBAAwB,SAASD,EAAUnB,GACzC,IAAMxD,EAAK2E,EAASnkB,EAAE4S,OAChB8M,EAAKyE,EAASpB,EAAEnQ,OAChB2M,EAAKnE,GAAI/C,eAAevS,EAAMmI,KAAK+U,GAAQmB,EAASnkB,EAAE8iB,MACtDrD,EAAKrE,GAAI/C,eAAevS,EAAMqI,KAAK6U,GAAQmB,EAASpB,EAAED,MAE5D,OAAO,IAAIxD,GAAaC,EAAIC,EAAIC,EAAIC,KE15BlC2E,GAAU,CACd,UAAa,EACb,IAAO,EACP,MAAS,GACT,OAAU,GACV,MAAS,GACT,OAAU,GAGV,KAAQ,GACR,GAAM,GACN,MAAS,GACT,KAAQ,GAGR,KAAQ,GACR,KAAQ,GACR,KAAQ,GACR,KAAQ,GACR,KAAQ,GACR,KAAQ,GACR,KAAQ,GACR,KAAQ,GACR,KAAQ,GAGR,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GACL,EAAK,GAEL,MAAS,IACT,YAAe,IACf,UAAa,IACb,aAAgB,IAGhB,KAAQ,GACR,IAAO,GACP,OAAU,GACV,SAAY,IAWC,IAObC,OAAQ,SAACC,GACP,OAAOze,EAAMwI,SAAS,CACpB+V,GAAQG,UACRH,GAAQI,IACRJ,GAAQK,MACRL,GAAQM,MACRN,GAAQO,QACPL,IAQLM,OAAQ,SAACN,GACP,OAAOze,EAAMwI,SAAS,CACpB+V,GAAQS,KACRT,GAAQU,GACRV,GAAQW,MACRX,GAAQY,MACPV,IAQLW,aAAc,SAACX,GACb,OAAOze,EAAMwI,SAAS,CACpB+V,GAAQc,KACRd,GAAQe,IACRf,GAAQgB,OACRhB,GAAQiB,UACPf,IAMLgB,aAAchY,EAAKV,aAAawX,IAChClJ,KAAMkJ,I,2KC7GamB,G,WACnB,WAAYpb,I,4FAAS,SACnB9J,KAAKmlB,MAAQ,GACbnlB,KAAKolB,aAAe,EACpBplB,KAAK8J,QAAUA,EACf9J,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAK2b,SAAW3b,KAAKqlB,UAAU,G,8DAI/B,IAAM7D,EAAM8D,GAAMrmB,OAAOe,KAAK2b,UAG9B,MAAO,CACLvb,SAAUJ,KAAKqlB,UAAUhlB,OACzBwjB,SAAYrC,GAAOA,EAAInC,eAAkBmC,EAAIqC,SAAS7jB,KAAK2b,UAJvC,CAAEjc,EAAG,CAAE8iB,KAAM,GAAIlQ,OAAQ,GAAKmQ,EAAG,CAAED,KAAM,GAAIlQ,OAAQ,O,oCAQ/DiT,GACc,OAAtBA,EAASnlB,UACXJ,KAAKqlB,UAAUhlB,KAAKklB,EAASnlB,UAEL,OAAtBmlB,EAAS1B,UACXyB,GAAM1B,mBAAmB5jB,KAAK2b,SAAU4J,EAAS1B,UAAUlc,W,+BAWzD3H,KAAKqlB,UAAUhlB,SAAWL,KAAKmlB,MAAMnlB,KAAKolB,aAAahlB,UACzDJ,KAAKwlB,aAIPxlB,KAAKolB,YAAc,EAGnBplB,KAAKylB,cAAczlB,KAAKmlB,MAAMnlB,KAAKolB,gB,+BASnCplB,KAAKmlB,MAAQ,GAGbnlB,KAAKolB,aAAe,EAGpBplB,KAAKwlB,e,8BASLxlB,KAAKmlB,MAAQ,GAGbnlB,KAAKolB,aAAe,EAGpBplB,KAAKqlB,UAAUhlB,KAAK,IAGpBL,KAAKwlB,e,6BAQDxlB,KAAKqlB,UAAUhlB,SAAWL,KAAKmlB,MAAMnlB,KAAKolB,aAAahlB,UACzDJ,KAAKwlB,aAGHxlB,KAAKolB,YAAc,IACrBplB,KAAKolB,cACLplB,KAAKylB,cAAczlB,KAAKmlB,MAAMnlB,KAAKolB,iB,6BAQjCplB,KAAKmlB,MAAM/jB,OAAS,EAAIpB,KAAKolB,cAC/BplB,KAAKolB,cACLplB,KAAKylB,cAAczlB,KAAKmlB,MAAMnlB,KAAKolB,iB,mCAQrCplB,KAAKolB,cAGDplB,KAAKmlB,MAAM/jB,OAASpB,KAAKolB,cAC3BplB,KAAKmlB,MAAQnlB,KAAKmlB,MAAMpX,MAAM,EAAG/N,KAAKolB,cAIxCplB,KAAKmlB,MAAMhW,KAAKnP,KAAK0lB,gBAGjB1lB,KAAKmlB,MAAM/jB,OAASpB,KAAK8J,QAAQhK,QAAQ6lB,eAC3C3lB,KAAKmlB,MAAMS,QACX5lB,KAAKolB,aAAe,Q,6MCrHLS,G,uLAcTC,EAAMC,GACd,GAAIhV,EAAItH,cAAgB,IAAK,CAC3B,IAAMoF,EAAS,GAIf,OAHA1O,IAAEM,KAAKslB,GAAe,SAAC5X,EAAK6X,GAC1BnX,EAAOmX,GAAgBF,EAAKG,IAAID,MAE3BnX,EAET,OAAOiX,EAAKG,IAAIF,K,+BAST7lB,GACP,IACMgmB,EAAYlmB,KAAKmmB,UAAUjmB,EADd,CAAC,cAAe,YAAa,aAAc,kBAAmB,iBAC1B,GAEjDkmB,EAAWlmB,EAAM,GAAG6E,MAAMqhB,UAAYF,EAAU,aAKtD,OAHAA,EAAU,aAAeG,SAASD,EAAU,IAC5CF,EAAU,kBAAoBE,EAASvN,MAAM,YAEtCqN,I,gCASC1E,EAAK0E,GACb/lB,IAAEM,KAAK+gB,EAAI7P,MAAMmJ,GAAI7K,OAAQ,CAC3B+Q,iBAAiB,KACf,SAAC7S,EAAK0T,GACR1hB,IAAE0hB,GAAMoE,IAAIC,Q,iCAcL1E,EAAK1hB,GACd0hB,EAAMA,EAAI5N,YAEV,IAAM/D,EAAY/P,GAAWA,EAAQ+P,UAAa,OAC5CyW,KAA0BxmB,IAAWA,EAAQwmB,sBAC7CC,KAAyBzmB,IAAWA,EAAQymB,qBAElD,GAAI/E,EAAIV,cACN,MAAO,CAACU,EAAIU,WAAWpH,GAAI7b,OAAO4Q,KAGpC,IAAIxB,EAAOyM,GAAIlL,mBAAmBC,GAC5B8B,EAAQ6P,EAAI7P,MAAMmJ,GAAIhL,OAAQ,CAClCmR,eAAe,IACdrU,KAAI,SAAC2L,GACN,OAAOuC,GAAI7D,oBAAoBsB,EAAMlK,IAASyM,GAAIpD,KAAKa,EAAM1I,MAG/D,GAAIyW,EAAsB,CACxB,GAAIC,EAAqB,CACvB,IAAMC,EAAehF,EAAI7P,QAEzBtD,EAAOpB,EAAK5B,IAAIgD,GAAM,SAACqB,GACrB,OAAOlK,EAAMwI,SAASwY,EAAc9W,MAIxC,OAAOiC,EAAM/E,KAAI,SAAC8C,GAChB,IAAMuG,EAAW6E,GAAI9E,oBAAoBtG,EAAMrB,GACzCV,EAAOnI,EAAMmI,KAAKsI,GAClBwQ,EAAQjhB,EAAMsI,KAAKmI,GAKzB,OAJA9V,IAAEM,KAAKgmB,GAAO,SAACtY,EAAKuY,GAClB5L,GAAI5I,iBAAiBvE,EAAM+Y,EAAKxV,YAChC4J,GAAInX,OAAO+iB,MAENlhB,EAAMmI,KAAKsI,MAGpB,OAAOtE,I,8BAUH6P,GACN,IAAMmF,EAAQxmB,IAAG2a,GAAIlG,UAAU4M,EAAIvC,IAA0BuC,EAAIvC,GAAxBuC,EAAIvC,GAAG3N,YAC5C4U,EAAYlmB,KAAK4mB,SAASD,GAI9B,IACET,EAAY/lB,IAAEyB,OAAOskB,EAAW,CAC9B,YAAanc,SAAS8c,kBAAkB,QAAU,OAAS,SAC3D,cAAe9c,SAAS8c,kBAAkB,UAAY,SAAW,SACjE,iBAAkB9c,SAAS8c,kBAAkB,aAAe,YAAc,SAC1E,iBAAkB9c,SAAS8c,kBAAkB,aAAe,YAAc,SAC1E,mBAAoB9c,SAAS8c,kBAAkB,eAAiB,cAAgB,SAChF,qBAAsB9c,SAAS8c,kBAAkB,iBAAmB,gBAAkB,SACtF,cAAe9c,SAAS+c,kBAAkB,aAAeZ,EAAU,iBAErE,MAAOzD,IAKT,GAAKjB,EAAIjC,WAEF,CACL,IACMwH,EADe,CAAC,SAAU,OAAQ,oBAAqB,UAC5B5d,QAAQ+c,EAAU,qBAAuB,EAC1EA,EAAU,cAAgBa,EAAc,YAAc,eAJtDb,EAAU,cAAgB,OAO5B,IAAMrE,EAAO/G,GAAIzJ,SAASmQ,EAAIvC,GAAInE,GAAI7K,QACtC,GAAI4R,GAAQA,EAAK9c,MAAM,eACrBmhB,EAAU,eAAiBrE,EAAK9c,MAAMiiB,eACjC,CACL,IAAMA,EAAaX,SAASH,EAAU,eAAgB,IAAMG,SAASH,EAAU,aAAc,IAC7FA,EAAU,eAAiBc,EAAWC,QAAQ,GAOhD,OAJAf,EAAUgB,OAAS1F,EAAIhC,cAAgB1E,GAAIzJ,SAASmQ,EAAIvC,GAAInE,GAAIlK,UAChEsV,EAAU1U,UAAYsJ,GAAIvJ,aAAaiQ,EAAIvC,GAAInE,GAAIrL,YACnDyW,EAAUZ,MAAQ9D,EAEX0E,O,6MC5JUiB,G,+LAIDxL,GAChB3b,KAAKonB,WAAW,KAAMzL,K,0CAMJA,GAClB3b,KAAKonB,WAAW,KAAMzL,K,6BAMjBA,GAAU,WACT6F,EAAM8D,GAAMrmB,OAAO0c,GAAUmG,yBAE7BY,EAAQlB,EAAI7P,MAAMmJ,GAAI7K,OAAQ,CAAE+Q,iBAAiB,IACjDqG,EAAa7hB,EAAMuJ,UAAU2T,EAAOzV,EAAKpC,KAAK,eAEpD1K,IAAEM,KAAK4mB,GAAY,SAAClZ,EAAKuU,GACvB,IAAM/U,EAAOnI,EAAMmI,KAAK+U,GACxB,GAAI5H,GAAI3K,KAAKxC,GAAO,CAClB,IAAM2Z,EAAe,EAAKC,SAAS5Z,EAAKiF,iBACpC0U,EACF5E,EACG9V,KAAI,SAAAiV,GAAI,OAAIyF,EAAarV,YAAY4P,OAExC,EAAK2F,SAAS9E,EAAO/U,EAAK2D,WAAWzB,UACrC6S,EACG9V,KAAI,SAACiV,GAAD,OAAUA,EAAKvQ,cACnB1E,KAAI,SAACiV,GAAD,OAAU,EAAK4F,iBAAiB5F,YAGzC1hB,IAAEM,KAAKiiB,GAAO,SAACvU,EAAK0T,GAClB1hB,IAAE0hB,GAAMoE,IAAI,cAAc,SAAC9X,EAAKmG,GAC9B,OAAQ+R,SAAS/R,EAAK,KAAO,GAAK,YAM1CkN,EAAI7Z,W,8BAMEgU,GAAU,WACV6F,EAAM8D,GAAMrmB,OAAO0c,GAAUmG,yBAE7BY,EAAQlB,EAAI7P,MAAMmJ,GAAI7K,OAAQ,CAAE+Q,iBAAiB,IACjDqG,EAAa7hB,EAAMuJ,UAAU2T,EAAOzV,EAAKpC,KAAK,eAEpD1K,IAAEM,KAAK4mB,GAAY,SAAClZ,EAAKuU,GACvB,IAAM/U,EAAOnI,EAAMmI,KAAK+U,GACpB5H,GAAI3K,KAAKxC,GACX,EAAK+Z,YAAY,CAAChF,IAElBviB,IAAEM,KAAKiiB,GAAO,SAACvU,EAAK0T,GAClB1hB,IAAE0hB,GAAMoE,IAAI,cAAc,SAAC9X,EAAKmG,GAE9B,OADAA,EAAO+R,SAAS/R,EAAK,KAAO,GACf,GAAKA,EAAM,GAAK,YAMrCkN,EAAI7Z,W,iCAQKggB,EAAUhM,GAAU,WACvB6F,EAAM8D,GAAMrmB,OAAO0c,GAAUmG,yBAE/BY,EAAQlB,EAAI7P,MAAMmJ,GAAI7K,OAAQ,CAAE+Q,iBAAiB,IAC/C6C,EAAWrC,EAAIoG,aAAalF,GAC5B2E,EAAa7hB,EAAMuJ,UAAU2T,EAAOzV,EAAKpC,KAAK,eAGpD,GAAIrF,EAAMxE,KAAK0hB,EAAO5H,GAAIjG,YAAa,CACrC,IAAIgT,EAAe,GACnB1nB,IAAEM,KAAK4mB,GAAY,SAAClZ,EAAKuU,GACvBmF,EAAeA,EAAajG,OAAO,EAAK4F,SAAS9E,EAAOiF,OAE1DjF,EAAQmF,MAEH,CACL,IAAMC,EAAYtG,EAAI7P,MAAMmJ,GAAItK,OAAQ,CACtCwQ,iBAAiB,IAChB7J,QAAO,SAAC4Q,GACT,OAAQ5nB,IAAE0P,SAASkY,EAAUJ,MAG3BG,EAAU1mB,OACZjB,IAAEM,KAAKqnB,GAAW,SAAC3Z,EAAK4Z,GACtBjN,GAAIvG,QAAQwT,EAAUJ,MAGxBjF,EAAQ1iB,KAAK0nB,YAAYL,GAAY,GAIzC/B,GAAMxB,uBAAuBD,EAAUnB,GAAO/a,W,+BAQvC+a,EAAOiF,GACd,IAAMha,EAAOnI,EAAMmI,KAAK+U,GAClB7U,EAAOrI,EAAMqI,KAAK6U,GAElBsF,EAAWlN,GAAItK,OAAO7C,EAAKiF,kBAAoBjF,EAAKiF,gBACpDqV,EAAWnN,GAAItK,OAAO3C,EAAK+D,cAAgB/D,EAAK+D,YAEhDmW,EAAWC,GAAYlN,GAAIjJ,YAAYiJ,GAAI7b,OAAO0oB,GAAY,MAAO9Z,GAe3E,OAZA6U,EAAQA,EAAM9V,KAAI,SAACiV,GACjB,OAAO/G,GAAIjG,WAAWgN,GAAQ/G,GAAIvG,QAAQsN,EAAM,MAAQA,KAI1D/G,GAAI5I,iBAAiB6V,EAAUrF,GAE3BuF,IACFnN,GAAI5I,iBAAiB6V,EAAUviB,EAAMmJ,KAAKsZ,EAAS/W,aACnD4J,GAAInX,OAAOskB,IAGNvF,I,kCAUG2E,EAAYa,GAAiB,WACnCC,EAAgB,GA+EpB,OA7EAhoB,IAAEM,KAAK4mB,GAAY,SAAClZ,EAAKuU,GACvB,IAAM/U,EAAOnI,EAAMmI,KAAK+U,GAClB7U,EAAOrI,EAAMqI,KAAK6U,GAElB0F,EAAWF,EAAkBpN,GAAI5D,aAAavJ,EAAMmN,GAAItK,QAAU7C,EAAK2D,WACvE+W,EAAaD,EAAS9W,WAE5B,GAAqC,OAAjC8W,EAAS9W,WAAWzB,SACtB6S,EAAM9V,KAAI,SAAAiV,GACR,IAAMyG,EAAU,EAAKC,iBAAiB1G,GAElCwG,EAAWzW,YACbyW,EAAW/W,WAAWU,aACpB6P,EACAwG,EAAWzW,aAGbyW,EAAW/W,WAAWW,YAAY4P,GAGhCyG,EAAQlnB,SACV,EAAKomB,SAASc,EAASF,EAASvY,UAChCgS,EAAK5P,YAAYqW,EAAQ,GAAGhX,gBAIC,IAA7B8W,EAASvoB,SAASuB,QACpBinB,EAAWlU,YAAYiU,GAGY,IAAjCC,EAAWnX,WAAW9P,QACxBinB,EAAW/W,WAAW6C,YAAYkU,OAE/B,CACL,IAAMG,EAAWJ,EAASlX,WAAW9P,OAAS,EAAI0Z,GAAI9G,UAAUoU,EAAU,CACxE1Y,KAAM7B,EAAKyD,WACXgB,OAAQwI,GAAIpI,SAAS7E,GAAQ,GAC5B,CACD4F,wBAAwB,IACrB,KAECgV,EAAa3N,GAAI9G,UAAUoU,EAAU,CACzC1Y,KAAM/B,EAAK2D,WACXgB,OAAQwI,GAAIpI,SAAS/E,IACpB,CACD8F,wBAAwB,IAG1BiP,EAAQwF,EAAkBpN,GAAIzD,eAAeoR,EAAY3N,GAAI3K,MACzD3K,EAAMmJ,KAAK8Z,EAAWvX,YAAYiG,OAAO2D,GAAI3K,OAG7C+X,GAAoBpN,GAAItK,OAAO4X,EAAS9W,cAC1CoR,EAAQA,EAAM9V,KAAI,SAACiV,GACjB,OAAO/G,GAAIvG,QAAQsN,EAAM,SAI7B1hB,IAAEM,KAAK+E,EAAMmJ,KAAK+T,GAAO5K,WAAW,SAAC3J,EAAK0T,GACxC/G,GAAIjJ,YAAYgQ,EAAMuG,MAIxB,IAAMM,EAAYljB,EAAMyJ,QAAQ,CAACmZ,EAAUK,EAAYD,IACvDroB,IAAEM,KAAKioB,GAAW,SAACva,EAAKwa,GACtB,IAAMC,EAAY,CAACD,GAAU/G,OAAO9G,GAAIzD,eAAesR,EAAU7N,GAAItK,SACrErQ,IAAEM,KAAKmoB,EAAU9Q,WAAW,SAAC3J,EAAK4Z,GAC3BjN,GAAI9J,WAAW+W,IAClBjN,GAAInX,OAAOokB,GAAU,SAM7BI,EAAgBA,EAAcvG,OAAOc,MAGhCyF,I,uCAYQzY,GACf,OAAOA,EAAKkD,gBACRkI,GAAI5I,iBAAiBxC,EAAKkD,gBAAiB,CAAClD,IAC5C1P,KAAKwnB,SAAS,CAAC9X,GAAO,Q,+BAWnBA,GACP,OAAOA,EACHlK,EAAMxE,KAAK0O,EAAK7P,UAAU,SAAAqB,GAAK,MAAI,CAAC,KAAM,MAAMiI,QAAQjI,EAAM2O,WAAa,KAC3E,O,uCAWWH,GAEf,IADA,IAAMuG,EAAW,GACVvG,EAAKkC,aACVqE,EAAS9G,KAAKO,EAAKkC,aACnBlC,EAAOA,EAAKkC,YAEd,OAAOqE,O,6MChRU4S,G,WACnB,WAAY/e,I,4FAAS,SAEnB9J,KAAK8oB,OAAS,IAAI3B,GAClBnnB,KAAKF,QAAUgK,EAAQhK,Q,yDASf0hB,EAAKuH,GACb,IAAMC,EAAMlO,GAAIxC,WAAW,IAAI/W,MAAMwnB,EAAU,GAAGhc,KAAK+N,GAAIxL,aAC3DkS,EAAMA,EAAIO,kBACNG,WAAW8G,GAAK,IAEpBxH,EAAM8D,GAAMrmB,OAAO+pB,EAAKD,IACpBphB,W,sCAcUgU,EAAU6F,GAOxBA,GAHAA,GAHAA,EAAMA,GAAO8D,GAAMrmB,OAAO0c,IAGhBoG,kBAGAD,yBAGV,IAEImH,EAFE/Q,EAAY4C,GAAIzJ,SAASmQ,EAAIvC,GAAInE,GAAI7K,QAI3C,GAAIiI,EAAW,CAEb,GAAI4C,GAAI3K,KAAK+H,KAAe4C,GAAIhM,QAAQoJ,IAAc4C,GAAIpF,oBAAoBwC,IAG5E,YADAlY,KAAK8oB,OAAO1B,WAAWlP,EAAU5G,WAAWzB,UAG5C,IAAI7K,EAAa,KAOjB,GAN6C,IAAzChF,KAAKF,QAAQopB,wBACflkB,EAAa8V,GAAIzJ,SAAS6G,EAAW4C,GAAIpK,cACS,IAAzC1Q,KAAKF,QAAQopB,0BACtBlkB,EAAa8V,GAAI5D,aAAagB,EAAW4C,GAAIpK,eAG3C1L,EAAY,CAEdikB,EAAW9oB,IAAE2a,GAAIpG,WAAW,GAGxBoG,GAAIvI,iBAAiBiP,EAAIT,kBAAoBjG,GAAI3F,KAAKqM,EAAIvC,GAAGrN,cAC/DzR,IAAEqhB,EAAIvC,GAAGrN,aAAajO,SAExB,IAAMgJ,EAAQmO,GAAI9G,UAAUhP,EAAYwc,EAAIT,gBAAiB,CAAEpN,sBAAsB,IACjFhH,EACFA,EAAM2E,WAAWU,aAAaiX,EAAUtc,GAExCmO,GAAIjJ,YAAYoX,EAAUjkB,OAEvB,CACLikB,EAAWnO,GAAI9G,UAAUkE,EAAWsJ,EAAIT,iBAGxC,IAAIoI,EAAerO,GAAIzD,eAAea,EAAW4C,GAAIlF,eACrDuT,EAAeA,EAAavH,OAAO9G,GAAIzD,eAAe4R,EAAUnO,GAAIlF,gBAEpEzV,IAAEM,KAAK0oB,GAAc,SAAChb,EAAK+Y,GACzBpM,GAAInX,OAAOujB,OAIRpM,GAAIhG,UAAUmU,IAAanO,GAAI5K,MAAM+Y,IAAanO,GAAIlB,iBAAiBqP,KAAcnO,GAAIhM,QAAQma,KACpGA,EAAWnO,GAAIvG,QAAQ0U,EAAU,WAKlC,CACL,IAAM7a,EAAOoT,EAAIvC,GAAG/N,WAAWsQ,EAAItC,IACnC+J,EAAW9oB,IAAE2a,GAAIpG,WAAW,GACxBtG,EACFoT,EAAIvC,GAAGjN,aAAaiX,EAAU7a,GAE9BoT,EAAIvC,GAAGhN,YAAYgX,GAIvB3D,GAAMrmB,OAAOgqB,EAAU,GAAGvH,YAAY/Z,SAASyhB,eAAezN,Q,yMCtGlE,IAAM0N,GAAoB,SAApBA,EAA6BvS,EAAYwS,EAAOniB,EAAQoiB,GAC5D,IAAMC,EAAc,CAAE,OAAU,EAAG,OAAU,GACvCC,EAAgB,GAChBC,EAAkB,GA+BxB,SAASC,EAAwBC,EAAUC,EAAWC,EAASC,EAAUC,EAAWC,EAAWC,GAC7F,IAAMC,EAAc,CAClB,QAAWL,EACX,SAAYC,EACZ,UAAaC,EACb,UAAaC,EACb,UAAaC,GAEVT,EAAcG,KACjBH,EAAcG,GAAY,IAE5BH,EAAcG,GAAUC,GAAaM,EASvC,SAASC,EAAcC,EAAqBC,EAAcC,EAAoBC,GAC5E,MAAO,CACL,SAAYH,EAAoBN,SAChC,OAAUO,EACV,aAAgB,CACd,SAAYC,EACZ,UAAaC,IAWnB,SAASC,EAAiBb,EAAUC,GAClC,IAAKJ,EAAcG,GACjB,OAAOC,EAET,IAAKJ,EAAcG,GAAUC,GAC3B,OAAOA,EAIT,IADA,IAAIa,EAAeb,EACZJ,EAAcG,GAAUc,IAE7B,GADAA,KACKjB,EAAcG,GAAUc,GAC3B,OAAOA,EAWb,SAASC,EAAqBC,EAAKC,GACjC,IAAMhB,EAAYY,EAAiBG,EAAIhB,SAAUiB,EAAKhB,WAChDiB,EAAkBD,EAAKE,QAAU,EACjCC,EAAkBH,EAAKI,QAAU,EACjCC,EAAsBN,EAAIhB,WAAaJ,EAAY2B,QAAUN,EAAKhB,YAAcL,EAAY4B,OAClGzB,EAAwBiB,EAAIhB,SAAUC,EAAWe,EAAKC,EAAMG,EAAgBF,GAAgB,GAG5F,IAAMO,EAAgBR,EAAKS,WAAWL,QAAU5E,SAASwE,EAAKS,WAAWL,QAAQrsB,MAAO,IAAM,EAC9F,GAAIysB,EAAgB,EAClB,IAAK,IAAIE,EAAK,EAAGA,EAAKF,EAAeE,IAAM,CACzC,IAAMC,EAAeZ,EAAIhB,SAAW2B,EACpCE,EAAiBD,EAAc3B,EAAWgB,EAAMK,GAChDvB,EAAwB6B,EAAc3B,EAAWe,EAAKC,GAAM,EAAMC,GAAgB,GAKtF,IAAMY,EAAgBb,EAAKS,WAAWP,QAAU1E,SAASwE,EAAKS,WAAWP,QAAQnsB,MAAO,IAAM,EAC9F,GAAI8sB,EAAgB,EAClB,IAAK,IAAIC,EAAK,EAAGA,EAAKD,EAAeC,IAAM,CACzC,IAAMC,EAAgBnB,EAAiBG,EAAIhB,SAAWC,EAAY8B,GAClEF,EAAiBb,EAAIhB,SAAUgC,EAAef,EAAMK,GACpDvB,EAAwBiB,EAAIhB,SAAUgC,EAAehB,EAAKC,EAAMG,GAAgB,GAAM,IAa5F,SAASS,EAAiB7B,EAAUC,EAAWgB,EAAMgB,GAC/CjC,IAAaJ,EAAY2B,QAAU3B,EAAY4B,QAAUP,EAAKhB,WAAagB,EAAKhB,WAAaA,IAAcgC,GAC7GrC,EAAY4B,SAsBhB,SAASU,EAA4BjB,GACnC,OAAQvB,GACN,KAAKD,EAAkBC,MAAMyC,OAC3B,GAAIlB,EAAKZ,UACP,OAAOZ,EAAkBiB,aAAa0B,kBAExC,MACF,KAAK3C,EAAkBC,MAAM2C,IAC3B,IAAKpB,EAAKqB,WAAarB,EAAKb,UAC1B,OAAOX,EAAkBiB,aAAa6B,QACjC,GAAItB,EAAKb,UACd,OAAOX,EAAkBiB,aAAa0B,kBAI5C,OAAO3C,EAAkBiB,aAAa8B,WAQxC,SAASC,EAAyBxB,GAChC,OAAQvB,GACN,KAAKD,EAAkBC,MAAMyC,OAC3B,GAAIlB,EAAKZ,UACP,OAAOZ,EAAkBiB,aAAagC,aACjC,GAAIzB,EAAKb,WAAaa,EAAKqB,UAChC,OAAO7C,EAAkBiB,aAAaiC,OAExC,MACF,KAAKlD,EAAkBC,MAAM2C,IAC3B,GAAIpB,EAAKb,UACP,OAAOX,EAAkBiB,aAAagC,aACjC,GAAIzB,EAAKZ,WAAaY,EAAKqB,UAChC,OAAO7C,EAAkBiB,aAAaiC,OAI5C,OAAOlD,EAAkBiB,aAAa6B,QAexCnsB,KAAKwsB,cAAgB,WAMnB,IALA,IAAMC,EAAYnD,IAAUD,EAAkBC,MAAM2C,IAAOzC,EAAY2B,QAAU,EAC3EuB,EAAYpD,IAAUD,EAAkBC,MAAMyC,OAAUvC,EAAY4B,QAAU,EAEhFuB,EAAiB,EACjBC,GAAc,EACXA,GAAa,CAClB,IAAMC,EAAeJ,GAAY,EAAKA,EAAWE,EAC3CG,EAAeJ,GAAY,EAAKA,EAAWC,EAC3C/B,EAAMnB,EAAcoD,GAC1B,IAAKjC,EAEH,OADAgC,GAAc,EACPlD,EAET,IAAMmB,EAAOD,EAAIkC,GACjB,IAAKjC,EAEH,OADA+B,GAAc,EACPlD,EAIT,IAAIY,EAAejB,EAAkBiB,aAAaiC,OAClD,OAAQplB,GACN,KAAKkiB,EAAkB0D,cAAcC,IACnC1C,EAAe+B,EAAyBxB,GACxC,MACF,KAAKxB,EAAkB0D,cAAcE,OACnC3C,EAAewB,EAA4BjB,GAG/CnB,EAAgBva,KAAKib,EAAcS,EAAMP,EAAcuC,EAAaC,IACpEH,IAGF,OAAOjD,GAtOF5S,GAAeA,EAAWoW,UAAiD,OAArCpW,EAAWoW,QAAQ/kB,eAA+D,OAArC2O,EAAWoW,QAAQ/kB,iBAI3GqhB,EAAY4B,OAAStU,EAAW+S,UAC3B/S,EAAWmG,eAAkBnG,EAAWmG,cAAciQ,SAA8D,OAAnDpW,EAAWmG,cAAciQ,QAAQ/kB,gBAIvGqhB,EAAY2B,OAASrU,EAAWmG,cAAc2M,WAqHhD,WAEE,IADA,IAAMuD,EAAO5D,EAAS4D,KACbvD,EAAW,EAAGA,EAAWuD,EAAK/rB,OAAQwoB,IAE7C,IADA,IAAMwD,EAAQD,EAAKvD,GAAUwD,MACpBvD,EAAY,EAAGA,EAAYuD,EAAMhsB,OAAQyoB,IAChDc,EAAqBwC,EAAKvD,GAAWwD,EAAMvD,IAuD/CwD,IAqDJhE,GAAkBC,MAAQ,CAAE,IAAO,EAAG,OAAU,GAKhDD,GAAkB0D,cAAgB,CAAE,IAAO,EAAG,OAAU,GAKxD1D,GAAkBiB,aAAe,CAAE,OAAU,EAAG,kBAAqB,EAAG,WAAc,EAAG,QAAW,EAAG,aAAgB,G,IASlGgD,G,iLAOf9L,EAAK+L,GACP,IAAM1C,EAAO/P,GAAIzJ,SAASmQ,EAAI/J,iBAAkBqD,GAAInK,QAC9CrM,EAAQwW,GAAIzJ,SAASwZ,EAAM/P,GAAI1K,SAC/Bgd,EAAQtS,GAAIzD,eAAe/S,EAAOwW,GAAInK,QAEtC6c,EAAWhoB,EAAM+nB,EAAU,OAAS,QAAQH,EAAOvC,GACrD2C,GACFlI,GAAMrmB,OAAOuuB,EAAU,GAAG7lB,W,6BAWvB6Z,EAAK9O,GAWV,IAVA,IAAMmY,EAAO/P,GAAIzJ,SAASmQ,EAAI/J,iBAAkBqD,GAAInK,QAE9C8c,EAAYttB,IAAE0qB,GAAMrO,QAAQ,MAC5BkR,EAAe1tB,KAAK2tB,kBAAkBF,GACtCptB,EAAOF,IAAE,MAAQutB,EAAe,UAIhCE,EAFS,IAAIvE,GAAkBwB,EAAMxB,GAAkBC,MAAM2C,IACjE5C,GAAkB0D,cAAcC,IAAK7sB,IAAEstB,GAAWjR,QAAQ,SAAS,IAC9CgQ,gBAEdqB,EAAS,EAAGA,EAASD,EAAQxsB,OAAQysB,IAAU,CACtD,IAAMC,EAAcF,EAAQC,GACtBE,EAAe/tB,KAAK2tB,kBAAkBG,EAAY/D,UACxD,OAAQ+D,EAAY3mB,QAClB,KAAKkiB,GAAkBiB,aAAa6B,QAClC9rB,EAAKgB,OAAO,MAAQ0sB,EAAe,IAAMjT,GAAIrG,MAAQ,SACrD,MACF,KAAK4U,GAAkBiB,aAAagC,aAEhC,GAAiB,QAAb5Z,IACiBob,EAAY/D,SAAShY,OACI+b,EAAY/D,SAASvN,QAAQ,MAAMoN,SAAvC,IAAoD6D,EAAU,GAAG7D,SACnF,CACpB,IAAMoE,EAAQ7tB,IAAE,eAAekB,OAAOlB,IAAE,MAAQ4tB,EAAe,IAAMjT,GAAIrG,MAAQ,SAASwZ,WAAW,YAAY5tB,OACjHA,EAAKgB,OAAO2sB,GACZ,MAGJ,IAAI3C,EAAgBhF,SAASyH,EAAY/D,SAASkB,QAAS,IAC3DI,IACAyC,EAAY/D,SAASmE,aAAa,UAAW7C,IAMrD,GAAiB,QAAb3Y,EACF+a,EAAUU,OAAO9tB,OACZ,CAEL,GADwBwqB,EAAKI,QAAU,EACnB,CAClB,IAAMmD,EAAcX,EAAU,GAAG7D,UAAYiB,EAAKI,QAAU,GAE5D,YADA9qB,IAAEA,IAAEstB,GAAW1b,SAAS/Q,KAAK,MAAMotB,IAAcC,MAAMluB,IAAEE,IAG3DotB,EAAUY,MAAMhuB,M,6BAWbmhB,EAAK9O,GACV,IAAMmY,EAAO/P,GAAIzJ,SAASmQ,EAAI/J,iBAAkBqD,GAAInK,QAC9Cia,EAAMzqB,IAAE0qB,GAAMrO,QAAQ,MACVrc,IAAEyqB,GAAK3U,WACf9G,KAAKyb,GAMf,IAJA,IAEMgD,EAFS,IAAIvE,GAAkBwB,EAAMxB,GAAkBC,MAAMyC,OACjE1C,GAAkB0D,cAAcC,IAAK7sB,IAAEyqB,GAAKpO,QAAQ,SAAS,IACxCgQ,gBAEd8B,EAAc,EAAGA,EAAcV,EAAQxsB,OAAQktB,IAAe,CACrE,IAAMR,EAAcF,EAAQU,GACtBP,EAAe/tB,KAAK2tB,kBAAkBG,EAAY/D,UACxD,OAAQ+D,EAAY3mB,QAClB,KAAKkiB,GAAkBiB,aAAa6B,QACjB,UAAbzZ,EACFvS,IAAE2tB,EAAY/D,UAAUsE,MAAM,MAAQN,EAAe,IAAMjT,GAAIrG,MAAQ,SAEvEtU,IAAE2tB,EAAY/D,UAAUoE,OAAO,MAAQJ,EAAe,IAAMjT,GAAIrG,MAAQ,SAE1E,MACF,KAAK4U,GAAkBiB,aAAagC,aAClC,GAAiB,UAAb5Z,EAAsB,CACxB,IAAIgZ,EAAgBrF,SAASyH,EAAY/D,SAASgB,QAAS,IAC3DW,IACAoC,EAAY/D,SAASmE,aAAa,UAAWxC,QAE7CvrB,IAAE2tB,EAAY/D,UAAUoE,OAAO,MAAQJ,EAAe,IAAMjT,GAAIrG,MAAQ,a,wCAahEhD,GAChB,IAAI8c,EAAY,GAEhB,IAAK9c,EACH,OAAO8c,EAKT,IAFA,IAAMC,EAAW/c,EAAG6Z,YAAc,GAEzBhuB,EAAI,EAAGA,EAAIkxB,EAASptB,OAAQ9D,IACI,OAAnCkxB,EAASlxB,GAAGY,KAAKiK,eAIjBqmB,EAASlxB,GAAGmxB,YACdF,GAAa,IAAMC,EAASlxB,GAAGY,KAAO,KAAQswB,EAASlxB,GAAGsB,MAAQ,KAItE,OAAO2vB,I,gCASC/M,GAUR,IATA,IAAMqJ,EAAO/P,GAAIzJ,SAASmQ,EAAI/J,iBAAkBqD,GAAInK,QAC9Cia,EAAMzqB,IAAE0qB,GAAMrO,QAAQ,MACtBkS,EAAU9D,EAAI/qB,SAAS,UAAU0iB,MAAMpiB,IAAE0qB,IACzCM,EAASP,EAAI,GAAGhB,SAIhBgE,EAFS,IAAIvE,GAAkBwB,EAAMxB,GAAkBC,MAAM2C,IACjE5C,GAAkB0D,cAAcE,OAAQ9sB,IAAEyqB,GAAKpO,QAAQ,SAAS,IAC3CgQ,gBAEd8B,EAAc,EAAGA,EAAcV,EAAQxsB,OAAQktB,IACtD,GAAKV,EAAQU,GAAb,CAIA,IAAMvE,EAAW6D,EAAQU,GAAavE,SAChC4E,EAAkBf,EAAQU,GAAaM,aACvCC,EAAc9E,EAASkB,SAAWlB,EAASkB,QAAU,EACvDI,EAAiBwD,EAAcxI,SAAS0D,EAASkB,QAAS,IAAM,EACpE,OAAQ2C,EAAQU,GAAannB,QAC3B,KAAKkiB,GAAkBiB,aAAaiC,OAClC,SACF,KAAKlD,GAAkBiB,aAAa6B,QAEhC,IAAM2C,EAAUlE,EAAIxc,KAAK,MAAM,GAC/B,IAAK0gB,EAAW,SAChB,IAAMC,EAAWnE,EAAI,GAAGwC,MAAMsB,GAC1BG,IACExD,EAAgB,GAClBA,IACAyD,EAAQ9c,aAAa+c,EAAUD,EAAQ1B,MAAMsB,IAC7CI,EAAQ1B,MAAMsB,GAASR,aAAa,UAAW7C,GAC/CyD,EAAQ1B,MAAMsB,GAASvd,UAAY,IACR,IAAlBka,IACTyD,EAAQ9c,aAAa+c,EAAUD,EAAQ1B,MAAMsB,IAC7CI,EAAQ1B,MAAMsB,GAASM,gBAAgB,WACvCF,EAAQ1B,MAAMsB,GAASvd,UAAY,KAIzC,SACF,KAAKkY,GAAkBiB,aAAa0B,kBAC9B6C,IACExD,EAAgB,GAClBA,IACAtB,EAASmE,aAAa,UAAW7C,GAC7BsD,EAAgB/E,WAAauB,GAAUpB,EAASF,YAAc6E,IAAW3E,EAAS5Y,UAAY,KACvE,IAAlBka,IACTtB,EAASiF,gBAAgB,WACrBL,EAAgB/E,WAAauB,GAAUpB,EAASF,YAAc6E,IAAW3E,EAAS5Y,UAAY,MAGtG,SACF,KAAKkY,GAAkBiB,aAAa8B,WAElC,UAGNxB,EAAIjnB,W,gCASI6d,GASR,IARA,IAAMqJ,EAAO/P,GAAIzJ,SAASmQ,EAAI/J,iBAAkBqD,GAAInK,QAC9Cia,EAAMzqB,IAAE0qB,GAAMrO,QAAQ,MACtBkS,EAAU9D,EAAI/qB,SAAS,UAAU0iB,MAAMpiB,IAAE0qB,IAIzC+C,EAFS,IAAIvE,GAAkBwB,EAAMxB,GAAkBC,MAAMyC,OACjE1C,GAAkB0D,cAAcE,OAAQ9sB,IAAEyqB,GAAKpO,QAAQ,SAAS,IAC3CgQ,gBAEd8B,EAAc,EAAGA,EAAcV,EAAQxsB,OAAQktB,IACtD,GAAKV,EAAQU,GAGb,OAAQV,EAAQU,GAAannB,QAC3B,KAAKkiB,GAAkBiB,aAAaiC,OAClC,SACF,KAAKlD,GAAkBiB,aAAa0B,kBAEhC,IAAMjC,EAAW6D,EAAQU,GAAavE,SAEtC,GADoBA,EAASgB,SAAWhB,EAASgB,QAAU,EAC3C,CACd,IAAIW,EAAiB3B,EAASgB,QAAW1E,SAAS0D,EAASgB,QAAS,IAAM,EACtEW,EAAgB,GAClBA,IACA3B,EAASmE,aAAa,UAAWxC,GAC7B3B,EAASF,YAAc6E,IAAW3E,EAAS5Y,UAAY,KAChC,IAAlBua,IACT3B,EAASiF,gBAAgB,WACrBjF,EAASF,YAAc6E,IAAW3E,EAAS5Y,UAAY,KAIjE,SACF,KAAKkY,GAAkBiB,aAAa8B,WAClCtR,GAAInX,OAAOiqB,EAAQU,GAAavE,UAAU,GAC1C,Y,kCAYIkF,EAAUC,EAAUpvB,GAG9B,IAFA,IACIqvB,EADEC,EAAM,GAEHC,EAAS,EAAGA,EAASJ,EAAUI,IACtCD,EAAIjgB,KAAK,OAAS2L,GAAIrG,MAAQ,SAEhC0a,EAASC,EAAIriB,KAAK,IAIlB,IAFA,IACIuiB,EADEC,EAAM,GAEHC,EAAS,EAAGA,EAASN,EAAUM,IACtCD,EAAIpgB,KAAK,OAASggB,EAAS,SAE7BG,EAASC,EAAIxiB,KAAK,IAClB,IAAM0iB,EAAStvB,IAAE,UAAYmvB,EAAS,YAKtC,OAJIxvB,GAAWA,EAAQ4vB,gBACrBD,EAAOlvB,SAAST,EAAQ4vB,gBAGnBD,EAAO,K,kCASJjO,GACV,IAAMqJ,EAAO/P,GAAIzJ,SAASmQ,EAAI/J,iBAAkBqD,GAAInK,QACpDxQ,IAAE0qB,GAAMrO,QAAQ,SAAS7Y,c,yMCnjB7B,IAKqBgsB,G,WACnB,WAAY7lB,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAK+Z,MAAQjQ,EAAQmQ,WAAW4E,KAChC7e,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,SAEzB1e,KAAK2b,SAAW3b,KAAKqlB,UAAU,GAC/BrlB,KAAK6vB,UAAY,KACjB7vB,KAAKulB,SAAW,KAEhBvlB,KAAK+E,MAAQ,IAAI8gB,GACjB7lB,KAAKsE,MAAQ,IAAIgpB,GACjBttB,KAAK8vB,OAAS,IAAIjH,GAAO/e,GACzB9J,KAAK8oB,OAAS,IAAI3B,GAClBnnB,KAAKuH,QAAU,IAAI2d,GAAQpb,GAE3B9J,KAAK8J,QAAQ4E,KAAK,cAAe1O,KAAK2B,KAAKgE,KAAKoqB,QAChD/vB,KAAK8J,QAAQ4E,KAAK,YAAa1O,KAAK2B,KAAKgE,KAAK6B,MAC9CxH,KAAK8J,QAAQ4E,KAAK,YAAa1O,KAAK2B,KAAKgE,KAAK8B,MAC9CzH,KAAK8J,QAAQ4E,KAAK,WAAY1O,KAAK2B,KAAKgE,KAAKqjB,KAC7ChpB,KAAK8J,QAAQ4E,KAAK,aAAc1O,KAAK2B,KAAKgE,KAAKqqB,OAC/ChwB,KAAK8J,QAAQ4E,KAAK,uBAAwB1O,KAAK2B,KAAKgE,KAAKsqB,iBACzDjwB,KAAK8J,QAAQ4E,KAAK,yBAA0B1O,KAAK2B,KAAKgE,KAAKuqB,mBAC3DlwB,KAAK8J,QAAQ4E,KAAK,2BAA4B1O,KAAK2B,KAAKgE,KAAKwqB,qBAC7DnwB,KAAK8J,QAAQ4E,KAAK,cAAe1O,KAAK2B,KAAKgE,KAAKK,QAChDhG,KAAK8J,QAAQ4E,KAAK,eAAgB1O,KAAK2B,KAAKgE,KAAKI,SACjD/F,KAAK8J,QAAQ4E,KAAK,kBAAmB1O,KAAK2B,KAAKgE,KAAKyqB,YACpDpwB,KAAK8J,QAAQ4E,KAAK,4BAA6B1O,KAAK2B,KAAKgE,KAAK0qB,sBAC9DrwB,KAAK8J,QAAQ4E,KAAK,gBAAiB1O,KAAK2B,KAAKgE,KAAKsC,UASlD,IANA,IAAMqoB,EAAW,CACf,OAAQ,SAAU,YAAa,gBAAiB,cAAe,YAC/D,cAAe,gBAAiB,eAAgB,cAChD,cAAe,eAAgB,aAGxBniB,EAAM,EAAGG,EAAMgiB,EAASlvB,OAAQ+M,EAAMG,EAAKH,IAClDnO,KAAKswB,EAASniB,IAAS,SAACoiB,GACtB,OAAO,SAAC3xB,GACN,EAAK4xB,gBACLzmB,SAAS0mB,YAAYF,GAAM,EAAO3xB,GAClC,EAAK8xB,cAAa,IAJC,CAMpBJ,EAASniB,IACZnO,KAAK8J,QAAQ4E,KAAK,QAAU4hB,EAASniB,GAAMnO,KAAK2B,KAAKgE,KAAK2qB,EAASniB,KAGrEnO,KAAKiI,SAAWjI,KAAK2wB,aAAY,SAAC/xB,GAChC,OAAO,EAAKgyB,YAAY,cAAe7f,EAAI/I,cAAcpJ,OAG3DoB,KAAKomB,SAAWpmB,KAAK2wB,aAAY,SAAC/xB,GAChC,IAAMiyB,EAAO,EAAKC,eAAe,kBACjC,OAAO,EAAKF,YAAY,YAAahyB,EAAQiyB,MAG/C7wB,KAAK+wB,aAAe/wB,KAAK2wB,aAAY,SAAC/xB,GACpC,IAAM0D,EAAO,EAAKwuB,eAAe,aACjC,OAAO,EAAKF,YAAY,YAAatuB,EAAO1D,MAG9C,IAAK,IAAIuP,EAAM,EAAGA,GAAO,EAAGA,IAC1BnO,KAAK,UAAYmO,GAAQ,SAACA,GACxB,OAAO,WACL,EAAK6iB,YAAY,IAAM7iB,IAFF,CAItBA,GACHnO,KAAK8J,QAAQ4E,KAAK,eAAiBP,EAAKnO,KAAK2B,KAAKgE,KAAK,UAAYwI,IAGrEnO,KAAKiwB,gBAAkBjwB,KAAK2wB,aAAY,WACtC,EAAKb,OAAOG,gBAAgB,EAAKtU,aAGnC3b,KAAKkwB,kBAAoBlwB,KAAK2wB,aAAY,WACxC,EAAK7H,OAAOoH,kBAAkB,EAAKvU,aAGrC3b,KAAKmwB,oBAAsBnwB,KAAK2wB,aAAY,WAC1C,EAAK7H,OAAOqH,oBAAoB,EAAKxU,aAGvC3b,KAAKgG,OAAShG,KAAK2wB,aAAY,WAC7B,EAAK7H,OAAO9iB,OAAO,EAAK2V,aAG1B3b,KAAK+F,QAAU/F,KAAK2wB,aAAY,WAC9B,EAAK7H,OAAO/iB,QAAQ,EAAK4V,aAQ3B3b,KAAKkiB,WAAaliB,KAAK2wB,aAAY,SAACjhB,GAC9B,EAAKuhB,UAAU9wB,IAAEuP,GAAM6I,OAAOnX,UAGtB,EAAK8vB,eACbhP,WAAWxS,GACf,EAAKyhB,aAAa7L,GAAM3B,oBAAoBjU,GAAM/H,cAOpD3H,KAAKoxB,WAAapxB,KAAK2wB,aAAY,SAACpY,GAClC,IAAI,EAAK0Y,UAAU1Y,EAAKnX,QAAxB,CAGA,IACMiwB,EADM,EAAKH,eACIhP,WAAWpH,GAAIxC,WAAWC,IAC/C,EAAK4Y,aAAa7L,GAAMrmB,OAAOoyB,EAAUvW,GAAI9J,WAAWqgB,IAAW1pB,cAOrE3H,KAAKsxB,UAAYtxB,KAAK2wB,aAAY,SAAC/wB,GACjC,IAAI,EAAKqxB,UAAUrxB,EAAOwB,QAA1B,CAGAxB,EAAS,EAAKkK,QAAQ2B,OAAO,kBAAmB7L,GAChD,IAAMQ,EAAW,EAAK8wB,eAAeI,UAAU1xB,GAC/C,EAAKuxB,aAAa7L,GAAM3B,oBAAoBne,EAAMqI,KAAKzN,IAAWuH,cAQpE3H,KAAKgxB,YAAchxB,KAAK2wB,aAAY,SAACzD,EAAS5Q,GAC5C,IAAMiV,EAAqB,EAAKzxB,QAAQ+b,UAAU0V,mBAC9CA,EACFA,EAAmBzzB,KAAK,EAAMwe,EAAS,EAAKxS,QAAS,EAAK0nB,eAE1D,EAAKA,cAActE,EAAS5Q,MAOhCtc,KAAKqwB,qBAAuBrwB,KAAK2wB,aAAY,WAC3C,IAAMc,EAAS,EAAKP,eAAehP,WAAWpH,GAAI7b,OAAO,OACrDwyB,EAAO7f,aACT,EAAKuf,aAAa7L,GAAMrmB,OAAOwyB,EAAO7f,YAAa,GAAG8P,YAAY/Z,aAQtE3H,KAAKgnB,WAAahnB,KAAK2wB,aAAY,SAAC/xB,GAClC,EAAKmG,MAAM2sB,UAAU,EAAKR,eAAgB,CACxClK,WAAYpoB,OAShBoB,KAAK2xB,WAAa3xB,KAAK2wB,aAAY,SAACiB,GAClC,IAAIC,EAAUD,EAASluB,IACjBouB,EAAWF,EAASrZ,KACpBwZ,EAAcH,EAASG,YACvBC,EAAgBJ,EAASI,cAC3BxQ,EAAMoQ,EAAStM,OAAS,EAAK4L,eAC3Be,EAAuBH,EAAS1wB,OAASogB,EAAIW,WAAW/gB,OAC9D,KAAI6wB,EAAuB,GAAK,EAAKhB,UAAUgB,IAA/C,CAGA,IAAMC,EAAgB1Q,EAAIW,aAAe2P,EAGlB,iBAAZD,IACTA,EAAUA,EAAQ5Y,QAGhB,EAAKnZ,QAAQqyB,aACfN,EAAU,EAAK/xB,QAAQqyB,aAAaN,GAC3BG,IAETH,EAAU,oCAAoCrpB,KAAKqpB,GAC/CA,EAAU,EAAK/xB,QAAQsyB,gBAAkBP,GAG/C,IAAIQ,EAAU,GACd,GAAIH,EAAe,CAEjB,IAAMhL,GADN1F,EAAMA,EAAIO,kBACSG,WAAW/hB,IAAE,MAAQ2xB,EAAW,QAAQ,IAC3DO,EAAQljB,KAAK+X,QAEbmL,EAAU,EAAKttB,MAAMutB,WAAW9Q,EAAK,CACnC3R,SAAU,IACVyW,sBAAsB,EACtBC,qBAAqB,IAIzBpmB,IAAEM,KAAK4xB,GAAS,SAAClkB,EAAK+Y,GACpB/mB,IAAE+mB,GAAQtmB,KAAK,OAAQixB,GACnBE,EACF5xB,IAAE+mB,GAAQtmB,KAAK,SAAU,UAEzBT,IAAE+mB,GAAQ+G,WAAW,aAIzB,EAAKkD,aACH,EAAKoB,oBAAoBF,GAAS1qB,cAWtC3H,KAAKqG,MAAQrG,KAAK2wB,aAAY,SAAC6B,GAC7B,IAAMC,EAAYD,EAAUC,UACtBC,EAAYF,EAAUE,UAExBD,GAAa1oB,SAAS0mB,YAAY,aAAa,EAAOgC,GACtDC,GAAa3oB,SAAS0mB,YAAY,aAAa,EAAOiC,MAQ5D1yB,KAAKyyB,UAAYzyB,KAAK2wB,aAAY,SAAC6B,GACjCzoB,SAAS0mB,YAAY,aAAa,EAAO+B,MAQ3CxyB,KAAK2yB,YAAc3yB,KAAK2wB,aAAY,SAACiC,GACnC,IAAMC,EAAYD,EAAIjmB,MAAM,KAEhB,EAAKukB,eAAenP,iBAC5BG,WAAW,EAAK5d,MAAMwuB,YAAYD,EAAU,GAAIA,EAAU,GAAI,EAAK/yB,aAMzEE,KAAK+yB,YAAc/yB,KAAK2wB,aAAY,WAClC,IAAIrU,EAAUnc,IAAE,EAAK6yB,iBAAiBjhB,SAClCuK,EAAQE,QAAQ,UAAUpb,OAC5Bkb,EAAQE,QAAQ,UAAU7Y,SAE1B2Y,EAAUnc,IAAE,EAAK6yB,iBAAiBC,SAEpC,EAAKnpB,QAAQyR,aAAa,eAAgBe,EAAS,EAAK+I,cAQ1DrlB,KAAKkzB,QAAUlzB,KAAK2wB,aAAY,SAAC/xB,GAC/B,IAAM0d,EAAUnc,IAAE,EAAK6yB,iBACvB1W,EAAQ6W,YAAY,kBAA6B,SAAVv0B,GACvC0d,EAAQ6W,YAAY,mBAA8B,UAAVv0B,GACxC0d,EAAQ2J,IAAI,QAAoB,SAAVrnB,EAAmB,GAAKA,MAOhDoB,KAAKozB,OAASpzB,KAAK2wB,aAAY,SAAC/xB,GAC9B,IAAM0d,EAAUnc,IAAE,EAAK6yB,iBAET,KADdp0B,EAAQ+J,WAAW/J,IAEjB0d,EAAQ2J,IAAI,QAAS,IAErB3J,EAAQ2J,IAAI,CACV5b,MAAe,IAARzL,EAAc,IACrBsD,OAAQ,Q,4DAMH,WAEXlC,KAAKqlB,UAAUvkB,GAAG,WAAW,SAACqb,GAgB5B,GAfIA,EAAM8H,UAAY/kB,GAAI2b,KAAKuJ,OAC7B,EAAKta,QAAQyR,aAAa,QAASY,GAErC,EAAKrS,QAAQyR,aAAa,UAAWY,GAGrC,EAAKoJ,SAAW,EAAKhe,QAAQme,eAC7B,EAAK2N,gBAAiB,EACjBlX,EAAMmX,uBACL,EAAKxzB,QAAQkH,UACf,EAAKqsB,eAAiB,EAAKE,aAAapX,GAExC,EAAKqX,gCAAgCrX,IAGrC,EAAK8U,UAAU,EAAG9U,GAAQ,CAC5B,IAAM0T,EAAY,EAAKqB,eACvB,GAAIrB,EAAUzQ,GAAKyQ,EAAU3Q,IAAO,EAClC,OAAO,EAGX,EAAKiS,eAGD,EAAKrxB,QAAQ2zB,uBACa,IAAxB,EAAKJ,gBACP,EAAK9rB,QAAQie,gBAGhB1kB,GAAG,SAAS,SAACqb,GACd,EAAKgV,eACL,EAAKrnB,QAAQyR,aAAa,QAASY,MAClCrb,GAAG,SAAS,SAACqb,GACd,EAAKgV,eACL,EAAKrnB,QAAQyR,aAAa,QAASY,MAClCrb,GAAG,QAAQ,SAACqb,GACb,EAAKrS,QAAQyR,aAAa,OAAQY,MACjCrb,GAAG,aAAa,SAACqb,GAClB,EAAKrS,QAAQyR,aAAa,YAAaY,MACtCrb,GAAG,WAAW,SAACqb,GAChB,EAAKgV,eACL,EAAK5pB,QAAQie,aACb,EAAK1b,QAAQyR,aAAa,UAAWY,MACpCrb,GAAG,UAAU,SAACqb,GACf,EAAKrS,QAAQyR,aAAa,SAAUY,MACnCrb,GAAG,SAAS,SAACqb,GACd,EAAKgV,eACL,EAAKrnB,QAAQyR,aAAa,QAASY,MAClCrb,GAAG,SAAS,WAET,EAAKmwB,UAAU,IAAM,EAAK1L,UAC5B,EAAKhe,QAAQke,cAAc,EAAKF,aAIpCvlB,KAAKqlB,UAAUzkB,KAAK,aAAcZ,KAAKF,QAAQ4zB,YAE/C1zB,KAAKqlB,UAAUzkB,KAAK,cAAeZ,KAAKF,QAAQ4zB,YAE5C1zB,KAAKF,QAAQ6zB,gBACf3zB,KAAKqlB,UAAUzkB,KAAK,cAAc,GAIpCZ,KAAKqlB,UAAUhlB,KAAKya,GAAIza,KAAKL,KAAK+Z,QAAUe,GAAIpG,WAEhD1U,KAAKqlB,UAAUvkB,GAAGiQ,EAAI/H,eAAgBiE,EAAKD,UAAS,WAClD,EAAKlD,QAAQyR,aAAa,SAAU,EAAK8J,UAAUhlB,OAAQ,EAAKglB,aAC/D,KAEHrlB,KAAKqlB,UAAUvkB,GAAG,WAAW,SAACqb,GAC5B,EAAKrS,QAAQyR,aAAa,UAAWY,MACpCrb,GAAG,YAAY,SAACqb,GACjB,EAAKrS,QAAQyR,aAAa,WAAYY,MAGpCnc,KAAKF,QAAQ8zB,QACX5zB,KAAKF,QAAQ+zB,qBACf7zB,KAAK4vB,QAAQ9uB,GAAG,eAAe,SAACqb,GAE9B,OADA,EAAKrS,QAAQyR,aAAa,cAAeY,IAClC,MAIPnc,KAAKF,QAAQuK,OACfrK,KAAK4vB,QAAQkE,WAAW9zB,KAAKF,QAAQuK,OAEnCrK,KAAKF,QAAQoC,QACflC,KAAKqlB,UAAU/L,YAAYtZ,KAAKF,QAAQoC,QAEtClC,KAAKF,QAAQi0B,WACf/zB,KAAKqlB,UAAUY,IAAI,aAAcjmB,KAAKF,QAAQi0B,WAE5C/zB,KAAKF,QAAQk0B,WACfh0B,KAAKqlB,UAAUY,IAAI,aAAcjmB,KAAKF,QAAQk0B,YAIlDh0B,KAAKuH,QAAQie,aACbxlB,KAAKmxB,iB,gCAILnxB,KAAKqlB,UAAU1L,Q,mCAGJwC,GACX,IAAM8X,EAASj0B,KAAKF,QAAQm0B,OAAOljB,EAAI9H,MAAQ,MAAQ,MACjDwQ,EAAO,GAET0C,EAAM+X,SAAWza,EAAKtK,KAAK,OAC3BgN,EAAMgY,UAAYhY,EAAMiY,QAAU3a,EAAKtK,KAAK,QAC5CgN,EAAMkY,UAAY5a,EAAKtK,KAAK,SAEhC,IAAMmlB,EAAUp1B,GAAI+lB,aAAa9I,EAAM8H,SACnCqQ,GACF7a,EAAKtK,KAAKmlB,GAGZ,IAAMC,EAAYN,EAAOxa,EAAK1M,KAAK,MAEnC,GAAgB,QAAZunB,GAAsBt0B,KAAKF,QAAQ00B,WAEhC,GAAID,GACT,IAAuC,IAAnCv0B,KAAK8J,QAAQ2B,OAAO8oB,GAGtB,OAFApY,EAAME,kBAEC,OAEAnd,GAAI8kB,OAAO7H,EAAM8H,UAC1BjkB,KAAK0wB,oBARL1wB,KAAK0wB,eAUP,OAAO,I,sDAGuBvU,IAEzBA,EAAMgY,SAAWhY,EAAM+X,UAC1B1uB,EAAMwI,SAAS,CAAC,GAAI,GAAI,IAAKmO,EAAM8H,UACnC9H,EAAME,mB,gCAIAoY,EAAKtY,GAGb,OAFAsY,EAAMA,GAAO,QAEQ,IAAVtY,KACLjd,GAAIqlB,OAAOpI,EAAM8H,UACjB/kB,GAAI0lB,aAAazI,EAAM8H,UACtB9H,EAAMgY,SAAWhY,EAAM+X,SACxB1uB,EAAMwI,SAAS,CAAC9O,GAAI2b,KAAKqJ,UAAWhlB,GAAI2b,KAAKyJ,QAASnI,EAAM8H,YAK9DjkB,KAAKF,QAAQ40B,cAAgB,GAC1B10B,KAAKqlB,UAAU9M,OAAOnX,OAASqzB,EAAOz0B,KAAKF,QAAQ40B,gB,oCAc1D,OAFA10B,KAAK+e,QACL/e,KAAKmxB,eACEnxB,KAAKkxB,iB,0CASMyD,GAClB,IACM7d,EADawO,GAAM5B,qBAAqBle,EAAMmI,KAAKgnB,IAC3B5T,gBAExBhK,EADWuO,GAAM3B,oBAAoBne,EAAMqI,KAAK8mB,IAC5B9T,cAE1B,OAAOyE,GAAMrmB,OACX6X,EAAWpH,KACXoH,EAAWxE,OACXyE,EAASrH,KACTqH,EAASzE,U,mCAYAkP,GACPA,EACFxhB,KAAK6vB,UAAYrO,GAEjBxhB,KAAK6vB,UAAYvK,GAAMrmB,OAAOe,KAAK2b,UAE2B,IAA1Dxb,IAAEH,KAAK6vB,UAAU5Q,IAAIzC,QAAQ,kBAAkBpb,SACjDpB,KAAK6vB,UAAYvK,GAAMtC,sBAAsBhjB,KAAK2b,c,qCAiBtD,OAHK3b,KAAK6vB,WACR7vB,KAAKmxB,eAEAnxB,KAAK6vB,Y,gCAUJ+E,GACJA,GACF50B,KAAKkxB,eAAezT,WAAW9V,W,qCAU7B3H,KAAK6vB,YACP7vB,KAAK6vB,UAAUloB,SACf3H,KAAK+e,W,iCAIErP,GACT1P,KAAKqlB,UAAU7kB,KAAK,SAAUkP,K,oCAI9B1P,KAAKqlB,UAAU5K,WAAW,Y,sCAI1B,OAAOza,KAAKqlB,UAAU7kB,KAAK,Y,qCAU3B,IAAIghB,EAAM8D,GAAMrmB,SAIhB,OAHIuiB,IACFA,EAAMA,EAAIE,aAELF,EAAMxhB,KAAK+E,MAAMyS,QAAQgK,GAAOxhB,KAAK+E,MAAM6hB,SAAS5mB,KAAKqlB,a,oCASpDnlB,GACZ,OAAOF,KAAK+E,MAAM6hB,SAAS1mB,K,6BAO3BF,KAAK8J,QAAQyR,aAAa,iBAAkBvb,KAAKqlB,UAAUhlB,QAC3DL,KAAKuH,QAAQC,OACbxH,KAAK8J,QAAQyR,aAAa,SAAUvb,KAAKqlB,UAAUhlB,OAAQL,KAAKqlB,a,+BAOhErlB,KAAK8J,QAAQyR,aAAa,iBAAkBvb,KAAKqlB,UAAUhlB,QAC3DL,KAAKuH,QAAQstB,SACb70B,KAAK8J,QAAQyR,aAAa,SAAUvb,KAAKqlB,UAAUhlB,OAAQL,KAAKqlB,a,6BAOhErlB,KAAK8J,QAAQyR,aAAa,iBAAkBvb,KAAKqlB,UAAUhlB,QAC3DL,KAAKuH,QAAQE,OACbzH,KAAK8J,QAAQyR,aAAa,SAAUvb,KAAKqlB,UAAUhlB,OAAQL,KAAKqlB,a,sCAOhErlB,KAAK8J,QAAQyR,aAAa,iBAAkBvb,KAAKqlB,UAAUhlB,QAG3D0J,SAAS0mB,YAAY,gBAAgB,EAAOzwB,KAAKF,QAAQg1B,cAGzD90B,KAAK+e,U,mCAOMgW,GACX/0B,KAAKg1B,mBACLh1B,KAAKuH,QAAQie,aACRuP,GACH/0B,KAAK8J,QAAQyR,aAAa,SAAUvb,KAAKqlB,UAAUhlB,OAAQL,KAAKqlB,a,4BAQlE,IAAM7D,EAAMxhB,KAAKkxB,eACjB,GAAI1P,EAAIV,eAAiBU,EAAI/B,WAC3Bzf,KAAKsE,MAAM0kB,IAAIxH,OACV,CACL,GAA6B,IAAzBxhB,KAAKF,QAAQm1B,QACf,OAAO,EAGJj1B,KAAKixB,UAAUjxB,KAAKF,QAAQm1B,WAC/Bj1B,KAAKwwB,gBACLxwB,KAAK8vB,OAAOoF,UAAU1T,EAAKxhB,KAAKF,QAAQm1B,SACxCj1B,KAAK0wB,mB,8BAST,IAAMlP,EAAMxhB,KAAKkxB,eACjB,GAAI1P,EAAIV,eAAiBU,EAAI/B,WAC3Bzf,KAAKsE,MAAM0kB,IAAIxH,GAAK,QAEpB,GAA6B,IAAzBxhB,KAAKF,QAAQm1B,QACf,OAAO,I,kCAQDvrB,GACV,OAAO,WACL1J,KAAKwwB,gBACL9mB,EAAG0B,MAAMpL,KAAMsB,WACftB,KAAK0wB,kB,kCAWGyE,EAAKC,GAAO,IChrBE1xB,EDgrBF,OACtB,OCjrBwBA,EDirBLyxB,EChrBdh1B,IAAEk1B,UAAS,SAACC,GACjB,IAAMC,EAAOp1B,IAAE,SAEfo1B,EAAKC,IAAI,QAAQ,WACfD,EAAK5b,IAAI,eACT2b,EAASG,QAAQF,MAChBC,IAAI,eAAe,WACpBD,EAAK5b,IAAI,QAAQsZ,SACjBqC,EAASI,OAAOH,MACftP,IAAI,CACL0P,QAAS,SACRC,SAAS7rB,SAASoT,MAAMvc,KAAK,MAAO8C,MACtCmyB,WDoqB8BC,MAAK,SAACC,GACnC,EAAKvF,gBAEgB,mBAAV4E,EACTA,EAAMW,IAEe,iBAAVX,GACTW,EAAOn1B,KAAK,gBAAiBw0B,GAE/BW,EAAO9P,IAAI,QAAS3F,KAAK0V,IAAI,EAAK3Q,UAAUhb,QAAS0rB,EAAO1rB,WAG9D0rB,EAAOE,OACP,EAAK/E,eAAehP,WAAW6T,EAAO,IACtC,EAAK5E,aAAa7L,GAAM3B,oBAAoBoS,EAAO,IAAIpuB,UACvD,EAAK+oB,kBACJ1lB,MAAK,SAACyX,GACP,EAAK3Y,QAAQyR,aAAa,qBAAsBkH,Q,4CAQ9ByT,GAAO,WAC3B/1B,IAAEM,KAAKy1B,GAAO,SAAC/nB,EAAKgoB,GAClB,IAAMC,EAAWD,EAAKj4B,KAClB,EAAK4B,QAAQu2B,sBAAwB,EAAKv2B,QAAQu2B,qBAAuBF,EAAK7zB,KAChF,EAAKwH,QAAQyR,aAAa,qBAAsB,EAAK5Z,KAAKa,MAAMiB,sBCpuBjE,SAA2B0yB,GAChC,OAAOh2B,IAAEk1B,UAAS,SAACC,GACjBn1B,IAAEyB,OAAO,IAAI00B,WAAc,CACzBC,OAAQ,SAAC9T,GACP,IAAM+T,EAAU/T,EAAElG,OAAO1N,OACzBymB,EAASG,QAAQe,IAEnBC,QAAS,SAACC,GACRpB,EAASI,OAAOgB,MAEjBC,cAAcR,MAChBN,UD2tBGe,CAAkBT,GAAML,MAAK,SAACU,GAC5B,OAAO,EAAKK,YAAYL,EAASJ,MAChCprB,MAAK,WACN,EAAKlB,QAAQyR,aAAa,8B,6CAUX2a,GACHl2B,KAAKF,QAAQ+b,UAEjBib,cACZ92B,KAAK8J,QAAQyR,aAAa,eAAgB2a,GAG1Cl2B,KAAK+2B,sBAAsBb,K,wCAS7B,IAAI1U,EAAMxhB,KAAKkxB,eAOf,OAJI1P,EAAIhC,eACNgC,EAAM8D,GAAMrC,eAAenI,GAAIzJ,SAASmQ,EAAIvC,GAAInE,GAAIlK,YAG/C4Q,EAAIW,a,oCAGC+K,EAAS5Q,GAKrB,GAHAvS,SAAS0mB,YAAY,eAAe,EAAO1f,EAAIxI,OAAS,IAAM2kB,EAAU,IAAMA,GAG1E5Q,GAAWA,EAAQlb,SAEjBkb,EAAQ,GAAG4Q,QAAQpgB,gBAAkBogB,EAAQpgB,gBAC/CwP,EAAUA,EAAQtb,KAAKksB,IAGrB5Q,GAAWA,EAAQlb,QAAQ,CAC7B,IAAMd,EAAYgc,EAAQ,GAAGhc,WAAa,GAC1C,GAAIA,EAAW,CACb,IAAM02B,EAAeh3B,KAAKuK,cAEVpK,IAAE,CAAC62B,EAAa/X,GAAI+X,EAAa7X,KAAK3C,QAAQ0Q,GACtD3sB,SAASD,O,mCAOvBN,KAAKgxB,YAAY,O,kCAGPzU,EAAQ3d,GAClB,IAAM4iB,EAAMxhB,KAAKkxB,eAEjB,GAAY,KAAR1P,EAAY,CACd,IAAMyV,EAAQj3B,KAAK+E,MAAMutB,WAAW9Q,GAMpC,GALAxhB,KAAK4vB,QAAQ5uB,KAAK,uBAAuBX,KAAK,IAC9CF,IAAE82B,GAAOhR,IAAI1J,EAAQ3d,GAIjB4iB,EAAIV,cAAe,CACrB,IAAMoW,EAAY1xB,EAAMmI,KAAKspB,GACzBC,IAAcpc,GAAI9J,WAAWkmB,KAC/BA,EAAU/lB,UAAY2J,GAAItG,qBAC1B8Q,GAAMrC,eAAeiU,EAAUxZ,YAAY/V,SAC3C3H,KAAKmxB,eACLnxB,KAAKqlB,UAAU7kB,KApzBP,QAozBuB02B,SAGjCl3B,KAAKmxB,aACHnxB,KAAKuyB,oBAAoB0E,GAAOtvB,cAG/B,CACL,IAAMwvB,EAAmBh3B,IAAE6a,MAC3Bhb,KAAK4vB,QAAQ5uB,KAAK,uBAAuBX,KAAK,+BAAiC82B,EAAmB,8BAAgCn3B,KAAK2B,KAAKiG,OAAOC,YAAc,UACjK4F,YAAW,WAAatN,IAAE,uBAAyBg3B,GAAkBxzB,WAAa,Q,+BAUpF,IAAI6d,EAAMxhB,KAAKkxB,eACf,GAAI1P,EAAIhC,aAAc,CACpB,IAAM0H,EAASpM,GAAIzJ,SAASmQ,EAAIvC,GAAInE,GAAIlK,WACxC4Q,EAAM8D,GAAMrC,eAAeiE,IACvBvf,SACJ3H,KAAKmxB,eAELnxB,KAAKwwB,gBACLzmB,SAAS0mB,YAAY,UACrBzwB,KAAK0wB,kB,oCAcP,IAAMlP,EAAMxhB,KAAKkxB,eAAekG,OAAOtc,GAAIlK,UAErCymB,EAAUl3B,IAAEqF,EAAMmI,KAAK6T,EAAI7P,MAAMmJ,GAAIlK,YACrCghB,EAAW,CACftM,MAAO9D,EACPjJ,KAAMiJ,EAAIW,WACVze,IAAK2zB,EAAQj2B,OAASi2B,EAAQz2B,KAAK,QAAU,IAS/C,OALIy2B,EAAQj2B,SAEVwwB,EAASG,YAAyC,WAA3BsF,EAAQz2B,KAAK,WAG/BgxB,I,6BAGFlf,GACL,IAAM8O,EAAMxhB,KAAKkxB,aAAalxB,KAAKqlB,WAC/B7D,EAAIV,eAAiBU,EAAI/B,aAC3Bzf,KAAKwwB,gBACLxwB,KAAKsE,MAAMgzB,OAAO9V,EAAK9O,GACvB1S,KAAK0wB,kB,6BAIFhe,GACL,IAAM8O,EAAMxhB,KAAKkxB,aAAalxB,KAAKqlB,WAC/B7D,EAAIV,eAAiBU,EAAI/B,aAC3Bzf,KAAKwwB,gBACLxwB,KAAKsE,MAAMizB,OAAO/V,EAAK9O,GACvB1S,KAAK0wB,kB,kCAKP,IAAMlP,EAAMxhB,KAAKkxB,aAAalxB,KAAKqlB,WAC/B7D,EAAIV,eAAiBU,EAAI/B,aAC3Bzf,KAAKwwB,gBACLxwB,KAAKsE,MAAMkzB,UAAUhW,GACrBxhB,KAAK0wB,kB,kCAKP,IAAMlP,EAAMxhB,KAAKkxB,aAAalxB,KAAKqlB,WAC/B7D,EAAIV,eAAiBU,EAAI/B,aAC3Bzf,KAAKwwB,gBACLxwB,KAAKsE,MAAMmzB,UAAUjW,GACrBxhB,KAAK0wB,kB,oCAKP,IAAMlP,EAAMxhB,KAAKkxB,aAAalxB,KAAKqlB,WAC/B7D,EAAIV,eAAiBU,EAAI/B,aAC3Bzf,KAAKwwB,gBACLxwB,KAAKsE,MAAMozB,YAAYlW,GACvBxhB,KAAK0wB,kB,+BASArX,EAAKiD,EAASqb,GACrB,IAAIC,EACJ,GAAID,EAAY,CACd,IAAME,EAAWxe,EAAIye,EAAIze,EAAI0e,EACvBC,EAAQ1b,EAAQ9b,KAAK,SAC3Bo3B,EAAY,CACVvtB,MAAO2tB,EAAQH,EAAWxe,EAAI0e,EAAI1e,EAAIye,EAAIE,EAC1C91B,OAAQ81B,EAAQH,EAAWxe,EAAI0e,EAAIC,EAAQ3e,EAAIye,QAGjDF,EAAY,CACVvtB,MAAOgP,EAAI0e,EACX71B,OAAQmX,EAAIye,GAIhBxb,EAAQ2J,IAAI2R,K,iCAOZ,OAAO53B,KAAKqlB,UAAU4S,GAAG,Y,8BASpBj4B,KAAKk4B,YACRl4B,KAAKqlB,UAAUtG,U,gCASjB,OAAOjE,GAAIhM,QAAQ9O,KAAKqlB,UAAU,KAAOvK,GAAIpG,YAAc1U,KAAKqlB,UAAUhlB,S,8BAO1EL,KAAK8J,QAAQ2B,OAAO,OAAQqP,GAAIpG,a,yCAOhC1U,KAAKqlB,UAAU,GAAG3D,iB,6MEv+BDyW,G,WACnB,WAAYruB,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,S,4DAIpC3b,KAAKqlB,UAAUvkB,GAAG,QAASd,KAAKo4B,aAAaj5B,KAAKa,S,mCAQvCmc,GAAO,WACZkc,EAAgBlc,EAAMmc,cAAcD,cAE1C,GAAIA,GAAiBA,EAAcE,OAASF,EAAcE,MAAMn3B,OAAQ,CACtE,IAAMoK,EAAO6sB,EAAcE,MAAMn3B,OAAS,EAAIi3B,EAAcE,MAAM,GAAK/yB,EAAMmI,KAAK0qB,EAAcE,OAC9E,SAAd/sB,EAAKgtB,OAAoD,IAAjChtB,EAAK+S,KAAKpV,QAAQ,WAE5CnJ,KAAK8J,QAAQ2B,OAAO,gCAAiC,CAACD,EAAKitB,cAC3Dtc,EAAME,kBACiB,WAAd7Q,EAAKgtB,MAEVx4B,KAAK8J,QAAQ2B,OAAO,mBAAoB4sB,EAAcK,QAAQ,QAAQt3B,SACxE+a,EAAME,sBAGL,GAAI9e,OAAO86B,cAAe,CAE/B,IAAI9f,EAAOhb,OAAO86B,cAAcK,QAAQ,QACpC14B,KAAK8J,QAAQ2B,OAAO,mBAAoB8M,EAAKnX,SAC/C+a,EAAME,iBAIV5O,YAAW,WACT,EAAK3D,QAAQ2B,OAAO,yBACnB,S,6MCxCcktB,G,WACnB,WAAY7uB,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAK44B,eAAiBz4B,IAAE4J,UACxB/J,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,SACzB1e,KAAK64B,sBAAwB,GAE7B74B,KAAK84B,UAAY34B,IAAE,CACjB,8BACE,4CACF,UACA4M,KAAK,KAAKgsB,UAAU/4B,KAAK4vB,S,4DAOvB5vB,KAAKF,QAAQk5B,oBAEfh5B,KAAK64B,sBAAsBI,OAAS,SAACxW,GACnCA,EAAEpG,kBAGJrc,KAAK44B,eAAiB54B,KAAK84B,UAC3B94B,KAAK44B,eAAe93B,GAAG,OAAQd,KAAK64B,sBAAsBI,SAE1Dj5B,KAAKk5B,2B,+CAOgB,WACnBtqB,EAAazO,MACXg5B,EAAmBn5B,KAAK84B,UAAU93B,KAAK,0BAE7ChB,KAAK64B,sBAAsBO,YAAc,SAAC3W,GACxC,IAAM4W,EAAa,EAAKvvB,QAAQ2B,OAAO,wBACjC6tB,EAAgB,EAAK1J,QAAQvlB,QAAU,GAAK,EAAKulB,QAAQ1tB,SAAW,EACrEm3B,GAAezqB,EAAWxN,SAAUk4B,IACvC,EAAK1J,QAAQrvB,SAAS,YACtB,EAAKu4B,UAAUzuB,MAAM,EAAKulB,QAAQvlB,SAClC,EAAKyuB,UAAU52B,OAAO,EAAK0tB,QAAQ1tB,UACnCi3B,EAAiB5gB,KAAK,EAAK5W,KAAKa,MAAMa,gBAExCuL,EAAaA,EAAW2qB,IAAI9W,EAAElG,SAGhCvc,KAAK64B,sBAAsBW,YAAc,SAAC/W,IACxC7T,EAAaA,EAAW1D,IAAIuX,EAAElG,SAGdnb,QAAgC,SAAtBqhB,EAAElG,OAAO1M,WACjCjB,EAAazO,MACb,EAAKyvB,QAAQ6J,YAAY,cAI7Bz5B,KAAK64B,sBAAsBI,OAAS,WAClCrqB,EAAazO,MACb,EAAKyvB,QAAQ6J,YAAY,aAK3Bz5B,KAAK44B,eAAe93B,GAAG,YAAad,KAAK64B,sBAAsBO,aAC5Dt4B,GAAG,YAAad,KAAK64B,sBAAsBW,aAC3C14B,GAAG,OAAQd,KAAK64B,sBAAsBI,QAGzCj5B,KAAK84B,UAAUh4B,GAAG,aAAa,WAC7B,EAAKg4B,UAAUv4B,SAAS,SACxB44B,EAAiB5gB,KAAK,EAAK5W,KAAKa,MAAMc,cACrCxC,GAAG,aAAa,WACjB,EAAKg4B,UAAUW,YAAY,SAC3BN,EAAiB5gB,KAAK,EAAK5W,KAAKa,MAAMa,kBAIxCrD,KAAK84B,UAAUh4B,GAAG,QAAQ,SAACqb,GACzB,IAAMud,EAAevd,EAAMmc,cAAcoB,aAGzCvd,EAAME,iBAEFqd,GAAgBA,EAAaxD,OAASwD,EAAaxD,MAAM90B,QAC3D,EAAKikB,UAAUtG,QACf,EAAKjV,QAAQ2B,OAAO,gCAAiCiuB,EAAaxD,QAElE/1B,IAAEM,KAAKi5B,EAAaC,OAAO,SAACxrB,EAAKoQ,GAE/B,KAAIA,EAAKpW,cAAcgB,QAAQ,UAAY,GAA3C,CAGA,IAAMywB,EAAUF,EAAahB,QAAQna,GAEjCA,EAAKpW,cAAcgB,QAAQ,SAAW,EACxC,EAAKW,QAAQ2B,OAAO,mBAAoBmuB,GAExCz5B,IAAEy5B,GAASn5B,MAAK,SAAC0N,EAAK3C,GACpB,EAAK1B,QAAQ2B,OAAO,oBAAqBD,aAKhD1K,GAAG,YAAY,K,gCAGV,WACRzC,OAAOob,KAAKzZ,KAAK64B,uBAAuB53B,SAAQ,SAAC/B,GAC/C,EAAK05B,eAAejf,IAAIza,EAAI26B,OAAO,GAAG1xB,cAAe,EAAK0wB,sBAAsB35B,OAElFc,KAAK64B,sBAAwB,Q,krCCjHZiB,G,WACnB,WAAYhwB,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAK+5B,SAAWjwB,EAAQmQ,WAAWyB,QACnC1b,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAKg6B,sBAAwBz8B,OAAO08B,WAEhCj6B,KAAKF,QAAQo6B,WAAWF,wBAC1Bh6B,KAAKg6B,sBAAwBh6B,KAAKF,QAAQo6B,WAAWF,uB,oDAIpD35B,GACH,IAAMg5B,EAAar5B,KAAKwb,cAClBye,EAAaj6B,KAAKg6B,sBAEpBX,IACEh5B,EACE45B,EACFj6B,KAAK+5B,SAASv5B,KAAK,YAAY25B,SAASC,SAAS/5B,GAEjDL,KAAK+5B,SAASzlB,IAAIjU,GAGhB45B,GACFj6B,KAAK+5B,SAASv5B,KAAK,YAAY65B,U,mCAM1B,WACXr6B,KAAK+5B,SAASj5B,GAAG,SAAS,SAACqb,GACrBA,EAAM8H,UAAY/kB,GAAI2b,KAAKyf,QAC7B,EAAKC,kB,oCAST,OAAOv6B,KAAK4vB,QAAQjgB,SAAS,c,+BAOzB3P,KAAKwb,cACPxb,KAAKu6B,aAELv6B,KAAKw6B,WAEPx6B,KAAK8J,QAAQyR,aAAa,sB,6BAQrB3c,GACL,GAAIoB,KAAKF,QAAQ26B,iBAEf77B,EAAQA,EAAM2V,QAAQvU,KAAKF,QAAQ46B,oBAAqB,IAEpD16B,KAAKF,QAAQ66B,sBAAsB,CACrC,IAAMC,EAAY56B,KAAKF,QAAQ+6B,2BAA2BjZ,OAAO5hB,KAAKF,QAAQg7B,gCAC9El8B,EAAQA,EAAM2V,QAAQ,qCAAqC,SAASwmB,GAElE,GAAI,uDAAuDvyB,KAAKuyB,GAC9D,MAAO,GAH8D,WAKrDH,GALqD,IAKvE,2BAA6B,KAAlBzF,EAAkB,QAE3B,GAAK,IAAI6F,OAAO,oBAAwB7F,EAAI5gB,QAAQ,yBAA0B,QAAU,UAAY/L,KAAKuyB,GACvG,OAAOA,GAR4D,8BAWvE,MAAO,MAIb,OAAOn8B,I,iCAME,WACHq7B,EAAaj6B,KAAKg6B,sBAWxB,GAVAh6B,KAAK+5B,SAASzlB,IAAIwG,GAAIza,KAAKL,KAAKqlB,UAAWrlB,KAAKF,QAAQm7B,eACxDj7B,KAAK+5B,SAAS73B,OAAOlC,KAAKqlB,UAAUnjB,UAEpClC,KAAK8J,QAAQ2B,OAAO,0BAA0B,GAC9CzL,KAAK8J,QAAQ2B,OAAO,6BAA6B,GAEjDzL,KAAK4vB,QAAQrvB,SAAS,YACtBP,KAAK+5B,SAAShb,QAGVkb,EAAY,CACd,IAAMiB,EAAWjB,EAAWkB,aAAan7B,KAAK+5B,SAAS,GAAI/5B,KAAKF,QAAQo6B,YAGxE,GAAIl6B,KAAKF,QAAQo6B,WAAWkB,KAAM,CAChC,IAAMC,EAAS,IAAIpB,EAAWqB,WAAWt7B,KAAKF,QAAQo6B,WAAWkB,MACjEF,EAASK,WAAaF,EACtBH,EAASp6B,GAAG,kBAAkB,SAAC06B,GAC7BH,EAAOI,eAAeD,MAI1BN,EAASp6B,GAAG,QAAQ,SAACqb,GACnB,EAAKrS,QAAQyR,aAAa,gBAAiB2f,EAASQ,WAAYvf,MAElE+e,EAASp6B,GAAG,UAAU,WACpB,EAAKgJ,QAAQyR,aAAa,kBAAmB2f,EAASQ,WAAYR,MAIpEA,EAASS,QAAQ,KAAM37B,KAAKqlB,UAAU/L,eACtCtZ,KAAK+5B,SAASv5B,KAAK,WAAY06B,QAE/Bl7B,KAAK+5B,SAASj5B,GAAG,QAAQ,SAACqb,GACxB,EAAKrS,QAAQyR,aAAa,gBAAiB,EAAKwe,SAASzlB,MAAO6H,MAElEnc,KAAK+5B,SAASj5B,GAAG,SAAS,WACxB,EAAKgJ,QAAQyR,aAAa,kBAAmB,EAAKwe,SAASzlB,MAAO,EAAKylB,e,mCAW3E,GAFmB/5B,KAAKg6B,sBAER,CACd,IAAMkB,EAAWl7B,KAAK+5B,SAASv5B,KAAK,YACpCR,KAAK+5B,SAASzlB,IAAI4mB,EAASQ,YAC3BR,EAASU,aAGX,IAAMh9B,EAAQoB,KAAK67B,OAAO/gB,GAAIlc,MAAMoB,KAAK+5B,SAAU/5B,KAAKF,QAAQm7B,eAAiBngB,GAAIpG,WAC/EonB,EAAW97B,KAAKqlB,UAAUhlB,SAAWzB,EAE3CoB,KAAKqlB,UAAUhlB,KAAKzB,GACpBoB,KAAKqlB,UAAUnjB,OAAOlC,KAAKF,QAAQoC,OAASlC,KAAK+5B,SAAS73B,SAAW,QACrElC,KAAK4vB,QAAQ6J,YAAY,YAErBqC,GACF97B,KAAK8J,QAAQyR,aAAa,SAAUvb,KAAKqlB,UAAUhlB,OAAQL,KAAKqlB,WAGlErlB,KAAKqlB,UAAUtG,QAEf/e,KAAK8J,QAAQ2B,OAAO,0BAA0B,GAC9CzL,KAAK8J,QAAQ2B,OAAO,6BAA6B,K,gCAI7CzL,KAAKwb,eACPxb,KAAKu6B,kB,yMC7KX,IAEqBwB,G,WACnB,WAAYjyB,I,4FAAS,SACnB9J,KAAKkM,UAAY/L,IAAE4J,UACnB/J,KAAKg8B,WAAalyB,EAAQmQ,WAAWgiB,UACrCj8B,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAKF,QAAUgK,EAAQhK,Q,4DAGZ,WACPE,KAAKF,QAAQ8zB,SAAW5zB,KAAKF,QAAQo8B,oBACvCl8B,KAAKkc,UAIPlc,KAAKg8B,WAAWl7B,GAAG,aAAa,SAACqb,GAC/BA,EAAME,iBACNF,EAAMggB,kBAEN,IAAMC,EAAc,EAAK/W,UAAU/S,SAASnG,IAAM,EAAKD,UAAUE,YAC3DiwB,EAAc,SAAClgB,GACnB,IAAIja,EAASia,EAAMmgB,SAAWF,EAtBb,IAwBjBl6B,EAAU,EAAKpC,QAAQy8B,UAAY,EAAKjc,KAAKkc,IAAIt6B,EAAQ,EAAKpC,QAAQy8B,WAAar6B,EACnFA,EAAU,EAAKpC,QAAQi0B,UAAY,EAAKzT,KAAK0V,IAAI9zB,EAAQ,EAAKpC,QAAQi0B,WAAa7xB,EAEnF,EAAKmjB,UAAUnjB,OAAOA,IAGxB,EAAKgK,UAAUpL,GAAG,YAAau7B,GAAa7G,IAAI,WAAW,WACzD,EAAKtpB,UAAUyN,IAAI,YAAa0iB,W,gCAMpCr8B,KAAKg8B,WAAWriB,MAChB3Z,KAAKg8B,WAAWz7B,SAAS,e,6MCrCRk8B,G,WACnB,WAAY3yB,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAK08B,SAAW5yB,EAAQmQ,WAAW0iB,QACnC38B,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAK+5B,SAAWjwB,EAAQmQ,WAAWyB,QAEnC1b,KAAK48B,QAAUz8B,IAAE5C,QACjByC,KAAK68B,WAAa18B,IAAE,cAEpBH,KAAK88B,SAAW,WACd,EAAKC,SAAS,CACZC,EAAG,EAAKJ,QAAQ16B,SAAW,EAAKw6B,SAASpjB,iB,wDAKtChX,GACPtC,KAAKqlB,UAAUY,IAAI,SAAU3jB,EAAK06B,GAClCh9B,KAAK+5B,SAAS9T,IAAI,SAAU3jB,EAAK06B,GAC7Bh9B,KAAK+5B,SAASv5B,KAAK,aACrBR,KAAK+5B,SAASv5B,KAAK,YAAYy8B,QAAQ,KAAM36B,EAAK06B,K,+BAQpDh9B,KAAK4vB,QAAQuD,YAAY,cACrBnzB,KAAKk9B,gBACPl9B,KAAKqlB,UAAU7kB,KAAK,YAAaR,KAAKqlB,UAAUY,IAAI,WACpDjmB,KAAKqlB,UAAU7kB,KAAK,eAAgBR,KAAKqlB,UAAUY,IAAI,cACvDjmB,KAAKqlB,UAAUY,IAAI,YAAa,IAChCjmB,KAAK48B,QAAQ97B,GAAG,SAAUd,KAAK88B,UAAUhhB,QAAQ,UACjD9b,KAAK68B,WAAW5W,IAAI,WAAY,YAEhCjmB,KAAK48B,QAAQjjB,IAAI,SAAU3Z,KAAK88B,UAChC98B,KAAK+8B,SAAS,CAAEC,EAAGh9B,KAAKqlB,UAAU7kB,KAAK,eACvCR,KAAKqlB,UAAUY,IAAI,YAAajmB,KAAKqlB,UAAUY,IAAI,iBACnDjmB,KAAK68B,WAAW5W,IAAI,WAAY,YAGlCjmB,KAAK8J,QAAQ2B,OAAO,2BAA4BzL,KAAKk9B,kB,qCAIrD,OAAOl9B,KAAK4vB,QAAQjgB,SAAS,mB,6MChDZwtB,G,WACnB,WAAYrzB,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAKkM,UAAY/L,IAAE4J,UACnB/J,KAAKo9B,aAAetzB,EAAQmQ,WAAWojB,YACvCr9B,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,SAEzB1e,KAAKwZ,OAAS,CACZ,uBAAwB,SAAC8jB,EAAI7a,GACvB,EAAK8a,OAAO9a,EAAElG,OAAQkG,IACxBA,EAAEpG,kBAGN,+EAAgF,WAC9E,EAAKkhB,UAEP,qCAAsC,WACpC,EAAKhjB,QAEP,8BAA+B,WAC7B,EAAKgjB,W,4DAKE,WACXv9B,KAAKw9B,QAAUr9B,IAAE,CACf,4BACE,uCACE,gDACA,0DACA,0DACA,0DACA,eACGH,KAAKF,QAAQ29B,mBAAqB,sBAAwB,sBAC7D,2BACCz9B,KAAKF,QAAQ29B,mBAAqB,GAAK,kDAC1C,SACF,UACA1wB,KAAK,KAAKgsB,UAAU/4B,KAAKo9B,cAE3Bp9B,KAAKw9B,QAAQ18B,GAAG,aAAa,SAACqb,GAC5B,GAAIrB,GAAInG,gBAAgBwH,EAAMI,QAAS,CACrCJ,EAAME,iBACNF,EAAMggB,kBAEN,IAAM7f,EAAU,EAAKkhB,QAAQx8B,KAAK,2BAA2BR,KAAK,UAC5Dk9B,EAAWphB,EAAQhK,SACnBlG,EAAY,EAAKF,UAAUE,YAE3BiwB,EAAc,SAAClgB,GACnB,EAAKrS,QAAQ2B,OAAO,kBAAmB,CACrCssB,EAAG5b,EAAMwhB,QAAUD,EAASz3B,KAC5B6xB,EAAG3b,EAAMmgB,SAAWoB,EAASvxB,IAAMC,IAClCkQ,GAAUH,EAAMkY,UAEnB,EAAKkJ,OAAOjhB,EAAQ,GAAIH,IAG1B,EAAKjQ,UACFpL,GAAG,YAAau7B,GAChB7G,IAAI,WAAW,SAAC/S,GACfA,EAAEpG,iBACF,EAAKnQ,UAAUyN,IAAI,YAAa0iB,GAChC,EAAKvyB,QAAQ2B,OAAO,0BAGnB6Q,EAAQ9b,KAAK,UAChB8b,EAAQ9b,KAAK,QAAS8b,EAAQpa,SAAWoa,EAAQjS,aAMvDrK,KAAKw9B,QAAQ18B,GAAG,SAAS,SAAC2hB,GACxBA,EAAEpG,iBACF,EAAKkhB,c,gCAKPv9B,KAAKw9B,QAAQ75B,W,6BAGR4Y,EAAQJ,GACb,GAAInc,KAAK8J,QAAQ8Q,aACf,OAAO,EAGT,IAAMgjB,EAAU9iB,GAAIrF,MAAM8G,GACpBshB,EAAa79B,KAAKw9B,QAAQx8B,KAAK,2BAIrC,GAFAhB,KAAK8J,QAAQ2B,OAAO,sBAAuB8Q,EAAQJ,GAE/CyhB,EAAS,CACX,IAAM7H,EAAS51B,IAAEoc,GACX7J,EAAWqjB,EAAOrjB,WAClB2G,EAAM,CACVpT,KAAMyM,EAASzM,KAAOogB,SAAS0P,EAAO9P,IAAI,cAAe,IACzD9Z,IAAKuG,EAASvG,IAAMka,SAAS0P,EAAO9P,IAAI,aAAc,KAIlD2R,EAAY,CAChBkG,EAAG/H,EAAOjC,YAAW,GACrBkJ,EAAGjH,EAAOzc,aAAY,IAGxBukB,EAAW5X,IAAI,CACb0P,QAAS,QACT1vB,KAAMoT,EAAIpT,KACVkG,IAAKkN,EAAIlN,IACT9B,MAAOutB,EAAUkG,EACjB57B,OAAQ01B,EAAUoF,IACjBx8B,KAAK,SAAUu1B,GAElB,IAAMgI,EAAe,IAAIC,MACzBD,EAAa5I,IAAMY,EAAOn1B,KAAK,OAE/B,IAAMq9B,EAAarG,EAAUkG,EAAI,IAAMlG,EAAUoF,EAAI,KAAOh9B,KAAK2B,KAAKa,MAAMoB,SAAW,KAAOm6B,EAAa1zB,MAAQ,IAAM0zB,EAAa77B,OAAS,IAC/I27B,EAAW78B,KAAK,gCAAgCuX,KAAK0lB,GACrDj+B,KAAK8J,QAAQ2B,OAAO,oBAAqB8Q,QAEzCvc,KAAKua,OAGP,OAAOqjB,I,6BASP59B,KAAK8J,QAAQ2B,OAAO,sBACpBzL,KAAKw9B,QAAQ39B,WAAW0a,Y,yMCxI5B,IACM2jB,GAAc,iFAECC,G,WACnB,WAAYr0B,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAKwZ,OAAS,CACZ,mBAAoB,SAAC8jB,EAAI7a,GAClBA,EAAE6Q,sBACL,EAAK8K,YAAY3b,IAGrB,qBAAsB,SAAC6a,EAAI7a,GACzB,EAAK4b,cAAc5b,K,4DAMvBziB,KAAKs+B,cAAgB,O,gCAIrBt+B,KAAKs+B,cAAgB,O,gCAIrB,GAAKt+B,KAAKs+B,cAAV,CAIA,IAAMC,EAAUv+B,KAAKs+B,cAAcnc,WAC7BtJ,EAAQ0lB,EAAQ1lB,MAAMqlB,IAE5B,GAAIrlB,IAAUA,EAAM,IAAMA,EAAM,IAAK,CACnC,IAAM7U,EAAO6U,EAAM,GAAK0lB,EApCR,UAoCkCA,EAC5CC,EAAUx+B,KAAKF,QAAQ2+B,0BAC3BF,EAAQhqB,QAAQ,wDAAyD,IAAI5H,MAAM,KAAK,GACtF4xB,EACE7uB,EAAOvP,IAAE,SAASE,KAAKm+B,GAAS59B,KAAK,OAAQoD,GAAM,GACrDhE,KAAK8J,QAAQhK,QAAQ4+B,iBACvBv+B,IAAEuP,GAAM9O,KAAK,SAAU,UAGzBZ,KAAKs+B,cAAcpc,WAAWxS,GAC9B1P,KAAKs+B,cAAgB,KACrBt+B,KAAK8J,QAAQ2B,OAAO,oB,oCAIVgX,GACZ,GAAIjd,EAAMwI,SAAS,CAAC9O,GAAI2b,KAAKuJ,MAAOllB,GAAI2b,KAAKwJ,OAAQ5B,EAAEwB,SAAU,CAC/D,IAAM0a,EAAY3+B,KAAK8J,QAAQ2B,OAAO,sBAAsBmzB,eAC5D5+B,KAAKs+B,cAAgBK,K,kCAIblc,GACNjd,EAAMwI,SAAS,CAAC9O,GAAI2b,KAAKuJ,MAAOllB,GAAI2b,KAAKwJ,OAAQ5B,EAAEwB,UACrDjkB,KAAKuU,e,6MC3DUsqB,G,WACnB,WAAY/0B,GAAS,Y,4FAAA,SACnB9J,KAAK+Z,MAAQjQ,EAAQmQ,WAAW4E,KAChC7e,KAAKwZ,OAAS,CACZ,oBAAqB,WACnB,EAAKO,MAAMzF,IAAIxK,EAAQ2B,OAAO,W,kEAMlC,OAAOqP,GAAI1G,WAAWpU,KAAK+Z,MAAM,S,6MCZhB+kB,G,WACnB,WAAYh1B,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAKF,QAAUgK,EAAQhK,QAAQyU,SAAW,GAE1CvU,KAAKyZ,KAAO,CAACva,GAAI2b,KAAKuJ,MAAOllB,GAAI2b,KAAKwJ,MAAOnlB,GAAI2b,KAAKkkB,OAAQ7/B,GAAI2b,KAAKmkB,MAAO9/B,GAAI2b,KAAKokB,UAAW//B,GAAI2b,KAAKqkB,OAC3Gl/B,KAAKm/B,oBAAsB,KAE3Bn/B,KAAKwZ,OAAS,CACZ,mBAAoB,SAAC8jB,EAAI7a,GAClBA,EAAE6Q,sBACL,EAAK8K,YAAY3b,IAGrB,qBAAsB,SAAC6a,EAAI7a,GACzB,EAAK4b,cAAc5b,K,kEAMvB,QAASziB,KAAKF,QAAQ+Y,Q,mCAItB7Y,KAAKo/B,SAAW,O,gCAIhBp/B,KAAKo/B,SAAW,O,gCAIhB,GAAKp/B,KAAKo/B,SAAV,CAIA,IAAMn0B,EAAOjL,KACPu+B,EAAUv+B,KAAKo/B,SAASjd,WAC9BniB,KAAKF,QAAQ+Y,MAAM0lB,GAAS,SAAS1lB,GACnC,GAAIA,EAAO,CACT,IAAInJ,EAAO,GAUX,GARqB,iBAAVmJ,EACTnJ,EAAOoL,GAAIxC,WAAWO,GACbA,aAAiBwmB,OAC1B3vB,EAAOmJ,EAAM,GACJA,aAAiBymB,OAC1B5vB,EAAOmJ,IAGJnJ,EAAM,OACXzE,EAAKm0B,SAASld,WAAWxS,GACzBzE,EAAKm0B,SAAW,KAChBn0B,EAAKnB,QAAQ2B,OAAO,uB,oCAKZgX,GAGZ,GAAIziB,KAAKm/B,qBAAuB35B,EAAMwI,SAAShO,KAAKyZ,KAAMzZ,KAAKm/B,qBAC7Dn/B,KAAKm/B,oBAAsB1c,EAAEwB,YAD/B,CAKA,GAAIze,EAAMwI,SAAShO,KAAKyZ,KAAMgJ,EAAEwB,SAAU,CACxC,IAAM0a,EAAY3+B,KAAK8J,QAAQ2B,OAAO,sBAAsBmzB,eAC5D5+B,KAAKo/B,SAAWT,EAElB3+B,KAAKm/B,oBAAsB1c,EAAEwB,W,kCAGnBxB,GACNjd,EAAMwI,SAAShO,KAAKyZ,KAAMgJ,EAAEwB,UAC9BjkB,KAAKuU,e,6MC/EUgrB,G,WACnB,WAAYz1B,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAKo9B,aAAetzB,EAAQmQ,WAAWojB,YACvCr9B,KAAKF,QAAUgK,EAAQhK,SAEiB,IAApCE,KAAKF,QAAQ0/B,qBAEfx/B,KAAKF,QAAQqZ,YAAcnZ,KAAK8J,QAAQiQ,MAAMnZ,KAAK,gBAAkBZ,KAAKF,QAAQqZ,aAGpFnZ,KAAKwZ,OAAS,CACZ,oCAAqC,WACnC,EAAK+jB,UAEP,8BAA+B,WAC7B,EAAKA,W,kEAMT,QAASv9B,KAAKF,QAAQqZ,c,mCAGX,WACXnZ,KAAKoZ,aAAejZ,IAAE,kCACtBH,KAAKoZ,aAAatY,GAAG,SAAS,WAC5B,EAAKgJ,QAAQ2B,OAAO,YACnBpL,KAAKL,KAAKF,QAAQqZ,aAAa4f,UAAU/4B,KAAKo9B,cAEjDp9B,KAAKu9B,W,gCAILv9B,KAAKoZ,aAAazV,W,+BAIlB,IAAM87B,GAAUz/B,KAAK8J,QAAQ2B,OAAO,yBAA2BzL,KAAK8J,QAAQ2B,OAAO,kBACnFzL,KAAKoZ,aAAasmB,OAAOD,Q,6MCrCRE,G,WACnB,WAAY71B,I,4FAAS,SACnB9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAK8J,QAAUA,EACf9J,KAAK08B,SAAW5yB,EAAQmQ,WAAW0iB,QACnC38B,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,SACzB1e,KAAK4/B,eAAiB3yB,EAAKV,aACzBvM,KAAKF,QAAQm0B,OAAOljB,EAAI9H,MAAQ,MAAQ,O,iEAI1B42B,GAChB,IAAI94B,EAAW/G,KAAK4/B,eAAeC,GACnC,OAAK7/B,KAAKF,QAAQkH,WAAcD,GAI5BgK,EAAI9H,QACNlC,EAAWA,EAASwN,QAAQ,MAAO,KAAKA,QAAQ,QAAS,MAQpD,MALPxN,EAAWA,EAASwN,QAAQ,YAAa,MACtCA,QAAQ,QAAS,KACjBA,QAAQ,cAAe,KACvBA,QAAQ,eAAgB,MAEF,KAZhB,K,6BAeJnW,GAKL,OAJK4B,KAAKF,QAAQ8e,SAAWxgB,EAAEwgB,gBACtBxgB,EAAEwgB,QAEXxgB,EAAE+Z,UAAYnY,KAAKF,QAAQqY,UACpBnY,KAAKka,GAAG4lB,OAAO1hC,K,mCAItB4B,KAAK+/B,oBACL//B,KAAKggC,yBACLhgC,KAAKigC,wBACLjgC,KAAKkgC,yBACLlgC,KAAKmgC,iBAAmB,K,uCAIjBngC,KAAKmgC,mB,sCAGEjiC,GAKd,OAJKG,OAAOkB,UAAUC,eAAe1B,KAAKkC,KAAKmgC,iBAAkBjiC,KAC/D8B,KAAKmgC,iBAAiBjiC,GAAQ6S,EAAInH,gBAAgB1L,IAChDsH,EAAMwI,SAAShO,KAAKF,QAAQsgC,qBAAsBliC,IAE/C8B,KAAKmgC,iBAAiBjiC,K,0CAGXA,GAElB,MAAiB,MADjBA,EAAOA,EAAKiK,gBACWnI,KAAK4J,gBAAgB1L,KAAoD,IAA3C6S,EAAIhJ,oBAAoBoB,QAAQjL,K,mCAG1EoC,EAAWse,EAAS8T,EAAWD,GAAW,WACrD,OAAOzyB,KAAKka,GAAGmmB,YAAY,CACzB//B,UAAW,cAAgBA,EAC3BT,SAAU,CACRG,KAAK8/B,OAAO,CACVx/B,UAAW,4BACXF,SAAUJ,KAAKka,GAAGomB,KAAKtgC,KAAKF,QAAQ6e,MAAM9c,KAAO,sBACjD+c,QAASA,EACT/d,MAAO,SAAC4hB,GACN,IAAM8d,EAAUpgC,IAAEsiB,EAAE+d,eAChB9N,GAAaD,EACf,EAAK3oB,QAAQ2B,OAAO,eAAgB,CAClCinB,UAAW6N,EAAQ3/B,KAAK,kBACxB6xB,UAAW8N,EAAQ3/B,KAAK,oBAEjB8xB,EACT,EAAK5oB,QAAQ2B,OAAO,eAAgB,CAClCinB,UAAW6N,EAAQ3/B,KAAK,oBAEjB6xB,GACT,EAAK3oB,QAAQ2B,OAAO,eAAgB,CAClCgnB,UAAW8N,EAAQ3/B,KAAK,qBAI9Bb,SAAU,SAACwgC,GACT,IAAME,EAAeF,EAAQv/B,KAAK,sBAC9B0xB,IACF+N,EAAaxa,IAAI,mBAAoB,EAAKnmB,QAAQ4gC,YAAYhO,WAC9D6N,EAAQ3/B,KAAK,iBAAkB,EAAKd,QAAQ4gC,YAAYhO,YAEtDD,GACFgO,EAAaxa,IAAI,QAAS,EAAKnmB,QAAQ4gC,YAAYjO,WACnD8N,EAAQ3/B,KAAK,iBAAkB,EAAKd,QAAQ4gC,YAAYjO,YAExDgO,EAAaxa,IAAI,QAAS,kBAIhCjmB,KAAK8/B,OAAO,CACVx/B,UAAW,kBACXF,SAAUJ,KAAKka,GAAGymB,uBAAuB,GAAI3gC,KAAKF,SAClD8e,QAAS5e,KAAK2B,KAAK0E,MAAME,KACzB/F,KAAM,CACJk/B,OAAQ,cAGZ1/B,KAAKka,GAAG0mB,SAAS,CACfrI,OAAQ7F,EAAY,CAClB,6BACE,mCAAqC1yB,KAAK2B,KAAK0E,MAAMG,WAAa,SAClE,QACE,4HACExG,KAAK2B,KAAK0E,MAAMK,YAClB,YACF,SACA,mFACA,QACE,mIACE1G,KAAK2B,KAAK0E,MAAMS,SAClB,YACA,0FAA4F9G,KAAKF,QAAQ4gC,YAAYhO,UAAY,mCACnI,SACA,sFACF,UACA3lB,KAAK,IAAM,KACZ0lB,EAAY,CACX,6BACE,mCAAqCzyB,KAAK2B,KAAK0E,MAAMI,WAAa,SAClE,QACE,6HACEzG,KAAK2B,KAAK0E,MAAMQ,eAClB,YACF,SACA,mFACA,QACE,mIACE7G,KAAK2B,KAAK0E,MAAMS,SAClB,YACA,0FAA4F9G,KAAKF,QAAQ4gC,YAAYjO,UAAY,mCACnI,SACA,sFACF,UACA1lB,KAAK,IAAM,IACbhN,SAAU,SAAC8gC,GACTA,EAAU7/B,KAAK,gBAAgBP,MAAK,SAAC0N,EAAK3C,GACxC,IAAMs1B,EAAU3gC,IAAEqL,GAClBs1B,EAAQz/B,OAAO,EAAK6Y,GAAG6mB,QAAQ,CAC7BC,OAAQ,EAAKlhC,QAAQkhC,OACrBC,WAAY,EAAKnhC,QAAQmhC,WACzB1M,UAAWuM,EAAQtgC,KAAK,SACxB2X,UAAW,EAAKrY,QAAQqY,UACxByG,QAAS,EAAK9e,QAAQ8e,UACrBzd,aAGL,IAAI+/B,EAAe,CACjB,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YAEhFL,EAAU7/B,KAAK,uBAAuBP,MAAK,SAAC0N,EAAK3C,GAC/C,IAAMs1B,EAAU3gC,IAAEqL,GAClBs1B,EAAQz/B,OAAO,EAAK6Y,GAAG6mB,QAAQ,CAC7BC,OAAQE,EACRD,WAAYC,EACZ3M,UAAWuM,EAAQtgC,KAAK,SACxB2X,UAAW,EAAKrY,QAAQqY,UACxByG,QAAS,EAAK9e,QAAQ8e,UACrBzd,aAEL0/B,EAAU7/B,KAAK,qBAAqBP,MAAK,SAAC0N,EAAK3C,GAC7CrL,IAAEqL,GAAM21B,QAAO,WACb,IAAMC,EAAQP,EAAU7/B,KAAK,IAAMb,IAAEH,MAAMQ,KAAK,UAAUQ,KAAK,mBAAmB8d,QAC5EzY,EAAQrG,KAAKpB,MAAMkO,cACzBs0B,EAAMnb,IAAI,mBAAoB5f,GAC3BzF,KAAK,aAAcyF,GACnBzF,KAAK,aAAcyF,GACnBzF,KAAK,sBAAuByF,GAC/B+6B,EAAMvgC,eAIZA,MAAO,SAACsb,GACNA,EAAMggB,kBAEN,IAAMl8B,EAAUE,IAAE,IAAMG,GAAWU,KAAK,uBAClCu/B,EAAUpgC,IAAEgc,EAAMI,QAClBgY,EAAYgM,EAAQ//B,KAAK,SACzB5B,EAAQ2hC,EAAQ3/B,KAAK,cAE3B,GAAkB,gBAAd2zB,EAA6B,CAC/B,IAAM8M,EAAUphC,EAAQe,KAAK,IAAMpC,GAC7B0iC,EAAWnhC,IAAEF,EAAQe,KAAK,IAAMqgC,EAAQ7gC,KAAK,UAAUQ,KAAK,mBAAmB,IAG/EogC,EAAQE,EAAStgC,KAAK,mBAAmB6M,OAAOolB,SAGhD5sB,EAAQg7B,EAAQ/sB,MACtB8sB,EAAMnb,IAAI,mBAAoB5f,GAC3BzF,KAAK,aAAcyF,GACnBzF,KAAK,aAAcyF,GACnBzF,KAAK,sBAAuByF,GAC/Bi7B,EAASC,QAAQH,GACjBC,EAAQxgC,YACH,CACL,GAAI2E,EAAMwI,SAAS,CAAC,YAAa,aAAcumB,GAAY,CACzD,IAAMr1B,EAAoB,cAAdq1B,EAA4B,mBAAqB,QACvDiN,EAASjB,EAAQ/jB,QAAQ,eAAexb,KAAK,sBAC7CygC,EAAiBlB,EAAQ/jB,QAAQ,eAAexb,KAAK,8BAE3DwgC,EAAOvb,IAAI/mB,EAAKN,GAChB6iC,EAAe7gC,KAAK,QAAU2zB,EAAW31B,GAE3C,EAAKkL,QAAQ2B,OAAO,UAAY8oB,EAAW31B,UAKlDuC,W,0CAGe,WAClBnB,KAAK8J,QAAQ4E,KAAK,gBAAgB,WAChC,OAAO,EAAKwL,GAAGmmB,YAAY,CACzB,EAAKP,OAAO,CACVx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGymB,uBAChB,EAAKzmB,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM+iB,OAAQ,EAAK5hC,SAE/C8e,QAAS,EAAKjd,KAAKoD,MAAMA,MACzBvE,KAAM,CACJk/B,OAAQ,cAGZ,EAAKxlB,GAAG0mB,SAAS,CACftgC,UAAW,iBACXi4B,MAAO,EAAKz4B,QAAQ6hC,UACpBC,MAAO,EAAKjgC,KAAKoD,MAAMA,MACvB88B,SAAU,SAACr2B,GAEW,iBAATA,IACTA,EAAO,CACLuvB,IAAKvvB,EACLo2B,MAAQvjC,OAAOkB,UAAUC,eAAe1B,KAAK,EAAK6D,KAAKoD,MAAOyG,GAAQ,EAAK7J,KAAKoD,MAAMyG,GAAQA,IAIlG,IAAMuvB,EAAMvvB,EAAKuvB,IACX6G,EAAQp2B,EAAKo2B,MAInB,MAAO,IAAM7G,GAHCvvB,EAAKzG,MAAQ,WAAayG,EAAKzG,MAAQ,KAAO,KAC1CyG,EAAKlL,UAAY,WAAakL,EAAKlL,UAAY,IAAM,IAEhC,IAAMshC,EAAQ,KAAO7G,EAAM,KAEpEl6B,MAAO,EAAKiJ,QAAQsS,oBAAoB,0BAEzCjb,YAGL,IAtCkB,eAsCT2gC,EAAcC,GACrB,IAAMv2B,EAAO,EAAK1L,QAAQ6hC,UAAUG,GAEpC,EAAKh4B,QAAQ4E,KAAK,gBAAkBlD,GAAM,WACxC,OAAO,EAAKs0B,OAAO,CACjBx/B,UAAW,kBAAoBkL,EAC/BpL,SAAU,oBAAsBoL,EAAO,KAAOA,EAAKsB,cAAgB,SACnE8R,QAAS,EAAKjd,KAAKoD,MAAMyG,GACzB3K,MAAO,EAAKiJ,QAAQsS,oBAAoB,wBACvCjb,aATE2gC,EAAW,EAAGC,EAAW/hC,KAAKF,QAAQ6hC,UAAUvgC,OAAQ0gC,EAAWC,EAAUD,IAAY,EAAzFA,GAaT9hC,KAAK8J,QAAQ4E,KAAK,eAAe,WAC/B,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,gBACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM7c,MAC1C8c,QAAS,EAAKjd,KAAKE,KAAKC,KAAO,EAAKkgC,kBAAkB,QACtDnhC,MAAO,EAAKiJ,QAAQm4B,kCAAkC,iBACrD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,iBAAiB,WACjC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM5c,QAC1C6c,QAAS,EAAKjd,KAAKE,KAAKE,OAAS,EAAKigC,kBAAkB,UACxDnhC,MAAO,EAAKiJ,QAAQm4B,kCAAkC,mBACrD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,qBACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM3c,WAC1C4c,QAAS,EAAKjd,KAAKE,KAAKG,UAAY,EAAKggC,kBAAkB,aAC3DnhC,MAAO,EAAKiJ,QAAQm4B,kCAAkC,sBACrD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,gBAAgB,WAChC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMujB,QAC1CtjB,QAAS,EAAKjd,KAAKE,KAAKI,MAAQ,EAAK+/B,kBAAkB,gBACvDnhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,yBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,wBAAwB,WACxC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,yBACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMxc,eAC1Cyc,QAAS,EAAKjd,KAAKE,KAAKM,cAAgB,EAAK6/B,kBAAkB,iBAC/DnhC,MAAO,EAAKiJ,QAAQm4B,kCAAkC,0BACrD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,sBAAsB,WACtC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,uBACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMtc,aAC1Cuc,QAAS,EAAKjd,KAAKE,KAAKQ,YACxBxB,MAAO,EAAKiJ,QAAQm4B,kCAAkC,wBACrD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,qBACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMvc,WAC1Cwc,QAAS,EAAKjd,KAAKE,KAAKO,UACxBvB,MAAO,EAAKiJ,QAAQm4B,kCAAkC,sBACrD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,mBAAmB,WACnC,IAAMwX,EAAY,EAAKpc,QAAQ2B,OAAO,uBActC,OAZI,EAAK3L,QAAQqiC,iBAEfhiC,IAAEM,KAAKylB,EAAU,eAAevZ,MAAM,MAAM,SAACwB,EAAKi0B,GAChDA,EAAWA,EAASnpB,OAAO1E,QAAQ,SAAU,IACzC,EAAK8tB,oBAAoBD,KACuB,IAA9C,EAAKtiC,QAAQwiC,UAAUn5B,QAAQi5B,IACjC,EAAKtiC,QAAQwiC,UAAUnzB,KAAKizB,MAM7B,EAAKloB,GAAGmmB,YAAY,CACzB,EAAKP,OAAO,CACVx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGymB,uBAChB,8CAA+C,EAAK7gC,SAEtD8e,QAAS,EAAKjd,KAAKE,KAAK3D,KACxBsC,KAAM,CACJk/B,OAAQ,cAGZ,EAAKxlB,GAAGqoB,cAAc,CACpBjiC,UAAW,oBACXkiC,eAAgB,EAAK1iC,QAAQ6e,MAAM8jB,UACnClK,MAAO,EAAKz4B,QAAQwiC,UAAUnrB,OAAO,EAAKvN,gBAAgBzK,KAAK,IAC/DyiC,MAAO,EAAKjgC,KAAKE,KAAK3D,KACtB2jC,SAAU,SAACr2B,GACT,MAAO,6BAA+BuF,EAAI/I,cAAcwD,GAAQ,KAAOA,EAAO,WAEhF3K,MAAO,EAAKiJ,QAAQm4B,kCAAkC,uBAEvD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,mBAAmB,WACnC,OAAO,EAAKwL,GAAGmmB,YAAY,CACzB,EAAKP,OAAO,CACVx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGymB,uBAAuB,8CAA+C,EAAK7gC,SAC7F8e,QAAS,EAAKjd,KAAKE,KAAKS,KACxB9B,KAAM,CACJk/B,OAAQ,cAGZ,EAAKxlB,GAAGqoB,cAAc,CACpBjiC,UAAW,oBACXkiC,eAAgB,EAAK1iC,QAAQ6e,MAAM8jB,UACnClK,MAAO,EAAKz4B,QAAQ4iC,UACpBd,MAAO,EAAKjgC,KAAKE,KAAKS,KACtBzB,MAAO,EAAKiJ,QAAQm4B,kCAAkC,uBAEvD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,uBAAuB,WACvC,OAAO,EAAKwL,GAAGmmB,YAAY,CACzB,EAAKP,OAAO,CACVx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGymB,uBAAuB,kDAAmD,EAAK7gC,SACjG8e,QAAS,EAAKjd,KAAKE,KAAKU,SACxB/B,KAAM,CACJk/B,OAAQ,cAGZ,EAAKxlB,GAAGqoB,cAAc,CACpBjiC,UAAW,wBACXkiC,eAAgB,EAAK1iC,QAAQ6e,MAAM8jB,UACnClK,MAAO,EAAKz4B,QAAQ6iC,cACpBf,MAAO,EAAKjgC,KAAKE,KAAKU,SACtB1B,MAAO,EAAKiJ,QAAQm4B,kCAAkC,2BAEvD9gC,YAGLnB,KAAK8J,QAAQ4E,KAAK,gBAAgB,WAChC,OAAO,EAAKk0B,aAAa,iBAAkB,EAAKjhC,KAAK0E,MAAMC,QAAQ,GAAM,MAG3EtG,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKk0B,aAAa,kBAAmB,EAAKjhC,KAAK0E,MAAMI,YAAY,GAAO,MAGjFzG,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKk0B,aAAa,kBAAmB,EAAKjhC,KAAK0E,MAAMG,YAAY,GAAM,MAGhFxG,KAAK8J,QAAQ4E,KAAK,aAAa,WAC7B,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMkkB,eAC1CjkB,QAAS,EAAKjd,KAAK6D,MAAMC,UAAY,EAAKu8B,kBAAkB,uBAC5DnhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,gCACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,aAAa,WAC7B,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMmkB,aAC1ClkB,QAAS,EAAKjd,KAAK6D,MAAME,QAAU,EAAKs8B,kBAAkB,qBAC1DnhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,8BACvCjb,YAGL,IAAM4hC,EAAc/iC,KAAK8/B,OAAO,CAC9B1/B,SAAUJ,KAAKka,GAAGomB,KAAKtgC,KAAKF,QAAQ6e,MAAMqkB,WAC1CpkB,QAAS5e,KAAK2B,KAAKmE,UAAUG,KAAOjG,KAAKgiC,kBAAkB,eAC3DnhC,MAAOb,KAAK8J,QAAQsS,oBAAoB,wBAGpC6mB,EAAgBjjC,KAAK8/B,OAAO,CAChC1/B,SAAUJ,KAAKka,GAAGomB,KAAKtgC,KAAKF,QAAQ6e,MAAMukB,aAC1CtkB,QAAS5e,KAAK2B,KAAKmE,UAAUI,OAASlG,KAAKgiC,kBAAkB,iBAC7DnhC,MAAOb,KAAK8J,QAAQsS,oBAAoB,0BAGpC+mB,EAAenjC,KAAK8/B,OAAO,CAC/B1/B,SAAUJ,KAAKka,GAAGomB,KAAKtgC,KAAKF,QAAQ6e,MAAMykB,YAC1CxkB,QAAS5e,KAAK2B,KAAKmE,UAAUK,MAAQnG,KAAKgiC,kBAAkB,gBAC5DnhC,MAAOb,KAAK8J,QAAQsS,oBAAoB,yBAGpCinB,EAAcrjC,KAAK8/B,OAAO,CAC9B1/B,SAAUJ,KAAKka,GAAGomB,KAAKtgC,KAAKF,QAAQ6e,MAAM2kB,cAC1C1kB,QAAS5e,KAAK2B,KAAKmE,UAAUM,QAAUpG,KAAKgiC,kBAAkB,eAC9DnhC,MAAOb,KAAK8J,QAAQsS,oBAAoB,wBAGpCrW,EAAU/F,KAAK8/B,OAAO,CAC1B1/B,SAAUJ,KAAKka,GAAGomB,KAAKtgC,KAAKF,QAAQ6e,MAAM5Y,SAC1C6Y,QAAS5e,KAAK2B,KAAKmE,UAAUC,QAAU/F,KAAKgiC,kBAAkB,WAC9DnhC,MAAOb,KAAK8J,QAAQsS,oBAAoB,oBAGpCpW,EAAShG,KAAK8/B,OAAO,CACzB1/B,SAAUJ,KAAKka,GAAGomB,KAAKtgC,KAAKF,QAAQ6e,MAAM3Y,QAC1C4Y,QAAS5e,KAAK2B,KAAKmE,UAAUE,OAAShG,KAAKgiC,kBAAkB,UAC7DnhC,MAAOb,KAAK8J,QAAQsS,oBAAoB,mBAG1Cpc,KAAK8J,QAAQ4E,KAAK,qBAAsBzB,EAAKxB,OAAOs3B,EAAa,WACjE/iC,KAAK8J,QAAQ4E,KAAK,uBAAwBzB,EAAKxB,OAAOw3B,EAAe,WACrEjjC,KAAK8J,QAAQ4E,KAAK,sBAAuBzB,EAAKxB,OAAO03B,EAAc,WACnEnjC,KAAK8J,QAAQ4E,KAAK,qBAAsBzB,EAAKxB,OAAO43B,EAAa,WACjErjC,KAAK8J,QAAQ4E,KAAK,iBAAkBzB,EAAKxB,OAAO1F,EAAS,WACzD/F,KAAK8J,QAAQ4E,KAAK,gBAAiBzB,EAAKxB,OAAOzF,EAAQ,WAEvDhG,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKwL,GAAGmmB,YAAY,CACzB,EAAKP,OAAO,CACVx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGymB,uBAAuB,EAAKzmB,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMqkB,WAAY,EAAKljC,SAC1F8e,QAAS,EAAKjd,KAAKmE,UAAUA,UAC7BtF,KAAM,CACJk/B,OAAQ,cAGZ,EAAKxlB,GAAG0mB,SAAS,CACf,EAAK1mB,GAAGmmB,YAAY,CAClB//B,UAAW,aACXT,SAAU,CAACkjC,EAAaE,EAAeE,EAAcE,KAEvD,EAAKnpB,GAAGmmB,YAAY,CAClB//B,UAAW,YACXT,SAAU,CAACkG,EAASC,SAGvB7E,YAGLnB,KAAK8J,QAAQ4E,KAAK,iBAAiB,WACjC,OAAO,EAAKwL,GAAGmmB,YAAY,CACzB,EAAKP,OAAO,CACVx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGymB,uBAAuB,EAAKzmB,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM4kB,YAAa,EAAKzjC,SAC3F8e,QAAS,EAAKjd,KAAKE,KAAKK,OACxB1B,KAAM,CACJk/B,OAAQ,cAGZ,EAAKxlB,GAAGqoB,cAAc,CACpBhK,MAAO,EAAKz4B,QAAQ0jC,YACpBhB,eAAgB,EAAK1iC,QAAQ6e,MAAM8jB,UACnCniC,UAAW,uBACXshC,MAAO,EAAKjgC,KAAKE,KAAKK,OACtBrB,MAAO,EAAKiJ,QAAQsS,oBAAoB,yBAEzCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,gBAAgB,WAChC,OAAO,EAAKwL,GAAGmmB,YAAY,CACzB,EAAKP,OAAO,CACVx/B,UAAW,kBACXF,SAAU,EAAK8Z,GAAGymB,uBAAuB,EAAKzmB,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMra,OAAQ,EAAKxE,SACtF8e,QAAS,EAAKjd,KAAK2C,MAAMA,MACzB9D,KAAM,CACJk/B,OAAQ,cAGZ,EAAKxlB,GAAG0mB,SAAS,CACfgB,MAAO,EAAKjgC,KAAK2C,MAAMA,MACvBhE,UAAW,aACXi4B,MAAO,CACL,sCACE,mGACA,wDACA,0DACF,SACA,mDACAxrB,KAAK,OAER,CACDhN,SAAU,SAACG,GACQA,EAAMc,KAAK,uCACnBilB,IAAI,CACX5b,MAAO,EAAKvK,QAAQ2jC,mBAAmBC,IAAM,KAC7CxhC,OAAQ,EAAKpC,QAAQ2jC,mBAAmB7Y,IAAM,OAC7C+Y,UAAU,EAAK75B,QAAQsS,oBAAoB,uBAC3Ctb,GAAG,YAAa,EAAK8iC,iBAAiBzkC,KAAK,OAE/CgC,YAGLnB,KAAK8J,QAAQ4E,KAAK,eAAe,WAC/B,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM3a,MAC1C4a,QAAS,EAAKjd,KAAKqC,KAAKA,KAAO,EAAKg+B,kBAAkB,mBACtDnhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,qBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,kBAAkB,WAClC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMklB,SAC1CjlB,QAAS,EAAKjd,KAAKa,MAAMA,MACzB3B,MAAO,EAAKiJ,QAAQsS,oBAAoB,sBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,gBAAgB,WAChC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM9a,OAC1C+a,QAAS,EAAKjd,KAAKkC,MAAMA,MACzBhD,MAAO,EAAKiJ,QAAQsS,oBAAoB,sBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,aAAa,WAC7B,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMmlB,OAC1CllB,QAAS,EAAKjd,KAAKmD,GAAGrC,OAAS,EAAKu/B,kBAAkB,wBACtDnhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,iCACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,qBAAqB,WACrC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,oCACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMolB,WAC1CnlB,QAAS,EAAKjd,KAAK7B,QAAQ8F,WAC3B/E,MAAO,EAAKiJ,QAAQsS,oBAAoB,uBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,mBAAmB,WACnC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,kCACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM9D,MAC1C+D,QAAS,EAAKjd,KAAK7B,QAAQ+F,SAC3BhF,MAAO,EAAKiJ,QAAQsS,oBAAoB,qBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,eAAe,WAC/B,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMlX,MAC1CmX,QAAS,EAAKjd,KAAK4F,QAAQE,KAAO,EAAKu6B,kBAAkB,QACzDnhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,iBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,eAAe,WAC/B,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMnX,MAC1CoX,QAAS,EAAKjd,KAAK4F,QAAQC,KAAO,EAAKw6B,kBAAkB,QACzDnhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,iBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,eAAe,WAC/B,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMqlB,UAC1CplB,QAAS,EAAKjd,KAAK7B,QAAQ6F,KAC3B9E,MAAO,EAAKiJ,QAAQsS,oBAAoB,qBACvCjb,c,+CAWkB,WAEvBnB,KAAK8J,QAAQ4E,KAAK,qBAAqB,WACrC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,6CACVwe,QAAS,EAAKjd,KAAKa,MAAME,WACzB7B,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,OACxDjb,YAELnB,KAAK8J,QAAQ4E,KAAK,qBAAqB,WACrC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,4CACVwe,QAAS,EAAKjd,KAAKa,MAAMG,WACzB9B,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,SACxDjb,YAELnB,KAAK8J,QAAQ4E,KAAK,wBAAwB,WACxC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,4CACVwe,QAAS,EAAKjd,KAAKa,MAAMI,cACzB/B,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,UACxDjb,YAELnB,KAAK8J,QAAQ4E,KAAK,qBAAqB,WACrC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMslB,UAC1CrlB,QAAS,EAAKjd,KAAKa,MAAMK,WACzBhC,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,OACxDjb,YAILnB,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM7b,WAC1C8b,QAAS,EAAKjd,KAAKa,MAAMM,UACzBjC,MAAO,EAAKiJ,QAAQsS,oBAAoB,iBAAkB,UACzDjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,qBAAqB,WACrC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM5b,YAC1C6b,QAAS,EAAKjd,KAAKa,MAAMO,WACzBlC,MAAO,EAAKiJ,QAAQsS,oBAAoB,iBAAkB,WACzDjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMslB,UAC1CrlB,QAAS,EAAKjd,KAAKa,MAAMQ,UACzBnC,MAAO,EAAKiJ,QAAQsS,oBAAoB,iBAAkB,UACzDjb,YAILnB,KAAK8J,QAAQ4E,KAAK,sBAAsB,WACtC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMulB,OAC1CtlB,QAAS,EAAKjd,KAAKa,MAAMmB,OACzB9C,MAAO,EAAKiJ,QAAQsS,oBAAoB,wBACvCjb,c,8CAIiB,WACtBnB,KAAK8J,QAAQ4E,KAAK,yBAAyB,WACzC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM3a,MAC1C4a,QAAS,EAAKjd,KAAKqC,KAAKE,KACxBrD,MAAO,EAAKiJ,QAAQsS,oBAAoB,qBACvCjb,YAGLnB,KAAK8J,QAAQ4E,KAAK,iBAAiB,WACjC,OAAO,EAAKoxB,OAAO,CACjB1/B,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM1a,QAC1C2a,QAAS,EAAKjd,KAAKqC,KAAKC,OACxBpD,MAAO,EAAKiJ,QAAQsS,oBAAoB,mBACvCjb,c,+CAUkB,WACvBnB,KAAK8J,QAAQ4E,KAAK,mBAAmB,WACnC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,SACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMwlB,UAC1CvlB,QAAS,EAAKjd,KAAK2C,MAAMC,YACzB1D,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,SACxDjb,YAELnB,KAAK8J,QAAQ4E,KAAK,qBAAqB,WACrC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,SACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMylB,UAC1CxlB,QAAS,EAAKjd,KAAK2C,MAAME,YACzB3D,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,YACxDjb,YAELnB,KAAK8J,QAAQ4E,KAAK,qBAAqB,WACrC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,SACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM0lB,WAC1CzlB,QAAS,EAAKjd,KAAK2C,MAAMG,WACzB5D,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,UACxDjb,YAELnB,KAAK8J,QAAQ4E,KAAK,sBAAsB,WACtC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,SACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM2lB,UAC1C1lB,QAAS,EAAKjd,KAAK2C,MAAMI,YACzB7D,MAAO,EAAKiJ,QAAQsS,oBAAoB,gBAAiB,WACxDjb,YAELnB,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,SACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM4lB,WAC1C3lB,QAAS,EAAKjd,KAAK2C,MAAMK,OACzB9D,MAAO,EAAKiJ,QAAQsS,oBAAoB,sBACvCjb,YAELnB,KAAK8J,QAAQ4E,KAAK,oBAAoB,WACpC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,SACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAM6lB,WAC1C5lB,QAAS,EAAKjd,KAAK2C,MAAMM,OACzB/D,MAAO,EAAKiJ,QAAQsS,oBAAoB,sBACvCjb,YAELnB,KAAK8J,QAAQ4E,KAAK,sBAAsB,WACtC,OAAO,EAAKoxB,OAAO,CACjBx/B,UAAW,SACXF,SAAU,EAAK8Z,GAAGomB,KAAK,EAAKxgC,QAAQ6e,MAAMulB,OAC1CtlB,QAAS,EAAKjd,KAAK2C,MAAMO,SACzBhE,MAAO,EAAKiJ,QAAQsS,oBAAoB,wBACvCjb,c,4BAIDJ,EAAY0jC,GAChB,IAAK,IAAIC,EAAW,EAAGC,EAAWF,EAAOrjC,OAAQsjC,EAAWC,EAAUD,IAAY,CAShF,IARA,IAAME,EAAQH,EAAOC,GACfG,EAAYtjC,MAAMC,QAAQojC,GAASA,EAAM,GAAKA,EAC9C1pB,EAAU3Z,MAAMC,QAAQojC,GAA4B,IAAjBA,EAAMxjC,OAAgB,CAACwjC,EAAM,IAAMA,EAAM,GAAM,CAACA,GAEnFE,EAAS9kC,KAAKka,GAAGmmB,YAAY,CACjC//B,UAAW,QAAUukC,IACpB1jC,SAEMgN,EAAM,EAAGG,EAAM4M,EAAQ9Z,OAAQ+M,EAAMG,EAAKH,IAAO,CACxD,IAAM42B,EAAM/kC,KAAK8J,QAAQ4E,KAAK,UAAYwM,EAAQ/M,IAC9C42B,GACFD,EAAOzjC,OAAsB,mBAAR0jC,EAAqBA,EAAI/kC,KAAK8J,SAAWi7B,GAGlED,EAAOlP,SAAS70B,M,yCAODA,GAAY,WACvB4lB,EAAQ5lB,GAAcf,KAAK08B,SAE3BxW,EAAYlmB,KAAK8J,QAAQ2B,OAAO,uBAsBtC,GArBAzL,KAAKglC,gBAAgBre,EAAO,CAC1B,iBAAkB,WAChB,MAAkC,SAA3BT,EAAU,cAEnB,mBAAoB,WAClB,MAAoC,WAA7BA,EAAU,gBAEnB,sBAAuB,WACrB,MAAuC,cAAhCA,EAAU,mBAEnB,sBAAuB,WACrB,MAAuC,cAAhCA,EAAU,mBAEnB,wBAAyB,WACvB,MAAyC,gBAAlCA,EAAU,qBAEnB,0BAA2B,WACzB,MAA2C,kBAApCA,EAAU,yBAIjBA,EAAU,eAAgB,CAC5B,IAAMoc,EAAYpc,EAAU,eAAevZ,MAAM,KAAKC,KAAI,SAAC1O,GACzD,OAAOA,EAAKqW,QAAQ,UAAW,IAC5BA,QAAQ,OAAQ,IAChBA,QAAQ,OAAQ,OAEftM,EAAWzC,EAAMxE,KAAKshC,EAAWtiC,KAAK4J,gBAAgBzK,KAAKa,OAEjE2mB,EAAM3lB,KAAK,wBAAwBP,MAAK,SAAC0N,EAAK3C,GAC5C,IAAMy5B,EAAQ9kC,IAAEqL,GAEV05B,EAAaD,EAAMzkC,KAAK,SAAW,IAASyH,EAAW,GAC7Dg9B,EAAM9R,YAAY,UAAW+R,MAE/Bve,EAAM3lB,KAAK,0BAA0BuX,KAAKtQ,GAAUge,IAAI,cAAehe,GAGzE,GAAIie,EAAU,aAAc,CAC1B,IAAME,EAAWF,EAAU,aAC3BS,EAAM3lB,KAAK,wBAAwBP,MAAK,SAAC0N,EAAK3C,GAC5C,IAAMy5B,EAAQ9kC,IAAEqL,GAEV05B,EAAaD,EAAMzkC,KAAK,SAAW,IAAS4lB,EAAW,GAC7D6e,EAAM9R,YAAY,UAAW+R,MAE/Bve,EAAM3lB,KAAK,0BAA0BuX,KAAK6N,GAE1C,IAAM2K,EAAe7K,EAAU,kBAC/BS,EAAM3lB,KAAK,4BAA4BP,MAAK,SAAC0N,EAAK3C,GAChD,IAAMy5B,EAAQ9kC,IAAEqL,GACV05B,EAAaD,EAAMzkC,KAAK,SAAW,IAASuwB,EAAe,GACjEkU,EAAM9R,YAAY,UAAW+R,MAE/Bve,EAAM3lB,KAAK,8BAA8BuX,KAAKwY,GAGhD,GAAI7K,EAAU,eAAgB,CAC5B,IAAMc,EAAad,EAAU,eAC7BS,EAAM3lB,KAAK,8BAA8BP,MAAK,SAAC0N,EAAK3C,GAElD,IAAM05B,EAAa/kC,IAAEqL,GAAMhL,KAAK,SAAW,IAASwmB,EAAa,GACjE,EAAK1mB,UAAY4kC,EAAY,UAAY,S,sCAK/BnkC,EAAYokC,GAAO,WACjChlC,IAAEM,KAAK0kC,GAAO,SAACC,EAAU/2B,GACvB,EAAK6L,GAAGmrB,gBAAgBtkC,EAAWC,KAAKokC,GAAW/2B,U,uCAItC8N,GACf,IAOImpB,EANEjE,EAAUlhC,IAAEgc,EAAMI,OAAOjL,YACzBi0B,EAAoBlE,EAAQjzB,OAC5Bo3B,EAAWnE,EAAQrgC,KAAK,uCACxBykC,EAAepE,EAAQrgC,KAAK,sCAC5B0kC,EAAiBrE,EAAQrgC,KAAK,wCAIpC,QAAsBya,IAAlBU,EAAMwpB,QAAuB,CAC/B,IAAMC,EAAazlC,IAAEgc,EAAMI,QAAQjK,SACnCgzB,EAAY,CACVvN,EAAG5b,EAAM0pB,MAAQD,EAAW3/B,KAC5B6xB,EAAG3b,EAAM2pB,MAAQF,EAAWz5B,UAG9Bm5B,EAAY,CACVvN,EAAG5b,EAAMwpB,QACT7N,EAAG3b,EAAM4pB,SAIb,IAAMnT,EACDtS,KAAK0lB,KAAKV,EAAUvN,EAvBP,KAuByB,EADrCnF,EAEDtS,KAAK0lB,KAAKV,EAAUxN,EAxBP,KAwByB,EAG3C2N,EAAaxf,IAAI,CAAE5b,MAAOuoB,EAAQ,KAAM1wB,OAAQ0wB,EAAQ,OACxD4S,EAAShlC,KAAK,QAASoyB,EAAQ,IAAMA,GAEjCA,EAAQ,GAAKA,EAAQ5yB,KAAKF,QAAQ2jC,mBAAmBC,KACvDgC,EAAezf,IAAI,CAAE5b,MAAOuoB,EAAQ,EAAI,OAGtCA,EAAQ,GAAKA,EAAQ5yB,KAAKF,QAAQ2jC,mBAAmB7Y,KACvD8a,EAAezf,IAAI,CAAE/jB,OAAQ0wB,EAAQ,EAAI,OAG3C2S,EAAkBllC,KAAKuyB,EAAQ,MAAQA,Q,6MC16BtBqT,G,WACnB,WAAYn8B,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAK48B,QAAUz8B,IAAE5C,QACjByC,KAAKkM,UAAY/L,IAAE4J,UAEnB/J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAK+Z,MAAQjQ,EAAQmQ,WAAW4E,KAChC7e,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAK08B,SAAW5yB,EAAQmQ,WAAW0iB,QACnC38B,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAKg8B,WAAalyB,EAAQmQ,WAAWgiB,UACrCj8B,KAAKF,QAAUgK,EAAQhK,QAEvBE,KAAKkmC,aAAc,EACnBlmC,KAAKmmC,aAAenmC,KAAKmmC,aAAahnC,KAAKa,M,kEAI3C,OAAQA,KAAKF,QAAQ8zB,U,mCAGV,WACX5zB,KAAKF,QAAQ68B,QAAU38B,KAAKF,QAAQ68B,SAAW,GAE1C38B,KAAKF,QAAQ68B,QAAQv7B,OAGxBpB,KAAK8J,QAAQ2B,OAAO,gBAAiBzL,KAAK08B,SAAU18B,KAAKF,QAAQ68B,SAFjE38B,KAAK08B,SAASniB,OAKZva,KAAKF,QAAQsmC,kBACfpmC,KAAK08B,SAAS9G,SAAS51B,KAAKF,QAAQsmC,kBAGtCpmC,KAAKqmC,iBAAgB,GAErBrmC,KAAK+Z,MAAMjZ,GAAG,yDAAyD,WACrE,EAAKgJ,QAAQ2B,OAAO,iCAGtBzL,KAAK8J,QAAQ2B,OAAO,8BAChBzL,KAAKF,QAAQwmC,kBACftmC,KAAK48B,QAAQ97B,GAAG,gBAAiBd,KAAKmmC,gB,gCAKxCnmC,KAAK08B,SAAS78B,WAAW8D,SAErB3D,KAAKF,QAAQwmC,kBACftmC,KAAK48B,QAAQjjB,IAAI,gBAAiB3Z,KAAKmmC,gB,qCAKzC,GAAInmC,KAAK4vB,QAAQjgB,SAAS,cACxB,OAAO,EAGT,IAAM42B,EAAevmC,KAAK4vB,QAAQtW,cAC5BktB,EAAcxmC,KAAK4vB,QAAQvlB,QAC3Bo8B,EAAgBzmC,KAAK08B,SAASx6B,SAC9BwkC,EAAkB1mC,KAAKg8B,WAAW95B,SAGpCykC,EAAiB,EACjB3mC,KAAKF,QAAQ8mC,iBACfD,EAAiBxmC,IAAEH,KAAKF,QAAQ8mC,gBAAgBttB,eAGlD,IAAMutB,EAAgB7mC,KAAKkM,UAAUE,YAC/B06B,EAAkB9mC,KAAK4vB,QAAQtd,SAASnG,IAExC46B,EAAiBD,EAAkBH,EACnCK,EAFqBF,EAAkBP,EAEOI,EAAiBF,EAAgBC,GAEhF1mC,KAAKkmC,aACPW,EAAgBE,GAAoBF,EAAgBG,EAAyBP,GAC9EzmC,KAAKkmC,aAAc,EACnBlmC,KAAKqlB,UAAUY,IAAI,CACjBghB,UAAWjnC,KAAK08B,SAASpjB,gBAE3BtZ,KAAK08B,SAASzW,IAAI,CAChBvT,SAAU,QACVvG,IAAKw6B,EACLt8B,MAAOm8B,EACPU,OAAQ,OAEDlnC,KAAKkmC,cACZW,EAAgBE,GAAoBF,EAAgBG,KACtDhnC,KAAKkmC,aAAc,EACnBlmC,KAAK08B,SAASzW,IAAI,CAChBvT,SAAU,WACVvG,IAAK,EACL9B,MAAO,OACP68B,OAAQ,SAEVlnC,KAAKqlB,UAAUY,IAAI,CACjBghB,UAAW,Q,sCAKD/J,GACVA,EACFl9B,KAAK08B,SAAS3D,UAAU/4B,KAAK4vB,SAEzB5vB,KAAKF,QAAQsmC,kBACfpmC,KAAK08B,SAAS9G,SAAS51B,KAAKF,QAAQsmC,kBAGpCpmC,KAAKF,QAAQwmC,kBACftmC,KAAKmmC,iB,uCAIQjJ,GACfl9B,KAAKka,GAAGmrB,gBAAgBrlC,KAAK08B,SAAS17B,KAAK,mBAAoBk8B,GAE/Dl9B,KAAKqmC,gBAAgBnJ,K,qCAGR7D,GACbr5B,KAAKka,GAAGmrB,gBAAgBrlC,KAAK08B,SAAS17B,KAAK,iBAAkBq4B,GACzDA,EACFr5B,KAAKu6B,aAELv6B,KAAKw6B,a,+BAIA2M,GACP,IAAIC,EAAOpnC,KAAK08B,SAAS17B,KAAK,UACzBmmC,IACHC,EAAOA,EAAKl8B,IAAI,wBAElBlL,KAAKka,GAAGmtB,UAAUD,GAAM,K,iCAGfD,GACT,IAAIC,EAAOpnC,KAAK08B,SAAS17B,KAAK,UACzBmmC,IACHC,EAAOA,EAAKl8B,IAAI,wBAElBlL,KAAKka,GAAGmtB,UAAUD,GAAM,Q,6MC9IPE,G,WACnB,WAAYx9B,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKunC,MAAQpnC,IAAE4J,SAASoT,MACxBnd,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,SAEzB5U,EAAQ4E,KAAK,uBAAwB1O,KAAKF,QAAQ4e,SAAS/Y,KAAK,oB,4DAIhE,IAAM5E,EAAaf,KAAKF,QAAQ0nC,cAAgBxnC,KAAKunC,MAAQvnC,KAAKF,QAAQqY,UACpEgF,EAAO,CACX,2CADW,2CAE2Bnd,KAAKF,QAAQiM,GAFxC,qCAEuE/L,KAAK2B,KAAKqC,KAAKG,cAFtF,sDAG0BnE,KAAKF,QAAQiM,GAHvC,oFAIX,SACA,2CALW,2CAM2B/L,KAAKF,QAAQiM,GANxC,qCAMuE/L,KAAK2B,KAAKqC,KAAKN,IANtF,sDAO0B1D,KAAKF,QAAQiM,GAPvC,mGAQX,SACC/L,KAAKF,QAAQ2nC,kBAMV,GALAtnC,IAAE,UAAUkB,OAAOrB,KAAKka,GAAGwtB,SAAS,CACpCpnC,UAAW,iCACXiY,KAAMvY,KAAK2B,KAAKqC,KAAKI,gBACrBujC,SAAS,IACRxmC,UAAUd,OAEfF,IAAE,UAAUkB,OAAOrB,KAAKka,GAAGwtB,SAAS,CAClCpnC,UAAW,2BACXiY,KAAMvY,KAAK2B,KAAKqC,KAAKK,YACrBsjC,SAAS,IACRxmC,UAAUd,QACb0M,KAAK,IAGD66B,EAAS,wCAAH,OADQ,0DACR,oBAAkE5nC,KAAK2B,KAAKqC,KAAKvB,OAAjF,eAEZzC,KAAK6nC,QAAU7nC,KAAKka,GAAG4tB,OAAO,CAC5BxnC,UAAW,cACXshC,MAAO5hC,KAAK2B,KAAKqC,KAAKvB,OACtBslC,KAAM/nC,KAAKF,QAAQkoC,YACnB7qB,KAAMA,EACNyqB,OAAQA,IACPzmC,SAASy0B,SAAS70B,K,gCAIrBf,KAAKka,GAAG+tB,WAAWjoC,KAAK6nC,SACxB7nC,KAAK6nC,QAAQlkC,W,mCAGFukC,EAAQd,GACnBc,EAAOpnC,GAAG,YAAY,SAACqb,GACjBA,EAAM8H,UAAY/kB,GAAI2b,KAAKuJ,QAC7BjI,EAAME,iBACN+qB,EAAKtrB,QAAQ,e,oCAQLqsB,EAAUC,EAAWC,GACjCroC,KAAKka,GAAGmtB,UAAUc,EAAUC,EAAU9zB,OAAS+zB,EAAS/zB,S,qCAS3Csd,GAAU,WACvB,OAAOzxB,IAAEk1B,UAAS,SAACC,GACjB,IAAM8S,EAAY,EAAKP,QAAQ7mC,KAAK,mBAC9BqnC,EAAW,EAAKR,QAAQ7mC,KAAK,kBAC7BmnC,EAAW,EAAKN,QAAQ7mC,KAAK,kBAC7BsnC,EAAmB,EAAKT,QAC3B7mC,KAAK,wDACFunC,EAAe,EAAKV,QACvB7mC,KAAK,kDAER,EAAKkZ,GAAGsuB,cAAc,EAAKX,SAAS,WAClC,EAAK/9B,QAAQyR,aAAa,iBAGrBqW,EAASluB,KAAOuJ,EAAKS,WAAWkkB,EAASrZ,QAC5CqZ,EAASluB,IAAMkuB,EAASrZ,MAG1B6vB,EAAUtnC,GAAG,8BAA8B,WAGzC8wB,EAASrZ,KAAO6vB,EAAU9zB,MAC1B,EAAKm0B,cAAcN,EAAUC,EAAWC,MACvC/zB,IAAIsd,EAASrZ,MAEhB8vB,EAASvnC,GAAG,8BAA8B,WAGnC8wB,EAASrZ,MACZ6vB,EAAU9zB,IAAI+zB,EAAS/zB,OAEzB,EAAKm0B,cAAcN,EAAUC,EAAWC,MACvC/zB,IAAIsd,EAASluB,KAEXqN,EAAIlI,gBACPw/B,EAASvsB,QAAQ,SAGnB,EAAK2sB,cAAcN,EAAUC,EAAWC,GACxC,EAAKK,aAAaL,EAAUF,GAC5B,EAAKO,aAAaN,EAAWD,GAE7B,IAAMQ,OAA8CltB,IAAzBmW,EAASG,YAChCH,EAASG,YAAc,EAAKjoB,QAAQhK,QAAQ4+B,gBAEhD4J,EAAiBM,KAAK,UAAWD,GAEjC,IAAME,GAAqBjX,EAASluB,KACxB,EAAKoG,QAAQhK,QAAQuE,YAEjCkkC,EAAaK,KAAK,UAAWC,GAE7BV,EAAS3S,IAAI,SAAS,SAACrZ,GACrBA,EAAME,iBAENiZ,EAASG,QAAQ,CACfnQ,MAAOsM,EAAStM,MAChB5hB,IAAK2kC,EAAS/zB,MACdiE,KAAM6vB,EAAU9zB,MAChByd,YAAauW,EAAiBrQ,GAAG,YACjCjG,cAAeuW,EAAatQ,GAAG,cAEjC,EAAK/d,GAAG+tB,WAAW,EAAKJ,eAI5B,EAAK3tB,GAAG4uB,eAAe,EAAKjB,SAAS,WAEnCO,EAAUzuB,MACV0uB,EAAS1uB,MACTwuB,EAASxuB,MAEgB,YAArB2b,EAASyT,SACXzT,EAASI,YAIb,EAAKxb,GAAG8uB,WAAW,EAAKnB,YACvBhS,Y,6BAME,WACCjE,EAAW5xB,KAAK8J,QAAQ2B,OAAO,sBAErCzL,KAAK8J,QAAQ2B,OAAO,oBACpBzL,KAAKipC,eAAerX,GAAUkE,MAAK,SAAClE,GAClC,EAAK9nB,QAAQ2B,OAAO,uBACpB,EAAK3B,QAAQ2B,OAAO,oBAAqBmmB,MACxC5mB,MAAK,WACN,EAAKlB,QAAQ2B,OAAO,+B,6MC1KLy9B,G,WACnB,WAAYp/B,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAKwZ,OAAS,CACZ,0EAA2E,WACzE,EAAK+jB,UAEP,6DAA8D,WAC5D,EAAKhjB,S,kEAMT,OAAQ/U,EAAMsJ,QAAQ9O,KAAKF,QAAQqpC,QAAQnlC,Q,mCAI3ChE,KAAKopC,SAAWppC,KAAKka,GAAGivB,QAAQ,CAC9B7oC,UAAW,oBACXP,SAAU,SAACG,GACQA,EAAMc,KAAK,0CACnBugC,QAAQ,iDAElBpgC,SAASy0B,SAAS51B,KAAKF,QAAQqY,WAClC,IAAMkxB,EAAWrpC,KAAKopC,SAASpoC,KAAK,0CAEpChB,KAAK8J,QAAQ2B,OAAO,gBAAiB49B,EAAUrpC,KAAKF,QAAQqpC,QAAQnlC,MAEpEhE,KAAKopC,SAAStoC,GAAG,aAAa,SAAC2hB,GAAQA,EAAEpG,sB,gCAIzCrc,KAAKopC,SAASzlC,W,+BAKd,GAAK3D,KAAK8J,QAAQ2B,OAAO,mBAAzB,CAKA,IAAM+V,EAAMxhB,KAAK8J,QAAQ2B,OAAO,uBAChC,GAAI+V,EAAIV,eAAiBU,EAAIhC,aAAc,CACzC,IAAM0H,EAASpM,GAAIzJ,SAASmQ,EAAIvC,GAAInE,GAAIlK,UAClC04B,EAAOnpC,IAAE+mB,GAAQtmB,KAAK,QAC5BZ,KAAKopC,SAASpoC,KAAK,KAAKJ,KAAK,OAAQ0oC,GAAM/wB,KAAK+wB,GAEhD,IAAMjwB,EAAMyB,GAAI5B,mBAAmBgO,GAC7BqiB,EAAkBppC,IAAEH,KAAKF,QAAQqY,WAAW7F,SAClD+G,EAAIlN,KAAOo9B,EAAgBp9B,IAC3BkN,EAAIpT,MAAQsjC,EAAgBtjC,KAE5BjG,KAAKopC,SAASnjB,IAAI,CAChB0P,QAAS,QACT1vB,KAAMoT,EAAIpT,KACVkG,IAAKkN,EAAIlN,WAGXnM,KAAKua,YArBLva,KAAKua,S,6BA0BPva,KAAKopC,SAAS7uB,Y,6MCpEGivB,G,WACnB,WAAY1/B,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKunC,MAAQpnC,IAAE4J,SAASoT,MACxBnd,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,S,4DAIzB,IAAI+qB,EAAkB,GACtB,GAAIzpC,KAAKF,QAAQu2B,qBAAsB,CACrC,IAAMxF,EAAOvQ,KAAKopB,MAAMppB,KAAKqpB,IAAI3pC,KAAKF,QAAQu2B,sBAAwB/V,KAAKqpB,IAAI,OACzEC,EAAuF,GAAvE5pC,KAAKF,QAAQu2B,qBAAuB/V,KAAKupB,IAAI,KAAMhZ,IAAO5J,QAAQ,GACrE,IAAM,SAAS4J,GAAQ,IAC1C4Y,EAAkB,UAAH,OAAazpC,KAAK2B,KAAKa,MAAMgB,gBAAkB,MAAQomC,EAAvD,YAGjB,IAAM7oC,EAAaf,KAAKF,QAAQ0nC,cAAgBxnC,KAAKunC,MAAQvnC,KAAKF,QAAQqY,UACpEgF,EAAO,CACX,wEACE,sCAAwCnd,KAAKF,QAAQiM,GAAK,6BAA+B/L,KAAK2B,KAAKa,MAAMe,gBAAkB,WAC3H,qCAAuCvD,KAAKF,QAAQiM,GAAK,6EACzD,mEACA09B,EACF,SACA,gDACE,qCAAuCzpC,KAAKF,QAAQiM,GAAK,6BAA+B/L,KAAK2B,KAAKa,MAAMkB,IAAM,WAC9G,oCAAsC1D,KAAKF,QAAQiM,GAAK,mFAC1D,UACAgB,KAAK,IAED66B,EAAS,wCAAH,OADQ,2DACR,oBAAkE5nC,KAAK2B,KAAKa,MAAMC,OAAlF,eAEZzC,KAAK6nC,QAAU7nC,KAAKka,GAAG4tB,OAAO,CAC5BlG,MAAO5hC,KAAK2B,KAAKa,MAAMC,OACvBslC,KAAM/nC,KAAKF,QAAQkoC,YACnB7qB,KAAMA,EACNyqB,OAAQA,IACPzmC,SAASy0B,SAAS70B,K,gCAIrBf,KAAKka,GAAG+tB,WAAWjoC,KAAK6nC,SACxB7nC,KAAK6nC,QAAQlkC,W,mCAGFukC,EAAQd,GACnBc,EAAOpnC,GAAG,YAAY,SAACqb,GACjBA,EAAM8H,UAAY/kB,GAAI2b,KAAKuJ,QAC7BjI,EAAME,iBACN+qB,EAAKtrB,QAAQ,e,6BAKZ,WACL9b,KAAK8J,QAAQ2B,OAAO,oBACpBzL,KAAK8pC,kBAAkBhU,MAAK,SAACt1B,GAE3B,EAAK0Z,GAAG+tB,WAAW,EAAKJ,SACxB,EAAK/9B,QAAQ2B,OAAO,uBAEA,iBAATjL,EAEL,EAAKV,QAAQ+b,UAAUkuB,kBACzB,EAAKjgC,QAAQyR,aAAa,oBAAqB/a,GAE/C,EAAKsJ,QAAQ2B,OAAO,qBAAsBjL,GAG5C,EAAKsJ,QAAQ2B,OAAO,gCAAiCjL,MAEtDwK,MAAK,WACN,EAAKlB,QAAQ2B,OAAO,4B,wCAUN,WAChB,OAAOtL,IAAEk1B,UAAS,SAACC,GACjB,IAAM0U,EAAc,EAAKnC,QAAQ7mC,KAAK,qBAChCipC,EAAY,EAAKpC,QAAQ7mC,KAAK,mBAC9BkpC,EAAY,EAAKrC,QAAQ7mC,KAAK,mBAEpC,EAAKkZ,GAAGsuB,cAAc,EAAKX,SAAS,WAClC,EAAK/9B,QAAQyR,aAAa,gBAG1ByuB,EAAYG,YAAYH,EAAYl2B,QAAQhT,GAAG,UAAU,SAACqb,GACxDmZ,EAASG,QAAQtZ,EAAMI,OAAO2Z,OAAS/Z,EAAMI,OAAO3d,UACnD0V,IAAI,KAEP21B,EAAUnpC,GAAG,8BAA8B,WACzC,EAAKoZ,GAAGmtB,UAAU6C,EAAWD,EAAU31B,UACtCA,IAAI,IAEFvD,EAAIlI,gBACPohC,EAAUnuB,QAAQ,SAGpBouB,EAAUrpC,OAAM,SAACsb,GACfA,EAAME,iBACNiZ,EAASG,QAAQwU,EAAU31B,UAG7B,EAAKo0B,aAAauB,EAAWC,MAG/B,EAAKhwB,GAAG4uB,eAAe,EAAKjB,SAAS,WACnCmC,EAAYrwB,MACZswB,EAAUtwB,MACVuwB,EAAUvwB,MAEe,YAArB2b,EAASyT,SACXzT,EAASI,YAIb,EAAKxb,GAAG8uB,WAAW,EAAKnB,iB,6MCxHTuC,G,WACnB,WAAYtgC,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GAEvBla,KAAK2b,SAAW7R,EAAQmQ,WAAW0B,SAAS,GAC5C3b,KAAKF,QAAUgK,EAAQhK,QAEvBE,KAAKwZ,OAAS,CACZ,qCAAsC,WACpC,EAAKe,S,kEAMT,OAAQ/U,EAAMsJ,QAAQ9O,KAAKF,QAAQqpC,QAAQ3mC,S,mCAI3CxC,KAAKopC,SAAWppC,KAAKka,GAAGivB,QAAQ,CAC9B7oC,UAAW,uBACVa,SAASy0B,SAAS51B,KAAKF,QAAQqY,WAClC,IAAMkxB,EAAWrpC,KAAKopC,SAASpoC,KAAK,0CACpChB,KAAK8J,QAAQ2B,OAAO,gBAAiB49B,EAAUrpC,KAAKF,QAAQqpC,QAAQ3mC,OAEpExC,KAAKopC,SAAStoC,GAAG,aAAa,SAAC2hB,GAAQA,EAAEpG,sB,gCAIzCrc,KAAKopC,SAASzlC,W,6BAGT4Y,EAAQJ,GACb,GAAIrB,GAAIrF,MAAM8G,GAAS,CACrB,IAAM7J,EAAWvS,IAAEoc,GAAQjK,SACrBi3B,EAAkBppC,IAAEH,KAAKF,QAAQqY,WAAW7F,SAC9C+G,EAAM,GACNrZ,KAAKF,QAAQuqC,YACfhxB,EAAIpT,KAAOkW,EAAM0pB,MAAQ,GACzBxsB,EAAIlN,IAAMgQ,EAAM2pB,OAEhBzsB,EAAM3G,EAER2G,EAAIlN,KAAOo9B,EAAgBp9B,IAC3BkN,EAAIpT,MAAQsjC,EAAgBtjC,KAE5BjG,KAAKopC,SAASnjB,IAAI,CAChB0P,QAAS,QACT1vB,KAAMoT,EAAIpT,KACVkG,IAAKkN,EAAIlN,WAGXnM,KAAKua,S,6BAKPva,KAAKopC,SAAS7uB,Y,6MC9DG+vB,G,WACnB,WAAYxgC,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAKwZ,OAAS,CACZ,uBAAwB,SAAC8jB,EAAI7a,GAC3B,EAAK8a,OAAO9a,EAAElG,SAEhB,uDAAwD,WACtD,EAAKghB,UAEP,qCAAsC,WACpC,EAAKhjB,S,kEAMT,OAAQ/U,EAAMsJ,QAAQ9O,KAAKF,QAAQqpC,QAAQ7kC,S,mCAI3CtE,KAAKopC,SAAWppC,KAAKka,GAAGivB,QAAQ,CAC9B7oC,UAAW,uBACVa,SAASy0B,SAAS51B,KAAKF,QAAQqY,WAClC,IAAMkxB,EAAWrpC,KAAKopC,SAASpoC,KAAK,0CAEpChB,KAAK8J,QAAQ2B,OAAO,gBAAiB49B,EAAUrpC,KAAKF,QAAQqpC,QAAQ7kC,OAGhEyM,EAAI3H,MACNW,SAAS0mB,YAAY,4BAA4B,GAAO,GAG1DzwB,KAAKopC,SAAStoC,GAAG,aAAa,SAAC2hB,GAAQA,EAAEpG,sB,gCAIzCrc,KAAKopC,SAASzlC,W,6BAGT4Y,GACL,GAAIvc,KAAK8J,QAAQ8Q,aACf,OAAO,EAGT,IAAMjK,EAASmK,GAAInK,OAAO4L,GAE1B,GAAI5L,EAAQ,CACV,IAAM0I,EAAMyB,GAAI5B,mBAAmBqD,GAC7BgtB,EAAkBppC,IAAEH,KAAKF,QAAQqY,WAAW7F,SAClD+G,EAAIlN,KAAOo9B,EAAgBp9B,IAC3BkN,EAAIpT,MAAQsjC,EAAgBtjC,KAE5BjG,KAAKopC,SAASnjB,IAAI,CAChB0P,QAAS,QACT1vB,KAAMoT,EAAIpT,KACVkG,IAAKkN,EAAIlN,WAGXnM,KAAKua,OAGP,OAAO5J,I,6BAIP3Q,KAAKopC,SAAS7uB,Y,6MCtEGgwB,G,WACnB,WAAYzgC,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKunC,MAAQpnC,IAAE4J,SAASoT,MACxBnd,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,S,4DAIzB,IAAM3d,EAAaf,KAAKF,QAAQ0nC,cAAgBxnC,KAAKunC,MAAQvnC,KAAKF,QAAQqY,UACpEgF,EAAO,CACX,qDADW,4CAE4Bnd,KAAKF,QAAQiM,GAFzC,qCAEwE/L,KAAK2B,KAAKkC,MAAMH,IAFxF,sCAEyH1D,KAAK2B,KAAKkC,MAAME,UAFzI,+DAG2B/D,KAAKF,QAAQiM,GAHxC,oFAIX,UACAgB,KAAK,IAED66B,EAAS,wCAAH,OADQ,2DACR,oBAAkE5nC,KAAK2B,KAAKkC,MAAMpB,OAAlF,eAEZzC,KAAK6nC,QAAU7nC,KAAKka,GAAG4tB,OAAO,CAC5BlG,MAAO5hC,KAAK2B,KAAKkC,MAAMpB,OACvBslC,KAAM/nC,KAAKF,QAAQkoC,YACnB7qB,KAAMA,EACNyqB,OAAQA,IACPzmC,SAASy0B,SAAS70B,K,gCAIrBf,KAAKka,GAAG+tB,WAAWjoC,KAAK6nC,SACxB7nC,KAAK6nC,QAAQlkC,W,mCAGFukC,EAAQd,GACnBc,EAAOpnC,GAAG,YAAY,SAACqb,GACjBA,EAAM8H,UAAY/kB,GAAI2b,KAAKuJ,QAC7BjI,EAAME,iBACN+qB,EAAKtrB,QAAQ,e,sCAKHpY,GAEd,IAqCI8mC,EAnCEC,EAAU/mC,EAAImV,MAFH,8HAKX6xB,EAAUhnC,EAAImV,MADH,sDAIX8xB,EAASjnC,EAAImV,MADH,mCAIV+xB,EAAWlnC,EAAImV,MADH,qDAIZgyB,EAAUnnC,EAAImV,MADH,kEAIXiyB,EAAapnC,EAAImV,MADH,+CAIdkyB,EAAUrnC,EAAImV,MADH,6BAIXmyB,EAAWtnC,EAAImV,MADH,6DAIZoyB,EAAWvnC,EAAImV,MADH,kBAIZqyB,EAAWxnC,EAAImV,MADH,kBAIZsyB,EAAYznC,EAAImV,MADH,eAIbuyB,EAAU1nC,EAAImV,MADH,2DAIjB,GAAI4xB,GAAiC,KAAtBA,EAAQ,GAAGrpC,OAAe,CACvC,IAAMiqC,EAAYZ,EAAQ,GACtBa,EAAQ,EACZ,QAA0B,IAAfb,EAAQ,GAAoB,CACrC,IAAMc,EAAkBd,EAAQ,GAAG5xB,MAzCd,uCA0CrB,GAAI0yB,EACF,IAAK,IAAInsC,EAAI,CAAC,KAAM,GAAI,GAAI9B,EAAI,EAAGmB,EAAIW,EAAEgC,OAAQ9D,EAAImB,EAAGnB,IACtDguC,QAA4C,IAA3BC,EAAgBjuC,EAAI,GAAqB8B,EAAE9B,GAAK+oB,SAASklB,EAAgBjuC,EAAI,GAAI,IAAM,EAI9GktC,EAASrqC,IAAE,YACRS,KAAK,cAAe,GACpBA,KAAK,MAAO,2BAA6ByqC,GAAaC,EAAQ,EAAI,UAAYA,EAAQ,KACtF1qC,KAAK,QAAS,OAAOA,KAAK,SAAU,YAClC,GAAI8pC,GAAWA,EAAQ,GAAGtpC,OAC/BopC,EAASrqC,IAAE,YACRS,KAAK,cAAe,GACpBA,KAAK,MAAO,2BAA6B8pC,EAAQ,GAAK,WACtD9pC,KAAK,QAAS,OAAOA,KAAK,SAAU,OACpCA,KAAK,YAAa,MAClBA,KAAK,oBAAqB,aACxB,GAAI+pC,GAAUA,EAAO,GAAGvpC,OAC7BopC,EAASrqC,IAAE,YACRS,KAAK,cAAe,GACpBA,KAAK,MAAO+pC,EAAO,GAAK,iBACxB/pC,KAAK,QAAS,OAAOA,KAAK,SAAU,OACpCA,KAAK,QAAS,mBACZ,GAAIgqC,GAAYA,EAAS,GAAGxpC,OACjCopC,EAASrqC,IAAE,qEACRS,KAAK,cAAe,GACpBA,KAAK,MAAO,4BAA8BgqC,EAAS,IACnDhqC,KAAK,QAAS,OAAOA,KAAK,SAAU,YAClC,GAAIiqC,GAAWA,EAAQ,GAAGzpC,OAC/BopC,EAASrqC,IAAE,YACRS,KAAK,cAAe,GACpBA,KAAK,MAAO,qCAAuCiqC,EAAQ,IAC3DjqC,KAAK,QAAS,OAAOA,KAAK,SAAU,YAClC,GAAIkqC,GAAcA,EAAW,GAAG1pC,OACrCopC,EAASrqC,IAAE,qEACRS,KAAK,cAAe,GACpBA,KAAK,SAAU,OACfA,KAAK,QAAS,OACdA,KAAK,MAAO,4BAA8BkqC,EAAW,SACnD,GAAKC,GAAWA,EAAQ,GAAG3pC,QAAY4pC,GAAYA,EAAS,GAAG5pC,OAAS,CAC7E,IAAMoqC,EAAQT,GAAWA,EAAQ,GAAG3pC,OAAU2pC,EAAQ,GAAKC,EAAS,GACpER,EAASrqC,IAAE,qEACRS,KAAK,cAAe,GACpBA,KAAK,SAAU,OACfA,KAAK,QAAS,OACdA,KAAK,MAAO,+CAAiD4qC,EAAM,oBACjE,GAAIP,GAAYC,GAAYC,EACjCX,EAASrqC,IAAE,oBACRS,KAAK,MAAO8C,GACZ9C,KAAK,QAAS,OAAOA,KAAK,SAAU,WAClC,KAAIwqC,IAAWA,EAAQ,GAAGhqC,OAS/B,OAAO,EARPopC,EAASrqC,IAAE,YACRS,KAAK,cAAe,GACpBA,KAAK,MAAO,mDAAqD6qC,mBAAmBL,EAAQ,IAAM,0BAClGxqC,KAAK,QAAS,OAAOA,KAAK,SAAU,OACpCA,KAAK,YAAa,MAClBA,KAAK,oBAAqB,QAQ/B,OAFA4pC,EAAOjqC,SAAS,mBAETiqC,EAAO,K,6BAGT,WACCjyB,EAAOvY,KAAK8J,QAAQ2B,OAAO,0BACjCzL,KAAK8J,QAAQ2B,OAAO,oBACpBzL,KAAK0rC,gBAAgBnzB,GAAMud,MAAK,SAACpyB,GAE/B,EAAKwW,GAAG+tB,WAAW,EAAKJ,SACxB,EAAK/9B,QAAQ2B,OAAO,uBAGpB,IAAMvL,EAAQ,EAAKyrC,gBAAgBjoC,GAE/BxD,GAEF,EAAK4J,QAAQ2B,OAAO,oBAAqBvL,MAE1C8K,MAAK,WACN,EAAKlB,QAAQ2B,OAAO,4B,wCAUI,WAC1B,OAAOtL,IAAEk1B,UAAS,SAACC,GACjB,IAAMsW,EAAY,EAAK/D,QAAQ7mC,KAAK,mBAC9B6qC,EAAY,EAAKhE,QAAQ7mC,KAAK,mBAEpC,EAAKkZ,GAAGsuB,cAAc,EAAKX,SAAS,WAClC,EAAK/9B,QAAQyR,aAAa,gBAE1BqwB,EAAU9qC,GAAG,8BAA8B,WACzC,EAAKoZ,GAAGmtB,UAAUwE,EAAWD,EAAUt3B,UAGpCvD,EAAIlI,gBACP+iC,EAAU9vB,QAAQ,SAGpB+vB,EAAUhrC,OAAM,SAACsb,GACfA,EAAME,iBACNiZ,EAASG,QAAQmW,EAAUt3B,UAG7B,EAAKo0B,aAAakD,EAAWC,MAG/B,EAAK3xB,GAAG4uB,eAAe,EAAKjB,SAAS,WACnC+D,EAAUjyB,MACVkyB,EAAUlyB,MAEe,YAArB2b,EAASyT,SACXzT,EAASI,YAIb,EAAKxb,GAAG8uB,WAAW,EAAKnB,iB,6MCxNTiE,G,WACnB,WAAYhiC,I,4FAAS,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKunC,MAAQpnC,IAAE4J,SAASoT,MACxBnd,KAAK4vB,QAAU9lB,EAAQmQ,WAAWgB,OAClCjb,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAK2B,KAAO3B,KAAKF,QAAQ4e,S,4DAIzB,IAAM3d,EAAaf,KAAKF,QAAQ0nC,cAAgBxnC,KAAKunC,MAAQvnC,KAAKF,QAAQqY,UACpEgF,EAAO,CACX,0BACE,gKACA,uFACA,QACF,KACApQ,IAEF/M,KAAK6nC,QAAU7nC,KAAKka,GAAG4tB,OAAO,CAC5BlG,MAAO5hC,KAAK2B,KAAK7B,QAAQ6F,KACzBoiC,KAAM/nC,KAAKF,QAAQkoC,YACnB7qB,KAAMnd,KAAK+rC,qBACXnE,OAAQzqB,EACRpd,SAAU,SAACG,GACTA,EAAMc,KAAK,gCAAgCilB,IAAI,CAC7C,aAAc,IACd,SAAY,cAGf9kB,SAASy0B,SAAS70B,K,gCAIrBf,KAAKka,GAAG+tB,WAAWjoC,KAAK6nC,SACxB7nC,KAAK6nC,QAAQlkC,W,2CAGM,WACbswB,EAASj0B,KAAKF,QAAQm0B,OAAOljB,EAAI9H,MAAQ,MAAQ,MACvD,OAAO5K,OAAOob,KAAKwa,GAAQrnB,KAAI,SAAC1N,GAC9B,IAAM8sC,EAAU/X,EAAO/0B,GACjB+sC,EAAO9rC,IAAE,iDAKf,OAJA8rC,EAAK5qC,OAAOlB,IAAE,eAAiBjB,EAAM,kBAAkB+mB,IAAI,CACzD,MAAS,IACT,eAAgB,MACd5kB,OAAOlB,IAAE,WAAWE,KAAK,EAAKyJ,QAAQ4E,KAAK,QAAUs9B,IAAYA,IAC9DC,EAAK5rC,UACX0M,KAAK,M,uCAQO,WACf,OAAO5M,IAAEk1B,UAAS,SAACC,GACjB,EAAKpb,GAAGsuB,cAAc,EAAKX,SAAS,WAClC,EAAK/9B,QAAQyR,aAAa,gBAC1B+Z,EAASG,aAEX,EAAKvb,GAAG8uB,WAAW,EAAKnB,YACvBhS,Y,6BAGE,WACL71B,KAAK8J,QAAQ2B,OAAO,oBACpBzL,KAAKksC,iBAAiBpW,MAAK,WACzB,EAAKhsB,QAAQ2B,OAAO,+B,yMCvE1B,IAGqB0gC,G,WACnB,WAAYriC,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EACf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKF,QAAUgK,EAAQhK,QAEvBE,KAAKosC,SAAU,EACfpsC,KAAKqsC,eAAgB,EACrBrsC,KAAK6lC,MAAQ,KACb7lC,KAAK8lC,MAAQ,KAEb9lC,KAAKwZ,OAAS,CACZ,yBAA0B,SAACiJ,GACrB,EAAK3iB,QAAQ8b,UACf6G,EAAEpG,iBACFoG,EAAE0Z,kBACF,EAAKkQ,eAAgB,EACrB,EAAK9O,QAAO,KAGhB,uBAAwB,SAACD,EAAI7a,GAC3B,EAAKojB,MAAQpjB,EAAEojB,MACf,EAAKC,MAAQrjB,EAAEqjB,OAEjB,wDAAyD,SAACxI,EAAI7a,GACxD,EAAK3iB,QAAQ8b,UAAY,EAAKywB,gBAChC,EAAKxG,MAAQpjB,EAAEojB,MACf,EAAKC,MAAQrjB,EAAEqjB,MACf,EAAKvI,UAEP,EAAK8O,eAAgB,GAEvB,+EAAgF,WAC9E,EAAK9xB,QAEP,sBAAuB,WAChB,EAAK6uB,SAASnR,GAAG,mBACpB,EAAK1d,S,kEAOX,OAAOva,KAAKF,QAAQ8zB,UAAYpuB,EAAMsJ,QAAQ9O,KAAKF,QAAQqpC,QAAQmD,O,mCAGxD,WACXtsC,KAAKopC,SAAWppC,KAAKka,GAAGivB,QAAQ,CAC9B7oC,UAAW,qBACVa,SAASy0B,SAAS51B,KAAKF,QAAQqY,WAClC,IAAMkxB,EAAWrpC,KAAKopC,SAASpoC,KAAK,oBAEpChB,KAAK8J,QAAQ2B,OAAO,gBAAiB49B,EAAUrpC,KAAKF,QAAQqpC,QAAQmD,KAGpEtsC,KAAKopC,SAAStoC,GAAG,aAAa,WAAQ,EAAKsrC,SAAU,KAErDpsC,KAAKopC,SAAStoC,GAAG,WAAW,WAAQ,EAAKsrC,SAAU,O,gCAInDpsC,KAAKopC,SAASzlC,W,6BAGT4oC,GACL,IAAMrmB,EAAYlmB,KAAK8J,QAAQ2B,OAAO,uBACtC,IAAIya,EAAUZ,OAAWY,EAAUZ,MAAMxE,gBAAiByrB,EAiBxDvsC,KAAKua,WAjBiE,CACtE,IAAItO,EAAO,CACThG,KAAMjG,KAAK6lC,MACX15B,IAAKnM,KAAK8lC,OAGNyD,EAAkBppC,IAAEH,KAAKF,QAAQqY,WAAW7F,SAClDrG,EAAKE,KAAOo9B,EAAgBp9B,IAC5BF,EAAKhG,MAAQsjC,EAAgBtjC,KAE7BjG,KAAKopC,SAASnjB,IAAI,CAChB0P,QAAS,QACT1vB,KAAMqa,KAAKkc,IAAIvwB,EAAKhG,KAAM,IAlFD,EAmFzBkG,IAAKF,EAAKE,IAlFe,IAoF3BnM,KAAK8J,QAAQ2B,OAAO,6BAA8BzL,KAAKopC,a,qCAM5C/P,GACbr5B,KAAKka,GAAGmrB,gBAAgBrlC,KAAKopC,SAASpoC,KAAK,iBAAkBq4B,GACzDA,GACFr5B,KAAKua,S,6BAKHva,KAAKosC,SACPpsC,KAAKopC,SAAS7uB,Y,yMChGpB,IAEqBiyB,G,WACnB,WAAY1iC,GAAS,Y,4FAAA,SACnB9J,KAAK8J,QAAUA,EAEf9J,KAAKka,GAAK/Z,IAAEuB,WAAWwY,GACvBla,KAAKqlB,UAAYvb,EAAQmQ,WAAW0B,SACpC3b,KAAKF,QAAUgK,EAAQhK,QACvBE,KAAKysC,KAAOzsC,KAAKF,QAAQ2sC,MAAQ,GACjCzsC,KAAK0sC,UAAY1sC,KAAKF,QAAQ6sC,eAAiB,SAC/C3sC,KAAK4sC,MAAQrrC,MAAMC,QAAQxB,KAAKysC,MAAQzsC,KAAKysC,KAAO,CAACzsC,KAAKysC,MAE1DzsC,KAAKwZ,OAAS,CACZ,mBAAoB,SAAC8jB,EAAI7a,GAClBA,EAAE6Q,sBACL,EAAK8K,YAAY3b,IAGrB,qBAAsB,SAAC6a,EAAI7a,GACzB,EAAK4b,cAAc5b,IAErB,6DAA8D,WAC5D,EAAKlI,S,kEAMT,OAAOva,KAAK4sC,MAAMxrC,OAAS,I,mCAGhB,WACXpB,KAAKs+B,cAAgB,KACrBt+B,KAAK6sC,aAAe,KACpB7sC,KAAKopC,SAAWppC,KAAKka,GAAGivB,QAAQ,CAC9B7oC,UAAW,oBACXwsC,WAAW,EACXJ,UAAW,KACVvrC,SAASy0B,SAAS51B,KAAKF,QAAQqY,WAElCnY,KAAKopC,SAAS7uB,OACdva,KAAKqpC,SAAWrpC,KAAKopC,SAASpoC,KAAK,0CACnChB,KAAKqpC,SAASvoC,GAAG,QAAS,mBAAmB,SAAC2hB,GAC5C,EAAK4mB,SAASroC,KAAK,WAAWy4B,YAAY,UAC1Ct5B,IAAEsiB,EAAE+d,eAAejgC,SAAS,UAC5B,EAAKgU,aAGPvU,KAAKopC,SAAStoC,GAAG,aAAa,SAAC2hB,GAAQA,EAAEpG,sB,gCAIzCrc,KAAKopC,SAASzlC,W,iCAGLshC,GACTjlC,KAAKqpC,SAASroC,KAAK,WAAWy4B,YAAY,UAC1CwL,EAAM1kC,SAAS,UAEfP,KAAKqpC,SAAS,GAAGj9B,UAAY64B,EAAM,GAAG5kB,UAAargB,KAAKqpC,SAAS0D,cAAgB,I,iCAIjF,IAAMC,EAAWhtC,KAAKqpC,SAASroC,KAAK,0BAC9BisC,EAAQD,EAAS5+B,OAEvB,GAAI6+B,EAAM7rC,OACRpB,KAAKktC,WAAWD,OACX,CACL,IAAIE,EAAaH,EAASj7B,SAAS3D,OAE9B++B,EAAW/rC,SACd+rC,EAAantC,KAAKqpC,SAASroC,KAAK,oBAAoB8d,SAGtD9e,KAAKktC,WAAWC,EAAWnsC,KAAK,mBAAmB8d,Y,+BAKrD,IAAMkuB,EAAWhtC,KAAKqpC,SAASroC,KAAK,0BAC9BosC,EAAQJ,EAAS9+B,OAEvB,GAAIk/B,EAAMhsC,OACRpB,KAAKktC,WAAWE,OACX,CACL,IAAIC,EAAaL,EAASj7B,SAAS7D,OAE9Bm/B,EAAWjsC,SACdisC,EAAartC,KAAKqpC,SAASroC,KAAK,oBAAoB6M,QAGtD7N,KAAKktC,WAAWG,EAAWrsC,KAAK,mBAAmB6M,W,gCAKrD,IAAMo3B,EAAQjlC,KAAKqpC,SAASroC,KAAK,0BAEjC,GAAIikC,EAAM7jC,OAAQ,CAChB,IAAIsO,EAAO1P,KAAKstC,aAAarI,GAE7B,GAA0B,OAAtBjlC,KAAK6sC,cAAsD,IAA7B7sC,KAAK6sC,aAAazrC,OAClDpB,KAAKs+B,cAAcpf,GAAKlf,KAAKs+B,cAAclf,QAEtC,GAA0B,OAAtBpf,KAAK6sC,cAAyB7sC,KAAK6sC,aAAazrC,OAAS,IAAMpB,KAAKs+B,cAAcxd,cAAe,CAC1G,IAAIysB,EAAevtC,KAAKs+B,cAAclf,GAAKpf,KAAKs+B,cAAcpf,GAAKlf,KAAK6sC,aAAazrC,OACjFmsC,EAAe,IACjBvtC,KAAKs+B,cAAcpf,IAAMquB,GAK7B,GAFAvtC,KAAKs+B,cAAcpc,WAAWxS,GAEE,SAA5B1P,KAAKF,QAAQ0tC,WAAuB,CACtC,IAAI/4B,EAAQ1K,SAASyO,eAAe,IACpCrY,IAAEuP,GAAM2e,MAAM5Z,GACd6Q,GAAM5B,qBAAqBjP,GAAO9M,cAElC2d,GAAM3B,oBAAoBjU,GAAM/H,SAGlC3H,KAAKs+B,cAAgB,KACrBt+B,KAAKua,OACLva,KAAK8J,QAAQ2B,OAAO,mB,mCAIXw5B,GACX,IAAMwH,EAAOzsC,KAAK4sC,MAAM3H,EAAMzkC,KAAK,UAC7BgL,EAAOy5B,EAAMzkC,KAAK,QACpBkP,EAAO+8B,EAAK7S,QAAU6S,EAAK7S,QAAQpuB,GAAQA,EAI/C,MAHoB,iBAATkE,IACTA,EAAOoL,GAAIxC,WAAW5I,IAEjBA,I,0CAGW+9B,EAASlV,GAC3B,IAAMkU,EAAOzsC,KAAK4sC,MAAMa,GACxB,OAAOlV,EAAM3rB,KAAI,SAACpB,GAChB,IAAMy5B,EAAQ9kC,IAAE,iCAMhB,OALA8kC,EAAM5jC,OAAOorC,EAAK5K,SAAW4K,EAAK5K,SAASr2B,GAAQA,EAAO,IAC1Dy5B,EAAMzkC,KAAK,CACT,MAASitC,EACT,KAAQjiC,IAEHy5B,O,oCAIGxiB,GACPziB,KAAKopC,SAASnR,GAAG,cAIlBxV,EAAEwB,UAAY/kB,GAAI2b,KAAKuJ,OACzB3B,EAAEpG,iBACFrc,KAAKuU,WACIkO,EAAEwB,UAAY/kB,GAAI2b,KAAK4J,IAChChC,EAAEpG,iBACFrc,KAAK0tC,UACIjrB,EAAEwB,UAAY/kB,GAAI2b,KAAK8J,OAChClC,EAAEpG,iBACFrc,KAAK2tC,e,oCAIKprB,EAAOgc,EAASx+B,GAC5B,IAAM0sC,EAAOzsC,KAAK4sC,MAAMrqB,GACxB,GAAIkqB,GAAQA,EAAK5zB,MAAMrQ,KAAK+1B,IAAYkO,EAAKmB,OAAQ,CACnD,IAAMnlC,EAAUgkC,EAAK5zB,MAAMnQ,KAAK61B,GAChCv+B,KAAK6sC,aAAepkC,EAAQ,GAC5BgkC,EAAKmB,OAAOnlC,EAAQ,GAAI1I,QAExBA,M,kCAIQoO,EAAKowB,GAAS,WAClBuG,EAAS3kC,IAAE,+CAAiDgO,EAAM,YASxE,OARAnO,KAAK6tC,cAAc1/B,EAAKowB,GAAS,SAAChG,IAChCA,EAAQA,GAAS,IACPn3B,SACR0jC,EAAOzkC,KAAK,EAAKytC,oBAAoB3/B,EAAKoqB,IAC1C,EAAKtC,WAIF6O,I,kCAGGriB,GAAG,WACb,IAAKjd,EAAMwI,SAAS,CAAC9O,GAAI2b,KAAKuJ,MAAOllB,GAAI2b,KAAK4J,GAAIvlB,GAAI2b,KAAK8J,MAAOlC,EAAEwB,SAAU,CAC5E,IACI0a,EAAWJ,EADXjZ,EAAQtlB,KAAK8J,QAAQ2B,OAAO,uBAEhC,GAA8B,UAA1BzL,KAAKF,QAAQiuC,SAAsB,CAWrC,GAVApP,EAAYrZ,EAAM0oB,cAAc1oB,GAChCiZ,EAAUI,EAAUxc,WAEpBniB,KAAK4sC,MAAM3rC,SAAQ,SAACwrC,GAClB,GAAIA,EAAK5zB,MAAMrQ,KAAK+1B,GAElB,OADAI,EAAYrZ,EAAM2oB,mBAAmBxB,EAAK5zB,QACnC,MAIN8lB,EAEH,YADA3+B,KAAKua,OAIPgkB,EAAUI,EAAUxc,gBAEpBwc,EAAYrZ,EAAMsZ,eAClBL,EAAUI,EAAUxc,WAGtB,GAAIniB,KAAK4sC,MAAMxrC,QAAUm9B,EAAS,CAChCv+B,KAAKqpC,SAAS6E,QAEd,IAAMC,EAAMlhC,EAAKjB,SAASxG,EAAMqI,KAAK8wB,EAAUhc,mBACzC4mB,EAAkBppC,IAAEH,KAAKF,QAAQqY,WAAW7F,SAC9C67B,IACFA,EAAIhiC,KAAOo9B,EAAgBp9B,IAC3BgiC,EAAIloC,MAAQsjC,EAAgBtjC,KAE5BjG,KAAKopC,SAAS7uB,OACdva,KAAKs+B,cAAgBK,EACrB3+B,KAAK4sC,MAAM3rC,SAAQ,SAACwrC,EAAMt+B,GACpBs+B,EAAK5zB,MAAMrQ,KAAK+1B,IAClB,EAAK6P,YAAYjgC,EAAKowB,GAAS3I,SAAS,EAAKyT,aAIjDrpC,KAAKqpC,SAASroC,KAAK,yBAAyBT,SAAS,UAG9B,QAAnBP,KAAK0sC,UACP1sC,KAAKopC,SAASnjB,IAAI,CAChBhgB,KAAMkoC,EAAIloC,KACVkG,IAAKgiC,EAAIhiC,IAAMnM,KAAKopC,SAAS9vB,cAjPtB,IAoPTtZ,KAAKopC,SAASnjB,IAAI,CAChBhgB,KAAMkoC,EAAIloC,KACVkG,IAAKgiC,EAAIhiC,IAAMgiC,EAAIjsC,OAtPZ,UA2PblC,KAAKua,U,6BAMTva,KAAKopC,SAASnT,S,6BAIdj2B,KAAKopC,SAAS7uB,Y,kCC/OlBpa,IAAEuB,WAAavB,IAAEyB,OAAOzB,IAAEuB,WAAY,CACpC2sC,QAAS,SACTlzB,QAAS,GAETL,IAAKA,GACLwK,MAAOA,GACP9f,MAAOA,EAEP1F,QAAS,CACP4e,SAAUve,IAAEuB,WAAWC,KAAK,SAC5Bia,SAAS,EACT/d,QAAS,CACP,OAAU8xB,GACV,UAAawI,GACb,SAAYQ,GACZ,SAAY2V,GACZ,UAAavS,GACb,WAAcU,GACd,OAAUU,GAGV,YAAeqP,GACf,SAAYrO,GACZ,SAAYU,GACZ,YAAeC,GACf,YAAeS,GACf,QAAWI,GACX,QAAWsG,GACX,WAAcqB,GACd,YAAe4B,GACf,YAAeM,GACf,aAAgBY,GAChB,aAAgBE,GAChB,YAAeC,GACf,WAAcuB,GACd,WAAcK,IAGhBjxB,QAAS,GAETvZ,KAAM,QAEN2kC,kBAAkB,EAClBiI,gBAAiB,MACjB3H,eAAgB,GAGhB4H,oBAAoB,EACpB7R,QAAS,CACP,CAAC,QAAS,CAAC,UACX,CAAC,OAAQ,CAAC,OAAQ,YAAa,UAC/B,CAAC,WAAY,CAAC,aACd,CAAC,QAAS,CAAC,UACX,CAAC,OAAQ,CAAC,KAAM,KAAM,cACtB,CAAC,QAAS,CAAC,UACX,CAAC,SAAU,CAAC,OAAQ,UAAW,UAC/B,CAAC,OAAQ,CAAC,aAAc,WAAY,UAItC0N,YAAY,EACZlB,QAAS,CACP3mC,MAAO,CACL,CAAC,SAAU,CAAC,aAAc,aAAc,gBAAiB,eACzD,CAAC,QAAS,CAAC,YAAa,aAAc,cACtC,CAAC,SAAU,CAAC,iBAEdwB,KAAM,CACJ,CAAC,OAAQ,CAAC,iBAAkB,YAE9BM,MAAO,CACL,CAAC,MAAO,CAAC,aAAc,WAAY,aAAc,gBACjD,CAAC,SAAU,CAAC,YAAa,YAAa,iBAExCgoC,IAAK,CACH,CAAC,QAAS,CAAC,UACX,CAAC,OAAQ,CAAC,OAAQ,YAAa,UAC/B,CAAC,OAAQ,CAAC,KAAM,cAChB,CAAC,QAAS,CAAC,UACX,CAAC,SAAU,CAAC,OAAQ,YACpB,CAAC,OAAQ,CAAC,aAAc,eAK5B1Y,SAAS,EACTC,qBAAqB,EAErBxpB,MAAO,KACPnI,OAAQ,KACRw8B,iBAAiB,EACjBr6B,aAAa,EACb+tB,gBAAiB,UAEjBrT,OAAO,EACP0vB,aAAa,EACbxZ,QAAS,EACTH,cAAc,EACd9tB,WAAW,EACX0nC,kBAAkB,EAClB9vB,QAAS,OACTzG,UAAW,KACXuc,cAAe,EACfxL,wBAAyB,EACzBwK,YAAY,EACZC,gBAAgB,EAChBxa,YAAa,KACbqmB,oBAAoB,EAEpB/L,sBAAsB,EACtB9N,aAAc,IAGd8Y,2BAA2B,EAG3BsP,SAAU,OACVP,WAAY,QACZb,cAAe,SAEfhL,UAAW,CAAC,IAAK,aAAc,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,MAEpEW,UAAW,CACT,QAAS,cAAe,gBAAiB,cACzC,iBAAkB,YAAa,SAAU,gBACzC,SAAU,kBAAmB,WAE/BlC,qBAAsB,GACtB+B,iBAAiB,EAEjBO,UAAW,CAAC,IAAK,IAAK,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAE1DC,cAAe,CAAC,KAAM,MAGtB3B,OAAQ,CACN,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC9E,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC9E,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC9E,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC9E,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC9E,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC9E,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,WAC9E,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YAIhFC,WAAY,CACV,CAAC,QAAS,UAAW,YAAa,YAAa,aAAc,UAAW,YAAa,SACrF,CAAC,MAAO,cAAe,SAAU,QAAS,OAAQ,OAAQ,kBAAmB,WAC7E,CAAC,SAAU,QAAS,YAAa,QAAS,aAAc,gBAAiB,UAAW,YACpF,CAAC,aAAc,eAAgB,eAAgB,SAAU,SAAU,SAAU,cAAe,eAC5F,CAAC,QAAS,QAAS,YAAa,UAAW,cAAe,SAAU,kBAAmB,QACvF,CAAC,gBAAiB,YAAa,eAAgB,mBAAoB,aAAc,cAAe,iBAAkB,YAClH,CAAC,UAAW,UAAW,cAAe,eAAgB,OAAQ,cAAe,YAAa,UAC1F,CAAC,WAAY,WAAY,QAAS,UAAW,QAAS,gBAAiB,YAAa,WAGtFP,YAAa,CACXjO,UAAW,UACXC,UAAW,WAGb8Q,YAAa,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAE/D9T,eAAgB,uBAEhB+T,mBAAoB,CAClBC,IAAK,GACL9Y,IAAK,IAIP4c,eAAe,EACfQ,aAAa,EAEb3R,qBAAsB,KAEtBxa,UAAW,CACT8yB,gBAAiB,KACjBC,OAAQ,KACRC,eAAgB,KAChBC,SAAU,KACVC,iBAAkB,KAClBvG,cAAe,KACfwG,QAAS,KACTC,QAAS,KACTlF,kBAAmB,KACnBjT,cAAe,KACfoY,mBAAoB,KACpBC,OAAQ,KACRC,UAAW,KACXC,QAAS,KACTC,YAAa,KACbC,UAAW,KACXC,QAAS,KACTC,SAAU,MAGZvV,WAAY,CACVp7B,KAAM,YACN4wC,UAAU,EACVC,aAAa,GAGflV,gBAAgB,EAChBC,oBAAqB,0IACrBC,sBAAsB,EACtBE,2BAA4B,GAC5BC,+BAAgC,CAC9B,kBACA,2BACA,mBACA,UACA,gBACA,mBACA,sBACA,mBACA,YAGF7G,OAAQ,CACN2b,GAAI,CACF,IAAO,SACP,MAAS,kBACT,SAAU,OACV,SAAU,OACV,IAAO,MACP,YAAa,QACb,SAAU,OACV,SAAU,SACV,SAAU,YACV,eAAgB,gBAChB,iBAAkB,eAClB,eAAgB,cAChB,eAAgB,gBAChB,eAAgB,eAChB,eAAgB,cAChB,kBAAmB,sBACnB,kBAAmB,oBACnB,mBAAoB,UACpB,oBAAqB,SACrB,YAAa,aACb,YAAa,WACb,YAAa,WACb,YAAa,WACb,YAAa,WACb,YAAa,WACb,YAAa,WACb,aAAc,uBACd,SAAU,mBAGZC,IAAK,CACH,IAAO,SACP,MAAS,kBACT,QAAS,OACT,cAAe,OACf,IAAO,MACP,YAAa,QACb,QAAS,OACT,QAAS,SACT,QAAS,YACT,cAAe,gBACf,gBAAiB,eACjB,cAAe,cACf,cAAe,gBACf,cAAe,eACf,cAAe,cACf,iBAAkB,sBAClB,iBAAkB,oBAClB,kBAAmB,UACnB,mBAAoB,SACpB,WAAY,aACZ,WAAY,WACZ,WAAY,WACZ,WAAY,WACZ,WAAY,WACZ,WAAY,WACZ,WAAY,WACZ,YAAa,uBACb,QAAS,oBAGblxB,MAAO,CACL,MAAS,kBACT,YAAe,yBACf,aAAgB,0BAChB,UAAa,uBACb,WAAc,wBACd,SAAY,sBACZ,UAAa,uBACb,SAAY,sBACZ,SAAY,sBACZ,UAAa,uBACb,UAAa,uBACb,OAAU,yBACV,QAAW,0BACX,UAAa,uBACb,KAAQ,iBACR,MAAS,kBACT,OAAU,mBACV,MAAS,kBACT,KAAQ,iBACR,OAAU,mBACV,UAAa,uBACb,WAAc,wBACd,KAAQ,iBACR,MAAS,kBACT,OAAU,mBACV,KAAQ,iBACR,OAAU,yBACV,MAAS,kBACT,UAAa,uBACb,MAAS,kBACT,YAAe,wBACf,OAAU,mBACV,QAAW,oBACX,SAAY,qBACZ,KAAQ,iBACR,SAAY,qBACZ,OAAU,mBACV,cAAiB,0BACjB,UAAa,sBACb,YAAe,wBACf,MAAS,kBACT,WAAc,wBACd,MAAS,kBACT,UAAa,sBACb,KAAQ,iBACR,cAAiB,0BACjB,MAAS,uB,2TCrWf,IAAM1D,EAAS60B,IAAS7wC,OAAO,6DACzB09B,EAAUmT,IAAS7wC,OAAO,4DAC1Bo+B,EAAcyS,IAAS7wC,OAAO,oCAC9Byc,EAAUo0B,IAAS7wC,OAAO,0DAC1B0c,EAAWm0B,IAAS7wC,OAAO,4FAC3Bg9B,EAAY6T,IAAS7wC,OAAO,CAChC,gFACA,6CACE,mDACE,oCACA,oCACA,oCACF,SACF,UACA8N,KAAK,KAEDgjC,EAAYD,IAAS7wC,OAAO,4CAC5B+wC,EAAcF,IAAS7wC,OAAO,CAClC,gGACA,iFACA8N,KAAK,KAEDszB,EAAcyP,IAAS7wC,OAAO,0CAE9B2hC,EAAWkP,IAAS7wC,OAAO,iDAAiD,SAASiB,EAAOJ,GAChG,IAAMF,EAAS2B,MAAMC,QAAQ1B,EAAQy4B,OAASz4B,EAAQy4B,MAAM3rB,KAAI,SAASpB,GACvE,IAAM5M,EAAyB,iBAAT4M,EAAqBA,EAAQA,EAAK5M,OAAS,GAC3Dg7B,EAAU95B,EAAQ+hC,SAAW/hC,EAAQ+hC,SAASr2B,GAAQA,EACtDykC,EAA0B,WAAhB,EAAOzkC,GAAqBA,EAAKykC,YAASx0B,EAI1D,MAAO,mBAAqB7c,EAAQ,kBAFlB,eAAiBA,EAAQ,UACZ6c,IAAXw0B,EAAwB,iBAAmBA,EAAS,IAAM,KACI,IAAMrW,EAAU,eACjG7sB,KAAK,IAAMjN,EAAQy4B,MAEtBr4B,EAAMG,KAAKT,GAAQgB,KAAK,CAAE,aAAcd,EAAQ8hC,QAE5C9hC,GAAWA,EAAQ0uC,oBACrBtuC,EAAMK,SAAS,yBAIbogC,EAAyB,SAASvgC,EAAUN,GAChD,OAAOM,EAAW,IAAMkgC,EAAKxgC,EAAQ6e,MAAMuxB,MAAO,SAG9C3N,EAAgBuN,IAAS7wC,OAAO,4DAA4D,SAASiB,EAAOJ,GAChH,IAAMF,EAAS2B,MAAMC,QAAQ1B,EAAQy4B,OAASz4B,EAAQy4B,MAAM3rB,KAAI,SAASpB,GACvE,IAAM5M,EAAyB,iBAAT4M,EAAqBA,EAAQA,EAAK5M,OAAS,GAC3Dg7B,EAAU95B,EAAQ+hC,SAAW/hC,EAAQ+hC,SAASr2B,GAAQA,EAC5D,MAAO,mBAAqBA,EAAO,6BAA+B5M,EAAQ,KAAO0hC,EAAKxgC,EAAQ0iC,gBAAkB,IAAM5I,EAAU,eAC/H7sB,KAAK,IAAMjN,EAAQy4B,MACtBr4B,EAAMG,KAAKT,GAAQgB,KAAK,CAAE,aAAcd,EAAQ8hC,QAE5C9hC,GAAWA,EAAQ0uC,oBACrBtuC,EAAMK,SAAS,yBAIbunC,EAASgI,IAAS7wC,OAAO,mFAAmF,SAASiB,EAAOJ,GAC5HA,EAAQioC,MACV7nC,EAAMK,SAAS,QAEjBL,EAAMU,KAAK,CACT,aAAcd,EAAQ8hC,QAExB1hC,EAAMG,KAAK,CACT,6BACE,8BACGP,EAAQ8hC,MAAQ,oKAEc9hC,EAAQ8hC,MAFtB,cAGN,GACX,2BAA6B9hC,EAAQqd,KAAO,SAC3Crd,EAAQ8nC,OAAS,6BAA+B9nC,EAAQ8nC,OAAS,SAAW,GAC/E,SACF,UACA76B,KAAK,QAGHo8B,EAAU2G,IAAS7wC,OAAO,CAC9B,wCACE,4BACA,8DACF,UACA8N,KAAK,KAAK,SAAS7M,EAAOJ,GAC1B,IAAM4sC,OAAyC,IAAtB5sC,EAAQ4sC,UAA4B5sC,EAAQ4sC,UAAY,SAEjFxsC,EAAMK,SAASmsC,GAEX5sC,EAAQgtC,WACV5sC,EAAMc,KAAK,UAAUuZ,UAInBmtB,EAAWoI,IAAS7wC,OAAO,gCAAgC,SAASiB,EAAOJ,GAC/EI,EAAMG,KAAK,CACT,UAAYP,EAAQiM,GAAK,cAAgBjM,EAAQiM,GAAK,IAAM,IAAM,IAChE,0BAA4BjM,EAAQiM,GAAK,aAAejM,EAAQiM,GAAK,IAAM,IACxEjM,EAAQ6nC,QAAU,WAAa,GAChC,mBAAqB7nC,EAAQ6nC,QAAU,OAAS,SAAW,MAC5D7nC,EAAQyY,KAAOzY,EAAQyY,KAAO,GACjC,YACAxL,KAAK,QAGHuzB,EAAO,SAAS6P,EAAejjB,GAEnC,MAAO,KADPA,EAAUA,GAAW,KACE,WAAaijB,EAAgB,OAASjjB,EAAQ,KAqJxDhT,EAlJJ,SAASk2B,GAClB,MAAO,CACLn1B,OAAQA,EACR0hB,QAASA,EACTU,YAAaA,EACb3hB,QAASA,EACTC,SAAUA,EACVsgB,UAAWA,EACX8T,UAAWA,EACXC,YAAaA,EACb3P,YAAaA,EACbO,SAAUA,EACVD,uBAAwBA,EACxB4B,cAAeA,EACfuF,OAAQA,EACRqB,QAASA,EACTzB,SAAUA,EACVpH,KAAMA,EACNxgC,QAASswC,EAETrP,QAAS,SAAS7gC,EAAOJ,GACvB,OAAOgwC,IAAS7wC,OAAO,qCAAqC,SAASiB,EAAOJ,GAE1E,IADA,IAAMM,EAAW,GACRwqB,EAAM,EAAGylB,EAAUvwC,EAAQkhC,OAAO5/B,OAAQwpB,EAAMylB,EAASzlB,IAAO,CAKvE,IAJA,IAAM2J,EAAYz0B,EAAQy0B,UACpByM,EAASlhC,EAAQkhC,OAAOpW,GACxBqW,EAAanhC,EAAQmhC,WAAWrW,GAChC1P,EAAU,GACPwoB,EAAM,EAAG4M,EAAUtP,EAAO5/B,OAAQsiC,EAAM4M,EAAS5M,IAAO,CAC/D,IAAMr9B,EAAQ26B,EAAO0C,GACf6M,EAAYtP,EAAWyC,GAC7BxoB,EAAQ/L,KAAK,CACX,+CACA,2BAA4B9I,EAAO,KACnC,eAAgBkuB,EAAW,KAC3B,eAAgBluB,EAAO,KACvB,UAAWkqC,EAAW,KACtB,eAAgBA,EAAW,KAC3B,gDACAxjC,KAAK,KAET3M,EAAS+O,KAAK,+BAAiC+L,EAAQnO,KAAK,IAAM,UAEpE7M,EAAMG,KAAKD,EAAS2M,KAAK,KAErBjN,EAAQ8e,SACV1e,EAAMc,KAAK,mBAAmB4d,QAAQ,CACpCzG,UAAWrY,EAAQqY,WAAai4B,EAAcj4B,UAC9C2D,QAAS,QACT00B,UAAW,aA5BVV,CA+BJ5vC,EAAOJ,IAGZggC,OAAQ,SAAS5/B,EAAOJ,GACtB,OAAOgwC,IAAS7wC,OAAO,gFAAgF,SAASiB,EAAOJ,GACjHA,GAAWA,EAAQ8e,SACrB1e,EAAMU,KAAK,CACTghC,MAAO9hC,EAAQ8e,QACf,aAAc9e,EAAQ8e,UACrBA,QAAQ,CACTzG,UAAWrY,EAAQqY,WAAai4B,EAAcj4B,UAC9C2D,QAAS,QACT00B,UAAW,WACV1vC,GAAG,SAAS,SAAC2hB,GACdtiB,IAAEsiB,EAAE+d,eAAe5hB,QAAQ,WAG3B9e,GAAWA,EAAQ2wC,gBACrBvwC,EAAMK,SAAS,wBAdZuvC,CAgBJ5vC,EAAOJ,IAGZunC,UAAW,SAASD,EAAMsJ,GACxBtJ,EAAKjU,YAAY,YAAaud,GAC9BtJ,EAAKxmC,KAAK,YAAa8vC,IAGzBrL,gBAAiB,SAAS+B,EAAMuJ,GAC9BvJ,EAAKjU,YAAY,SAAUwd,IAG7BnI,cAAe,SAASX,EAAS7wB,GAC/B6wB,EAAQrS,IAAI,iBAAkBxe,IAGhC8xB,eAAgB,SAASjB,EAAS7wB,GAChC6wB,EAAQrS,IAAI,kBAAmBxe,IAGjCgyB,WAAY,SAASnB,GACnBA,EAAQ+I,MAAM,SAGhB3I,WAAY,SAASJ,GACnBA,EAAQ+I,MAAM,SAGhBv2B,aAAc,SAASN,GACrB,IAAM6V,GAAWwgB,EAAcxc,QAAUmc,EAAU,CACjD1S,EAAY,CACV3hB,IACAs0B,QAEoC,WAAlCI,EAAc7B,gBAChBtzB,EAAO,CACPoiB,EAAY,CACV3hB,IACAC,MAEFghB,IACAV,MAEAhhB,EAAO,CACP0hB,IACAU,EAAY,CACV3hB,IACAC,MAEFsgB,OAED96B,SAIH,OAFAyuB,EAAQ/d,YAAYkI,GAEb,CACL8E,KAAM9E,EACNkB,OAAQ2U,EACR+M,QAAS/M,EAAQ5uB,KAAK,iBACtBq8B,YAAazN,EAAQ5uB,KAAK,sBAC1B2a,SAAUiU,EAAQ5uB,KAAK,kBACvB0a,QAASkU,EAAQ5uB,KAAK,iBACtBi7B,UAAWrM,EAAQ5uB,KAAK,qBAI5B0Z,aAAc,SAASX,EAAOE,GAC5BF,EAAM1Z,KAAK4Z,EAAW0B,SAAStb,QAC/B4Z,EAAWgB,OAAOtX,SAClBoW,EAAMkc,U,UCzPZ91B,IAAEuB,WAAavB,IAAEyB,OAAOzB,IAAEuB,WAAY,CACpCyY,YAAaD,EACb22B,UAAW","file":"summernote.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"jquery\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"jquery\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"jquery\")) : factory(root[\"jQuery\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(window, function(__WEBPACK_EXTERNAL_MODULE__0__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 52);\n","module.exports = __WEBPACK_EXTERNAL_MODULE__0__;","import $ from 'jquery';\n\nclass Renderer {\n  constructor(markup, children, options, callback) {\n    this.markup = markup;\n    this.children = children;\n    this.options = options;\n    this.callback = callback;\n  }\n\n  render($parent) {\n    const $node = $(this.markup);\n\n    if (this.options && this.options.contents) {\n      $node.html(this.options.contents);\n    }\n\n    if (this.options && this.options.className) {\n      $node.addClass(this.options.className);\n    }\n\n    if (this.options && this.options.data) {\n      $.each(this.options.data, (k, v) => {\n        $node.attr('data-' + k, v);\n      });\n    }\n\n    if (this.options && this.options.click) {\n      $node.on('click', this.options.click);\n    }\n\n    if (this.children) {\n      const $container = $node.find('.note-children-container');\n      this.children.forEach((child) => {\n        child.render($container.length ? $container : $node);\n      });\n    }\n\n    if (this.callback) {\n      this.callback($node, this.options);\n    }\n\n    if (this.options && this.options.callback) {\n      this.options.callback($node);\n    }\n\n    if ($parent) {\n      $parent.append($node);\n    }\n\n    return $node;\n  }\n}\n\nexport default {\n  create: (markup, callback) => {\n    return function() {\n      const options = typeof arguments[1] === 'object' ? arguments[1] : arguments[0];\n      let children = Array.isArray(arguments[0]) ? arguments[0] : [];\n      if (options && options.children) {\n        children = options.children;\n      }\n      return new Renderer(markup, children, options, callback);\n    };\n  },\n};\n","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n","import $ from 'jquery';\n\n$.summernote = $.summernote || {\n  lang: {},\n};\n\n$.extend($.summernote.lang, {\n  'en-US': {\n    font: {\n      bold: 'Bold',\n      italic: 'Italic',\n      underline: 'Underline',\n      clear: 'Remove Font Style',\n      height: 'Line Height',\n      name: 'Font Family',\n      strikethrough: 'Strikethrough',\n      subscript: 'Subscript',\n      superscript: 'Superscript',\n      size: 'Font Size',\n      sizeunit: 'Font Size Unit',\n    },\n    image: {\n      image: 'Picture',\n      insert: 'Insert Image',\n      resizeFull: 'Resize full',\n      resizeHalf: 'Resize half',\n      resizeQuarter: 'Resize quarter',\n      resizeNone: 'Original size',\n      floatLeft: 'Float Left',\n      floatRight: 'Float Right',\n      floatNone: 'Remove float',\n      shapeRounded: 'Shape: Rounded',\n      shapeCircle: 'Shape: Circle',\n      shapeThumbnail: 'Shape: Thumbnail',\n      shapeNone: 'Shape: None',\n      dragImageHere: 'Drag image or text here',\n      dropImage: 'Drop image or Text',\n      selectFromFiles: 'Select from files',\n      maximumFileSize: 'Maximum file size',\n      maximumFileSizeError: 'Maximum file size exceeded.',\n      url: 'Image URL',\n      remove: 'Remove Image',\n      original: 'Original',\n    },\n    video: {\n      video: 'Video',\n      videoLink: 'Video Link',\n      insert: 'Insert Video',\n      url: 'Video URL',\n      providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion or Youku)',\n    },\n    link: {\n      link: 'Link',\n      insert: 'Insert Link',\n      unlink: 'Unlink',\n      edit: 'Edit',\n      textToDisplay: 'Text to display',\n      url: 'To what URL should this link go?',\n      openInNewWindow: 'Open in new window',\n      useProtocol: 'Use default protocol',\n    },\n    table: {\n      table: 'Table',\n      addRowAbove: 'Add row above',\n      addRowBelow: 'Add row below',\n      addColLeft: 'Add column left',\n      addColRight: 'Add column right',\n      delRow: 'Delete row',\n      delCol: 'Delete column',\n      delTable: 'Delete table',\n    },\n    hr: {\n      insert: 'Insert Horizontal Rule',\n    },\n    style: {\n      style: 'Style',\n      p: 'Normal',\n      blockquote: 'Quote',\n      pre: 'Code',\n      h1: 'Header 1',\n      h2: 'Header 2',\n      h3: 'Header 3',\n      h4: 'Header 4',\n      h5: 'Header 5',\n      h6: 'Header 6',\n    },\n    lists: {\n      unordered: 'Unordered list',\n      ordered: 'Ordered list',\n    },\n    options: {\n      help: 'Help',\n      fullscreen: 'Full Screen',\n      codeview: 'Code View',\n    },\n    paragraph: {\n      paragraph: 'Paragraph',\n      outdent: 'Outdent',\n      indent: 'Indent',\n      left: 'Align left',\n      center: 'Align center',\n      right: 'Align right',\n      justify: 'Justify full',\n    },\n    color: {\n      recent: 'Recent Color',\n      more: 'More Color',\n      background: 'Background Color',\n      foreground: 'Text Color',\n      transparent: 'Transparent',\n      setTransparent: 'Set transparent',\n      reset: 'Reset',\n      resetToDefault: 'Reset to default',\n      cpSelect: 'Select',\n    },\n    shortcut: {\n      shortcuts: 'Keyboard shortcuts',\n      close: 'Close',\n      textFormatting: 'Text formatting',\n      action: 'Action',\n      paragraphFormatting: 'Paragraph formatting',\n      documentStyle: 'Document Style',\n      extraKeys: 'Extra keys',\n    },\n    help: {\n      'escape': 'Escape',\n      'insertParagraph': 'Insert Paragraph',\n      'undo': 'Undo the last command',\n      'redo': 'Redo the last command',\n      'tab': 'Tab',\n      'untab': 'Untab',\n      'bold': 'Set a bold style',\n      'italic': 'Set a italic style',\n      'underline': 'Set a underline style',\n      'strikethrough': 'Set a strikethrough style',\n      'removeFormat': 'Clean a style',\n      'justifyLeft': 'Set left align',\n      'justifyCenter': 'Set center align',\n      'justifyRight': 'Set right align',\n      'justifyFull': 'Set full align',\n      'insertUnorderedList': 'Toggle unordered list',\n      'insertOrderedList': 'Toggle ordered list',\n      'outdent': 'Outdent on current paragraph',\n      'indent': 'Indent on current paragraph',\n      'formatPara': 'Change current block\\'s format as a paragraph(P tag)',\n      'formatH1': 'Change current block\\'s format as H1',\n      'formatH2': 'Change current block\\'s format as H2',\n      'formatH3': 'Change current block\\'s format as H3',\n      'formatH4': 'Change current block\\'s format as H4',\n      'formatH5': 'Change current block\\'s format as H5',\n      'formatH6': 'Change current block\\'s format as H6',\n      'insertHorizontalRule': 'Insert horizontal rule',\n      'linkDialog.show': 'Show Link Dialog',\n    },\n    history: {\n      undo: 'Undo',\n      redo: 'Redo',\n    },\n    specialChar: {\n      specialChar: 'SPECIAL CHARACTERS',\n      select: 'Select Special characters',\n    },\n    output: {\n      noSelection: 'No Selection Made!',\n    },\n  },\n});\n","import $ from 'jquery';\nconst isSupportAmd = typeof define === 'function' && define.amd; // eslint-disable-line\n\n/**\n * returns whether font is installed or not.\n *\n * @param {String} fontName\n * @return {Boolean}\n */\nconst genericFontFamilies = ['sans-serif', 'serif', 'monospace', 'cursive', 'fantasy'];\n\nfunction validFontName(fontName) {\n  return ($.inArray(fontName.toLowerCase(), genericFontFamilies) === -1) ? `'${fontName}'` : fontName;\n}\n\nfunction isFontInstalled(fontName) {\n  const testFontName = fontName === 'Comic Sans MS' ? 'Courier New' : 'Comic Sans MS';\n  const testText = 'mmmmmmmmmmwwwww';\n  const testSize = '200px';\n\n  var canvas = document.createElement('canvas');\n  var context = canvas.getContext('2d');\n\n  context.font = testSize + \" '\" + testFontName + \"'\";\n  const originalWidth = context.measureText(testText).width;\n\n  context.font = testSize + ' ' + validFontName(fontName) + ', \"' + testFontName + '\"';\n  const width = context.measureText(testText).width;\n\n  return originalWidth !== width;\n}\n\nconst userAgent = navigator.userAgent;\nconst isMSIE = /MSIE|Trident/i.test(userAgent);\nlet browserVersion;\nif (isMSIE) {\n  let matches = /MSIE (\\d+[.]\\d+)/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n  matches = /Trident\\/.*rv:([0-9]{1,}[.0-9]{0,})/.exec(userAgent);\n  if (matches) {\n    browserVersion = parseFloat(matches[1]);\n  }\n}\n\nconst isEdge = /Edge\\/\\d+/.test(userAgent);\n\nconst isSupportTouch =\n  (('ontouchstart' in window) ||\n   (navigator.MaxTouchPoints > 0) ||\n   (navigator.msMaxTouchPoints > 0));\n\n// [workaround] IE doesn't have input events for contentEditable\n// - see: https://goo.gl/4bfIvA\nconst inputEventName = (isMSIE) ? 'DOMCharacterDataModified DOMSubtreeModified DOMNodeInserted' : 'input';\n\n/**\n * @class core.env\n *\n * Object which check platform and agent\n *\n * @singleton\n * @alternateClassName env\n */\nexport default {\n  isMac: navigator.appVersion.indexOf('Mac') > -1,\n  isMSIE,\n  isEdge,\n  isFF: !isEdge && /firefox/i.test(userAgent),\n  isPhantom: /PhantomJS/i.test(userAgent),\n  isWebkit: !isEdge && /webkit/i.test(userAgent),\n  isChrome: !isEdge && /chrome/i.test(userAgent),\n  isSafari: !isEdge && /safari/i.test(userAgent) && (!/chrome/i.test(userAgent)),\n  browserVersion,\n  jqueryVersion: parseFloat($.fn.jquery),\n  isSupportAmd,\n  isSupportTouch,\n  isFontInstalled,\n  isW3CRangeSupport: !!document.createRange,\n  inputEventName,\n  genericFontFamilies,\n  validFontName,\n};\n","import $ from 'jquery';\n\n/**\n * @class core.func\n *\n * func utils (for high-order func's arg)\n *\n * @singleton\n * @alternateClassName func\n */\nfunction eq(itemA) {\n  return function(itemB) {\n    return itemA === itemB;\n  };\n}\n\nfunction eq2(itemA, itemB) {\n  return itemA === itemB;\n}\n\nfunction peq2(propName) {\n  return function(itemA, itemB) {\n    return itemA[propName] === itemB[propName];\n  };\n}\n\nfunction ok() {\n  return true;\n}\n\nfunction fail() {\n  return false;\n}\n\nfunction not(f) {\n  return function() {\n    return !f.apply(f, arguments);\n  };\n}\n\nfunction and(fA, fB) {\n  return function(item) {\n    return fA(item) && fB(item);\n  };\n}\n\nfunction self(a) {\n  return a;\n}\n\nfunction invoke(obj, method) {\n  return function() {\n    return obj[method].apply(obj, arguments);\n  };\n}\n\nlet idCounter = 0;\n\n/**\n * reset globally-unique id\n *\n */\nfunction resetUniqueId() {\n  idCounter = 0;\n}\n\n/**\n * generate a globally-unique id\n *\n * @param {String} [prefix]\n */\nfunction uniqueId(prefix) {\n  const id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n/**\n * returns bnd (bounds) from rect\n *\n * - IE Compatibility Issue: http://goo.gl/sRLOAo\n * - Scroll Issue: http://goo.gl/sNjUc\n *\n * @param {Rect} rect\n * @return {Object} bounds\n * @return {Number} bounds.top\n * @return {Number} bounds.left\n * @return {Number} bounds.width\n * @return {Number} bounds.height\n */\nfunction rect2bnd(rect) {\n  const $document = $(document);\n  return {\n    top: rect.top + $document.scrollTop(),\n    left: rect.left + $document.scrollLeft(),\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n}\n\n/**\n * returns a copy of the object where the keys have become the values and the values the keys.\n * @param {Object} obj\n * @return {Object}\n */\nfunction invertObject(obj) {\n  const inverted = {};\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      inverted[obj[key]] = key;\n    }\n  }\n  return inverted;\n}\n\n/**\n * @param {String} namespace\n * @param {String} [prefix]\n * @return {String}\n */\nfunction namespaceToCamel(namespace, prefix) {\n  prefix = prefix || '';\n  return prefix + namespace.split('.').map(function(name) {\n    return name.substring(0, 1).toUpperCase() + name.substring(1);\n  }).join('');\n}\n\n/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing.\n * @param {Function} func\n * @param {Number} wait\n * @param {Boolean} immediate\n * @return {Function}\n */\nfunction debounce(func, wait, immediate) {\n  let timeout;\n  return function() {\n    const context = this;\n    const args = arguments;\n    const later = () => {\n      timeout = null;\n      if (!immediate) {\n        func.apply(context, args);\n      }\n    };\n    const callNow = immediate && !timeout;\n    clearTimeout(timeout);\n    timeout = setTimeout(later, wait);\n    if (callNow) {\n      func.apply(context, args);\n    }\n  };\n}\n\n/**\n *\n * @param {String} url\n * @return {Boolean}\n */\nfunction isValidUrl(url) {\n  const expression = /[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,6}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)/gi;\n  return expression.test(url);\n}\n\nexport default {\n  eq,\n  eq2,\n  peq2,\n  ok,\n  fail,\n  self,\n  not,\n  and,\n  invoke,\n  resetUniqueId,\n  uniqueId,\n  rect2bnd,\n  invertObject,\n  namespaceToCamel,\n  debounce,\n  isValidUrl,\n};\n","import func from './func';\n\n/**\n * returns the first item of an array.\n *\n * @param {Array} array\n */\nfunction head(array) {\n  return array[0];\n}\n\n/**\n * returns the last item of an array.\n *\n * @param {Array} array\n */\nfunction last(array) {\n  return array[array.length - 1];\n}\n\n/**\n * returns everything but the last entry of the array.\n *\n * @param {Array} array\n */\nfunction initial(array) {\n  return array.slice(0, array.length - 1);\n}\n\n/**\n * returns the rest of the items in an array.\n *\n * @param {Array} array\n */\nfunction tail(array) {\n  return array.slice(1);\n}\n\n/**\n * returns item of array\n */\nfunction find(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    const item = array[idx];\n    if (pred(item)) {\n      return item;\n    }\n  }\n}\n\n/**\n * returns true if all of the values in the array pass the predicate truth test.\n */\nfunction all(array, pred) {\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!pred(array[idx])) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * returns true if the value is present in the list.\n */\nfunction contains(array, item) {\n  if (array && array.length && item) {\n    if (array.indexOf) {\n      return array.indexOf(item) !== -1;\n    } else if (array.contains) {\n      // `DOMTokenList` doesn't implement `.indexOf`, but it implements `.contains`\n      return array.contains(item);\n    }\n  }\n  return false;\n}\n\n/**\n * get sum from a list\n *\n * @param {Array} array - array\n * @param {Function} fn - iterator\n */\nfunction sum(array, fn) {\n  fn = fn || func.self;\n  return array.reduce(function(memo, v) {\n    return memo + fn(v);\n  }, 0);\n}\n\n/**\n * returns a copy of the collection with array type.\n * @param {Collection} collection - collection eg) node.childNodes, ...\n */\nfunction from(collection) {\n  const result = [];\n  const length = collection.length;\n  let idx = -1;\n  while (++idx < length) {\n    result[idx] = collection[idx];\n  }\n  return result;\n}\n\n/**\n * returns whether list is empty or not\n */\nfunction isEmpty(array) {\n  return !array || !array.length;\n}\n\n/**\n * cluster elements by predicate function.\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n * @param {Array[]}\n */\nfunction clusterBy(array, fn) {\n  if (!array.length) { return []; }\n  const aTail = tail(array);\n  return aTail.reduce(function(memo, v) {\n    const aLast = last(memo);\n    if (fn(last(aLast), v)) {\n      aLast[aLast.length] = v;\n    } else {\n      memo[memo.length] = [v];\n    }\n    return memo;\n  }, [[head(array)]]);\n}\n\n/**\n * returns a copy of the array with all false values removed\n *\n * @param {Array} array - array\n * @param {Function} fn - predicate function for cluster rule\n */\nfunction compact(array) {\n  const aResult = [];\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (array[idx]) { aResult.push(array[idx]); }\n  }\n  return aResult;\n}\n\n/**\n * produces a duplicate-free version of the array\n *\n * @param {Array} array\n */\nfunction unique(array) {\n  const results = [];\n\n  for (let idx = 0, len = array.length; idx < len; idx++) {\n    if (!contains(results, array[idx])) {\n      results.push(array[idx]);\n    }\n  }\n\n  return results;\n}\n\n/**\n * returns next item.\n * @param {Array} array\n */\nfunction next(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx + 1];\n  }\n  return null;\n}\n\n/**\n * returns prev item.\n * @param {Array} array\n */\nfunction prev(array, item) {\n  if (array && array.length && item) {\n    const idx = array.indexOf(item);\n    return idx === -1 ? null : array[idx - 1];\n  }\n  return null;\n}\n\n/**\n * @class core.list\n *\n * list utils\n *\n * @singleton\n * @alternateClassName list\n */\nexport default {\n  head,\n  last,\n  initial,\n  tail,\n  prev,\n  next,\n  find,\n  contains,\n  all,\n  sum,\n  from,\n  isEmpty,\n  clusterBy,\n  compact,\n  unique,\n};\n","import $ from 'jquery';\nimport func from './func';\nimport lists from './lists';\nimport env from './env';\n\nconst NBSP_CHAR = String.fromCharCode(160);\nconst ZERO_WIDTH_NBSP_CHAR = '\\ufeff';\n\n/**\n * @method isEditable\n *\n * returns whether node is `note-editable` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEditable(node) {\n  return node && $(node).hasClass('note-editable');\n}\n\n/**\n * @method isControlSizing\n *\n * returns whether node is `note-control-sizing` or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isControlSizing(node) {\n  return node && $(node).hasClass('note-control-sizing');\n}\n\n/**\n * @method makePredByNodeName\n *\n * returns predicate which judge whether nodeName is same\n *\n * @param {String} nodeName\n * @return {Function}\n */\nfunction makePredByNodeName(nodeName) {\n  nodeName = nodeName.toUpperCase();\n  return function(node) {\n    return node && node.nodeName.toUpperCase() === nodeName;\n  };\n}\n\n/**\n * @method isText\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is text(3)\n */\nfunction isText(node) {\n  return node && node.nodeType === 3;\n}\n\n/**\n * @method isElement\n *\n *\n *\n * @param {Node} node\n * @return {Boolean} true if node's type is element(1)\n */\nfunction isElement(node) {\n  return node && node.nodeType === 1;\n}\n\n/**\n * ex) br, col, embed, hr, img, input, ...\n * @see http://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements\n */\nfunction isVoid(node) {\n  return node && /^BR|^IMG|^HR|^IFRAME|^BUTTON|^INPUT|^AUDIO|^VIDEO|^EMBED/.test(node.nodeName.toUpperCase());\n}\n\nfunction isPara(node) {\n  if (isEditable(node)) {\n    return false;\n  }\n\n  // Chrome(v31.0), FF(v25.0.1) use DIV for paragraph\n  return node && /^DIV|^P|^LI|^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nfunction isHeading(node) {\n  return node && /^H[1-7]/.test(node.nodeName.toUpperCase());\n}\n\nconst isPre = makePredByNodeName('PRE');\n\nconst isLi = makePredByNodeName('LI');\n\nfunction isPurePara(node) {\n  return isPara(node) && !isLi(node);\n}\n\nconst isTable = makePredByNodeName('TABLE');\n\nconst isData = makePredByNodeName('DATA');\n\nfunction isInline(node) {\n  return !isBodyContainer(node) &&\n         !isList(node) &&\n         !isHr(node) &&\n         !isPara(node) &&\n         !isTable(node) &&\n         !isBlockquote(node) &&\n         !isData(node);\n}\n\nfunction isList(node) {\n  return node && /^UL|^OL/.test(node.nodeName.toUpperCase());\n}\n\nconst isHr = makePredByNodeName('HR');\n\nfunction isCell(node) {\n  return node && /^TD|^TH/.test(node.nodeName.toUpperCase());\n}\n\nconst isBlockquote = makePredByNodeName('BLOCKQUOTE');\n\nfunction isBodyContainer(node) {\n  return isCell(node) || isBlockquote(node) || isEditable(node);\n}\n\nconst isAnchor = makePredByNodeName('A');\n\nfunction isParaInline(node) {\n  return isInline(node) && !!ancestor(node, isPara);\n}\n\nfunction isBodyInline(node) {\n  return isInline(node) && !ancestor(node, isPara);\n}\n\nconst isBody = makePredByNodeName('BODY');\n\n/**\n * returns whether nodeB is closest sibling of nodeA\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n * @return {Boolean}\n */\nfunction isClosestSibling(nodeA, nodeB) {\n  return nodeA.nextSibling === nodeB ||\n         nodeA.previousSibling === nodeB;\n}\n\n/**\n * returns array of closest siblings with node\n *\n * @param {Node} node\n * @param {function} [pred] - predicate function\n * @return {Node[]}\n */\nfunction withClosestSiblings(node, pred) {\n  pred = pred || func.ok;\n\n  const siblings = [];\n  if (node.previousSibling && pred(node.previousSibling)) {\n    siblings.push(node.previousSibling);\n  }\n  siblings.push(node);\n  if (node.nextSibling && pred(node.nextSibling)) {\n    siblings.push(node.nextSibling);\n  }\n  return siblings;\n}\n\n/**\n * blank HTML for cursor position\n * - [workaround] old IE only works with &nbsp;\n * - [workaround] IE11 and other browser works with bogus br\n */\nconst blankHTML = env.isMSIE && env.browserVersion < 11 ? '&nbsp;' : '<br>';\n\n/**\n * @method nodeLength\n *\n * returns #text's text size or element's childNodes size\n *\n * @param {Node} node\n */\nfunction nodeLength(node) {\n  if (isText(node)) {\n    return node.nodeValue.length;\n  }\n\n  if (node) {\n    return node.childNodes.length;\n  }\n\n  return 0;\n}\n\n/**\n * returns whether deepest child node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction deepestChildIsEmpty(node) {\n  do {\n    if (node.firstElementChild === null || node.firstElementChild.innerHTML === '') break;\n  } while ((node = node.firstElementChild));\n\n  return isEmpty(node);\n}\n\n/**\n * returns whether node is empty or not.\n *\n * @param {Node} node\n * @return {Boolean}\n */\nfunction isEmpty(node) {\n  const len = nodeLength(node);\n\n  if (len === 0) {\n    return true;\n  } else if (!isText(node) && len === 1 && node.innerHTML === blankHTML) {\n    // ex) <p><br></p>, <span><br></span>\n    return true;\n  } else if (lists.all(node.childNodes, isText) && node.innerHTML === '') {\n    // ex) <p></p>, <span></span>\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * padding blankHTML if node is empty (for cursor position)\n */\nfunction paddingBlankHTML(node) {\n  if (!isVoid(node) && !nodeLength(node)) {\n    node.innerHTML = blankHTML;\n  }\n}\n\n/**\n * find nearest ancestor predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction ancestor(node, pred) {\n  while (node) {\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * find nearest ancestor only single child blood line and predicate hit\n *\n * @param {Node} node\n * @param {Function} pred - predicate function\n */\nfunction singleChildAncestor(node, pred) {\n  node = node.parentNode;\n\n  while (node) {\n    if (nodeLength(node) !== 1) { break; }\n    if (pred(node)) { return node; }\n    if (isEditable(node)) { break; }\n\n    node = node.parentNode;\n  }\n  return null;\n}\n\n/**\n * returns new array of ancestor nodes (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listAncestor(node, pred) {\n  pred = pred || func.fail;\n\n  const ancestors = [];\n  ancestor(node, function(el) {\n    if (!isEditable(el)) {\n      ancestors.push(el);\n    }\n\n    return pred(el);\n  });\n  return ancestors;\n}\n\n/**\n * find farthest ancestor predicate hit\n */\nfunction lastAncestor(node, pred) {\n  const ancestors = listAncestor(node);\n  return lists.last(ancestors.filter(pred));\n}\n\n/**\n * returns common ancestor node between two nodes.\n *\n * @param {Node} nodeA\n * @param {Node} nodeB\n */\nfunction commonAncestor(nodeA, nodeB) {\n  const ancestors = listAncestor(nodeA);\n  for (let n = nodeB; n; n = n.parentNode) {\n    if (ancestors.indexOf(n) > -1) return n;\n  }\n  return null; // difference document area\n}\n\n/**\n * listing all previous siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [optional] pred - predicate function\n */\nfunction listPrev(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.previousSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing next siblings (until predicate hit).\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listNext(node, pred) {\n  pred = pred || func.fail;\n\n  const nodes = [];\n  while (node) {\n    if (pred(node)) { break; }\n    nodes.push(node);\n    node = node.nextSibling;\n  }\n  return nodes;\n}\n\n/**\n * listing descendant nodes\n *\n * @param {Node} node\n * @param {Function} [pred] - predicate function\n */\nfunction listDescendant(node, pred) {\n  const descendants = [];\n  pred = pred || func.ok;\n\n  // start DFS(depth first search) with node\n  (function fnWalk(current) {\n    if (node !== current && pred(current)) {\n      descendants.push(current);\n    }\n    for (let idx = 0, len = current.childNodes.length; idx < len; idx++) {\n      fnWalk(current.childNodes[idx]);\n    }\n  })(node);\n\n  return descendants;\n}\n\n/**\n * wrap node with new tag.\n *\n * @param {Node} node\n * @param {Node} tagName of wrapper\n * @return {Node} - wrapper\n */\nfunction wrap(node, wrapperName) {\n  const parent = node.parentNode;\n  const wrapper = $('<' + wrapperName + '>')[0];\n\n  parent.insertBefore(wrapper, node);\n  wrapper.appendChild(node);\n\n  return wrapper;\n}\n\n/**\n * insert node after preceding\n *\n * @param {Node} node\n * @param {Node} preceding - predicate function\n */\nfunction insertAfter(node, preceding) {\n  const next = preceding.nextSibling;\n  let parent = preceding.parentNode;\n  if (next) {\n    parent.insertBefore(node, next);\n  } else {\n    parent.appendChild(node);\n  }\n  return node;\n}\n\n/**\n * append elements.\n *\n * @param {Node} node\n * @param {Collection} aChild\n */\nfunction appendChildNodes(node, aChild) {\n  $.each(aChild, function(idx, child) {\n    node.appendChild(child);\n  });\n  return node;\n}\n\n/**\n * returns whether boundaryPoint is left edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isLeftEdgePoint(point) {\n  return point.offset === 0;\n}\n\n/**\n * returns whether boundaryPoint is right edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isRightEdgePoint(point) {\n  return point.offset === nodeLength(point.node);\n}\n\n/**\n * returns whether boundaryPoint is edge or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isEdgePoint(point) {\n  return isLeftEdgePoint(point) || isRightEdgePoint(point);\n}\n\n/**\n * returns whether node is left edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgeOf(node, ancestor) {\n  while (node && node !== ancestor) {\n    if (position(node) !== 0) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether node is right edge of ancestor or not.\n *\n * @param {Node} node\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgeOf(node, ancestor) {\n  if (!ancestor) {\n    return false;\n  }\n  while (node && node !== ancestor) {\n    if (position(node) !== nodeLength(node.parentNode) - 1) {\n      return false;\n    }\n    node = node.parentNode;\n  }\n\n  return true;\n}\n\n/**\n * returns whether point is left edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isLeftEdgePointOf(point, ancestor) {\n  return isLeftEdgePoint(point) && isLeftEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns whether point is right edge of ancestor or not.\n * @param {BoundaryPoint} point\n * @param {Node} ancestor\n * @return {Boolean}\n */\nfunction isRightEdgePointOf(point, ancestor) {\n  return isRightEdgePoint(point) && isRightEdgeOf(point.node, ancestor);\n}\n\n/**\n * returns offset from parent.\n *\n * @param {Node} node\n */\nfunction position(node) {\n  let offset = 0;\n  while ((node = node.previousSibling)) {\n    offset += 1;\n  }\n  return offset;\n}\n\nfunction hasChildren(node) {\n  return !!(node && node.childNodes && node.childNodes.length);\n}\n\n/**\n * returns previous boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction prevPoint(point, isSkipInnerOffset) {\n  let node;\n  let offset;\n\n  if (point.offset === 0) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    node = point.node.parentNode;\n    offset = position(point.node);\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset - 1];\n    offset = nodeLength(node);\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? 0 : point.offset - 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPoint(point, isSkipInnerOffset) {\n  let node, offset;\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/**\n * returns next boundaryPoint with empty node\n *\n * @param {BoundaryPoint} point\n * @param {Boolean} isSkipInnerOffset\n * @return {BoundaryPoint}\n */\nfunction nextPointWithEmptyNode(point, isSkipInnerOffset) {\n  let node, offset;\n\n  // if node is empty string node, return current node's sibling.\n  if (isEmpty(point.node)) {\n    node = point.node.nextSibling;\n    offset = 0;\n\n    return {\n      node: node,\n      offset: offset,\n    };\n  }\n\n  if (nodeLength(point.node) === point.offset) {\n    if (isEditable(point.node)) {\n      return null;\n    }\n\n    let nextTextNode = getNextTextNode(point.node);\n    if (nextTextNode) {\n      node = nextTextNode;\n      offset = 0;\n    } else {\n      node = point.node.parentNode;\n      offset = position(point.node) + 1;\n    }\n\n    // if next node is editable, return current node's sibling node.\n    if (isEditable(node)) {\n      node = point.node.nextSibling;\n      offset = 0;\n    }\n  } else if (hasChildren(point.node)) {\n    node = point.node.childNodes[point.offset];\n    offset = 0;\n    if (isEmpty(node)) {\n      return null;\n    }\n  } else {\n    node = point.node;\n    offset = isSkipInnerOffset ? nodeLength(point.node) : point.offset + 1;\n\n    if (isEmpty(node)) {\n      return null;\n    }\n  }\n\n  return {\n    node: node,\n    offset: offset,\n  };\n}\n\n/*\n* returns the next Text node index or 0 if not found.\n*/\nfunction getNextTextNode(actual) {\n  if (!actual.nextSibling) return undefined;\n  if (actual.parent !== actual.nextSibling.parent) return undefined;\n  if (isText(actual.nextSibling)) return actual.nextSibling;\n  return getNextTextNode(actual.nextSibling);\n}\n\n/**\n * returns whether pointA and pointB is same or not.\n *\n * @param {BoundaryPoint} pointA\n * @param {BoundaryPoint} pointB\n * @return {Boolean}\n */\nfunction isSamePoint(pointA, pointB) {\n  return pointA.node === pointB.node && pointA.offset === pointB.offset;\n}\n\n/**\n * returns whether point is visible (can set cursor) or not.\n *\n * @param {BoundaryPoint} point\n * @return {Boolean}\n */\nfunction isVisiblePoint(point) {\n  if (isText(point.node) || !hasChildren(point.node) || isEmpty(point.node)) {\n    return true;\n  }\n\n  const leftNode = point.node.childNodes[point.offset - 1];\n  const rightNode = point.node.childNodes[point.offset];\n  if ((!leftNode || isVoid(leftNode)) && (!rightNode || isVoid(rightNode))) {\n    return true;\n  }\n\n  return false;\n}\n\n/**\n * @method prevPointUtil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction prevPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = prevPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * @method nextPointUntil\n *\n * @param {BoundaryPoint} point\n * @param {Function} pred\n * @return {BoundaryPoint}\n */\nfunction nextPointUntil(point, pred) {\n  while (point) {\n    if (pred(point)) {\n      return point;\n    }\n\n    point = nextPoint(point);\n  }\n\n  return null;\n}\n\n/**\n * returns whether point has character or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isCharPoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch && (ch !== ' ' && ch !== NBSP_CHAR);\n}\n\n/**\n * returns whether point has space or not.\n *\n * @param {Point} point\n * @return {Boolean}\n */\nfunction isSpacePoint(point) {\n  if (!isText(point.node)) {\n    return false;\n  }\n\n  const ch = point.node.nodeValue.charAt(point.offset - 1);\n  return ch === ' ' || ch === NBSP_CHAR;\n}\n\n/**\n * @method walkPoint\n *\n * @param {BoundaryPoint} startPoint\n * @param {BoundaryPoint} endPoint\n * @param {Function} handler\n * @param {Boolean} isSkipInnerOffset\n */\nfunction walkPoint(startPoint, endPoint, handler, isSkipInnerOffset) {\n  let point = startPoint;\n\n  while (point) {\n    handler(point);\n\n    if (isSamePoint(point, endPoint)) {\n      break;\n    }\n\n    const isSkipOffset = isSkipInnerOffset &&\n                       startPoint.node !== point.node &&\n                       endPoint.node !== point.node;\n    point = nextPointWithEmptyNode(point, isSkipOffset);\n  }\n}\n\n/**\n * @method makeOffsetPath\n *\n * return offsetPath(array of offset) from ancestor\n *\n * @param {Node} ancestor - ancestor node\n * @param {Node} node\n */\nfunction makeOffsetPath(ancestor, node) {\n  const ancestors = listAncestor(node, func.eq(ancestor));\n  return ancestors.map(position).reverse();\n}\n\n/**\n * @method fromOffsetPath\n *\n * return element from offsetPath(array of offset)\n *\n * @param {Node} ancestor - ancestor node\n * @param {array} offsets - offsetPath\n */\nfunction fromOffsetPath(ancestor, offsets) {\n  let current = ancestor;\n  for (let i = 0, len = offsets.length; i < len; i++) {\n    if (current.childNodes.length <= offsets[i]) {\n      current = current.childNodes[current.childNodes.length - 1];\n    } else {\n      current = current.childNodes[offsets[i]];\n    }\n  }\n  return current;\n}\n\n/**\n * @method splitNode\n *\n * split element or #text\n *\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @param {Boolean} [options.isDiscardEmptySplits] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitNode(point, options) {\n  let isSkipPaddingBlankHTML = options && options.isSkipPaddingBlankHTML;\n  const isNotSplitEdgePoint = options && options.isNotSplitEdgePoint;\n  const isDiscardEmptySplits = options && options.isDiscardEmptySplits;\n\n  if (isDiscardEmptySplits) {\n    isSkipPaddingBlankHTML = true;\n  }\n\n  // edge case\n  if (isEdgePoint(point) && (isText(point.node) || isNotSplitEdgePoint)) {\n    if (isLeftEdgePoint(point)) {\n      return point.node;\n    } else if (isRightEdgePoint(point)) {\n      return point.node.nextSibling;\n    }\n  }\n\n  // split #text\n  if (isText(point.node)) {\n    return point.node.splitText(point.offset);\n  } else {\n    const childNode = point.node.childNodes[point.offset];\n    const clone = insertAfter(point.node.cloneNode(false), point.node);\n    appendChildNodes(clone, listNext(childNode));\n\n    if (!isSkipPaddingBlankHTML) {\n      paddingBlankHTML(point.node);\n      paddingBlankHTML(clone);\n    }\n\n    if (isDiscardEmptySplits) {\n      if (isEmpty(point.node)) {\n        remove(point.node);\n      }\n      if (isEmpty(clone)) {\n        remove(clone);\n        return point.node.nextSibling;\n      }\n    }\n\n    return clone;\n  }\n}\n\n/**\n * @method splitTree\n *\n * split tree by point\n *\n * @param {Node} root - split root\n * @param {BoundaryPoint} point\n * @param {Object} [options]\n * @param {Boolean} [options.isSkipPaddingBlankHTML] - default: false\n * @param {Boolean} [options.isNotSplitEdgePoint] - default: false\n * @return {Node} right node of boundaryPoint\n */\nfunction splitTree(root, point, options) {\n  // ex) [#text, <span>, <p>]\n  const ancestors = listAncestor(point.node, func.eq(root));\n\n  if (!ancestors.length) {\n    return null;\n  } else if (ancestors.length === 1) {\n    return splitNode(point, options);\n  }\n\n  return ancestors.reduce(function(node, parent) {\n    if (node === point.node) {\n      node = splitNode(point, options);\n    }\n\n    return splitNode({\n      node: parent,\n      offset: node ? position(node) : nodeLength(parent),\n    }, options);\n  });\n}\n\n/**\n * split point\n *\n * @param {Point} point\n * @param {Boolean} isInline\n * @return {Object}\n */\nfunction splitPoint(point, isInline) {\n  // find splitRoot, container\n  //  - inline: splitRoot is a child of paragraph\n  //  - block: splitRoot is a child of bodyContainer\n  const pred = isInline ? isPara : isBodyContainer;\n  const ancestors = listAncestor(point.node, pred);\n  const topAncestor = lists.last(ancestors) || point.node;\n\n  let splitRoot, container;\n  if (pred(topAncestor)) {\n    splitRoot = ancestors[ancestors.length - 2];\n    container = topAncestor;\n  } else {\n    splitRoot = topAncestor;\n    container = splitRoot.parentNode;\n  }\n\n  // if splitRoot is exists, split with splitTree\n  let pivot = splitRoot && splitTree(splitRoot, point, {\n    isSkipPaddingBlankHTML: isInline,\n    isNotSplitEdgePoint: isInline,\n  });\n\n  // if container is point.node, find pivot with point.offset\n  if (!pivot && container === point.node) {\n    pivot = point.node.childNodes[point.offset];\n  }\n\n  return {\n    rightNode: pivot,\n    container: container,\n  };\n}\n\nfunction create(nodeName) {\n  return document.createElement(nodeName);\n}\n\nfunction createText(text) {\n  return document.createTextNode(text);\n}\n\n/**\n * @method remove\n *\n * remove node, (isRemoveChild: remove child or not)\n *\n * @param {Node} node\n * @param {Boolean} isRemoveChild\n */\nfunction remove(node, isRemoveChild) {\n  if (!node || !node.parentNode) { return; }\n  if (node.removeNode) { return node.removeNode(isRemoveChild); }\n\n  const parent = node.parentNode;\n  if (!isRemoveChild) {\n    const nodes = [];\n    for (let i = 0, len = node.childNodes.length; i < len; i++) {\n      nodes.push(node.childNodes[i]);\n    }\n\n    for (let i = 0, len = nodes.length; i < len; i++) {\n      parent.insertBefore(nodes[i], node);\n    }\n  }\n\n  parent.removeChild(node);\n}\n\n/**\n * @method removeWhile\n *\n * @param {Node} node\n * @param {Function} pred\n */\nfunction removeWhile(node, pred) {\n  while (node) {\n    if (isEditable(node) || !pred(node)) {\n      break;\n    }\n\n    const parent = node.parentNode;\n    remove(node);\n    node = parent;\n  }\n}\n\n/**\n * @method replace\n *\n * replace node with provided nodeName\n *\n * @param {Node} node\n * @param {String} nodeName\n * @return {Node} - new node\n */\nfunction replace(node, nodeName) {\n  if (node.nodeName.toUpperCase() === nodeName.toUpperCase()) {\n    return node;\n  }\n\n  const newNode = create(nodeName);\n\n  if (node.style.cssText) {\n    newNode.style.cssText = node.style.cssText;\n  }\n\n  appendChildNodes(newNode, lists.from(node.childNodes));\n  insertAfter(newNode, node);\n  remove(node);\n\n  return newNode;\n}\n\nconst isTextarea = makePredByNodeName('TEXTAREA');\n\n/**\n * @param {jQuery} $node\n * @param {Boolean} [stripLinebreaks] - default: false\n */\nfunction value($node, stripLinebreaks) {\n  const val = isTextarea($node[0]) ? $node.val() : $node.html();\n  if (stripLinebreaks) {\n    return val.replace(/[\\n\\r]/g, '');\n  }\n  return val;\n}\n\n/**\n * @method html\n *\n * get the HTML contents of node\n *\n * @param {jQuery} $node\n * @param {Boolean} [isNewlineOnBlock]\n */\nfunction html($node, isNewlineOnBlock) {\n  let markup = value($node);\n\n  if (isNewlineOnBlock) {\n    const regexTag = /<(\\/?)(\\b(?!!)[^>\\s]*)(.*?)(\\s*\\/?>)/g;\n    markup = markup.replace(regexTag, function(match, endSlash, name) {\n      name = name.toUpperCase();\n      const isEndOfInlineContainer = /^DIV|^TD|^TH|^P|^LI|^H[1-7]/.test(name) &&\n                                   !!endSlash;\n      const isBlockNode = /^BLOCKQUOTE|^TABLE|^TBODY|^TR|^HR|^UL|^OL/.test(name);\n\n      return match + ((isEndOfInlineContainer || isBlockNode) ? '\\n' : '');\n    });\n    markup = markup.trim();\n  }\n\n  return markup;\n}\n\nfunction posFromPlaceholder(placeholder) {\n  const $placeholder = $(placeholder);\n  const pos = $placeholder.offset();\n  const height = $placeholder.outerHeight(true); // include margin\n\n  return {\n    left: pos.left,\n    top: pos.top + height,\n  };\n}\n\nfunction attachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.on(key, events[key]);\n  });\n}\n\nfunction detachEvents($node, events) {\n  Object.keys(events).forEach(function(key) {\n    $node.off(key, events[key]);\n  });\n}\n\n/**\n * @method isCustomStyleTag\n *\n * assert if a node contains a \"note-styletag\" class,\n * which implies that's a custom-made style tag node\n *\n * @param {Node} an HTML DOM node\n */\nfunction isCustomStyleTag(node) {\n  return node && !isText(node) && lists.contains(node.classList, 'note-styletag');\n}\n\nexport default {\n  /** @property {String} NBSP_CHAR */\n  NBSP_CHAR,\n  /** @property {String} ZERO_WIDTH_NBSP_CHAR */\n  ZERO_WIDTH_NBSP_CHAR,\n  /** @property {String} blank */\n  blank: blankHTML,\n  /** @property {String} emptyPara */\n  emptyPara: `<p>${blankHTML}</p>`,\n  makePredByNodeName,\n  isEditable,\n  isControlSizing,\n  isText,\n  isElement,\n  isVoid,\n  isPara,\n  isPurePara,\n  isHeading,\n  isInline,\n  isBlock: func.not(isInline),\n  isBodyInline,\n  isBody,\n  isParaInline,\n  isPre,\n  isList,\n  isTable,\n  isData,\n  isCell,\n  isBlockquote,\n  isBodyContainer,\n  isAnchor,\n  isDiv: makePredByNodeName('DIV'),\n  isLi,\n  isBR: makePredByNodeName('BR'),\n  isSpan: makePredByNodeName('SPAN'),\n  isB: makePredByNodeName('B'),\n  isU: makePredByNodeName('U'),\n  isS: makePredByNodeName('S'),\n  isI: makePredByNodeName('I'),\n  isImg: makePredByNodeName('IMG'),\n  isTextarea,\n  deepestChildIsEmpty,\n  isEmpty,\n  isEmptyAnchor: func.and(isAnchor, isEmpty),\n  isClosestSibling,\n  withClosestSiblings,\n  nodeLength,\n  isLeftEdgePoint,\n  isRightEdgePoint,\n  isEdgePoint,\n  isLeftEdgeOf,\n  isRightEdgeOf,\n  isLeftEdgePointOf,\n  isRightEdgePointOf,\n  prevPoint,\n  nextPoint,\n  nextPointWithEmptyNode,\n  isSamePoint,\n  isVisiblePoint,\n  prevPointUntil,\n  nextPointUntil,\n  isCharPoint,\n  isSpacePoint,\n  walkPoint,\n  ancestor,\n  singleChildAncestor,\n  listAncestor,\n  lastAncestor,\n  listNext,\n  listPrev,\n  listDescendant,\n  commonAncestor,\n  wrap,\n  insertAfter,\n  appendChildNodes,\n  position,\n  hasChildren,\n  makeOffsetPath,\n  fromOffsetPath,\n  splitTree,\n  splitPoint,\n  create,\n  createText,\n  remove,\n  removeWhile,\n  replace,\n  html,\n  value,\n  posFromPlaceholder,\n  attachEvents,\n  detachEvents,\n  isCustomStyleTag,\n};\n","import $ from 'jquery';\nimport func from './core/func';\nimport lists from './core/lists';\nimport dom from './core/dom';\n\nexport default class Context {\n  /**\n   * @param {jQuery} $note\n   * @param {Object} options\n   */\n  constructor($note, options) {\n    this.$note = $note;\n\n    this.memos = {};\n    this.modules = {};\n    this.layoutInfo = {};\n    this.options = $.extend(true, {}, options);\n\n    // init ui with options\n    $.summernote.ui = $.summernote.ui_template(this.options);\n    this.ui = $.summernote.ui;\n\n    this.initialize();\n  }\n\n  /**\n   * create layout and initialize modules and other resources\n   */\n  initialize() {\n    this.layoutInfo = this.ui.createLayout(this.$note);\n    this._initialize();\n    this.$note.hide();\n    return this;\n  }\n\n  /**\n   * destroy modules and other resources and remove layout\n   */\n  destroy() {\n    this._destroy();\n    this.$note.removeData('summernote');\n    this.ui.removeLayout(this.$note, this.layoutInfo);\n  }\n\n  /**\n   * destory modules and other resources and initialize it again\n   */\n  reset() {\n    const disabled = this.isDisabled();\n    this.code(dom.emptyPara);\n    this._destroy();\n    this._initialize();\n\n    if (disabled) {\n      this.disable();\n    }\n  }\n\n  _initialize() {\n    // set own id\n    this.options.id = func.uniqueId($.now());\n    // set default container for tooltips, popovers, and dialogs\n    this.options.container = this.options.container || this.layoutInfo.editor;\n\n    // add optional buttons\n    const buttons = $.extend({}, this.options.buttons);\n    Object.keys(buttons).forEach((key) => {\n      this.memo('button.' + key, buttons[key]);\n    });\n\n    const modules = $.extend({}, this.options.modules, $.summernote.plugins || {});\n\n    // add and initialize modules\n    Object.keys(modules).forEach((key) => {\n      this.module(key, modules[key], true);\n    });\n\n    Object.keys(this.modules).forEach((key) => {\n      this.initializeModule(key);\n    });\n  }\n\n  _destroy() {\n    // destroy modules with reversed order\n    Object.keys(this.modules).reverse().forEach((key) => {\n      this.removeModule(key);\n    });\n\n    Object.keys(this.memos).forEach((key) => {\n      this.removeMemo(key);\n    });\n    // trigger custom onDestroy callback\n    this.triggerEvent('destroy', this);\n  }\n\n  code(html) {\n    const isActivated = this.invoke('codeview.isActivated');\n\n    if (html === undefined) {\n      this.invoke('codeview.sync');\n      return isActivated ? this.layoutInfo.codable.val() : this.layoutInfo.editable.html();\n    } else {\n      if (isActivated) {\n        this.invoke('codeview.sync', html);\n      } else {\n        this.layoutInfo.editable.html(html);\n      }\n      this.$note.val(html);\n      this.triggerEvent('change', html, this.layoutInfo.editable);\n    }\n  }\n\n  isDisabled() {\n    return this.layoutInfo.editable.attr('contenteditable') === 'false';\n  }\n\n  enable() {\n    this.layoutInfo.editable.attr('contenteditable', true);\n    this.invoke('toolbar.activate', true);\n    this.triggerEvent('disable', false);\n    this.options.editing = true;\n  }\n\n  disable() {\n    // close codeview if codeview is opend\n    if (this.invoke('codeview.isActivated')) {\n      this.invoke('codeview.deactivate');\n    }\n    this.layoutInfo.editable.attr('contenteditable', false);\n    this.options.editing = false;\n    this.invoke('toolbar.deactivate', true);\n\n    this.triggerEvent('disable', true);\n  }\n\n  triggerEvent() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const callback = this.options.callbacks[func.namespaceToCamel(namespace, 'on')];\n    if (callback) {\n      callback.apply(this.$note[0], args);\n    }\n    this.$note.trigger('summernote.' + namespace, args);\n  }\n\n  initializeModule(key) {\n    const module = this.modules[key];\n    module.shouldInitialize = module.shouldInitialize || func.ok;\n    if (!module.shouldInitialize()) {\n      return;\n    }\n\n    // initialize module\n    if (module.initialize) {\n      module.initialize();\n    }\n\n    // attach events\n    if (module.events) {\n      dom.attachEvents(this.$note, module.events);\n    }\n  }\n\n  module(key, ModuleClass, withoutIntialize) {\n    if (arguments.length === 1) {\n      return this.modules[key];\n    }\n\n    this.modules[key] = new ModuleClass(this);\n\n    if (!withoutIntialize) {\n      this.initializeModule(key);\n    }\n  }\n\n  removeModule(key) {\n    const module = this.modules[key];\n    if (module.shouldInitialize()) {\n      if (module.events) {\n        dom.detachEvents(this.$note, module.events);\n      }\n\n      if (module.destroy) {\n        module.destroy();\n      }\n    }\n\n    delete this.modules[key];\n  }\n\n  memo(key, obj) {\n    if (arguments.length === 1) {\n      return this.memos[key];\n    }\n    this.memos[key] = obj;\n  }\n\n  removeMemo(key) {\n    if (this.memos[key] && this.memos[key].destroy) {\n      this.memos[key].destroy();\n    }\n\n    delete this.memos[key];\n  }\n\n  /**\n   * Some buttons need to change their visual style immediately once they get pressed\n   */\n  createInvokeHandlerAndUpdateState(namespace, value) {\n    return (event) => {\n      this.createInvokeHandler(namespace, value)(event);\n      this.invoke('buttons.updateCurrentStyle');\n    };\n  }\n\n  createInvokeHandler(namespace, value) {\n    return (event) => {\n      event.preventDefault();\n      const $target = $(event.target);\n      this.invoke(namespace, value || $target.closest('[data-value]').data('value'), $target);\n    };\n  }\n\n  invoke() {\n    const namespace = lists.head(arguments);\n    const args = lists.tail(lists.from(arguments));\n\n    const splits = namespace.split('.');\n    const hasSeparator = splits.length > 1;\n    const moduleName = hasSeparator && lists.head(splits);\n    const methodName = hasSeparator ? lists.last(splits) : lists.head(splits);\n\n    const module = this.modules[moduleName || 'editor'];\n    if (!moduleName && this[methodName]) {\n      return this[methodName].apply(this, args);\n    } else if (module && module[methodName] && module.shouldInitialize()) {\n      return module[methodName].apply(module, args);\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from './env';\nimport func from './func';\nimport lists from './lists';\nimport dom from './dom';\n\n/**\n * return boundaryPoint from TextRange, inspired by Andy Na's HuskyRange.js\n *\n * @param {TextRange} textRange\n * @param {Boolean} isStart\n * @return {BoundaryPoint}\n *\n * @see http://msdn.microsoft.com/en-us/library/ie/ms535872(v=vs.85).aspx\n */\nfunction textRangeToPoint(textRange, isStart) {\n  let container = textRange.parentElement();\n  let offset;\n\n  const tester = document.body.createTextRange();\n  let prevContainer;\n  const childNodes = lists.from(container.childNodes);\n  for (offset = 0; offset < childNodes.length; offset++) {\n    if (dom.isText(childNodes[offset])) {\n      continue;\n    }\n    tester.moveToElementText(childNodes[offset]);\n    if (tester.compareEndPoints('StartToStart', textRange) >= 0) {\n      break;\n    }\n    prevContainer = childNodes[offset];\n  }\n\n  if (offset !== 0 && dom.isText(childNodes[offset - 1])) {\n    const textRangeStart = document.body.createTextRange();\n    let curTextNode = null;\n    textRangeStart.moveToElementText(prevContainer || container);\n    textRangeStart.collapse(!prevContainer);\n    curTextNode = prevContainer ? prevContainer.nextSibling : container.firstChild;\n\n    const pointTester = textRange.duplicate();\n    pointTester.setEndPoint('StartToStart', textRangeStart);\n    let textCount = pointTester.text.replace(/[\\r\\n]/g, '').length;\n\n    while (textCount > curTextNode.nodeValue.length && curTextNode.nextSibling) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    // [workaround] enforce IE to re-reference curTextNode, hack\n    const dummy = curTextNode.nodeValue; // eslint-disable-line\n\n    if (isStart && curTextNode.nextSibling && dom.isText(curTextNode.nextSibling) &&\n      textCount === curTextNode.nodeValue.length) {\n      textCount -= curTextNode.nodeValue.length;\n      curTextNode = curTextNode.nextSibling;\n    }\n\n    container = curTextNode;\n    offset = textCount;\n  }\n\n  return {\n    cont: container,\n    offset: offset,\n  };\n}\n\n/**\n * return TextRange from boundary point (inspired by google closure-library)\n * @param {BoundaryPoint} point\n * @return {TextRange}\n */\nfunction pointToTextRange(point) {\n  const textRangeInfo = function(container, offset) {\n    let node, isCollapseToStart;\n\n    if (dom.isText(container)) {\n      const prevTextNodes = dom.listPrev(container, func.not(dom.isText));\n      const prevContainer = lists.last(prevTextNodes).previousSibling;\n      node = prevContainer || container.parentNode;\n      offset += lists.sum(lists.tail(prevTextNodes), dom.nodeLength);\n      isCollapseToStart = !prevContainer;\n    } else {\n      node = container.childNodes[offset] || container;\n      if (dom.isText(node)) {\n        return textRangeInfo(node, 0);\n      }\n\n      offset = 0;\n      isCollapseToStart = false;\n    }\n\n    return {\n      node: node,\n      collapseToStart: isCollapseToStart,\n      offset: offset,\n    };\n  };\n\n  const textRange = document.body.createTextRange();\n  const info = textRangeInfo(point.node, point.offset);\n\n  textRange.moveToElementText(info.node);\n  textRange.collapse(info.collapseToStart);\n  textRange.moveStart('character', info.offset);\n  return textRange;\n}\n\n/**\n   * Wrapped Range\n   *\n   * @constructor\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   */\nclass WrappedRange {\n  constructor(sc, so, ec, eo) {\n    this.sc = sc;\n    this.so = so;\n    this.ec = ec;\n    this.eo = eo;\n\n    // isOnEditable: judge whether range is on editable or not\n    this.isOnEditable = this.makeIsOn(dom.isEditable);\n    // isOnList: judge whether range is on list node or not\n    this.isOnList = this.makeIsOn(dom.isList);\n    // isOnAnchor: judge whether range is on anchor node or not\n    this.isOnAnchor = this.makeIsOn(dom.isAnchor);\n    // isOnCell: judge whether range is on cell node or not\n    this.isOnCell = this.makeIsOn(dom.isCell);\n    // isOnData: judge whether range is on data node or not\n    this.isOnData = this.makeIsOn(dom.isData);\n  }\n\n  // nativeRange: get nativeRange from sc, so, ec, eo\n  nativeRange() {\n    if (env.isW3CRangeSupport) {\n      const w3cRange = document.createRange();\n      w3cRange.setStart(this.sc, this.so);\n      w3cRange.setEnd(this.ec, this.eo);\n\n      return w3cRange;\n    } else {\n      const textRange = pointToTextRange({\n        node: this.sc,\n        offset: this.so,\n      });\n\n      textRange.setEndPoint('EndToEnd', pointToTextRange({\n        node: this.ec,\n        offset: this.eo,\n      }));\n\n      return textRange;\n    }\n  }\n\n  getPoints() {\n    return {\n      sc: this.sc,\n      so: this.so,\n      ec: this.ec,\n      eo: this.eo,\n    };\n  }\n\n  getStartPoint() {\n    return {\n      node: this.sc,\n      offset: this.so,\n    };\n  }\n\n  getEndPoint() {\n    return {\n      node: this.ec,\n      offset: this.eo,\n    };\n  }\n\n  /**\n   * select update visible range\n   */\n  select() {\n    const nativeRng = this.nativeRange();\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (selection.rangeCount > 0) {\n        selection.removeAllRanges();\n      }\n      selection.addRange(nativeRng);\n    } else {\n      nativeRng.select();\n    }\n\n    return this;\n  }\n\n  /**\n   * Moves the scrollbar to start container(sc) of current range\n   *\n   * @return {WrappedRange}\n   */\n  scrollIntoView(container) {\n    const height = $(container).height();\n    if (container.scrollTop + height < this.sc.offsetTop) {\n      container.scrollTop += Math.abs(container.scrollTop + height - this.sc.offsetTop);\n    }\n\n    return this;\n  }\n\n  /**\n   * @return {WrappedRange}\n   */\n  normalize() {\n    /**\n     * @param {BoundaryPoint} point\n     * @param {Boolean} isLeftToRight - true: prefer to choose right node\n     *                                - false: prefer to choose left node\n     * @return {BoundaryPoint}\n     */\n    const getVisiblePoint = function(point, isLeftToRight) {\n      if (!point) {\n        return point;\n      }\n\n      // Just use the given point [XXX:Adhoc]\n      //  - case 01. if the point is on the middle of the node\n      //  - case 02. if the point is on the right edge and prefer to choose left node\n      //  - case 03. if the point is on the left edge and prefer to choose right node\n      //  - case 04. if the point is on the right edge and prefer to choose right node but the node is void\n      //  - case 05. if the point is on the left edge and prefer to choose left node but the node is void\n      //  - case 06. if the point is on the block node and there is no children\n      if (dom.isVisiblePoint(point)) {\n        if (!dom.isEdgePoint(point) ||\n            (dom.isRightEdgePoint(point) && !isLeftToRight) ||\n            (dom.isLeftEdgePoint(point) && isLeftToRight) ||\n            (dom.isRightEdgePoint(point) && isLeftToRight && dom.isVoid(point.node.nextSibling)) ||\n            (dom.isLeftEdgePoint(point) && !isLeftToRight && dom.isVoid(point.node.previousSibling)) ||\n            (dom.isBlock(point.node) && dom.isEmpty(point.node))) {\n          return point;\n        }\n      }\n\n      // point on block's edge\n      const block = dom.ancestor(point.node, dom.isBlock);\n      let hasRightNode = false;\n\n      if (!hasRightNode) {\n        const prevPoint = dom.prevPoint(point) || { node: null };\n        hasRightNode = (dom.isLeftEdgePointOf(point, block) || dom.isVoid(prevPoint.node)) && !isLeftToRight;\n      }\n\n      let hasLeftNode = false;\n      if (!hasLeftNode) {\n        const nextPoint = dom.nextPoint(point) || { node: null };\n        hasLeftNode = (dom.isRightEdgePointOf(point, block) || dom.isVoid(nextPoint.node)) && isLeftToRight;\n      }\n\n      if (hasRightNode || hasLeftNode) {\n        // returns point already on visible point\n        if (dom.isVisiblePoint(point)) {\n          return point;\n        }\n        // reverse direction\n        isLeftToRight = !isLeftToRight;\n      }\n\n      const nextPoint = isLeftToRight ? dom.nextPointUntil(dom.nextPoint(point), dom.isVisiblePoint)\n        : dom.prevPointUntil(dom.prevPoint(point), dom.isVisiblePoint);\n      return nextPoint || point;\n    };\n\n    const endPoint = getVisiblePoint(this.getEndPoint(), false);\n    const startPoint = this.isCollapsed() ? endPoint : getVisiblePoint(this.getStartPoint(), true);\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns matched nodes on range\n   *\n   * @param {Function} [pred] - predicate function\n   * @param {Object} [options]\n   * @param {Boolean} [options.includeAncestor]\n   * @param {Boolean} [options.fullyContains]\n   * @return {Node[]}\n   */\n  nodes(pred, options) {\n    pred = pred || func.ok;\n\n    const includeAncestor = options && options.includeAncestor;\n    const fullyContains = options && options.fullyContains;\n\n    // TODO compare points and sort\n    const startPoint = this.getStartPoint();\n    const endPoint = this.getEndPoint();\n\n    const nodes = [];\n    const leftEdgeNodes = [];\n\n    dom.walkPoint(startPoint, endPoint, function(point) {\n      if (dom.isEditable(point.node)) {\n        return;\n      }\n\n      let node;\n      if (fullyContains) {\n        if (dom.isLeftEdgePoint(point)) {\n          leftEdgeNodes.push(point.node);\n        }\n        if (dom.isRightEdgePoint(point) && lists.contains(leftEdgeNodes, point.node)) {\n          node = point.node;\n        }\n      } else if (includeAncestor) {\n        node = dom.ancestor(point.node, pred);\n      } else {\n        node = point.node;\n      }\n\n      if (node && pred(node)) {\n        nodes.push(node);\n      }\n    }, true);\n\n    return lists.unique(nodes);\n  }\n\n  /**\n   * returns commonAncestor of range\n   * @return {Element} - commonAncestor\n   */\n  commonAncestor() {\n    return dom.commonAncestor(this.sc, this.ec);\n  }\n\n  /**\n   * returns expanded range by pred\n   *\n   * @param {Function} pred - predicate function\n   * @return {WrappedRange}\n   */\n  expand(pred) {\n    const startAncestor = dom.ancestor(this.sc, pred);\n    const endAncestor = dom.ancestor(this.ec, pred);\n\n    if (!startAncestor && !endAncestor) {\n      return new WrappedRange(this.sc, this.so, this.ec, this.eo);\n    }\n\n    const boundaryPoints = this.getPoints();\n\n    if (startAncestor) {\n      boundaryPoints.sc = startAncestor;\n      boundaryPoints.so = 0;\n    }\n\n    if (endAncestor) {\n      boundaryPoints.ec = endAncestor;\n      boundaryPoints.eo = dom.nodeLength(endAncestor);\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * @param {Boolean} isCollapseToStart\n   * @return {WrappedRange}\n   */\n  collapse(isCollapseToStart) {\n    if (isCollapseToStart) {\n      return new WrappedRange(this.sc, this.so, this.sc, this.so);\n    } else {\n      return new WrappedRange(this.ec, this.eo, this.ec, this.eo);\n    }\n  }\n\n  /**\n   * splitText on range\n   */\n  splitText() {\n    const isSameContainer = this.sc === this.ec;\n    const boundaryPoints = this.getPoints();\n\n    if (dom.isText(this.ec) && !dom.isEdgePoint(this.getEndPoint())) {\n      this.ec.splitText(this.eo);\n    }\n\n    if (dom.isText(this.sc) && !dom.isEdgePoint(this.getStartPoint())) {\n      boundaryPoints.sc = this.sc.splitText(this.so);\n      boundaryPoints.so = 0;\n\n      if (isSameContainer) {\n        boundaryPoints.ec = boundaryPoints.sc;\n        boundaryPoints.eo = this.eo - this.so;\n      }\n    }\n\n    return new WrappedRange(\n      boundaryPoints.sc,\n      boundaryPoints.so,\n      boundaryPoints.ec,\n      boundaryPoints.eo\n    );\n  }\n\n  /**\n   * delete contents on range\n   * @return {WrappedRange}\n   */\n  deleteContents() {\n    if (this.isCollapsed()) {\n      return this;\n    }\n\n    const rng = this.splitText();\n    const nodes = rng.nodes(null, {\n      fullyContains: true,\n    });\n\n    // find new cursor point\n    const point = dom.prevPointUntil(rng.getStartPoint(), function(point) {\n      return !lists.contains(nodes, point.node);\n    });\n\n    const emptyParents = [];\n    $.each(nodes, function(idx, node) {\n      // find empty parents\n      const parent = node.parentNode;\n      if (point.node !== parent && dom.nodeLength(parent) === 1) {\n        emptyParents.push(parent);\n      }\n      dom.remove(node, false);\n    });\n\n    // remove empty parents\n    $.each(emptyParents, function(idx, node) {\n      dom.remove(node, false);\n    });\n\n    return new WrappedRange(\n      point.node,\n      point.offset,\n      point.node,\n      point.offset\n    ).normalize();\n  }\n\n  /**\n   * makeIsOn: return isOn(pred) function\n   */\n  makeIsOn(pred) {\n    return function() {\n      const ancestor = dom.ancestor(this.sc, pred);\n      return !!ancestor && (ancestor === dom.ancestor(this.ec, pred));\n    };\n  }\n\n  /**\n   * @param {Function} pred\n   * @return {Boolean}\n   */\n  isLeftEdgeOf(pred) {\n    if (!dom.isLeftEdgePoint(this.getStartPoint())) {\n      return false;\n    }\n\n    const node = dom.ancestor(this.sc, pred);\n    return node && dom.isLeftEdgeOf(this.sc, node);\n  }\n\n  /**\n   * returns whether range was collapsed or not\n   */\n  isCollapsed() {\n    return this.sc === this.ec && this.so === this.eo;\n  }\n\n  /**\n   * wrap inline nodes which children of body with paragraph\n   *\n   * @return {WrappedRange}\n   */\n  wrapBodyInlineWithPara() {\n    if (dom.isBodyContainer(this.sc) && dom.isEmpty(this.sc)) {\n      this.sc.innerHTML = dom.emptyPara;\n      return new WrappedRange(this.sc.firstChild, 0, this.sc.firstChild, 0);\n    }\n\n    /**\n     * [workaround] firefox often create range on not visible point. so normalize here.\n     *  - firefox: |<p>text</p>|\n     *  - chrome: <p>|text|</p>\n     */\n    const rng = this.normalize();\n    if (dom.isParaInline(this.sc) || dom.isPara(this.sc)) {\n      return rng;\n    }\n\n    // find inline top ancestor\n    let topAncestor;\n    if (dom.isInline(rng.sc)) {\n      const ancestors = dom.listAncestor(rng.sc, func.not(dom.isInline));\n      topAncestor = lists.last(ancestors);\n      if (!dom.isInline(topAncestor)) {\n        topAncestor = ancestors[ancestors.length - 2] || rng.sc.childNodes[rng.so];\n      }\n    } else {\n      topAncestor = rng.sc.childNodes[rng.so > 0 ? rng.so - 1 : 0];\n    }\n\n    if (topAncestor) {\n      // siblings not in paragraph\n      let inlineSiblings = dom.listPrev(topAncestor, dom.isParaInline).reverse();\n      inlineSiblings = inlineSiblings.concat(dom.listNext(topAncestor.nextSibling, dom.isParaInline));\n\n      // wrap with paragraph\n      if (inlineSiblings.length) {\n        const para = dom.wrap(lists.head(inlineSiblings), 'p');\n        dom.appendChildNodes(para, lists.tail(inlineSiblings));\n      }\n    }\n\n    return this.normalize();\n  }\n\n  /**\n   * insert node at current cursor\n   *\n   * @param {Node} node\n   * @return {Node}\n   */\n  insertNode(node) {\n    let rng = this;\n\n    if (dom.isText(node) || dom.isInline(node)) {\n      rng = this.wrapBodyInlineWithPara().deleteContents();\n    }\n\n    const info = dom.splitPoint(rng.getStartPoint(), dom.isInline(node));\n    if (info.rightNode) {\n      info.rightNode.parentNode.insertBefore(node, info.rightNode);\n      if (dom.isEmpty(info.rightNode) && dom.isPara(node)) {\n        info.rightNode.parentNode.removeChild(info.rightNode);\n      }\n    } else {\n      info.container.appendChild(node);\n    }\n\n    return node;\n  }\n\n  /**\n   * insert html at current cursor\n   */\n  pasteHTML(markup) {\n    markup = $.trim(markup);\n\n    const contentsContainer = $('<div></div>').html(markup)[0];\n    let childNodes = lists.from(contentsContainer.childNodes);\n\n    // const rng = this.wrapBodyInlineWithPara().deleteContents();\n    const rng = this;\n    let reversed = false;\n\n    if (rng.so >= 0) {\n      childNodes = childNodes.reverse();\n      reversed = true;\n    }\n\n    childNodes = childNodes.map(function(childNode) {\n      return rng.insertNode(childNode);\n    });\n\n    if (reversed) {\n      childNodes = childNodes.reverse();\n    }\n    return childNodes;\n  }\n\n  /**\n   * returns text in range\n   *\n   * @return {String}\n   */\n  toString() {\n    const nativeRng = this.nativeRange();\n    return env.isW3CRangeSupport ? nativeRng.toString() : nativeRng.text;\n  }\n\n  /**\n   * returns range for word before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordRange(findAfter) {\n    let endPoint = this.getEndPoint();\n\n    if (!dom.isCharPoint(endPoint)) {\n      return this;\n    }\n\n    const startPoint = dom.prevPointUntil(endPoint, function(point) {\n      return !dom.isCharPoint(point);\n    });\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, function(point) {\n        return !dom.isCharPoint(point);\n      });\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor\n   *\n   * @param {Boolean} [findAfter] - find after cursor, default: false\n   * @return {WrappedRange}\n   */\n  getWordsRange(findAfter) {\n    var endPoint = this.getEndPoint();\n\n    var isNotTextPoint = function(point) {\n      return !dom.isCharPoint(point) && !dom.isSpacePoint(point);\n    };\n\n    if (isNotTextPoint(endPoint)) {\n      return this;\n    }\n\n    var startPoint = dom.prevPointUntil(endPoint, isNotTextPoint);\n\n    if (findAfter) {\n      endPoint = dom.nextPointUntil(endPoint, isNotTextPoint);\n    }\n\n    return new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * returns range for words before cursor that match with a Regex\n   *\n   * example:\n   *  range: 'hi @Peter Pan'\n   *  regex: '/@[a-z ]+/i'\n   *  return range: '@Peter Pan'\n   *\n   * @param {RegExp} [regex]\n   * @return {WrappedRange|null}\n   */\n  getWordsMatchRange(regex) {\n    var endPoint = this.getEndPoint();\n\n    var startPoint = dom.prevPointUntil(endPoint, function(point) {\n      if (!dom.isCharPoint(point) && !dom.isSpacePoint(point)) {\n        return true;\n      }\n      var rng = new WrappedRange(\n        point.node,\n        point.offset,\n        endPoint.node,\n        endPoint.offset\n      );\n      var result = regex.exec(rng.toString());\n      return result && result.index === 0;\n    });\n\n    var rng = new WrappedRange(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n\n    var text = rng.toString();\n    var result = regex.exec(text);\n\n    if (result && result[0].length === text.length) {\n      return rng;\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * create offsetPath bookmark\n   *\n   * @param {Node} editable\n   */\n  bookmark(editable) {\n    return {\n      s: {\n        path: dom.makeOffsetPath(editable, this.sc),\n        offset: this.so,\n      },\n      e: {\n        path: dom.makeOffsetPath(editable, this.ec),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * create offsetPath bookmark base on paragraph\n   *\n   * @param {Node[]} paras\n   */\n  paraBookmark(paras) {\n    return {\n      s: {\n        path: lists.tail(dom.makeOffsetPath(lists.head(paras), this.sc)),\n        offset: this.so,\n      },\n      e: {\n        path: lists.tail(dom.makeOffsetPath(lists.last(paras), this.ec)),\n        offset: this.eo,\n      },\n    };\n  }\n\n  /**\n   * getClientRects\n   * @return {Rect[]}\n   */\n  getClientRects() {\n    const nativeRng = this.nativeRange();\n    return nativeRng.getClientRects();\n  }\n}\n\n/**\n * Data structure\n *  * BoundaryPoint: a point of dom tree\n *  * BoundaryPoints: two boundaryPoints corresponding to the start and the end of the Range\n *\n * See to http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Position\n */\nexport default {\n  /**\n   * create Range Object From arguments or Browser Selection\n   *\n   * @param {Node} sc - start container\n   * @param {Number} so - start offset\n   * @param {Node} ec - end container\n   * @param {Number} eo - end offset\n   * @return {WrappedRange}\n   */\n  create: function(sc, so, ec, eo) {\n    if (arguments.length === 4) {\n      return new WrappedRange(sc, so, ec, eo);\n    } else if (arguments.length === 2) { // collapsed\n      ec = sc;\n      eo = so;\n      return new WrappedRange(sc, so, ec, eo);\n    } else {\n      let wrappedRange = this.createFromSelection();\n\n      if (!wrappedRange && arguments.length === 1) {\n        let bodyElement = arguments[0];\n        if (dom.isEditable(bodyElement)) {\n          bodyElement = bodyElement.lastChild;\n        }\n        return this.createFromBodyElement(bodyElement, dom.emptyPara === arguments[0].innerHTML);\n      }\n      return wrappedRange;\n    }\n  },\n\n  createFromBodyElement: function(bodyElement, isCollapseToStart = false) {\n    var wrappedRange = this.createFromNode(bodyElement);\n    return wrappedRange.collapse(isCollapseToStart);\n  },\n\n  createFromSelection: function() {\n    let sc, so, ec, eo;\n    if (env.isW3CRangeSupport) {\n      const selection = document.getSelection();\n      if (!selection || selection.rangeCount === 0) {\n        return null;\n      } else if (dom.isBody(selection.anchorNode)) {\n        // Firefox: returns entire body as range on initialization.\n        // We won't never need it.\n        return null;\n      }\n\n      const nativeRng = selection.getRangeAt(0);\n      sc = nativeRng.startContainer;\n      so = nativeRng.startOffset;\n      ec = nativeRng.endContainer;\n      eo = nativeRng.endOffset;\n    } else { // IE8: TextRange\n      const textRange = document.selection.createRange();\n      const textRangeEnd = textRange.duplicate();\n      textRangeEnd.collapse(false);\n      const textRangeStart = textRange;\n      textRangeStart.collapse(true);\n\n      let startPoint = textRangeToPoint(textRangeStart, true);\n      let endPoint = textRangeToPoint(textRangeEnd, false);\n\n      // same visible point case: range was collapsed.\n      if (dom.isText(startPoint.node) && dom.isLeftEdgePoint(startPoint) &&\n        dom.isTextNode(endPoint.node) && dom.isRightEdgePoint(endPoint) &&\n        endPoint.node.nextSibling === startPoint.node) {\n        startPoint = endPoint;\n      }\n\n      sc = startPoint.cont;\n      so = startPoint.offset;\n      ec = endPoint.cont;\n      eo = endPoint.offset;\n    }\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from node\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNode: function(node) {\n    let sc = node;\n    let so = 0;\n    let ec = node;\n    let eo = dom.nodeLength(ec);\n\n    // browsers can't target a picture or void node\n    if (dom.isVoid(sc)) {\n      so = dom.listPrev(sc).length - 1;\n      sc = sc.parentNode;\n    }\n    if (dom.isBR(ec)) {\n      eo = dom.listPrev(ec).length - 1;\n      ec = ec.parentNode;\n    } else if (dom.isVoid(ec)) {\n      eo = dom.listPrev(ec).length;\n      ec = ec.parentNode;\n    }\n\n    return this.create(sc, so, ec, eo);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeBefore: function(node) {\n    return this.createFromNode(node).collapse(true);\n  },\n\n  /**\n   * create WrappedRange from node after position\n   *\n   * @param {Node} node\n   * @return {WrappedRange}\n   */\n  createFromNodeAfter: function(node) {\n    return this.createFromNode(node).collapse();\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from bookmark\n   *\n   * @param {Node} editable\n   * @param {Object} bookmark\n   * @return {WrappedRange}\n   */\n  createFromBookmark: function(editable, bookmark) {\n    const sc = dom.fromOffsetPath(editable, bookmark.s.path);\n    const so = bookmark.s.offset;\n    const ec = dom.fromOffsetPath(editable, bookmark.e.path);\n    const eo = bookmark.e.offset;\n    return new WrappedRange(sc, so, ec, eo);\n  },\n\n  /**\n   * @method\n   *\n   * create WrappedRange from paraBookmark\n   *\n   * @param {Object} bookmark\n   * @param {Node[]} paras\n   * @return {WrappedRange}\n   */\n  createFromParaBookmark: function(bookmark, paras) {\n    const so = bookmark.s.offset;\n    const eo = bookmark.e.offset;\n    const sc = dom.fromOffsetPath(lists.head(paras), bookmark.s.path);\n    const ec = dom.fromOffsetPath(lists.last(paras), bookmark.e.path);\n\n    return new WrappedRange(sc, so, ec, eo);\n  },\n};\n","import $ from 'jquery';\nimport env from './base/core/env';\nimport lists from './base/core/lists';\nimport Context from './base/Context';\n\n$.fn.extend({\n  /**\n   * Summernote API\n   *\n   * @param {Object|String}\n   * @return {this}\n   */\n  summernote: function() {\n    const type = $.type(lists.head(arguments));\n    const isExternalAPICalled = type === 'string';\n    const hasInitOptions = type === 'object';\n\n    const options = $.extend({}, $.summernote.options, hasInitOptions ? lists.head(arguments) : {});\n\n    // Update options\n    options.langInfo = $.extend(true, {}, $.summernote.lang['en-US'], $.summernote.lang[options.lang]);\n    options.icons = $.extend(true, {}, $.summernote.options.icons, options.icons);\n    options.tooltip = options.tooltip === 'auto' ? !env.isSupportTouch : options.tooltip;\n\n    this.each((idx, note) => {\n      const $note = $(note);\n      if (!$note.data('summernote')) {\n        const context = new Context($note, options);\n        $note.data('summernote', context);\n        $note.data('summernote').triggerEvent('init', context.layoutInfo);\n      }\n    });\n\n    const $note = this.first();\n    if ($note.length) {\n      const context = $note.data('summernote');\n      if (isExternalAPICalled) {\n        return context.invoke.apply(context, lists.from(arguments));\n      } else if (options.focus) {\n        context.invoke('editor.focus');\n      }\n    }\n\n    return this;\n  },\n});\n","import lists from './lists';\nimport func from './func';\n\nconst KEY_MAP = {\n  'BACKSPACE': 8,\n  'TAB': 9,\n  'ENTER': 13,\n  'ESCAPE': 27,\n  'SPACE': 32,\n  'DELETE': 46,\n\n  // Arrow\n  'LEFT': 37,\n  'UP': 38,\n  'RIGHT': 39,\n  'DOWN': 40,\n\n  // Number: 0-9\n  'NUM0': 48,\n  'NUM1': 49,\n  'NUM2': 50,\n  'NUM3': 51,\n  'NUM4': 52,\n  'NUM5': 53,\n  'NUM6': 54,\n  'NUM7': 55,\n  'NUM8': 56,\n\n  // Alphabet: a-z\n  'B': 66,\n  'E': 69,\n  'I': 73,\n  'J': 74,\n  'K': 75,\n  'L': 76,\n  'R': 82,\n  'S': 83,\n  'U': 85,\n  'V': 86,\n  'Y': 89,\n  'Z': 90,\n\n  'SLASH': 191,\n  'LEFTBRACKET': 219,\n  'BACKSLASH': 220,\n  'RIGHTBRACKET': 221,\n\n  // Navigation\n  'HOME': 36,\n  'END': 35,\n  'PAGEUP': 33,\n  'PAGEDOWN': 34,\n};\n\n/**\n * @class core.key\n *\n * Object for keycodes.\n *\n * @singleton\n * @alternateClassName key\n */\nexport default {\n  /**\n   * @method isEdit\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isEdit: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.BACKSPACE,\n      KEY_MAP.TAB,\n      KEY_MAP.ENTER,\n      KEY_MAP.SPACE,\n      KEY_MAP.DELETE,\n    ], keyCode);\n  },\n  /**\n   * @method isMove\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isMove: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.LEFT,\n      KEY_MAP.UP,\n      KEY_MAP.RIGHT,\n      KEY_MAP.DOWN,\n    ], keyCode);\n  },\n  /**\n   * @method isNavigation\n   *\n   * @param {Number} keyCode\n   * @return {Boolean}\n   */\n  isNavigation: (keyCode) => {\n    return lists.contains([\n      KEY_MAP.HOME,\n      KEY_MAP.END,\n      KEY_MAP.PAGEUP,\n      KEY_MAP.PAGEDOWN,\n    ], keyCode);\n  },\n  /**\n   * @property {Object} nameFromCode\n   * @property {String} nameFromCode.8 \"BACKSPACE\"\n   */\n  nameFromCode: func.invertObject(KEY_MAP),\n  code: KEY_MAP,\n};\n","import range from '../core/range';\n\nexport default class History {\n  constructor(context) {\n    this.stack = [];\n    this.stackOffset = -1;\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n    this.editable = this.$editable[0];\n  }\n\n  makeSnapshot() {\n    const rng = range.create(this.editable);\n    const emptyBookmark = { s: { path: [], offset: 0 }, e: { path: [], offset: 0 } };\n\n    return {\n      contents: this.$editable.html(),\n      bookmark: ((rng && rng.isOnEditable()) ? rng.bookmark(this.editable) : emptyBookmark),\n    };\n  }\n\n  applySnapshot(snapshot) {\n    if (snapshot.contents !== null) {\n      this.$editable.html(snapshot.contents);\n    }\n    if (snapshot.bookmark !== null) {\n      range.createFromBookmark(this.editable, snapshot.bookmark).select();\n    }\n  }\n\n  /**\n  * @method rewind\n  * Rewinds the history stack back to the first snapshot taken.\n  * Leaves the stack intact, so that \"Redo\" can still be used.\n  */\n  rewind() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    // Return to the first available snapshot.\n    this.stackOffset = 0;\n\n    // Apply that snapshot.\n    this.applySnapshot(this.stack[this.stackOffset]);\n  }\n\n  /**\n  *  @method commit\n  *  Resets history stack, but keeps current editor's content.\n  */\n  commit() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n  * @method reset\n  * Resets the history stack completely; reverting to an empty editor.\n  */\n  reset() {\n    // Clear the stack.\n    this.stack = [];\n\n    // Restore stackOffset to its original value.\n    this.stackOffset = -1;\n\n    // Clear the editable area.\n    this.$editable.html('');\n\n    // Record our first snapshot (of nothing).\n    this.recordUndo();\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    // Create snap shot if not yet recorded\n    if (this.$editable.html() !== this.stack[this.stackOffset].contents) {\n      this.recordUndo();\n    }\n\n    if (this.stackOffset > 0) {\n      this.stackOffset--;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    if (this.stack.length - 1 > this.stackOffset) {\n      this.stackOffset++;\n      this.applySnapshot(this.stack[this.stackOffset]);\n    }\n  }\n\n  /**\n   * recorded undo\n   */\n  recordUndo() {\n    this.stackOffset++;\n\n    // Wash out stack after stackOffset\n    if (this.stack.length > this.stackOffset) {\n      this.stack = this.stack.slice(0, this.stackOffset);\n    }\n\n    // Create new snapshot and push it to the end\n    this.stack.push(this.makeSnapshot());\n\n    // If the stack size reachs to the limit, then slice it\n    if (this.stack.length > this.context.options.historyLimit) {\n      this.stack.shift();\n      this.stackOffset -= 1;\n    }\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class Style {\n  /**\n   * @method jQueryCSS\n   *\n   * [workaround] for old jQuery\n   * passing an array of style properties to .css()\n   * will result in an object of property-value pairs.\n   * (compability with version < 1.9)\n   *\n   * @private\n   * @param  {jQuery} $obj\n   * @param  {Array} propertyNames - An array of one or more CSS properties.\n   * @return {Object}\n   */\n  jQueryCSS($obj, propertyNames) {\n    if (env.jqueryVersion < 1.9) {\n      const result = {};\n      $.each(propertyNames, (idx, propertyName) => {\n        result[propertyName] = $obj.css(propertyName);\n      });\n      return result;\n    }\n    return $obj.css(propertyNames);\n  }\n\n  /**\n   * returns style object from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  fromNode($node) {\n    const properties = ['font-family', 'font-size', 'text-align', 'list-style-type', 'line-height'];\n    const styleInfo = this.jQueryCSS($node, properties) || {};\n\n    const fontSize = $node[0].style.fontSize || styleInfo['font-size'];\n\n    styleInfo['font-size'] = parseInt(fontSize, 10);\n    styleInfo['font-size-unit'] = fontSize.match(/[a-z%]+$/);\n\n    return styleInfo;\n  }\n\n  /**\n   * paragraph level style\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} styleInfo\n   */\n  stylePara(rng, styleInfo) {\n    $.each(rng.nodes(dom.isPara, {\n      includeAncestor: true,\n    }), (idx, para) => {\n      $(para).css(styleInfo);\n    });\n  }\n\n  /**\n   * insert and returns styleNodes on range.\n   *\n   * @param {WrappedRange} rng\n   * @param {Object} [options] - options for styleNodes\n   * @param {String} [options.nodeName] - default: `SPAN`\n   * @param {Boolean} [options.expandClosestSibling] - default: `false`\n   * @param {Boolean} [options.onlyPartialContains] - default: `false`\n   * @return {Node[]}\n   */\n  styleNodes(rng, options) {\n    rng = rng.splitText();\n\n    const nodeName = (options && options.nodeName) || 'SPAN';\n    const expandClosestSibling = !!(options && options.expandClosestSibling);\n    const onlyPartialContains = !!(options && options.onlyPartialContains);\n\n    if (rng.isCollapsed()) {\n      return [rng.insertNode(dom.create(nodeName))];\n    }\n\n    let pred = dom.makePredByNodeName(nodeName);\n    const nodes = rng.nodes(dom.isText, {\n      fullyContains: true,\n    }).map((text) => {\n      return dom.singleChildAncestor(text, pred) || dom.wrap(text, nodeName);\n    });\n\n    if (expandClosestSibling) {\n      if (onlyPartialContains) {\n        const nodesInRange = rng.nodes();\n        // compose with partial contains predication\n        pred = func.and(pred, (node) => {\n          return lists.contains(nodesInRange, node);\n        });\n      }\n\n      return nodes.map((node) => {\n        const siblings = dom.withClosestSiblings(node, pred);\n        const head = lists.head(siblings);\n        const tails = lists.tail(siblings);\n        $.each(tails, (idx, elem) => {\n          dom.appendChildNodes(head, elem.childNodes);\n          dom.remove(elem);\n        });\n        return lists.head(siblings);\n      });\n    } else {\n      return nodes;\n    }\n  }\n\n  /**\n   * get current style on cursor\n   *\n   * @param {WrappedRange} rng\n   * @return {Object} - object contains style properties.\n   */\n  current(rng) {\n    const $cont = $(!dom.isElement(rng.sc) ? rng.sc.parentNode : rng.sc);\n    let styleInfo = this.fromNode($cont);\n\n    // document.queryCommandState for toggle state\n    // [workaround] prevent Firefox nsresult: \"0x80004005 (NS_ERROR_FAILURE)\"\n    try {\n      styleInfo = $.extend(styleInfo, {\n        'font-bold': document.queryCommandState('bold') ? 'bold' : 'normal',\n        'font-italic': document.queryCommandState('italic') ? 'italic' : 'normal',\n        'font-underline': document.queryCommandState('underline') ? 'underline' : 'normal',\n        'font-subscript': document.queryCommandState('subscript') ? 'subscript' : 'normal',\n        'font-superscript': document.queryCommandState('superscript') ? 'superscript' : 'normal',\n        'font-strikethrough': document.queryCommandState('strikethrough') ? 'strikethrough' : 'normal',\n        'font-family': document.queryCommandValue('fontname') || styleInfo['font-family'],\n      });\n    } catch (e) {\n      // eslint-disable-next-line\n    }\n\n    // list-style-type to list-style(unordered, ordered)\n    if (!rng.isOnList()) {\n      styleInfo['list-style'] = 'none';\n    } else {\n      const orderedTypes = ['circle', 'disc', 'disc-leading-zero', 'square'];\n      const isUnordered = orderedTypes.indexOf(styleInfo['list-style-type']) > -1;\n      styleInfo['list-style'] = isUnordered ? 'unordered' : 'ordered';\n    }\n\n    const para = dom.ancestor(rng.sc, dom.isPara);\n    if (para && para.style['line-height']) {\n      styleInfo['line-height'] = para.style.lineHeight;\n    } else {\n      const lineHeight = parseInt(styleInfo['line-height'], 10) / parseInt(styleInfo['font-size'], 10);\n      styleInfo['line-height'] = lineHeight.toFixed(1);\n    }\n\n    styleInfo.anchor = rng.isOnAnchor() && dom.ancestor(rng.sc, dom.isAnchor);\n    styleInfo.ancestors = dom.listAncestor(rng.sc, dom.isEditable);\n    styleInfo.range = rng;\n\n    return styleInfo;\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport func from '../core/func';\nimport dom from '../core/dom';\nimport range from '../core/range';\n\nexport default class Bullet {\n  /**\n   * toggle ordered list\n   */\n  insertOrderedList(editable) {\n    this.toggleList('OL', editable);\n  }\n\n  /**\n   * toggle unordered list\n   */\n  insertUnorderedList(editable) {\n    this.toggleList('UL', editable);\n  }\n\n  /**\n   * indent\n   */\n  indent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        const previousList = this.findList(head.previousSibling);\n        if (previousList) {\n          paras\n            .map(para => previousList.appendChild(para));\n        } else {\n          this.wrapList(paras, head.parentNode.nodeName);\n          paras\n            .map((para) => para.parentNode)\n            .map((para) => this.appendToPrevious(para));\n        }\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            return (parseInt(val, 10) || 0) + 25;\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * outdent\n   */\n  outdent(editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    const paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      if (dom.isLi(head)) {\n        this.releaseList([paras]);\n      } else {\n        $.each(paras, (idx, para) => {\n          $(para).css('marginLeft', (idx, val) => {\n            val = (parseInt(val, 10) || 0);\n            return val > 25 ? val - 25 : '';\n          });\n        });\n      }\n    });\n\n    rng.select();\n  }\n\n  /**\n   * toggle list\n   *\n   * @param {String} listName - OL or UL\n   */\n  toggleList(listName, editable) {\n    const rng = range.create(editable).wrapBodyInlineWithPara();\n\n    let paras = rng.nodes(dom.isPara, { includeAncestor: true });\n    const bookmark = rng.paraBookmark(paras);\n    const clustereds = lists.clusterBy(paras, func.peq2('parentNode'));\n\n    // paragraph to list\n    if (lists.find(paras, dom.isPurePara)) {\n      let wrappedParas = [];\n      $.each(clustereds, (idx, paras) => {\n        wrappedParas = wrappedParas.concat(this.wrapList(paras, listName));\n      });\n      paras = wrappedParas;\n    // list to paragraph or change list style\n    } else {\n      const diffLists = rng.nodes(dom.isList, {\n        includeAncestor: true,\n      }).filter((listNode) => {\n        return !$.nodeName(listNode, listName);\n      });\n\n      if (diffLists.length) {\n        $.each(diffLists, (idx, listNode) => {\n          dom.replace(listNode, listName);\n        });\n      } else {\n        paras = this.releaseList(clustereds, true);\n      }\n    }\n\n    range.createFromParaBookmark(bookmark, paras).select();\n  }\n\n  /**\n   * @param {Node[]} paras\n   * @param {String} listName\n   * @return {Node[]}\n   */\n  wrapList(paras, listName) {\n    const head = lists.head(paras);\n    const last = lists.last(paras);\n\n    const prevList = dom.isList(head.previousSibling) && head.previousSibling;\n    const nextList = dom.isList(last.nextSibling) && last.nextSibling;\n\n    const listNode = prevList || dom.insertAfter(dom.create(listName || 'UL'), last);\n\n    // P to LI\n    paras = paras.map((para) => {\n      return dom.isPurePara(para) ? dom.replace(para, 'LI') : para;\n    });\n\n    // append to list(<ul>, <ol>)\n    dom.appendChildNodes(listNode, paras);\n\n    if (nextList) {\n      dom.appendChildNodes(listNode, lists.from(nextList.childNodes));\n      dom.remove(nextList);\n    }\n\n    return paras;\n  }\n\n  /**\n   * @method releaseList\n   *\n   * @param {Array[]} clustereds\n   * @param {Boolean} isEscapseToBody\n   * @return {Node[]}\n   */\n  releaseList(clustereds, isEscapseToBody) {\n    let releasedParas = [];\n\n    $.each(clustereds, (idx, paras) => {\n      const head = lists.head(paras);\n      const last = lists.last(paras);\n\n      const headList = isEscapseToBody ? dom.lastAncestor(head, dom.isList) : head.parentNode;\n      const parentItem = headList.parentNode;\n\n      if (headList.parentNode.nodeName === 'LI') {\n        paras.map(para => {\n          const newList = this.findNextSiblings(para);\n\n          if (parentItem.nextSibling) {\n            parentItem.parentNode.insertBefore(\n              para,\n              parentItem.nextSibling\n            );\n          } else {\n            parentItem.parentNode.appendChild(para);\n          }\n\n          if (newList.length) {\n            this.wrapList(newList, headList.nodeName);\n            para.appendChild(newList[0].parentNode);\n          }\n        });\n\n        if (headList.children.length === 0) {\n          parentItem.removeChild(headList);\n        }\n\n        if (parentItem.childNodes.length === 0) {\n          parentItem.parentNode.removeChild(parentItem);\n        }\n      } else {\n        const lastList = headList.childNodes.length > 1 ? dom.splitTree(headList, {\n          node: last.parentNode,\n          offset: dom.position(last) + 1,\n        }, {\n          isSkipPaddingBlankHTML: true,\n        }) : null;\n\n        const middleList = dom.splitTree(headList, {\n          node: head.parentNode,\n          offset: dom.position(head),\n        }, {\n          isSkipPaddingBlankHTML: true,\n        });\n\n        paras = isEscapseToBody ? dom.listDescendant(middleList, dom.isLi)\n          : lists.from(middleList.childNodes).filter(dom.isLi);\n\n        // LI to P\n        if (isEscapseToBody || !dom.isList(headList.parentNode)) {\n          paras = paras.map((para) => {\n            return dom.replace(para, 'P');\n          });\n        }\n\n        $.each(lists.from(paras).reverse(), (idx, para) => {\n          dom.insertAfter(para, headList);\n        });\n\n        // remove empty lists\n        const rootLists = lists.compact([headList, middleList, lastList]);\n        $.each(rootLists, (idx, rootList) => {\n          const listNodes = [rootList].concat(dom.listDescendant(rootList, dom.isList));\n          $.each(listNodes.reverse(), (idx, listNode) => {\n            if (!dom.nodeLength(listNode)) {\n              dom.remove(listNode, true);\n            }\n          });\n        });\n      }\n\n      releasedParas = releasedParas.concat(paras);\n    });\n\n    return releasedParas;\n  }\n\n  /**\n   * @method appendToPrevious\n   *\n   * Appends list to previous list item, if\n   * none exist it wraps the list in a new list item.\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  appendToPrevious(node) {\n    return node.previousSibling\n      ? dom.appendChildNodes(node.previousSibling, [node])\n      : this.wrapList([node], 'LI');\n  }\n\n  /**\n   * @method findList\n   *\n   * Finds an existing list in list item\n   *\n   * @param {HTMLNode} ListItem\n   * @return {Array[]}\n   */\n  findList(node) {\n    return node\n      ? lists.find(node.children, child => ['OL', 'UL'].indexOf(child.nodeName) > -1)\n      : null;\n  }\n\n  /**\n   * @method findNextSiblings\n   *\n   * Finds all list item siblings that follow it\n   *\n   * @param {HTMLNode} ListItem\n   * @return {HTMLNode}\n   */\n  findNextSiblings(node) {\n    const siblings = [];\n    while (node.nextSibling) {\n      siblings.push(node.nextSibling);\n      node = node.nextSibling;\n    }\n    return siblings;\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport Bullet from '../editing/Bullet';\n\n/**\n * @class editing.Typing\n *\n * Typing\n *\n */\nexport default class Typing {\n  constructor(context) {\n    // a Bullet instance to toggle lists off\n    this.bullet = new Bullet();\n    this.options = context.options;\n  }\n\n  /**\n   * insert tab\n   *\n   * @param {WrappedRange} rng\n   * @param {Number} tabsize\n   */\n  insertTab(rng, tabsize) {\n    const tab = dom.createText(new Array(tabsize + 1).join(dom.NBSP_CHAR));\n    rng = rng.deleteContents();\n    rng.insertNode(tab, true);\n\n    rng = range.create(tab, tabsize);\n    rng.select();\n  }\n\n  /**\n   * insert paragraph\n   *\n   * @param {jQuery} $editable\n   * @param {WrappedRange} rng Can be used in unit tests to \"mock\" the range\n   *\n   * blockquoteBreakingLevel\n   *   0 - No break, the new paragraph remains inside the quote\n   *   1 - Break the first blockquote in the ancestors list\n   *   2 - Break all blockquotes, so that the new paragraph is not quoted (this is the default)\n   */\n  insertParagraph(editable, rng) {\n    rng = rng || range.create(editable);\n\n    // deleteContents on range.\n    rng = rng.deleteContents();\n\n    // Wrap range if it needs to be wrapped by paragraph\n    rng = rng.wrapBodyInlineWithPara();\n\n    // finding paragraph\n    const splitRoot = dom.ancestor(rng.sc, dom.isPara);\n\n    let nextPara;\n    // on paragraph: split paragraph\n    if (splitRoot) {\n      // if it is an empty line with li\n      if (dom.isLi(splitRoot) && (dom.isEmpty(splitRoot) || dom.deepestChildIsEmpty(splitRoot))) {\n        // toggle UL/OL and escape\n        this.bullet.toggleList(splitRoot.parentNode.nodeName);\n        return;\n      } else {\n        let blockquote = null;\n        if (this.options.blockquoteBreakingLevel === 1) {\n          blockquote = dom.ancestor(splitRoot, dom.isBlockquote);\n        } else if (this.options.blockquoteBreakingLevel === 2) {\n          blockquote = dom.lastAncestor(splitRoot, dom.isBlockquote);\n        }\n\n        if (blockquote) {\n          // We're inside a blockquote and options ask us to break it\n          nextPara = $(dom.emptyPara)[0];\n          // If the split is right before a <br>, remove it so that there's no \"empty line\"\n          // after the split in the new blockquote created\n          if (dom.isRightEdgePoint(rng.getStartPoint()) && dom.isBR(rng.sc.nextSibling)) {\n            $(rng.sc.nextSibling).remove();\n          }\n          const split = dom.splitTree(blockquote, rng.getStartPoint(), { isDiscardEmptySplits: true });\n          if (split) {\n            split.parentNode.insertBefore(nextPara, split);\n          } else {\n            dom.insertAfter(nextPara, blockquote); // There's no split if we were at the end of the blockquote\n          }\n        } else {\n          nextPara = dom.splitTree(splitRoot, rng.getStartPoint());\n\n          // not a blockquote, just insert the paragraph\n          let emptyAnchors = dom.listDescendant(splitRoot, dom.isEmptyAnchor);\n          emptyAnchors = emptyAnchors.concat(dom.listDescendant(nextPara, dom.isEmptyAnchor));\n\n          $.each(emptyAnchors, (idx, anchor) => {\n            dom.remove(anchor);\n          });\n\n          // replace empty heading, pre or custom-made styleTag with P tag\n          if ((dom.isHeading(nextPara) || dom.isPre(nextPara) || dom.isCustomStyleTag(nextPara)) && dom.isEmpty(nextPara)) {\n            nextPara = dom.replace(nextPara, 'p');\n          }\n        }\n      }\n    // no paragraph: insert empty paragraph\n    } else {\n      const next = rng.sc.childNodes[rng.so];\n      nextPara = $(dom.emptyPara)[0];\n      if (next) {\n        rng.sc.insertBefore(nextPara, next);\n      } else {\n        rng.sc.appendChild(nextPara);\n      }\n    }\n\n    range.create(nextPara, 0).normalize().select().scrollIntoView(editable);\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport lists from '../core/lists';\n\n/**\n * @class Create a virtual table to create what actions to do in change.\n * @param {object} startPoint Cell selected to apply change.\n * @param {enum} where  Where change will be applied Row or Col. Use enum: TableResultAction.where\n * @param {enum} action Action to be applied. Use enum: TableResultAction.requestAction\n * @param {object} domTable Dom element of table to make changes.\n */\nconst TableResultAction = function(startPoint, where, action, domTable) {\n  const _startPoint = { 'colPos': 0, 'rowPos': 0 };\n  const _virtualTable = [];\n  const _actionCellList = [];\n\n  /// ///////////////////////////////////////////\n  // Private functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Set the startPoint of action.\n   */\n  function setStartPoint() {\n    if (!startPoint || !startPoint.tagName || (startPoint.tagName.toLowerCase() !== 'td' && startPoint.tagName.toLowerCase() !== 'th')) {\n      // Impossible to identify start Cell point\n      return;\n    }\n    _startPoint.colPos = startPoint.cellIndex;\n    if (!startPoint.parentElement || !startPoint.parentElement.tagName || startPoint.parentElement.tagName.toLowerCase() !== 'tr') {\n      // Impossible to identify start Row point\n      return;\n    }\n    _startPoint.rowPos = startPoint.parentElement.rowIndex;\n  }\n\n  /**\n   * Define virtual table position info object.\n   *\n   * @param {int} rowIndex Index position in line of virtual table.\n   * @param {int} cellIndex Index position in column of virtual table.\n   * @param {object} baseRow Row affected by this position.\n   * @param {object} baseCell Cell affected by this position.\n   * @param {bool} isSpan Inform if it is an span cell/row.\n   */\n  function setVirtualTablePosition(rowIndex, cellIndex, baseRow, baseCell, isRowSpan, isColSpan, isVirtualCell) {\n    const objPosition = {\n      'baseRow': baseRow,\n      'baseCell': baseCell,\n      'isRowSpan': isRowSpan,\n      'isColSpan': isColSpan,\n      'isVirtual': isVirtualCell,\n    };\n    if (!_virtualTable[rowIndex]) {\n      _virtualTable[rowIndex] = [];\n    }\n    _virtualTable[rowIndex][cellIndex] = objPosition;\n  }\n\n  /**\n   * Create action cell object.\n   *\n   * @param {object} virtualTableCellObj Object of specific position on virtual table.\n   * @param {enum} resultAction Action to be applied in that item.\n   */\n  function getActionCell(virtualTableCellObj, resultAction, virtualRowPosition, virtualColPosition) {\n    return {\n      'baseCell': virtualTableCellObj.baseCell,\n      'action': resultAction,\n      'virtualTable': {\n        'rowIndex': virtualRowPosition,\n        'cellIndex': virtualColPosition,\n      },\n    };\n  }\n\n  /**\n   * Recover free index of row to append Cell.\n   *\n   * @param {int} rowIndex Index of row to find free space.\n   * @param {int} cellIndex Index of cell to find free space in table.\n   */\n  function recoverCellIndex(rowIndex, cellIndex) {\n    if (!_virtualTable[rowIndex]) {\n      return cellIndex;\n    }\n    if (!_virtualTable[rowIndex][cellIndex]) {\n      return cellIndex;\n    }\n\n    let newCellIndex = cellIndex;\n    while (_virtualTable[rowIndex][newCellIndex]) {\n      newCellIndex++;\n      if (!_virtualTable[rowIndex][newCellIndex]) {\n        return newCellIndex;\n      }\n    }\n  }\n\n  /**\n   * Recover info about row and cell and add information to virtual table.\n   *\n   * @param {object} row Row to recover information.\n   * @param {object} cell Cell to recover information.\n   */\n  function addCellInfoToVirtual(row, cell) {\n    const cellIndex = recoverCellIndex(row.rowIndex, cell.cellIndex);\n    const cellHasColspan = (cell.colSpan > 1);\n    const cellHasRowspan = (cell.rowSpan > 1);\n    const isThisSelectedCell = (row.rowIndex === _startPoint.rowPos && cell.cellIndex === _startPoint.colPos);\n    setVirtualTablePosition(row.rowIndex, cellIndex, row, cell, cellHasRowspan, cellHasColspan, false);\n\n    // Add span rows to virtual Table.\n    const rowspanNumber = cell.attributes.rowSpan ? parseInt(cell.attributes.rowSpan.value, 10) : 0;\n    if (rowspanNumber > 1) {\n      for (let rp = 1; rp < rowspanNumber; rp++) {\n        const rowspanIndex = row.rowIndex + rp;\n        adjustStartPoint(rowspanIndex, cellIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(rowspanIndex, cellIndex, row, cell, true, cellHasColspan, true);\n      }\n    }\n\n    // Add span cols to virtual table.\n    const colspanNumber = cell.attributes.colSpan ? parseInt(cell.attributes.colSpan.value, 10) : 0;\n    if (colspanNumber > 1) {\n      for (let cp = 1; cp < colspanNumber; cp++) {\n        const cellspanIndex = recoverCellIndex(row.rowIndex, (cellIndex + cp));\n        adjustStartPoint(row.rowIndex, cellspanIndex, cell, isThisSelectedCell);\n        setVirtualTablePosition(row.rowIndex, cellspanIndex, row, cell, cellHasRowspan, true, true);\n      }\n    }\n  }\n\n  /**\n   * Process validation and adjust of start point if needed\n   *\n   * @param {int} rowIndex\n   * @param {int} cellIndex\n   * @param {object} cell\n   * @param {bool} isSelectedCell\n   */\n  function adjustStartPoint(rowIndex, cellIndex, cell, isSelectedCell) {\n    if (rowIndex === _startPoint.rowPos && _startPoint.colPos >= cell.cellIndex && cell.cellIndex <= cellIndex && !isSelectedCell) {\n      _startPoint.colPos++;\n    }\n  }\n\n  /**\n   * Create virtual table of cells with all cells, including span cells.\n   */\n  function createVirtualTable() {\n    const rows = domTable.rows;\n    for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n      const cells = rows[rowIndex].cells;\n      for (let cellIndex = 0; cellIndex < cells.length; cellIndex++) {\n        addCellInfoToVirtual(rows[rowIndex], cells[cellIndex]);\n      }\n    }\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getDeleteResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (!cell.isVirtual && cell.isRowSpan) {\n          return TableResultAction.resultAction.AddCell;\n        } else if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SubtractSpanCount;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.RemoveCell;\n  }\n\n  /**\n   * Get action to be applied on the cell.\n   *\n   * @param {object} cell virtual table cell to apply action\n   */\n  function getAddResultActionToCell(cell) {\n    switch (where) {\n      case TableResultAction.where.Column:\n        if (cell.isColSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isRowSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n      case TableResultAction.where.Row:\n        if (cell.isRowSpan) {\n          return TableResultAction.resultAction.SumSpanCount;\n        } else if (cell.isColSpan && cell.isVirtual) {\n          return TableResultAction.resultAction.Ignore;\n        }\n        break;\n    }\n    return TableResultAction.resultAction.AddCell;\n  }\n\n  function init() {\n    setStartPoint();\n    createVirtualTable();\n  }\n\n  /// ///////////////////////////////////////////\n  // Public functions\n  /// ///////////////////////////////////////////\n\n  /**\n   * Recover array os what to do in table.\n   */\n  this.getActionList = function() {\n    const fixedRow = (where === TableResultAction.where.Row) ? _startPoint.rowPos : -1;\n    const fixedCol = (where === TableResultAction.where.Column) ? _startPoint.colPos : -1;\n\n    let actualPosition = 0;\n    let canContinue = true;\n    while (canContinue) {\n      const rowPosition = (fixedRow >= 0) ? fixedRow : actualPosition;\n      const colPosition = (fixedCol >= 0) ? fixedCol : actualPosition;\n      const row = _virtualTable[rowPosition];\n      if (!row) {\n        canContinue = false;\n        return _actionCellList;\n      }\n      const cell = row[colPosition];\n      if (!cell) {\n        canContinue = false;\n        return _actionCellList;\n      }\n\n      // Define action to be applied in this cell\n      let resultAction = TableResultAction.resultAction.Ignore;\n      switch (action) {\n        case TableResultAction.requestAction.Add:\n          resultAction = getAddResultActionToCell(cell);\n          break;\n        case TableResultAction.requestAction.Delete:\n          resultAction = getDeleteResultActionToCell(cell);\n          break;\n      }\n      _actionCellList.push(getActionCell(cell, resultAction, rowPosition, colPosition));\n      actualPosition++;\n    }\n\n    return _actionCellList;\n  };\n\n  init();\n};\n/**\n*\n* Where action occours enum.\n*/\nTableResultAction.where = { 'Row': 0, 'Column': 1 };\n/**\n*\n* Requested action to apply enum.\n*/\nTableResultAction.requestAction = { 'Add': 0, 'Delete': 1 };\n/**\n*\n* Result action to be executed enum.\n*/\nTableResultAction.resultAction = { 'Ignore': 0, 'SubtractSpanCount': 1, 'RemoveCell': 2, 'AddCell': 3, 'SumSpanCount': 4 };\n\n/**\n *\n * @class editing.Table\n *\n * Table\n *\n */\nexport default class Table {\n  /**\n   * handle tab key\n   *\n   * @param {WrappedRange} rng\n   * @param {Boolean} isShift\n   */\n  tab(rng, isShift) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const table = dom.ancestor(cell, dom.isTable);\n    const cells = dom.listDescendant(table, dom.isCell);\n\n    const nextCell = lists[isShift ? 'prev' : 'next'](cells, cell);\n    if (nextCell) {\n      range.create(nextCell, 0).select();\n    }\n  }\n\n  /**\n   * Add a new row\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (top/bottom)\n   * @return {Node}\n   */\n  addRow(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n\n    const currentTr = $(cell).closest('tr');\n    const trAttributes = this.recoverAttributes(currentTr);\n    const html = $('<tr' + trAttributes + '></tr>');\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Add, $(currentTr).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let idCell = 0; idCell < actions.length; idCell++) {\n      const currentCell = actions[idCell];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          html.append('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          {\n            if (position === 'top') {\n              const baseCellTr = currentCell.baseCell.parent;\n              const isTopFromRowSpan = (!baseCellTr ? 0 : currentCell.baseCell.closest('tr').rowIndex) <= currentTr[0].rowIndex;\n              if (isTopFromRowSpan) {\n                const newTd = $('<div></div>').append($('<td' + tdAttributes + '>' + dom.blank + '</td>').removeAttr('rowspan')).html();\n                html.append(newTd);\n                break;\n              }\n            }\n            let rowspanNumber = parseInt(currentCell.baseCell.rowSpan, 10);\n            rowspanNumber++;\n            currentCell.baseCell.setAttribute('rowSpan', rowspanNumber);\n          }\n          break;\n      }\n    }\n\n    if (position === 'top') {\n      currentTr.before(html);\n    } else {\n      const cellHasRowspan = (cell.rowSpan > 1);\n      if (cellHasRowspan) {\n        const lastTrIndex = currentTr[0].rowIndex + (cell.rowSpan - 2);\n        $($(currentTr).parent().find('tr')[lastTrIndex]).after($(html));\n        return;\n      }\n      currentTr.after(html);\n    }\n  }\n\n  /**\n   * Add a new col\n   *\n   * @param {WrappedRange} rng\n   * @param {String} position (left/right)\n   * @return {Node}\n   */\n  addCol(rng, position) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const rowsGroup = $(row).siblings();\n    rowsGroup.push(row);\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Add, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      const currentCell = actions[actionIndex];\n      const tdAttributes = this.recoverAttributes(currentCell.baseCell);\n      switch (currentCell.action) {\n        case TableResultAction.resultAction.AddCell:\n          if (position === 'right') {\n            $(currentCell.baseCell).after('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n        case TableResultAction.resultAction.SumSpanCount:\n          if (position === 'right') {\n            let colspanNumber = parseInt(currentCell.baseCell.colSpan, 10);\n            colspanNumber++;\n            currentCell.baseCell.setAttribute('colSpan', colspanNumber);\n          } else {\n            $(currentCell.baseCell).before('<td' + tdAttributes + '>' + dom.blank + '</td>');\n          }\n          break;\n      }\n    }\n  }\n\n  /*\n  * Copy attributes from element.\n  *\n  * @param {object} Element to recover attributes.\n  * @return {string} Copied string elements.\n  */\n  recoverAttributes(el) {\n    let resultStr = '';\n\n    if (!el) {\n      return resultStr;\n    }\n\n    const attrList = el.attributes || [];\n\n    for (let i = 0; i < attrList.length; i++) {\n      if (attrList[i].name.toLowerCase() === 'id') {\n        continue;\n      }\n\n      if (attrList[i].specified) {\n        resultStr += ' ' + attrList[i].name + '=\\'' + attrList[i].value + '\\'';\n      }\n    }\n\n    return resultStr;\n  }\n\n  /**\n   * Delete current row\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteRow(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n    const rowPos = row[0].rowIndex;\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Row,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n\n      const baseCell = actions[actionIndex].baseCell;\n      const virtualPosition = actions[actionIndex].virtualTable;\n      const hasRowspan = (baseCell.rowSpan && baseCell.rowSpan > 1);\n      let rowspanNumber = (hasRowspan) ? parseInt(baseCell.rowSpan, 10) : 0;\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.AddCell:\n          {\n            const nextRow = row.next('tr')[0];\n            if (!nextRow) { continue; }\n            const cloneRow = row[0].cells[cellPos];\n            if (hasRowspan) {\n              if (rowspanNumber > 2) {\n                rowspanNumber--;\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].setAttribute('rowSpan', rowspanNumber);\n                nextRow.cells[cellPos].innerHTML = '';\n              } else if (rowspanNumber === 2) {\n                nextRow.insertBefore(cloneRow, nextRow.cells[cellPos]);\n                nextRow.cells[cellPos].removeAttribute('rowSpan');\n                nextRow.cells[cellPos].innerHTML = '';\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          if (hasRowspan) {\n            if (rowspanNumber > 2) {\n              rowspanNumber--;\n              baseCell.setAttribute('rowSpan', rowspanNumber);\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            } else if (rowspanNumber === 2) {\n              baseCell.removeAttribute('rowSpan');\n              if (virtualPosition.rowIndex !== rowPos && baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          // Do not need remove cell because row will be deleted.\n          continue;\n      }\n    }\n    row.remove();\n  }\n\n  /**\n   * Delete current col\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteCol(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    const row = $(cell).closest('tr');\n    const cellPos = row.children('td, th').index($(cell));\n\n    const vTable = new TableResultAction(cell, TableResultAction.where.Column,\n      TableResultAction.requestAction.Delete, $(row).closest('table')[0]);\n    const actions = vTable.getActionList();\n\n    for (let actionIndex = 0; actionIndex < actions.length; actionIndex++) {\n      if (!actions[actionIndex]) {\n        continue;\n      }\n      switch (actions[actionIndex].action) {\n        case TableResultAction.resultAction.Ignore:\n          continue;\n        case TableResultAction.resultAction.SubtractSpanCount:\n          {\n            const baseCell = actions[actionIndex].baseCell;\n            const hasColspan = (baseCell.colSpan && baseCell.colSpan > 1);\n            if (hasColspan) {\n              let colspanNumber = (baseCell.colSpan) ? parseInt(baseCell.colSpan, 10) : 0;\n              if (colspanNumber > 2) {\n                colspanNumber--;\n                baseCell.setAttribute('colSpan', colspanNumber);\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              } else if (colspanNumber === 2) {\n                baseCell.removeAttribute('colSpan');\n                if (baseCell.cellIndex === cellPos) { baseCell.innerHTML = ''; }\n              }\n            }\n          }\n          continue;\n        case TableResultAction.resultAction.RemoveCell:\n          dom.remove(actions[actionIndex].baseCell, true);\n          continue;\n      }\n    }\n  }\n\n  /**\n   * create empty table element\n   *\n   * @param {Number} rowCount\n   * @param {Number} colCount\n   * @return {Node}\n   */\n  createTable(colCount, rowCount, options) {\n    const tds = [];\n    let tdHTML;\n    for (let idxCol = 0; idxCol < colCount; idxCol++) {\n      tds.push('<td>' + dom.blank + '</td>');\n    }\n    tdHTML = tds.join('');\n\n    const trs = [];\n    let trHTML;\n    for (let idxRow = 0; idxRow < rowCount; idxRow++) {\n      trs.push('<tr>' + tdHTML + '</tr>');\n    }\n    trHTML = trs.join('');\n    const $table = $('<table>' + trHTML + '</table>');\n    if (options && options.tableClassName) {\n      $table.addClass(options.tableClassName);\n    }\n\n    return $table[0];\n  }\n\n  /**\n   * Delete current table\n   *\n   * @param {WrappedRange} rng\n   * @return {Node}\n   */\n  deleteTable(rng) {\n    const cell = dom.ancestor(rng.commonAncestor(), dom.isCell);\n    $(cell).closest('table').remove();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport { readFileAsDataURL, createImage } from '../core/async';\nimport History from '../editing/History';\nimport Style from '../editing/Style';\nimport Typing from '../editing/Typing';\nimport Table from '../editing/Table';\nimport Bullet from '../editing/Bullet';\n\nconst KEY_BOGUS = 'bogus';\n\n/**\n * @class Editor\n */\nexport default class Editor {\n  constructor(context) {\n    this.context = context;\n\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.editable = this.$editable[0];\n    this.lastRange = null;\n    this.snapshot = null;\n\n    this.style = new Style();\n    this.table = new Table();\n    this.typing = new Typing(context);\n    this.bullet = new Bullet();\n    this.history = new History(context);\n\n    this.context.memo('help.escape', this.lang.help.escape);\n    this.context.memo('help.undo', this.lang.help.undo);\n    this.context.memo('help.redo', this.lang.help.redo);\n    this.context.memo('help.tab', this.lang.help.tab);\n    this.context.memo('help.untab', this.lang.help.untab);\n    this.context.memo('help.insertParagraph', this.lang.help.insertParagraph);\n    this.context.memo('help.insertOrderedList', this.lang.help.insertOrderedList);\n    this.context.memo('help.insertUnorderedList', this.lang.help.insertUnorderedList);\n    this.context.memo('help.indent', this.lang.help.indent);\n    this.context.memo('help.outdent', this.lang.help.outdent);\n    this.context.memo('help.formatPara', this.lang.help.formatPara);\n    this.context.memo('help.insertHorizontalRule', this.lang.help.insertHorizontalRule);\n    this.context.memo('help.fontName', this.lang.help.fontName);\n\n    // native commands(with execCommand), generate function for execCommand\n    const commands = [\n      'bold', 'italic', 'underline', 'strikethrough', 'superscript', 'subscript',\n      'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n      'formatBlock', 'removeFormat', 'backColor',\n    ];\n\n    for (let idx = 0, len = commands.length; idx < len; idx++) {\n      this[commands[idx]] = ((sCmd) => {\n        return (value) => {\n          this.beforeCommand();\n          document.execCommand(sCmd, false, value);\n          this.afterCommand(true);\n        };\n      })(commands[idx]);\n      this.context.memo('help.' + commands[idx], this.lang.help[commands[idx]]);\n    }\n\n    this.fontName = this.wrapCommand((value) => {\n      return this.fontStyling('font-family', env.validFontName(value));\n    });\n\n    this.fontSize = this.wrapCommand((value) => {\n      const unit = this.currentStyle()['font-size-unit'];\n      return this.fontStyling('font-size', value + unit);\n    });\n\n    this.fontSizeUnit = this.wrapCommand((value) => {\n      const size = this.currentStyle()['font-size'];\n      return this.fontStyling('font-size', size + value);\n    });\n\n    for (let idx = 1; idx <= 6; idx++) {\n      this['formatH' + idx] = ((idx) => {\n        return () => {\n          this.formatBlock('H' + idx);\n        };\n      })(idx);\n      this.context.memo('help.formatH' + idx, this.lang.help['formatH' + idx]);\n    }\n\n    this.insertParagraph = this.wrapCommand(() => {\n      this.typing.insertParagraph(this.editable);\n    });\n\n    this.insertOrderedList = this.wrapCommand(() => {\n      this.bullet.insertOrderedList(this.editable);\n    });\n\n    this.insertUnorderedList = this.wrapCommand(() => {\n      this.bullet.insertUnorderedList(this.editable);\n    });\n\n    this.indent = this.wrapCommand(() => {\n      this.bullet.indent(this.editable);\n    });\n\n    this.outdent = this.wrapCommand(() => {\n      this.bullet.outdent(this.editable);\n    });\n\n    /**\n     * insertNode\n     * insert node\n     * @param {Node} node\n     */\n    this.insertNode = this.wrapCommand((node) => {\n      if (this.isLimited($(node).text().length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      rng.insertNode(node);\n      this.setLastRange(range.createFromNodeAfter(node).select());\n    });\n\n    /**\n     * insert text\n     * @param {String} text\n     */\n    this.insertText = this.wrapCommand((text) => {\n      if (this.isLimited(text.length)) {\n        return;\n      }\n      const rng = this.getLastRange();\n      const textNode = rng.insertNode(dom.createText(text));\n      this.setLastRange(range.create(textNode, dom.nodeLength(textNode)).select());\n    });\n\n    /**\n     * paste HTML\n     * @param {String} markup\n     */\n    this.pasteHTML = this.wrapCommand((markup) => {\n      if (this.isLimited(markup.length)) {\n        return;\n      }\n      markup = this.context.invoke('codeview.purify', markup);\n      const contents = this.getLastRange().pasteHTML(markup);\n      this.setLastRange(range.createFromNodeAfter(lists.last(contents)).select());\n    });\n\n    /**\n     * formatBlock\n     *\n     * @param {String} tagName\n     */\n    this.formatBlock = this.wrapCommand((tagName, $target) => {\n      const onApplyCustomStyle = this.options.callbacks.onApplyCustomStyle;\n      if (onApplyCustomStyle) {\n        onApplyCustomStyle.call(this, $target, this.context, this.onFormatBlock);\n      } else {\n        this.onFormatBlock(tagName, $target);\n      }\n    });\n\n    /**\n     * insert horizontal rule\n     */\n    this.insertHorizontalRule = this.wrapCommand(() => {\n      const hrNode = this.getLastRange().insertNode(dom.create('HR'));\n      if (hrNode.nextSibling) {\n        this.setLastRange(range.create(hrNode.nextSibling, 0).normalize().select());\n      }\n    });\n\n    /**\n     * lineHeight\n     * @param {String} value\n     */\n    this.lineHeight = this.wrapCommand((value) => {\n      this.style.stylePara(this.getLastRange(), {\n        lineHeight: value,\n      });\n    });\n\n    /**\n     * create link (command)\n     *\n     * @param {Object} linkInfo\n     */\n    this.createLink = this.wrapCommand((linkInfo) => {\n      let linkUrl = linkInfo.url;\n      const linkText = linkInfo.text;\n      const isNewWindow = linkInfo.isNewWindow;\n      const checkProtocol = linkInfo.checkProtocol;\n      let rng = linkInfo.range || this.getLastRange();\n      const additionalTextLength = linkText.length - rng.toString().length;\n      if (additionalTextLength > 0 && this.isLimited(additionalTextLength)) {\n        return;\n      }\n      const isTextChanged = rng.toString() !== linkText;\n\n      // handle spaced urls from input\n      if (typeof linkUrl === 'string') {\n        linkUrl = linkUrl.trim();\n      }\n\n      if (this.options.onCreateLink) {\n        linkUrl = this.options.onCreateLink(linkUrl);\n      } else if (checkProtocol) {\n        // if url doesn't have any protocol and not even a relative or a label, use http:// as default\n        linkUrl = /^([A-Za-z][A-Za-z0-9+-.]*\\:|#|\\/)/.test(linkUrl)\n          ? linkUrl : this.options.defaultProtocol + linkUrl;\n      }\n\n      let anchors = [];\n      if (isTextChanged) {\n        rng = rng.deleteContents();\n        const anchor = rng.insertNode($('<A>' + linkText + '</A>')[0]);\n        anchors.push(anchor);\n      } else {\n        anchors = this.style.styleNodes(rng, {\n          nodeName: 'A',\n          expandClosestSibling: true,\n          onlyPartialContains: true,\n        });\n      }\n\n      $.each(anchors, (idx, anchor) => {\n        $(anchor).attr('href', linkUrl);\n        if (isNewWindow) {\n          $(anchor).attr('target', '_blank');\n        } else {\n          $(anchor).removeAttr('target');\n        }\n      });\n\n      this.setLastRange(\n        this.createRangeFromList(anchors).select()\n      );\n    });\n\n    /**\n     * setting color\n     *\n     * @param {Object} sObjColor  color code\n     * @param {String} sObjColor.foreColor foreground color\n     * @param {String} sObjColor.backColor background color\n     */\n    this.color = this.wrapCommand((colorInfo) => {\n      const foreColor = colorInfo.foreColor;\n      const backColor = colorInfo.backColor;\n\n      if (foreColor) { document.execCommand('foreColor', false, foreColor); }\n      if (backColor) { document.execCommand('backColor', false, backColor); }\n    });\n\n    /**\n     * Set foreground color\n     *\n     * @param {String} colorCode foreground color code\n     */\n    this.foreColor = this.wrapCommand((colorInfo) => {\n      document.execCommand('foreColor', false, colorInfo);\n    });\n\n    /**\n     * insert Table\n     *\n     * @param {String} dimension of table (ex : \"5x5\")\n     */\n    this.insertTable = this.wrapCommand((dim) => {\n      const dimension = dim.split('x');\n\n      const rng = this.getLastRange().deleteContents();\n      rng.insertNode(this.table.createTable(dimension[0], dimension[1], this.options));\n    });\n\n    /**\n     * remove media object and Figure Elements if media object is img with Figure.\n     */\n    this.removeMedia = this.wrapCommand(() => {\n      let $target = $(this.restoreTarget()).parent();\n      if ($target.closest('figure').length) {\n        $target.closest('figure').remove();\n      } else {\n        $target = $(this.restoreTarget()).detach();\n      }\n      this.context.triggerEvent('media.delete', $target, this.$editable);\n    });\n\n    /**\n     * float me\n     *\n     * @param {String} value\n     */\n    this.floatMe = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      $target.toggleClass('note-float-left', value === 'left');\n      $target.toggleClass('note-float-right', value === 'right');\n      $target.css('float', (value === 'none' ? '' : value));\n    });\n\n    /**\n     * resize overlay element\n     * @param {String} value\n     */\n    this.resize = this.wrapCommand((value) => {\n      const $target = $(this.restoreTarget());\n      value = parseFloat(value);\n      if (value === 0) {\n        $target.css('width', '');\n      } else {\n        $target.css({\n          width: value * 100 + '%',\n          height: '',\n        });\n      }\n    });\n  }\n\n  initialize() {\n    // bind custom events\n    this.$editable.on('keydown', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        this.context.triggerEvent('enter', event);\n      }\n      this.context.triggerEvent('keydown', event);\n\n      // keep a snapshot to limit text on input event\n      this.snapshot = this.history.makeSnapshot();\n      this.hasKeyShortCut = false;\n      if (!event.isDefaultPrevented()) {\n        if (this.options.shortcuts) {\n          this.hasKeyShortCut = this.handleKeyMap(event);\n        } else {\n          this.preventDefaultEditableShortCuts(event);\n        }\n      }\n      if (this.isLimited(1, event)) {\n        const lastRange = this.getLastRange();\n        if (lastRange.eo - lastRange.so === 0) {\n          return false;\n        }\n      }\n      this.setLastRange();\n\n      // record undo in the key event except keyMap.\n      if (this.options.recordEveryKeystroke) {\n        if (this.hasKeyShortCut === false) {\n          this.history.recordUndo();\n        }\n      }\n    }).on('keyup', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('keyup', event);\n    }).on('focus', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('focus', event);\n    }).on('blur', (event) => {\n      this.context.triggerEvent('blur', event);\n    }).on('mousedown', (event) => {\n      this.context.triggerEvent('mousedown', event);\n    }).on('mouseup', (event) => {\n      this.setLastRange();\n      this.history.recordUndo();\n      this.context.triggerEvent('mouseup', event);\n    }).on('scroll', (event) => {\n      this.context.triggerEvent('scroll', event);\n    }).on('paste', (event) => {\n      this.setLastRange();\n      this.context.triggerEvent('paste', event);\n    }).on('input', () => {\n      // To limit composition characters (e.g. Korean)\n      if (this.isLimited(0) && this.snapshot) {\n        this.history.applySnapshot(this.snapshot);\n      }\n    });\n\n    this.$editable.attr('spellcheck', this.options.spellCheck);\n\n    this.$editable.attr('autocorrect', this.options.spellCheck);\n\n    if (this.options.disableGrammar) {\n      this.$editable.attr('data-gramm', false);\n    }\n\n    // init content before set event\n    this.$editable.html(dom.html(this.$note) || dom.emptyPara);\n\n    this.$editable.on(env.inputEventName, func.debounce(() => {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }, 10));\n\n    this.$editable.on('focusin', (event) => {\n      this.context.triggerEvent('focusin', event);\n    }).on('focusout', (event) => {\n      this.context.triggerEvent('focusout', event);\n    });\n\n    if (this.options.airMode) {\n      if (this.options.overrideContextMenu) {\n        this.$editor.on('contextmenu', (event) => {\n          this.context.triggerEvent('contextmenu', event);\n          return false;\n        });\n      }\n    } else {\n      if (this.options.width) {\n        this.$editor.outerWidth(this.options.width);\n      }\n      if (this.options.height) {\n        this.$editable.outerHeight(this.options.height);\n      }\n      if (this.options.maxHeight) {\n        this.$editable.css('max-height', this.options.maxHeight);\n      }\n      if (this.options.minHeight) {\n        this.$editable.css('min-height', this.options.minHeight);\n      }\n    }\n\n    this.history.recordUndo();\n    this.setLastRange();\n  }\n\n  destroy() {\n    this.$editable.off();\n  }\n\n  handleKeyMap(event) {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    const keys = [];\n\n    if (event.metaKey) { keys.push('CMD'); }\n    if (event.ctrlKey && !event.altKey) { keys.push('CTRL'); }\n    if (event.shiftKey) { keys.push('SHIFT'); }\n\n    const keyName = key.nameFromCode[event.keyCode];\n    if (keyName) {\n      keys.push(keyName);\n    }\n\n    const eventName = keyMap[keys.join('+')];\n\n    if (keyName === 'TAB' && !this.options.tabDisable) {\n      this.afterCommand();\n    } else if (eventName) {\n      if (this.context.invoke(eventName) !== false) {\n        event.preventDefault();\n        // if keyMap action was invoked\n        return true;\n      }\n    } else if (key.isEdit(event.keyCode)) {\n      this.afterCommand();\n    }\n    return false;\n  }\n\n  preventDefaultEditableShortCuts(event) {\n    // B(Bold, 66) / I(Italic, 73) / U(Underline, 85)\n    if ((event.ctrlKey || event.metaKey) &&\n      lists.contains([66, 73, 85], event.keyCode)) {\n      event.preventDefault();\n    }\n  }\n\n  isLimited(pad, event) {\n    pad = pad || 0;\n\n    if (typeof event !== 'undefined') {\n      if (key.isMove(event.keyCode) ||\n          key.isNavigation(event.keyCode) ||\n          (event.ctrlKey || event.metaKey) ||\n          lists.contains([key.code.BACKSPACE, key.code.DELETE], event.keyCode)) {\n        return false;\n      }\n    }\n\n    if (this.options.maxTextLength > 0) {\n      if ((this.$editable.text().length + pad) > this.options.maxTextLength) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * create range\n   * @return {WrappedRange}\n   */\n  createRange() {\n    this.focus();\n    this.setLastRange();\n    return this.getLastRange();\n  }\n\n  /**\n   * create a new range from the list of elements\n   *\n   * @param {list} dom element list\n   * @return {WrappedRange}\n   */\n  createRangeFromList(lst) {\n    const startRange = range.createFromNodeBefore(lists.head(lst));\n    const startPoint = startRange.getStartPoint();\n    const endRange = range.createFromNodeAfter(lists.last(lst));\n    const endPoint = endRange.getEndPoint();\n\n    return range.create(\n      startPoint.node,\n      startPoint.offset,\n      endPoint.node,\n      endPoint.offset\n    );\n  }\n\n  /**\n   * set the last range\n   *\n   * if given rng is exist, set rng as the last range\n   * or create a new range at the end of the document\n   *\n   * @param {WrappedRange} rng\n   */\n  setLastRange(rng) {\n    if (rng) {\n      this.lastRange = rng;\n    } else {\n      this.lastRange = range.create(this.editable);\n\n      if ($(this.lastRange.sc).closest('.note-editable').length === 0) {\n        this.lastRange = range.createFromBodyElement(this.editable);\n      }\n    }\n  }\n\n  /**\n   * get the last range\n   *\n   * if there is a saved last range, return it\n   * or create a new range and return it\n   *\n   * @return {WrappedRange}\n   */\n  getLastRange() {\n    if (!this.lastRange) {\n      this.setLastRange();\n    }\n    return this.lastRange;\n  }\n\n  /**\n   * saveRange\n   *\n   * save current range\n   *\n   * @param {Boolean} [thenCollapse=false]\n   */\n  saveRange(thenCollapse) {\n    if (thenCollapse) {\n      this.getLastRange().collapse().select();\n    }\n  }\n\n  /**\n   * restoreRange\n   *\n   * restore lately range\n   */\n  restoreRange() {\n    if (this.lastRange) {\n      this.lastRange.select();\n      this.focus();\n    }\n  }\n\n  saveTarget(node) {\n    this.$editable.data('target', node);\n  }\n\n  clearTarget() {\n    this.$editable.removeData('target');\n  }\n\n  restoreTarget() {\n    return this.$editable.data('target');\n  }\n\n  /**\n   * currentStyle\n   *\n   * current style\n   * @return {Object|Boolean} unfocus\n   */\n  currentStyle() {\n    let rng = range.create();\n    if (rng) {\n      rng = rng.normalize();\n    }\n    return rng ? this.style.current(rng) : this.style.fromNode(this.$editable);\n  }\n\n  /**\n   * style from node\n   *\n   * @param {jQuery} $node\n   * @return {Object}\n   */\n  styleFromNode($node) {\n    return this.style.fromNode($node);\n  }\n\n  /**\n   * undo\n   */\n  undo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.undo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /*\n  * commit\n  */\n  commit() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.commit();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * redo\n   */\n  redo() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n    this.history.redo();\n    this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n  }\n\n  /**\n   * before command\n   */\n  beforeCommand() {\n    this.context.triggerEvent('before.command', this.$editable.html());\n\n    // Set styleWithCSS before run a command\n    document.execCommand('styleWithCSS', false, this.options.styleWithCSS);\n\n    // keep focus on editable before command execution\n    this.focus();\n  }\n\n  /**\n   * after command\n   * @param {Boolean} isPreventTrigger\n   */\n  afterCommand(isPreventTrigger) {\n    this.normalizeContent();\n    this.history.recordUndo();\n    if (!isPreventTrigger) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n  }\n\n  /**\n   * handle tab key\n   */\n  tab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n\n      if (!this.isLimited(this.options.tabSize)) {\n        this.beforeCommand();\n        this.typing.insertTab(rng, this.options.tabSize);\n        this.afterCommand();\n      }\n    }\n  }\n\n  /**\n   * handle shift+tab key\n   */\n  untab() {\n    const rng = this.getLastRange();\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.table.tab(rng, true);\n    } else {\n      if (this.options.tabSize === 0) {\n        return false;\n      }\n    }\n  }\n\n  /**\n   * run given function between beforeCommand and afterCommand\n   */\n  wrapCommand(fn) {\n    return function() {\n      this.beforeCommand();\n      fn.apply(this, arguments);\n      this.afterCommand();\n    };\n  }\n\n  /**\n   * insert image\n   *\n   * @param {String} src\n   * @param {String|Function} param\n   * @return {Promise}\n   */\n  insertImage(src, param) {\n    return createImage(src, param).then(($image) => {\n      this.beforeCommand();\n\n      if (typeof param === 'function') {\n        param($image);\n      } else {\n        if (typeof param === 'string') {\n          $image.attr('data-filename', param);\n        }\n        $image.css('width', Math.min(this.$editable.width(), $image.width()));\n      }\n\n      $image.show();\n      this.getLastRange().insertNode($image[0]);\n      this.setLastRange(range.createFromNodeAfter($image[0]).select());\n      this.afterCommand();\n    }).fail((e) => {\n      this.context.triggerEvent('image.upload.error', e);\n    });\n  }\n\n  /**\n   * insertImages\n   * @param {File[]} files\n   */\n  insertImagesAsDataURL(files) {\n    $.each(files, (idx, file) => {\n      const filename = file.name;\n      if (this.options.maximumImageFileSize && this.options.maximumImageFileSize < file.size) {\n        this.context.triggerEvent('image.upload.error', this.lang.image.maximumFileSizeError);\n      } else {\n        readFileAsDataURL(file).then((dataURL) => {\n          return this.insertImage(dataURL, filename);\n        }).fail(() => {\n          this.context.triggerEvent('image.upload.error');\n        });\n      }\n    });\n  }\n\n  /**\n   * insertImagesOrCallback\n   * @param {File[]} files\n   */\n  insertImagesOrCallback(files) {\n    const callbacks = this.options.callbacks;\n    // If onImageUpload set,\n    if (callbacks.onImageUpload) {\n      this.context.triggerEvent('image.upload', files);\n      // else insert Image as dataURL\n    } else {\n      this.insertImagesAsDataURL(files);\n    }\n  }\n\n  /**\n   * return selected plain text\n   * @return {String} text\n   */\n  getSelectedText() {\n    let rng = this.getLastRange();\n\n    // if range on anchor, expand range with anchor\n    if (rng.isOnAnchor()) {\n      rng = range.createFromNode(dom.ancestor(rng.sc, dom.isAnchor));\n    }\n\n    return rng.toString();\n  }\n\n  onFormatBlock(tagName, $target) {\n    // [workaround] for MSIE, IE need `<`\n    document.execCommand('FormatBlock', false, env.isMSIE ? '<' + tagName + '>' : tagName);\n\n    // support custom class\n    if ($target && $target.length) {\n      // find the exact element has given tagName\n      if ($target[0].tagName.toUpperCase() !== tagName.toUpperCase()) {\n        $target = $target.find(tagName);\n      }\n\n      if ($target && $target.length) {\n        const className = $target[0].className || '';\n        if (className) {\n          const currentRange = this.createRange();\n\n          const $parent = $([currentRange.sc, currentRange.ec]).closest(tagName);\n          $parent.addClass(className);\n        }\n      }\n    }\n  }\n\n  formatPara() {\n    this.formatBlock('P');\n  }\n\n  fontStyling(target, value) {\n    const rng = this.getLastRange();\n\n    if (rng !== '') {\n      const spans = this.style.styleNodes(rng);\n      this.$editor.find('.note-status-output').html('');\n      $(spans).css(target, value);\n\n      // [workaround] added styled bogus span for style\n      //  - also bogus character needed for cursor position\n      if (rng.isCollapsed()) {\n        const firstSpan = lists.head(spans);\n        if (firstSpan && !dom.nodeLength(firstSpan)) {\n          firstSpan.innerHTML = dom.ZERO_WIDTH_NBSP_CHAR;\n          range.createFromNode(firstSpan.firstChild).select();\n          this.setLastRange();\n          this.$editable.data(KEY_BOGUS, firstSpan);\n        }\n      } else {\n        this.setLastRange(\n          this.createRangeFromList(spans).select()\n        );\n      }\n    } else {\n      const noteStatusOutput = $.now();\n      this.$editor.find('.note-status-output').html('<div id=\"note-status-output-' + noteStatusOutput + '\" class=\"alert alert-info\">' + this.lang.output.noSelection + '</div>');\n      setTimeout(function() { $('#note-status-output-' + noteStatusOutput).remove(); }, 5000);\n    }\n  }\n\n  /**\n   * unlink\n   *\n   * @type command\n   */\n  unlink() {\n    let rng = this.getLastRange();\n    if (rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      rng = range.createFromNode(anchor);\n      rng.select();\n      this.setLastRange();\n\n      this.beforeCommand();\n      document.execCommand('unlink');\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * returns link info\n   *\n   * @return {Object}\n   * @return {WrappedRange} return.range\n   * @return {String} return.text\n   * @return {Boolean} [return.isNewWindow=true]\n   * @return {String} [return.url=\"\"]\n   */\n  getLinkInfo() {\n    const rng = this.getLastRange().expand(dom.isAnchor);\n    // Get the first anchor on range(for edit).\n    const $anchor = $(lists.head(rng.nodes(dom.isAnchor)));\n    const linkInfo = {\n      range: rng,\n      text: rng.toString(),\n      url: $anchor.length ? $anchor.attr('href') : '',\n    };\n\n    // When anchor exists,\n    if ($anchor.length) {\n      // Set isNewWindow by checking its target.\n      linkInfo.isNewWindow = $anchor.attr('target') === '_blank';\n    }\n\n    return linkInfo;\n  }\n\n  addRow(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addRow(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  addCol(position) {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.addCol(rng, position);\n      this.afterCommand();\n    }\n  }\n\n  deleteRow() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteRow(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteCol() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteCol(rng);\n      this.afterCommand();\n    }\n  }\n\n  deleteTable() {\n    const rng = this.getLastRange(this.$editable);\n    if (rng.isCollapsed() && rng.isOnCell()) {\n      this.beforeCommand();\n      this.table.deleteTable(rng);\n      this.afterCommand();\n    }\n  }\n\n  /**\n   * @param {Position} pos\n   * @param {jQuery} $target - target element\n   * @param {Boolean} [bKeepRatio] - keep ratio\n   */\n  resizeTo(pos, $target, bKeepRatio) {\n    let imageSize;\n    if (bKeepRatio) {\n      const newRatio = pos.y / pos.x;\n      const ratio = $target.data('ratio');\n      imageSize = {\n        width: ratio > newRatio ? pos.x : pos.y / ratio,\n        height: ratio > newRatio ? pos.x * ratio : pos.y,\n      };\n    } else {\n      imageSize = {\n        width: pos.x,\n        height: pos.y,\n      };\n    }\n\n    $target.css(imageSize);\n  }\n\n  /**\n   * returns whether editable area has focus or not.\n   */\n  hasFocus() {\n    return this.$editable.is(':focus');\n  }\n\n  /**\n   * set focus\n   */\n  focus() {\n    // [workaround] Screen will move when page is scolled in IE.\n    //  - do focus when not focused\n    if (!this.hasFocus()) {\n      this.$editable.focus();\n    }\n  }\n\n  /**\n   * returns whether contents is empty or not.\n   * @return {Boolean}\n   */\n  isEmpty() {\n    return dom.isEmpty(this.$editable[0]) || dom.emptyPara === this.$editable.html();\n  }\n\n  /**\n   * Removes all contents and restores the editable instance to an _emptyPara_.\n   */\n  empty() {\n    this.context.invoke('code', dom.emptyPara);\n  }\n\n  /**\n   * normalize content\n   */\n  normalizeContent() {\n    this.$editable[0].normalize();\n  }\n}\n","import $ from 'jquery';\n\n/**\n * @method readFileAsDataURL\n *\n * read contents of file as representing URL\n *\n * @param {File} file\n * @return {Promise} - then: dataUrl\n */\nexport function readFileAsDataURL(file) {\n  return $.Deferred((deferred) => {\n    $.extend(new FileReader(), {\n      onload: (e) => {\n        const dataURL = e.target.result;\n        deferred.resolve(dataURL);\n      },\n      onerror: (err) => {\n        deferred.reject(err);\n      },\n    }).readAsDataURL(file);\n  }).promise();\n}\n\n/**\n * @method createImage\n *\n * create `<image>` from url string\n *\n * @param {String} url\n * @return {Promise} - then: $image\n */\nexport function createImage(url) {\n  return $.Deferred((deferred) => {\n    const $img = $('<img>');\n\n    $img.one('load', () => {\n      $img.off('error abort');\n      deferred.resolve($img);\n    }).one('error abort', () => {\n      $img.off('load').detach();\n      deferred.reject($img);\n    }).css({\n      display: 'none',\n    }).appendTo(document.body).attr('src', url);\n  }).promise();\n}\n","import lists from '../core/lists';\n\nexport default class Clipboard {\n  constructor(context) {\n    this.context = context;\n    this.$editable = context.layoutInfo.editable;\n  }\n\n  initialize() {\n    this.$editable.on('paste', this.pasteByEvent.bind(this));\n  }\n\n  /**\n   * paste by clipboard event\n   *\n   * @param {Event} event\n   */\n  pasteByEvent(event) {\n    const clipboardData = event.originalEvent.clipboardData;\n\n    if (clipboardData && clipboardData.items && clipboardData.items.length) {\n      const item = clipboardData.items.length > 1 ? clipboardData.items[1] : lists.head(clipboardData.items);\n      if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {\n        // paste img file\n        this.context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);\n        event.preventDefault();\n      } else if (item.kind === 'string') {\n        // paste text with maxTextLength check\n        if (this.context.invoke('editor.isLimited', clipboardData.getData('Text').length)) {\n          event.preventDefault();\n        }\n      }\n    } else if (window.clipboardData) {\n      // for IE\n      let text = window.clipboardData.getData('text');\n      if (this.context.invoke('editor.isLimited', text.length)) {\n        event.preventDefault();\n      }\n    }\n    // Call editor.afterCommand after proceeding default event handler\n    setTimeout(() => {\n      this.context.invoke('editor.afterCommand');\n    }, 10);\n  }\n}\n","import $ from 'jquery';\n\nexport default class Dropzone {\n  constructor(context) {\n    this.context = context;\n    this.$eventListener = $(document);\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.documentEventHandlers = {};\n\n    this.$dropzone = $([\n      '<div class=\"note-dropzone\">',\n        '<div class=\"note-dropzone-message\"></div>',\n      '</div>',\n    ].join('')).prependTo(this.$editor);\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  initialize() {\n    if (this.options.disableDragAndDrop) {\n      // prevent default drop event\n      this.documentEventHandlers.onDrop = (e) => {\n        e.preventDefault();\n      };\n      // do not consider outside of dropzone\n      this.$eventListener = this.$dropzone;\n      this.$eventListener.on('drop', this.documentEventHandlers.onDrop);\n    } else {\n      this.attachDragAndDropEvent();\n    }\n  }\n\n  /**\n   * attach Drag and Drop Events\n   */\n  attachDragAndDropEvent() {\n    let collection = $();\n    const $dropzoneMessage = this.$dropzone.find('.note-dropzone-message');\n\n    this.documentEventHandlers.onDragenter = (e) => {\n      const isCodeview = this.context.invoke('codeview.isActivated');\n      const hasEditorSize = this.$editor.width() > 0 && this.$editor.height() > 0;\n      if (!isCodeview && !collection.length && hasEditorSize) {\n        this.$editor.addClass('dragover');\n        this.$dropzone.width(this.$editor.width());\n        this.$dropzone.height(this.$editor.height());\n        $dropzoneMessage.text(this.lang.image.dragImageHere);\n      }\n      collection = collection.add(e.target);\n    };\n\n    this.documentEventHandlers.onDragleave = (e) => {\n      collection = collection.not(e.target);\n\n      // If nodeName is BODY, then just make it over (fix for IE)\n      if (!collection.length || e.target.nodeName === 'BODY') {\n        collection = $();\n        this.$editor.removeClass('dragover');\n      }\n    };\n\n    this.documentEventHandlers.onDrop = () => {\n      collection = $();\n      this.$editor.removeClass('dragover');\n    };\n\n    // show dropzone on dragenter when dragging a object to document\n    // -but only if the editor is visible, i.e. has a positive width and height\n    this.$eventListener.on('dragenter', this.documentEventHandlers.onDragenter)\n      .on('dragleave', this.documentEventHandlers.onDragleave)\n      .on('drop', this.documentEventHandlers.onDrop);\n\n    // change dropzone's message on hover.\n    this.$dropzone.on('dragenter', () => {\n      this.$dropzone.addClass('hover');\n      $dropzoneMessage.text(this.lang.image.dropImage);\n    }).on('dragleave', () => {\n      this.$dropzone.removeClass('hover');\n      $dropzoneMessage.text(this.lang.image.dragImageHere);\n    });\n\n    // attach dropImage\n    this.$dropzone.on('drop', (event) => {\n      const dataTransfer = event.originalEvent.dataTransfer;\n\n      // stop the browser from opening the dropped content\n      event.preventDefault();\n\n      if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {\n        this.$editable.focus();\n        this.context.invoke('editor.insertImagesOrCallback', dataTransfer.files);\n      } else {\n        $.each(dataTransfer.types, (idx, type) => {\n          // skip moz-specific types\n          if (type.toLowerCase().indexOf('_moz_') > -1) {\n            return;\n          }\n          const content = dataTransfer.getData(type);\n\n          if (type.toLowerCase().indexOf('text') > -1) {\n            this.context.invoke('editor.pasteHTML', content);\n          } else {\n            $(content).each((idx, item) => {\n              this.context.invoke('editor.insertNode', item);\n            });\n          }\n        });\n      }\n    }).on('dragover', false); // prevent default dragover event\n  }\n\n  destroy() {\n    Object.keys(this.documentEventHandlers).forEach((key) => {\n      this.$eventListener.off(key.substr(2).toLowerCase(), this.documentEventHandlers[key]);\n    });\n    this.documentEventHandlers = {};\n  }\n}\n","import dom from '../core/dom';\nimport key from '../core/key';\n\n/**\n * @class Codeview\n */\nexport default class CodeView {\n  constructor(context) {\n    this.context = context;\n    this.$editor = context.layoutInfo.editor;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n    this.options = context.options;\n    this.CodeMirrorConstructor = window.CodeMirror;\n\n    if (this.options.codemirror.CodeMirrorConstructor) {\n      this.CodeMirrorConstructor = this.options.codemirror.CodeMirrorConstructor;\n    }\n  }\n\n  sync(html) {\n    const isCodeview = this.isActivated();\n    const CodeMirror = this.CodeMirrorConstructor;\n\n    if (isCodeview) {\n      if (html) {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').getDoc().setValue(html);\n        } else {\n          this.$codable.val(html);\n        }\n      } else {\n        if (CodeMirror) {\n          this.$codable.data('cmEditor').save();\n        }\n      }\n    }\n  }\n\n  initialize() {\n    this.$codable.on('keyup', (event) => {\n      if (event.keyCode === key.code.ESCAPE) {\n        this.deactivate();\n      }\n    });\n  }\n\n  /**\n   * @return {Boolean}\n   */\n  isActivated() {\n    return this.$editor.hasClass('codeview');\n  }\n\n  /**\n   * toggle codeview\n   */\n  toggle() {\n    if (this.isActivated()) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n    this.context.triggerEvent('codeview.toggled');\n  }\n\n  /**\n   * purify input value\n   * @param value\n   * @returns {*}\n   */\n  purify(value) {\n    if (this.options.codeviewFilter) {\n      // filter code view regex\n      value = value.replace(this.options.codeviewFilterRegex, '');\n      // allow specific iframe tag\n      if (this.options.codeviewIframeFilter) {\n        const whitelist = this.options.codeviewIframeWhitelistSrc.concat(this.options.codeviewIframeWhitelistSrcBase);\n        value = value.replace(/(<iframe.*?>.*?(?:<\\/iframe>)?)/gi, function(tag) {\n          // remove if src attribute is duplicated\n          if (/<.+src(?==?('|\"|\\s)?)[\\s\\S]+src(?=('|\"|\\s)?)[^>]*?>/i.test(tag)) {\n            return '';\n          }\n          for (const src of whitelist) {\n            // pass if src is trusted\n            if ((new RegExp('src=\"(https?:)?\\/\\/' + src.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + '\\/(.+)\"')).test(tag)) {\n              return tag;\n            }\n          }\n          return '';\n        });\n      }\n    }\n    return value;\n  }\n\n  /**\n   * activate code view\n   */\n  activate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    this.$codable.val(dom.html(this.$editable, this.options.prettifyHtml));\n    this.$codable.height(this.$editable.height());\n\n    this.context.invoke('toolbar.updateCodeview', true);\n    this.context.invoke('airPopover.updateCodeview', true);\n\n    this.$editor.addClass('codeview');\n    this.$codable.focus();\n\n    // activate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = CodeMirror.fromTextArea(this.$codable[0], this.options.codemirror);\n\n      // CodeMirror TernServer\n      if (this.options.codemirror.tern) {\n        const server = new CodeMirror.TernServer(this.options.codemirror.tern);\n        cmEditor.ternServer = server;\n        cmEditor.on('cursorActivity', (cm) => {\n          server.updateArgHints(cm);\n        });\n      }\n\n      cmEditor.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', cmEditor.getValue(), event);\n      });\n      cmEditor.on('change', () => {\n        this.context.triggerEvent('change.codeview', cmEditor.getValue(), cmEditor);\n      });\n\n      // CodeMirror hasn't Padding.\n      cmEditor.setSize(null, this.$editable.outerHeight());\n      this.$codable.data('cmEditor', cmEditor);\n    } else {\n      this.$codable.on('blur', (event) => {\n        this.context.triggerEvent('blur.codeview', this.$codable.val(), event);\n      });\n      this.$codable.on('input', () => {\n        this.context.triggerEvent('change.codeview', this.$codable.val(), this.$codable);\n      });\n    }\n  }\n\n  /**\n   * deactivate code view\n   */\n  deactivate() {\n    const CodeMirror = this.CodeMirrorConstructor;\n    // deactivate CodeMirror as codable\n    if (CodeMirror) {\n      const cmEditor = this.$codable.data('cmEditor');\n      this.$codable.val(cmEditor.getValue());\n      cmEditor.toTextArea();\n    }\n\n    const value = this.purify(dom.value(this.$codable, this.options.prettifyHtml) || dom.emptyPara);\n    const isChange = this.$editable.html() !== value;\n\n    this.$editable.html(value);\n    this.$editable.height(this.options.height ? this.$codable.height() : 'auto');\n    this.$editor.removeClass('codeview');\n\n    if (isChange) {\n      this.context.triggerEvent('change', this.$editable.html(), this.$editable);\n    }\n\n    this.$editable.focus();\n\n    this.context.invoke('toolbar.updateCodeview', false);\n    this.context.invoke('airPopover.updateCodeview', false);\n  }\n\n  destroy() {\n    if (this.isActivated()) {\n      this.deactivate();\n    }\n  }\n}\n","import $ from 'jquery';\nconst EDITABLE_PADDING = 24;\n\nexport default class Statusbar {\n  constructor(context) {\n    this.$document = $(document);\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n  }\n\n  initialize() {\n    if (this.options.airMode || this.options.disableResizeEditor) {\n      this.destroy();\n      return;\n    }\n\n    this.$statusbar.on('mousedown', (event) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      const editableTop = this.$editable.offset().top - this.$document.scrollTop();\n      const onMouseMove = (event) => {\n        let height = event.clientY - (editableTop + EDITABLE_PADDING);\n\n        height = (this.options.minheight > 0) ? Math.max(height, this.options.minheight) : height;\n        height = (this.options.maxHeight > 0) ? Math.min(height, this.options.maxHeight) : height;\n\n        this.$editable.height(height);\n      };\n\n      this.$document.on('mousemove', onMouseMove).one('mouseup', () => {\n        this.$document.off('mousemove', onMouseMove);\n      });\n    });\n  }\n\n  destroy() {\n    this.$statusbar.off();\n    this.$statusbar.addClass('locked');\n  }\n}\n","import $ from 'jquery';\n\nexport default class Fullscreen {\n  constructor(context) {\n    this.context = context;\n\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$codable = context.layoutInfo.codable;\n\n    this.$window = $(window);\n    this.$scrollbar = $('html, body');\n\n    this.onResize = () => {\n      this.resizeTo({\n        h: this.$window.height() - this.$toolbar.outerHeight(),\n      });\n    };\n  }\n\n  resizeTo(size) {\n    this.$editable.css('height', size.h);\n    this.$codable.css('height', size.h);\n    if (this.$codable.data('cmeditor')) {\n      this.$codable.data('cmeditor').setsize(null, size.h);\n    }\n  }\n\n  /**\n   * toggle fullscreen\n   */\n  toggle() {\n    this.$editor.toggleClass('fullscreen');\n    if (this.isFullscreen()) {\n      this.$editable.data('orgHeight', this.$editable.css('height'));\n      this.$editable.data('orgMaxHeight', this.$editable.css('maxHeight'));\n      this.$editable.css('maxHeight', '');\n      this.$window.on('resize', this.onResize).trigger('resize');\n      this.$scrollbar.css('overflow', 'hidden');\n    } else {\n      this.$window.off('resize', this.onResize);\n      this.resizeTo({ h: this.$editable.data('orgHeight') });\n      this.$editable.css('maxHeight', this.$editable.css('orgMaxHeight'));\n      this.$scrollbar.css('overflow', 'visible');\n    }\n\n    this.context.invoke('toolbar.updateFullscreen', this.isFullscreen());\n  }\n\n  isFullscreen() {\n    return this.$editor.hasClass('fullscreen');\n  }\n}\n","import $ from 'jquery';\nimport dom from '../core/dom';\n\nexport default class Handle {\n  constructor(context) {\n    this.context = context;\n    this.$document = $(document);\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        if (this.update(e.target, e)) {\n          e.preventDefault();\n        }\n      },\n      'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  initialize() {\n    this.$handle = $([\n      '<div class=\"note-handle\">',\n        '<div class=\"note-control-selection\">',\n          '<div class=\"note-control-selection-bg\"></div>',\n          '<div class=\"note-control-holder note-control-nw\"></div>',\n          '<div class=\"note-control-holder note-control-ne\"></div>',\n          '<div class=\"note-control-holder note-control-sw\"></div>',\n          '<div class=\"',\n            (this.options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),\n          ' note-control-se\"></div>',\n          (this.options.disableResizeImage ? '' : '<div class=\"note-control-selection-info\"></div>'),\n        '</div>',\n      '</div>',\n    ].join('')).prependTo(this.$editingArea);\n\n    this.$handle.on('mousedown', (event) => {\n      if (dom.isControlSizing(event.target)) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const $target = this.$handle.find('.note-control-selection').data('target');\n        const posStart = $target.offset();\n        const scrollTop = this.$document.scrollTop();\n\n        const onMouseMove = (event) => {\n          this.context.invoke('editor.resizeTo', {\n            x: event.clientX - posStart.left,\n            y: event.clientY - (posStart.top - scrollTop),\n          }, $target, !event.shiftKey);\n\n          this.update($target[0], event);\n        };\n\n        this.$document\n          .on('mousemove', onMouseMove)\n          .one('mouseup', (e) => {\n            e.preventDefault();\n            this.$document.off('mousemove', onMouseMove);\n            this.context.invoke('editor.afterCommand');\n          });\n\n        if (!$target.data('ratio')) { // original ratio.\n          $target.data('ratio', $target.height() / $target.width());\n        }\n      }\n    });\n\n    // Listen for scrolling on the handle overlay.\n    this.$handle.on('wheel', (e) => {\n      e.preventDefault();\n      this.update();\n    });\n  }\n\n  destroy() {\n    this.$handle.remove();\n  }\n\n  update(target, event) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isImage = dom.isImg(target);\n    const $selection = this.$handle.find('.note-control-selection');\n\n    this.context.invoke('imagePopover.update', target, event);\n\n    if (isImage) {\n      const $image = $(target);\n      const position = $image.position();\n      const pos = {\n        left: position.left + parseInt($image.css('marginLeft'), 10),\n        top: position.top + parseInt($image.css('marginTop'), 10),\n      };\n\n      // exclude margin\n      const imageSize = {\n        w: $image.outerWidth(false),\n        h: $image.outerHeight(false),\n      };\n\n      $selection.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n        width: imageSize.w,\n        height: imageSize.h,\n      }).data('target', $image); // save current image element.\n\n      const origImageObj = new Image();\n      origImageObj.src = $image.attr('src');\n\n      const sizingText = imageSize.w + 'x' + imageSize.h + ' (' + this.lang.image.original + ': ' + origImageObj.width + 'x' + origImageObj.height + ')';\n      $selection.find('.note-control-selection-info').text(sizingText);\n      this.context.invoke('editor.saveTarget', target);\n    } else {\n      this.hide();\n    }\n\n    return isImage;\n  }\n\n  /**\n   * hide\n   *\n   * @param {jQuery} $handle\n   */\n  hide() {\n    this.context.invoke('editor.clearTarget');\n    this.$handle.children().hide();\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport key from '../core/key';\n\nconst defaultScheme = 'http://';\nconst linkPattern = /^([A-Za-z][A-Za-z0-9+-.]*\\:[\\/]{2}|tel:|mailto:[A-Z0-9._%+-]+@)?(www\\.)?(.+)$/i;\n\nexport default class AutoLink {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n  }\n\n  destroy() {\n    this.lastWordRange = null;\n  }\n\n  replace() {\n    if (!this.lastWordRange) {\n      return;\n    }\n\n    const keyword = this.lastWordRange.toString();\n    const match = keyword.match(linkPattern);\n\n    if (match && (match[1] || match[2])) {\n      const link = match[1] ? keyword : defaultScheme + keyword;\n      const urlText = this.options.showDomainOnlyForAutolink ?\n        keyword.replace(/^(?:https?:\\/\\/)?(?:tel?:?)?(?:mailto?:?)?(?:www\\.)?/i, '').split('/')[0]\n        : keyword;\n      const node = $('<a />').html(urlText).attr('href', link)[0];\n      if (this.context.options.linkTargetBlank) {\n        $(node).attr('target', '_blank');\n      }\n\n      this.lastWordRange.insertNode(node);\n      this.lastWordRange = null;\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  handleKeydown(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWordRange = wordRange;\n    }\n  }\n\n  handleKeyup(e) {\n    if (lists.contains([key.code.ENTER, key.code.SPACE], e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import dom from '../core/dom';\n\n/**\n * textarea auto sync.\n */\nexport default class AutoSync {\n  constructor(context) {\n    this.$note = context.layoutInfo.note;\n    this.events = {\n      'summernote.change': () => {\n        this.$note.val(context.invoke('code'));\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return dom.isTextarea(this.$note[0]);\n  }\n}\n","import lists from '../core/lists';\nimport dom from '../core/dom';\nimport key from '../core/key';\n\nexport default class AutoReplace {\n  constructor(context) {\n    this.context = context;\n    this.options = context.options.replace || {};\n\n    this.keys = [key.code.ENTER, key.code.SPACE, key.code.PERIOD, key.code.COMMA, key.code.SEMICOLON, key.code.SLASH];\n    this.previousKeydownCode = null;\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.match;\n  }\n\n  initialize() {\n    this.lastWord = null;\n  }\n\n  destroy() {\n    this.lastWord = null;\n  }\n\n  replace() {\n    if (!this.lastWord) {\n      return;\n    }\n\n    const self = this;\n    const keyword = this.lastWord.toString();\n    this.options.match(keyword, function(match) {\n      if (match) {\n        let node = '';\n\n        if (typeof match === 'string') {\n          node = dom.createText(match);\n        } else if (match instanceof jQuery) {\n          node = match[0];\n        } else if (match instanceof Node) {\n          node = match;\n        }\n\n        if (!node) return;\n        self.lastWord.insertNode(node);\n        self.lastWord = null;\n        self.context.invoke('editor.focus');\n      }\n    });\n  }\n\n  handleKeydown(e) {\n    // this forces it to remember the last whole word, even if multiple termination keys are pressed\n    // before the previous key is let go.\n    if (this.previousKeydownCode && lists.contains(this.keys, this.previousKeydownCode)) {\n      this.previousKeydownCode = e.keyCode;\n      return;\n    }\n\n    if (lists.contains(this.keys, e.keyCode)) {\n      const wordRange = this.context.invoke('editor.createRange').getWordRange();\n      this.lastWord = wordRange;\n    }\n    this.previousKeydownCode = e.keyCode;\n  }\n\n  handleKeyup(e) {\n    if (lists.contains(this.keys, e.keyCode)) {\n      this.replace();\n    }\n  }\n}\n","import $ from 'jquery';\nexport default class Placeholder {\n  constructor(context) {\n    this.context = context;\n\n    this.$editingArea = context.layoutInfo.editingArea;\n    this.options = context.options;\n\n    if (this.options.inheritPlaceholder === true) {\n      // get placeholder value from the original element\n      this.options.placeholder = this.context.$note.attr('placeholder') || this.options.placeholder;\n    }\n\n    this.events = {\n      'summernote.init summernote.change': () => {\n        this.update();\n      },\n      'summernote.codeview.toggled': () => {\n        this.update();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !!this.options.placeholder;\n  }\n\n  initialize() {\n    this.$placeholder = $('<div class=\"note-placeholder\">');\n    this.$placeholder.on('click', () => {\n      this.context.invoke('focus');\n    }).html(this.options.placeholder).prependTo(this.$editingArea);\n\n    this.update();\n  }\n\n  destroy() {\n    this.$placeholder.remove();\n  }\n\n  update() {\n    const isShow = !this.context.invoke('codeview.isActivated') && this.context.invoke('editor.isEmpty');\n    this.$placeholder.toggle(isShow);\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport env from '../core/env';\n\nexport default class Buttons {\n  constructor(context) {\n    this.ui = $.summernote.ui;\n    this.context = context;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n    this.invertedKeyMap = func.invertObject(\n      this.options.keyMap[env.isMac ? 'mac' : 'pc']\n    );\n  }\n\n  representShortcut(editorMethod) {\n    let shortcut = this.invertedKeyMap[editorMethod];\n    if (!this.options.shortcuts || !shortcut) {\n      return '';\n    }\n\n    if (env.isMac) {\n      shortcut = shortcut.replace('CMD', '⌘').replace('SHIFT', '⇧');\n    }\n\n    shortcut = shortcut.replace('BACKSLASH', '\\\\')\n      .replace('SLASH', '/')\n      .replace('LEFTBRACKET', '[')\n      .replace('RIGHTBRACKET', ']');\n\n    return ' (' + shortcut + ')';\n  }\n\n  button(o) {\n    if (!this.options.tooltip && o.tooltip) {\n      delete o.tooltip;\n    }\n    o.container = this.options.container;\n    return this.ui.button(o);\n  }\n\n  initialize() {\n    this.addToolbarButtons();\n    this.addImagePopoverButtons();\n    this.addLinkPopoverButtons();\n    this.addTablePopoverButtons();\n    this.fontInstalledMap = {};\n  }\n\n  destroy() {\n    delete this.fontInstalledMap;\n  }\n\n  isFontInstalled(name) {\n    if (!Object.prototype.hasOwnProperty.call(this.fontInstalledMap, name)) {\n      this.fontInstalledMap[name] = env.isFontInstalled(name) ||\n        lists.contains(this.options.fontNamesIgnoreCheck, name);\n    }\n    return this.fontInstalledMap[name];\n  }\n\n  isFontDeservedToAdd(name) {\n    name = name.toLowerCase();\n    return (name !== '' && this.isFontInstalled(name) && env.genericFontFamilies.indexOf(name) === -1);\n  }\n\n  colorPalette(className, tooltip, backColor, foreColor) {\n    return this.ui.buttonGroup({\n      className: 'note-color ' + className,\n      children: [\n        this.button({\n          className: 'note-current-color-button',\n          contents: this.ui.icon(this.options.icons.font + ' note-recent-color'),\n          tooltip: tooltip,\n          click: (e) => {\n            const $button = $(e.currentTarget);\n            if (backColor && foreColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n                foreColor: $button.attr('data-foreColor'),\n              });\n            } else if (backColor) {\n              this.context.invoke('editor.color', {\n                backColor: $button.attr('data-backColor'),\n              });\n            } else if (foreColor) {\n              this.context.invoke('editor.color', {\n                foreColor: $button.attr('data-foreColor'),\n              });\n            }\n          },\n          callback: ($button) => {\n            const $recentColor = $button.find('.note-recent-color');\n            if (backColor) {\n              $recentColor.css('background-color', this.options.colorButton.backColor);\n              $button.attr('data-backColor', this.options.colorButton.backColor);\n            }\n            if (foreColor) {\n              $recentColor.css('color', this.options.colorButton.foreColor);\n              $button.attr('data-foreColor', this.options.colorButton.foreColor);\n            } else {\n              $recentColor.css('color', 'transparent');\n            }\n          },\n        }),\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('', this.options),\n          tooltip: this.lang.color.more,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          items: (backColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.background + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"backColor\" data-value=\"transparent\">',\n                  this.lang.color.transparent,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"backColor\"><!-- back colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"backColorPicker\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"backColorPicker\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.backColor + '\" data-event=\"backColorPalette\">',\n              '</div>',\n              '<div class=\"note-holder-custom\" id=\"backColorPalette\" data-event=\"backColor\"></div>',\n            '</div>',\n          ].join('') : '') +\n          (foreColor ? [\n            '<div class=\"note-palette\">',\n              '<div class=\"note-palette-title\">' + this.lang.color.foreground + '</div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-reset btn btn-light btn-default\" data-event=\"removeFormat\" data-value=\"foreColor\">',\n                  this.lang.color.resetToDefault,\n                '</button>',\n              '</div>',\n              '<div class=\"note-holder\" data-event=\"foreColor\"><!-- fore colors --></div>',\n              '<div>',\n                '<button type=\"button\" class=\"note-color-select btn btn-light btn-default\" data-event=\"openPalette\" data-value=\"foreColorPicker\">',\n                  this.lang.color.cpSelect,\n                '</button>',\n                '<input type=\"color\" id=\"foreColorPicker\" class=\"note-btn note-color-select-btn\" value=\"' + this.options.colorButton.foreColor + '\" data-event=\"foreColorPalette\">',\n              '</div>', // Fix missing Div, Commented to find easily if it's wrong\n              '<div class=\"note-holder-custom\" id=\"foreColorPalette\" data-event=\"foreColor\"></div>',\n            '</div>',\n          ].join('') : ''),\n          callback: ($dropdown) => {\n            $dropdown.find('.note-holder').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: this.options.colors,\n                colorsName: this.options.colorsName,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            /* TODO: do we have to record recent custom colors within cookies? */\n            var customColors = [\n              ['#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF', '#FFFFFF'],\n            ];\n            $dropdown.find('.note-holder-custom').each((idx, item) => {\n              const $holder = $(item);\n              $holder.append(this.ui.palette({\n                colors: customColors,\n                colorsName: customColors,\n                eventName: $holder.data('event'),\n                container: this.options.container,\n                tooltip: this.options.tooltip,\n              }).render());\n            });\n            $dropdown.find('input[type=color]').each((idx, item) => {\n              $(item).change(function() {\n                const $chip = $dropdown.find('#' + $(this).data('event')).find('.note-color-btn').first();\n                const color = this.value.toUpperCase();\n                $chip.css('background-color', color)\n                  .attr('aria-label', color)\n                  .attr('data-value', color)\n                  .attr('data-original-title', color);\n                $chip.click();\n              });\n            });\n          },\n          click: (event) => {\n            event.stopPropagation();\n\n            const $parent = $('.' + className).find('.note-dropdown-menu');\n            const $button = $(event.target);\n            const eventName = $button.data('event');\n            const value = $button.attr('data-value');\n\n            if (eventName === 'openPalette') {\n              const $picker = $parent.find('#' + value);\n              const $palette = $($parent.find('#' + $picker.data('event')).find('.note-color-row')[0]);\n\n              // Shift palette chips\n              const $chip = $palette.find('.note-color-btn').last().detach();\n\n              // Set chip attributes\n              const color = $picker.val();\n              $chip.css('background-color', color)\n                .attr('aria-label', color)\n                .attr('data-value', color)\n                .attr('data-original-title', color);\n              $palette.prepend($chip);\n              $picker.click();\n            } else {\n              if (lists.contains(['backColor', 'foreColor'], eventName)) {\n                const key = eventName === 'backColor' ? 'background-color' : 'color';\n                const $color = $button.closest('.note-color').find('.note-recent-color');\n                const $currentButton = $button.closest('.note-color').find('.note-current-color-button');\n\n                $color.css(key, value);\n                $currentButton.attr('data-' + eventName, value);\n              }\n              this.context.invoke('editor.' + eventName, value);\n            }\n          },\n        }),\n      ],\n    }).render();\n  }\n\n  addToolbarButtons() {\n    this.context.memo('button.style', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            this.ui.icon(this.options.icons.magic), this.options\n          ),\n          tooltip: this.lang.style.style,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          className: 'dropdown-style',\n          items: this.options.styleTags,\n          title: this.lang.style.style,\n          template: (item) => {\n            // TBD: need to be simplified\n            if (typeof item === 'string') {\n              item = {\n                tag: item,\n                title: (Object.prototype.hasOwnProperty.call(this.lang.style, item) ? this.lang.style[item] : item),\n              };\n            }\n\n            const tag = item.tag;\n            const title = item.title;\n            const style = item.style ? ' style=\"' + item.style + '\" ' : '';\n            const className = item.className ? ' class=\"' + item.className + '\"' : '';\n\n            return '<' + tag + style + className + '>' + title + '</' + tag + '>';\n          },\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }),\n      ]).render();\n    });\n\n    for (let styleIdx = 0, styleLen = this.options.styleTags.length; styleIdx < styleLen; styleIdx++) {\n      const item = this.options.styleTags[styleIdx];\n\n      this.context.memo('button.style.' + item, () => {\n        return this.button({\n          className: 'note-btn-style-' + item,\n          contents: '<div data-value=\"' + item + '\">' + item.toUpperCase() + '</div>',\n          tooltip: this.lang.style[item],\n          click: this.context.createInvokeHandler('editor.formatBlock'),\n        }).render();\n      });\n    }\n\n    this.context.memo('button.bold', () => {\n      return this.button({\n        className: 'note-btn-bold',\n        contents: this.ui.icon(this.options.icons.bold),\n        tooltip: this.lang.font.bold + this.representShortcut('bold'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.bold'),\n      }).render();\n    });\n\n    this.context.memo('button.italic', () => {\n      return this.button({\n        className: 'note-btn-italic',\n        contents: this.ui.icon(this.options.icons.italic),\n        tooltip: this.lang.font.italic + this.representShortcut('italic'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.italic'),\n      }).render();\n    });\n\n    this.context.memo('button.underline', () => {\n      return this.button({\n        className: 'note-btn-underline',\n        contents: this.ui.icon(this.options.icons.underline),\n        tooltip: this.lang.font.underline + this.representShortcut('underline'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.underline'),\n      }).render();\n    });\n\n    this.context.memo('button.clear', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.eraser),\n        tooltip: this.lang.font.clear + this.representShortcut('removeFormat'),\n        click: this.context.createInvokeHandler('editor.removeFormat'),\n      }).render();\n    });\n\n    this.context.memo('button.strikethrough', () => {\n      return this.button({\n        className: 'note-btn-strikethrough',\n        contents: this.ui.icon(this.options.icons.strikethrough),\n        tooltip: this.lang.font.strikethrough + this.representShortcut('strikethrough'),\n        click: this.context.createInvokeHandlerAndUpdateState('editor.strikethrough'),\n      }).render();\n    });\n\n    this.context.memo('button.superscript', () => {\n      return this.button({\n        className: 'note-btn-superscript',\n        contents: this.ui.icon(this.options.icons.superscript),\n        tooltip: this.lang.font.superscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.superscript'),\n      }).render();\n    });\n\n    this.context.memo('button.subscript', () => {\n      return this.button({\n        className: 'note-btn-subscript',\n        contents: this.ui.icon(this.options.icons.subscript),\n        tooltip: this.lang.font.subscript,\n        click: this.context.createInvokeHandlerAndUpdateState('editor.subscript'),\n      }).render();\n    });\n\n    this.context.memo('button.fontname', () => {\n      const styleInfo = this.context.invoke('editor.currentStyle');\n\n      if (this.options.addDefaultFonts) {\n        // Add 'default' fonts into the fontnames array if not exist\n        $.each(styleInfo['font-family'].split(','), (idx, fontname) => {\n          fontname = fontname.trim().replace(/['\"]+/g, '');\n          if (this.isFontDeservedToAdd(fontname)) {\n            if (this.options.fontNames.indexOf(fontname) === -1) {\n              this.options.fontNames.push(fontname);\n            }\n          }\n        });\n      }\n\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(\n            '<span class=\"note-current-fontname\"></span>', this.options\n          ),\n          tooltip: this.lang.font.name,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontname',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontNames.filter(this.isFontInstalled.bind(this)),\n          title: this.lang.font.name,\n          template: (item) => {\n            return '<span style=\"font-family: ' + env.validFontName(item) + '\">' + item + '</span>';\n          },\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontName'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsize', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsize\"></span>', this.options),\n          tooltip: this.lang.font.size,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsize',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizes,\n          title: this.lang.font.size,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSize'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.fontsizeunit', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents('<span class=\"note-current-fontsizeunit\"></span>', this.options),\n          tooltip: this.lang.font.sizeunit,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          className: 'dropdown-fontsizeunit',\n          checkClassName: this.options.icons.menuCheck,\n          items: this.options.fontSizeUnits,\n          title: this.lang.font.sizeunit,\n          click: this.context.createInvokeHandlerAndUpdateState('editor.fontSizeUnit'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.color', () => {\n      return this.colorPalette('note-color-all', this.lang.color.recent, true, true);\n    });\n\n    this.context.memo('button.forecolor', () => {\n      return this.colorPalette('note-color-fore', this.lang.color.foreground, false, true);\n    });\n\n    this.context.memo('button.backcolor', () => {\n      return this.colorPalette('note-color-back', this.lang.color.background, true, false);\n    });\n\n    this.context.memo('button.ul', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unorderedlist),\n        tooltip: this.lang.lists.unordered + this.representShortcut('insertUnorderedList'),\n        click: this.context.createInvokeHandler('editor.insertUnorderedList'),\n      }).render();\n    });\n\n    this.context.memo('button.ol', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.orderedlist),\n        tooltip: this.lang.lists.ordered + this.representShortcut('insertOrderedList'),\n        click: this.context.createInvokeHandler('editor.insertOrderedList'),\n      }).render();\n    });\n\n    const justifyLeft = this.button({\n      contents: this.ui.icon(this.options.icons.alignLeft),\n      tooltip: this.lang.paragraph.left + this.representShortcut('justifyLeft'),\n      click: this.context.createInvokeHandler('editor.justifyLeft'),\n    });\n\n    const justifyCenter = this.button({\n      contents: this.ui.icon(this.options.icons.alignCenter),\n      tooltip: this.lang.paragraph.center + this.representShortcut('justifyCenter'),\n      click: this.context.createInvokeHandler('editor.justifyCenter'),\n    });\n\n    const justifyRight = this.button({\n      contents: this.ui.icon(this.options.icons.alignRight),\n      tooltip: this.lang.paragraph.right + this.representShortcut('justifyRight'),\n      click: this.context.createInvokeHandler('editor.justifyRight'),\n    });\n\n    const justifyFull = this.button({\n      contents: this.ui.icon(this.options.icons.alignJustify),\n      tooltip: this.lang.paragraph.justify + this.representShortcut('justifyFull'),\n      click: this.context.createInvokeHandler('editor.justifyFull'),\n    });\n\n    const outdent = this.button({\n      contents: this.ui.icon(this.options.icons.outdent),\n      tooltip: this.lang.paragraph.outdent + this.representShortcut('outdent'),\n      click: this.context.createInvokeHandler('editor.outdent'),\n    });\n\n    const indent = this.button({\n      contents: this.ui.icon(this.options.icons.indent),\n      tooltip: this.lang.paragraph.indent + this.representShortcut('indent'),\n      click: this.context.createInvokeHandler('editor.indent'),\n    });\n\n    this.context.memo('button.justifyLeft', func.invoke(justifyLeft, 'render'));\n    this.context.memo('button.justifyCenter', func.invoke(justifyCenter, 'render'));\n    this.context.memo('button.justifyRight', func.invoke(justifyRight, 'render'));\n    this.context.memo('button.justifyFull', func.invoke(justifyFull, 'render'));\n    this.context.memo('button.outdent', func.invoke(outdent, 'render'));\n    this.context.memo('button.indent', func.invoke(indent, 'render'));\n\n    this.context.memo('button.paragraph', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.alignLeft), this.options),\n          tooltip: this.lang.paragraph.paragraph,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown([\n          this.ui.buttonGroup({\n            className: 'note-align',\n            children: [justifyLeft, justifyCenter, justifyRight, justifyFull],\n          }),\n          this.ui.buttonGroup({\n            className: 'note-list',\n            children: [outdent, indent],\n          }),\n        ]),\n      ]).render();\n    });\n\n    this.context.memo('button.height', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.textHeight), this.options),\n          tooltip: this.lang.font.height,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdownCheck({\n          items: this.options.lineHeights,\n          checkClassName: this.options.icons.menuCheck,\n          className: 'dropdown-line-height',\n          title: this.lang.font.height,\n          click: this.context.createInvokeHandler('editor.lineHeight'),\n        }),\n      ]).render();\n    });\n\n    this.context.memo('button.table', () => {\n      return this.ui.buttonGroup([\n        this.button({\n          className: 'dropdown-toggle',\n          contents: this.ui.dropdownButtonContents(this.ui.icon(this.options.icons.table), this.options),\n          tooltip: this.lang.table.table,\n          data: {\n            toggle: 'dropdown',\n          },\n        }),\n        this.ui.dropdown({\n          title: this.lang.table.table,\n          className: 'note-table',\n          items: [\n            '<div class=\"note-dimension-picker\">',\n              '<div class=\"note-dimension-picker-mousecatcher\" data-event=\"insertTable\" data-value=\"1x1\"></div>',\n              '<div class=\"note-dimension-picker-highlighted\"></div>',\n              '<div class=\"note-dimension-picker-unhighlighted\"></div>',\n            '</div>',\n            '<div class=\"note-dimension-display\">1 x 1</div>',\n          ].join(''),\n        }),\n      ], {\n        callback: ($node) => {\n          const $catcher = $node.find('.note-dimension-picker-mousecatcher');\n          $catcher.css({\n            width: this.options.insertTableMaxSize.col + 'em',\n            height: this.options.insertTableMaxSize.row + 'em',\n          }).mousedown(this.context.createInvokeHandler('editor.insertTable'))\n            .on('mousemove', this.tableMoveHandler.bind(this));\n        },\n      }).render();\n    });\n\n    this.context.memo('button.link', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.link + this.representShortcut('linkDialog.show'),\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.picture', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.picture),\n        tooltip: this.lang.image.image,\n        click: this.context.createInvokeHandler('imageDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.video', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.video),\n        tooltip: this.lang.video.video,\n        click: this.context.createInvokeHandler('videoDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.hr', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.minus),\n        tooltip: this.lang.hr.insert + this.representShortcut('insertHorizontalRule'),\n        click: this.context.createInvokeHandler('editor.insertHorizontalRule'),\n      }).render();\n    });\n\n    this.context.memo('button.fullscreen', () => {\n      return this.button({\n        className: 'btn-fullscreen note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.arrowsAlt),\n        tooltip: this.lang.options.fullscreen,\n        click: this.context.createInvokeHandler('fullscreen.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.codeview', () => {\n      return this.button({\n        className: 'btn-codeview note-codeview-keep',\n        contents: this.ui.icon(this.options.icons.code),\n        tooltip: this.lang.options.codeview,\n        click: this.context.createInvokeHandler('codeview.toggle'),\n      }).render();\n    });\n\n    this.context.memo('button.redo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.redo),\n        tooltip: this.lang.history.redo + this.representShortcut('redo'),\n        click: this.context.createInvokeHandler('editor.redo'),\n      }).render();\n    });\n\n    this.context.memo('button.undo', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.undo),\n        tooltip: this.lang.history.undo + this.representShortcut('undo'),\n        click: this.context.createInvokeHandler('editor.undo'),\n      }).render();\n    });\n\n    this.context.memo('button.help', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.question),\n        tooltip: this.lang.options.help,\n        click: this.context.createInvokeHandler('helpDialog.show'),\n      }).render();\n    });\n  }\n\n  /**\n   * image: [\n   *   ['imageResize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n   *   ['float', ['floatLeft', 'floatRight', 'floatNone']],\n   *   ['remove', ['removeMedia']],\n   * ],\n   */\n  addImagePopoverButtons() {\n    // Image Size Buttons\n    this.context.memo('button.resizeFull', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">100%</span>',\n        tooltip: this.lang.image.resizeFull,\n        click: this.context.createInvokeHandler('editor.resize', '1'),\n      }).render();\n    });\n    this.context.memo('button.resizeHalf', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">50%</span>',\n        tooltip: this.lang.image.resizeHalf,\n        click: this.context.createInvokeHandler('editor.resize', '0.5'),\n      }).render();\n    });\n    this.context.memo('button.resizeQuarter', () => {\n      return this.button({\n        contents: '<span class=\"note-fontsize-10\">25%</span>',\n        tooltip: this.lang.image.resizeQuarter,\n        click: this.context.createInvokeHandler('editor.resize', '0.25'),\n      }).render();\n    });\n    this.context.memo('button.resizeNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.resizeNone,\n        click: this.context.createInvokeHandler('editor.resize', '0'),\n      }).render();\n    });\n\n    // Float Buttons\n    this.context.memo('button.floatLeft', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatLeft),\n        tooltip: this.lang.image.floatLeft,\n        click: this.context.createInvokeHandler('editor.floatMe', 'left'),\n      }).render();\n    });\n\n    this.context.memo('button.floatRight', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.floatRight),\n        tooltip: this.lang.image.floatRight,\n        click: this.context.createInvokeHandler('editor.floatMe', 'right'),\n      }).render();\n    });\n\n    this.context.memo('button.floatNone', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.rollback),\n        tooltip: this.lang.image.floatNone,\n        click: this.context.createInvokeHandler('editor.floatMe', 'none'),\n      }).render();\n    });\n\n    // Remove Buttons\n    this.context.memo('button.removeMedia', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.image.remove,\n        click: this.context.createInvokeHandler('editor.removeMedia'),\n      }).render();\n    });\n  }\n\n  addLinkPopoverButtons() {\n    this.context.memo('button.linkDialogShow', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.link),\n        tooltip: this.lang.link.edit,\n        click: this.context.createInvokeHandler('linkDialog.show'),\n      }).render();\n    });\n\n    this.context.memo('button.unlink', () => {\n      return this.button({\n        contents: this.ui.icon(this.options.icons.unlink),\n        tooltip: this.lang.link.unlink,\n        click: this.context.createInvokeHandler('editor.unlink'),\n      }).render();\n    });\n  }\n\n  /**\n   * table : [\n   *  ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n   *  ['delete', ['deleteRow', 'deleteCol', 'deleteTable']]\n   * ],\n   */\n  addTablePopoverButtons() {\n    this.context.memo('button.addRowUp', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowAbove),\n        tooltip: this.lang.table.addRowAbove,\n        click: this.context.createInvokeHandler('editor.addRow', 'top'),\n      }).render();\n    });\n    this.context.memo('button.addRowDown', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowBelow),\n        tooltip: this.lang.table.addRowBelow,\n        click: this.context.createInvokeHandler('editor.addRow', 'bottom'),\n      }).render();\n    });\n    this.context.memo('button.addColLeft', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colBefore),\n        tooltip: this.lang.table.addColLeft,\n        click: this.context.createInvokeHandler('editor.addCol', 'left'),\n      }).render();\n    });\n    this.context.memo('button.addColRight', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colAfter),\n        tooltip: this.lang.table.addColRight,\n        click: this.context.createInvokeHandler('editor.addCol', 'right'),\n      }).render();\n    });\n    this.context.memo('button.deleteRow', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.rowRemove),\n        tooltip: this.lang.table.delRow,\n        click: this.context.createInvokeHandler('editor.deleteRow'),\n      }).render();\n    });\n    this.context.memo('button.deleteCol', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.colRemove),\n        tooltip: this.lang.table.delCol,\n        click: this.context.createInvokeHandler('editor.deleteCol'),\n      }).render();\n    });\n    this.context.memo('button.deleteTable', () => {\n      return this.button({\n        className: 'btn-md',\n        contents: this.ui.icon(this.options.icons.trash),\n        tooltip: this.lang.table.delTable,\n        click: this.context.createInvokeHandler('editor.deleteTable'),\n      }).render();\n    });\n  }\n\n  build($container, groups) {\n    for (let groupIdx = 0, groupLen = groups.length; groupIdx < groupLen; groupIdx++) {\n      const group = groups[groupIdx];\n      const groupName = Array.isArray(group) ? group[0] : group;\n      const buttons = Array.isArray(group) ? ((group.length === 1) ? [group[0]] : group[1]) : [group];\n\n      const $group = this.ui.buttonGroup({\n        className: 'note-' + groupName,\n      }).render();\n\n      for (let idx = 0, len = buttons.length; idx < len; idx++) {\n        const btn = this.context.memo('button.' + buttons[idx]);\n        if (btn) {\n          $group.append(typeof btn === 'function' ? btn(this.context) : btn);\n        }\n      }\n      $group.appendTo($container);\n    }\n  }\n\n  /**\n   * @param {jQuery} [$container]\n   */\n  updateCurrentStyle($container) {\n    const $cont = $container || this.$toolbar;\n\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    this.updateBtnStates($cont, {\n      '.note-btn-bold': () => {\n        return styleInfo['font-bold'] === 'bold';\n      },\n      '.note-btn-italic': () => {\n        return styleInfo['font-italic'] === 'italic';\n      },\n      '.note-btn-underline': () => {\n        return styleInfo['font-underline'] === 'underline';\n      },\n      '.note-btn-subscript': () => {\n        return styleInfo['font-subscript'] === 'subscript';\n      },\n      '.note-btn-superscript': () => {\n        return styleInfo['font-superscript'] === 'superscript';\n      },\n      '.note-btn-strikethrough': () => {\n        return styleInfo['font-strikethrough'] === 'strikethrough';\n      },\n    });\n\n    if (styleInfo['font-family']) {\n      const fontNames = styleInfo['font-family'].split(',').map((name) => {\n        return name.replace(/[\\'\\\"]/g, '')\n          .replace(/\\s+$/, '')\n          .replace(/^\\s+/, '');\n      });\n      const fontName = lists.find(fontNames, this.isFontInstalled.bind(this));\n\n      $cont.find('.dropdown-fontname a').each((idx, item) => {\n        const $item = $(item);\n        // always compare string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontName + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontname').text(fontName).css('font-family', fontName);\n    }\n\n    if (styleInfo['font-size']) {\n      const fontSize = styleInfo['font-size'];\n      $cont.find('.dropdown-fontsize a').each((idx, item) => {\n        const $item = $(item);\n        // always compare with string to avoid creating another func.\n        const isChecked = ($item.data('value') + '') === (fontSize + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsize').text(fontSize);\n\n      const fontSizeUnit = styleInfo['font-size-unit'];\n      $cont.find('.dropdown-fontsizeunit a').each((idx, item) => {\n        const $item = $(item);\n        const isChecked = ($item.data('value') + '') === (fontSizeUnit + '');\n        $item.toggleClass('checked', isChecked);\n      });\n      $cont.find('.note-current-fontsizeunit').text(fontSizeUnit);\n    }\n\n    if (styleInfo['line-height']) {\n      const lineHeight = styleInfo['line-height'];\n      $cont.find('.dropdown-line-height li a').each((idx, item) => {\n        // always compare with string to avoid creating another func.\n        const isChecked = ($(item).data('value') + '') === (lineHeight + '');\n        this.className = isChecked ? 'checked' : '';\n      });\n    }\n  }\n\n  updateBtnStates($container, infos) {\n    $.each(infos, (selector, pred) => {\n      this.ui.toggleBtnActive($container.find(selector), pred());\n    });\n  }\n\n  tableMoveHandler(event) {\n    const PX_PER_EM = 18;\n    const $picker = $(event.target.parentNode); // target is mousecatcher\n    const $dimensionDisplay = $picker.next();\n    const $catcher = $picker.find('.note-dimension-picker-mousecatcher');\n    const $highlighted = $picker.find('.note-dimension-picker-highlighted');\n    const $unhighlighted = $picker.find('.note-dimension-picker-unhighlighted');\n\n    let posOffset;\n    // HTML5 with jQuery - e.offsetX is undefined in Firefox\n    if (event.offsetX === undefined) {\n      const posCatcher = $(event.target).offset();\n      posOffset = {\n        x: event.pageX - posCatcher.left,\n        y: event.pageY - posCatcher.top,\n      };\n    } else {\n      posOffset = {\n        x: event.offsetX,\n        y: event.offsetY,\n      };\n    }\n\n    const dim = {\n      c: Math.ceil(posOffset.x / PX_PER_EM) || 1,\n      r: Math.ceil(posOffset.y / PX_PER_EM) || 1,\n    };\n\n    $highlighted.css({ width: dim.c + 'em', height: dim.r + 'em' });\n    $catcher.data('value', dim.c + 'x' + dim.r);\n\n    if (dim.c > 3 && dim.c < this.options.insertTableMaxSize.col) {\n      $unhighlighted.css({ width: dim.c + 1 + 'em' });\n    }\n\n    if (dim.r > 3 && dim.r < this.options.insertTableMaxSize.row) {\n      $unhighlighted.css({ height: dim.r + 1 + 'em' });\n    }\n\n    $dimensionDisplay.html(dim.c + ' x ' + dim.r);\n  }\n}\n","import $ from 'jquery';\nexport default class Toolbar {\n  constructor(context) {\n    this.context = context;\n\n    this.$window = $(window);\n    this.$document = $(document);\n\n    this.ui = $.summernote.ui;\n    this.$note = context.layoutInfo.note;\n    this.$editor = context.layoutInfo.editor;\n    this.$toolbar = context.layoutInfo.toolbar;\n    this.$editable = context.layoutInfo.editable;\n    this.$statusbar = context.layoutInfo.statusbar;\n    this.options = context.options;\n\n    this.isFollowing = false;\n    this.followScroll = this.followScroll.bind(this);\n  }\n\n  shouldInitialize() {\n    return !this.options.airMode;\n  }\n\n  initialize() {\n    this.options.toolbar = this.options.toolbar || [];\n\n    if (!this.options.toolbar.length) {\n      this.$toolbar.hide();\n    } else {\n      this.context.invoke('buttons.build', this.$toolbar, this.options.toolbar);\n    }\n\n    if (this.options.toolbarContainer) {\n      this.$toolbar.appendTo(this.options.toolbarContainer);\n    }\n\n    this.changeContainer(false);\n\n    this.$note.on('summernote.keyup summernote.mouseup summernote.change', () => {\n      this.context.invoke('buttons.updateCurrentStyle');\n    });\n\n    this.context.invoke('buttons.updateCurrentStyle');\n    if (this.options.followingToolbar) {\n      this.$window.on('scroll resize', this.followScroll);\n    }\n  }\n\n  destroy() {\n    this.$toolbar.children().remove();\n\n    if (this.options.followingToolbar) {\n      this.$window.off('scroll resize', this.followScroll);\n    }\n  }\n\n  followScroll() {\n    if (this.$editor.hasClass('fullscreen')) {\n      return false;\n    }\n\n    const editorHeight = this.$editor.outerHeight();\n    const editorWidth = this.$editor.width();\n    const toolbarHeight = this.$toolbar.height();\n    const statusbarHeight = this.$statusbar.height();\n\n    // check if the web app is currently using another static bar\n    let otherBarHeight = 0;\n    if (this.options.otherStaticBar) {\n      otherBarHeight = $(this.options.otherStaticBar).outerHeight();\n    }\n\n    const currentOffset = this.$document.scrollTop();\n    const editorOffsetTop = this.$editor.offset().top;\n    const editorOffsetBottom = editorOffsetTop + editorHeight;\n    const activateOffset = editorOffsetTop - otherBarHeight;\n    const deactivateOffsetBottom = editorOffsetBottom - otherBarHeight - toolbarHeight - statusbarHeight;\n\n    if (!this.isFollowing &&\n      (currentOffset > activateOffset) && (currentOffset < deactivateOffsetBottom - toolbarHeight)) {\n      this.isFollowing = true;\n      this.$editable.css({\n        marginTop: this.$toolbar.outerHeight(),\n      });\n      this.$toolbar.css({\n        position: 'fixed',\n        top: otherBarHeight,\n        width: editorWidth,\n        zIndex: 1000,\n      });\n    } else if (this.isFollowing &&\n      ((currentOffset < activateOffset) || (currentOffset > deactivateOffsetBottom))) {\n      this.isFollowing = false;\n      this.$toolbar.css({\n        position: 'relative',\n        top: 0,\n        width: '100%',\n        zIndex: 'auto',\n      });\n      this.$editable.css({\n        marginTop: '',\n      });\n    }\n  }\n\n  changeContainer(isFullscreen) {\n    if (isFullscreen) {\n      this.$toolbar.prependTo(this.$editor);\n    } else {\n      if (this.options.toolbarContainer) {\n        this.$toolbar.appendTo(this.options.toolbarContainer);\n      }\n    }\n    if (this.options.followingToolbar) {\n      this.followScroll();\n    }\n  }\n\n  updateFullscreen(isFullscreen) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-fullscreen'), isFullscreen);\n\n    this.changeContainer(isFullscreen);\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$toolbar.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.deactivate();\n    } else {\n      this.activate();\n    }\n  }\n\n  activate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, true);\n  }\n\n  deactivate(isIncludeCodeview) {\n    let $btn = this.$toolbar.find('button');\n    if (!isIncludeCodeview) {\n      $btn = $btn.not('.note-codeview-keep');\n    }\n    this.ui.toggleBtn($btn, false);\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\nimport func from '../core/func';\n\nexport default class LinkDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n\n    context.memo('help.linkDialog.show', this.options.langInfo.help['linkDialog.show']);\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-txt-${this.options.id}\" class=\"note-form-label\">${this.lang.link.textToDisplay}</label>`,\n        `<input id=\"note-dialog-link-txt-${this.options.id}\" class=\"note-link-text form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n      '<div class=\"form-group note-form-group\">',\n        `<label for=\"note-dialog-link-url-${this.options.id}\" class=\"note-form-label\">${this.lang.link.url}</label>`,\n        `<input id=\"note-dialog-link-url-${this.options.id}\" class=\"note-link-url form-control note-form-control note-input\" type=\"text\" value=\"http://\"/>`,\n      '</div>',\n      !this.options.disableLinkTarget\n        ? $('<div/>').append(this.ui.checkbox({\n          className: 'sn-checkbox-open-in-new-window',\n          text: this.lang.link.openInNewWindow,\n          checked: true,\n        }).render()).html()\n        : '',\n      $('<div/>').append(this.ui.checkbox({\n        className: 'sn-checkbox-use-protocol',\n        text: this.lang.link.useProtocol,\n        checked: true,\n      }).render()).html(),\n    ].join('');\n\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-link-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.link.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      className: 'link-dialog',\n      title: this.lang.link.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  /**\n   * toggle update button\n   */\n  toggleLinkBtn($linkBtn, $linkText, $linkUrl) {\n    this.ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val());\n  }\n\n  /**\n   * Show link dialog and set event handlers on dialog controls.\n   *\n   * @param {Object} linkInfo\n   * @return {Promise}\n   */\n  showLinkDialog(linkInfo) {\n    return $.Deferred((deferred) => {\n      const $linkText = this.$dialog.find('.note-link-text');\n      const $linkUrl = this.$dialog.find('.note-link-url');\n      const $linkBtn = this.$dialog.find('.note-link-btn');\n      const $openInNewWindow = this.$dialog\n        .find('.sn-checkbox-open-in-new-window input[type=checkbox]');\n      const $useProtocol = this.$dialog\n        .find('.sn-checkbox-use-protocol input[type=checkbox]');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // If no url was given and given text is valid URL then copy that into URL Field\n        if (!linkInfo.url && func.isValidUrl(linkInfo.text)) {\n          linkInfo.url = linkInfo.text;\n        }\n\n        $linkText.on('input paste propertychange', () => {\n          // If linktext was modified by input events,\n          // cloning text from linkUrl will be stopped.\n          linkInfo.text = $linkText.val();\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.text);\n\n        $linkUrl.on('input paste propertychange', () => {\n          // Display same text on `Text to display` as default\n          // when linktext has no text\n          if (!linkInfo.text) {\n            $linkText.val($linkUrl.val());\n          }\n          this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        }).val(linkInfo.url);\n\n        if (!env.isSupportTouch) {\n          $linkUrl.trigger('focus');\n        }\n\n        this.toggleLinkBtn($linkBtn, $linkText, $linkUrl);\n        this.bindEnterKey($linkUrl, $linkBtn);\n        this.bindEnterKey($linkText, $linkBtn);\n\n        const isNewWindowChecked = linkInfo.isNewWindow !== undefined\n          ? linkInfo.isNewWindow : this.context.options.linkTargetBlank;\n\n        $openInNewWindow.prop('checked', isNewWindowChecked);\n\n        const useProtocolChecked = linkInfo.url\n          ? false : this.context.options.useProtocol;\n\n        $useProtocol.prop('checked', useProtocolChecked);\n\n        $linkBtn.one('click', (event) => {\n          event.preventDefault();\n\n          deferred.resolve({\n            range: linkInfo.range,\n            url: $linkUrl.val(),\n            text: $linkText.val(),\n            isNewWindow: $openInNewWindow.is(':checked'),\n            checkProtocol: $useProtocol.is(':checked'),\n          });\n          this.ui.hideDialog(this.$dialog);\n        });\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        // detach events\n        $linkText.off();\n        $linkUrl.off();\n        $linkBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  /**\n   * @param {Object} layoutInfo\n   */\n  show() {\n    const linkInfo = this.context.invoke('editor.getLinkInfo');\n\n    this.context.invoke('editor.saveRange');\n    this.showLinkDialog(linkInfo).then((linkInfo) => {\n      this.context.invoke('editor.restoreRange');\n      this.context.invoke('editor.createLink', linkInfo);\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class LinkPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.keyup summernote.mouseup summernote.change summernote.scroll': () => {\n        this.update();\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.link);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-link-popover',\n      callback: ($node) => {\n        const $content = $node.find('.popover-content,.note-popover-content');\n        $content.prepend('<span><a target=\"_blank\"></a>&nbsp;</span>');\n      },\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.link);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update() {\n    // Prevent focusing on editable when invoke('code') is executed\n    if (!this.context.invoke('editor.hasFocus')) {\n      this.hide();\n      return;\n    }\n\n    const rng = this.context.invoke('editor.getLastRange');\n    if (rng.isCollapsed() && rng.isOnAnchor()) {\n      const anchor = dom.ancestor(rng.sc, dom.isAnchor);\n      const href = $(anchor).attr('href');\n      this.$popover.find('a').attr('href', href).text(href);\n\n      const pos = dom.posFromPlaceholder(anchor);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class ImageDialog {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    let imageLimitation = '';\n    if (this.options.maximumImageFileSize) {\n      const unit = Math.floor(Math.log(this.options.maximumImageFileSize) / Math.log(1024));\n      const readableSize = (this.options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 +\n                         ' ' + ' KMGTP'[unit] + 'B';\n      imageLimitation = `<small>${this.lang.image.maximumFileSize + ' : ' + readableSize}</small>`;\n    }\n\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group note-group-select-from-files\">',\n        '<label for=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.selectFromFiles + '</label>',\n        '<input id=\"note-dialog-image-file-' + this.options.id + '\" class=\"note-image-input form-control-file note-form-control note-input\" ',\n        ' type=\"file\" name=\"files\" accept=\"image/*\" multiple=\"multiple\"/>',\n        imageLimitation,\n      '</div>',\n      '<div class=\"form-group note-group-image-url\">',\n        '<label for=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-form-label\">' + this.lang.image.url + '</label>',\n        '<input id=\"note-dialog-image-url-' + this.options.id + '\" class=\"note-image-url form-control note-form-control note-input\" type=\"text\"/>',\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-image-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.image.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.image.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showImageDialog().then((data) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      if (typeof data === 'string') { // image url\n        // If onImageLinkInsert set,\n        if (this.options.callbacks.onImageLinkInsert) {\n          this.context.triggerEvent('image.link.insert', data);\n        } else {\n          this.context.invoke('editor.insertImage', data);\n        }\n      } else { // array of files\n        this.context.invoke('editor.insertImagesOrCallback', data);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show image dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showImageDialog() {\n    return $.Deferred((deferred) => {\n      const $imageInput = this.$dialog.find('.note-image-input');\n      const $imageUrl = this.$dialog.find('.note-image-url');\n      const $imageBtn = this.$dialog.find('.note-image-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        // Cloning imageInput to clear element.\n        $imageInput.replaceWith($imageInput.clone().on('change', (event) => {\n          deferred.resolve(event.target.files || event.target.value);\n        }).val(''));\n\n        $imageUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($imageBtn, $imageUrl.val());\n        }).val('');\n\n        if (!env.isSupportTouch) {\n          $imageUrl.trigger('focus');\n        }\n\n        $imageBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($imageUrl.val());\n        });\n\n        this.bindEnterKey($imageUrl, $imageBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $imageInput.off();\n        $imageUrl.off();\n        $imageBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\n/**\n * Image popover module\n *  mouse events that show/hide popover will be handled by Handle.js.\n *  Handle.js will receive the events and invoke 'imagePopover.update'.\n */\nexport default class ImagePopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n\n    this.editable = context.layoutInfo.editable[0];\n    this.options = context.options;\n\n    this.events = {\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.image);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-image-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n    this.context.invoke('buttons.build', $content, this.options.popover.image);\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target, event) {\n    if (dom.isImg(target)) {\n      const position = $(target).offset();\n      const containerOffset = $(this.options.container).offset();\n      let pos = {};\n      if (this.options.popatmouse) {\n        pos.left = event.pageX - 20;\n        pos.top = event.pageY;\n      } else {\n        pos = position;\n      }\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\n\nexport default class TablePopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n    this.events = {\n      'summernote.mousedown': (we, e) => {\n        this.update(e.target);\n      },\n      'summernote.keyup summernote.scroll summernote.change': () => {\n        this.update();\n      },\n      'summernote.disable summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return !lists.isEmpty(this.options.popover.table);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-table-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content,.note-popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.table);\n\n    // [workaround] Disable Firefox's default table editor\n    if (env.isFF) {\n      document.execCommand('enableInlineTableEditing', false, false);\n    }\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(target) {\n    if (this.context.isDisabled()) {\n      return false;\n    }\n\n    const isCell = dom.isCell(target);\n\n    if (isCell) {\n      const pos = dom.posFromPlaceholder(target);\n      const containerOffset = $(this.options.container).offset();\n      pos.top -= containerOffset.top;\n      pos.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: pos.left,\n        top: pos.top,\n      });\n    } else {\n      this.hide();\n    }\n\n    return isCell;\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\nimport key from '../core/key';\n\nexport default class VideoDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<div class=\"form-group note-form-group row-fluid\">',\n        `<label for=\"note-dialog-video-url-${this.options.id}\" class=\"note-form-label\">${this.lang.video.url} <small class=\"text-muted\">${this.lang.video.providers}</small></label>`,\n        `<input id=\"note-dialog-video-url-${this.options.id}\" class=\"note-video-url form-control note-form-control note-input\" type=\"text\"/>`,\n      '</div>',\n    ].join('');\n    const buttonClass = 'btn btn-primary note-btn note-btn-primary note-video-btn';\n    const footer = `<input type=\"button\" href=\"#\" class=\"${buttonClass}\" value=\"${this.lang.video.insert}\" disabled>`;\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.video.insert,\n      fade: this.options.dialogsFade,\n      body: body,\n      footer: footer,\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  bindEnterKey($input, $btn) {\n    $input.on('keypress', (event) => {\n      if (event.keyCode === key.code.ENTER) {\n        event.preventDefault();\n        $btn.trigger('click');\n      }\n    });\n  }\n\n  createVideoNode(url) {\n    // video url patterns(youtube, instagram, vimeo, dailymotion, youku, mp4, ogg, webm)\n    const ytRegExp = /\\/\\/(?:(?:www|m)\\.)?(?:youtu\\.be\\/|youtube\\.com\\/(?:embed\\/|v\\/|watch\\?v=|watch\\?.+&v=))([\\w|-]{11})(?:(?:[\\?&]t=)(\\S+))?$/;\n    const ytRegExpForStart = /^(?:(\\d+)h)?(?:(\\d+)m)?(?:(\\d+)s)?$/;\n    const ytMatch = url.match(ytRegExp);\n\n    const igRegExp = /(?:www\\.|\\/\\/)instagram\\.com\\/p\\/(.[a-zA-Z0-9_-]*)/;\n    const igMatch = url.match(igRegExp);\n\n    const vRegExp = /\\/\\/vine\\.co\\/v\\/([a-zA-Z0-9]+)/;\n    const vMatch = url.match(vRegExp);\n\n    const vimRegExp = /\\/\\/(player\\.)?vimeo\\.com\\/([a-z]*\\/)*(\\d+)[?]?.*/;\n    const vimMatch = url.match(vimRegExp);\n\n    const dmRegExp = /.+dailymotion.com\\/(video|hub)\\/([^_]+)[^#]*(#video=([^_&]+))?/;\n    const dmMatch = url.match(dmRegExp);\n\n    const youkuRegExp = /\\/\\/v\\.youku\\.com\\/v_show\\/id_(\\w+)=*\\.html/;\n    const youkuMatch = url.match(youkuRegExp);\n\n    const qqRegExp = /\\/\\/v\\.qq\\.com.*?vid=(.+)/;\n    const qqMatch = url.match(qqRegExp);\n\n    const qqRegExp2 = /\\/\\/v\\.qq\\.com\\/x?\\/?(page|cover).*?\\/([^\\/]+)\\.html\\??.*/;\n    const qqMatch2 = url.match(qqRegExp2);\n\n    const mp4RegExp = /^.+.(mp4|m4v)$/;\n    const mp4Match = url.match(mp4RegExp);\n\n    const oggRegExp = /^.+.(ogg|ogv)$/;\n    const oggMatch = url.match(oggRegExp);\n\n    const webmRegExp = /^.+.(webm)$/;\n    const webmMatch = url.match(webmRegExp);\n\n    const fbRegExp = /(?:www\\.|\\/\\/)facebook\\.com\\/([^\\/]+)\\/videos\\/([0-9]+)/;\n    const fbMatch = url.match(fbRegExp);\n\n    let $video;\n    if (ytMatch && ytMatch[1].length === 11) {\n      const youtubeId = ytMatch[1];\n      var start = 0;\n      if (typeof ytMatch[2] !== 'undefined') {\n        const ytMatchForStart = ytMatch[2].match(ytRegExpForStart);\n        if (ytMatchForStart) {\n          for (var n = [3600, 60, 1], i = 0, r = n.length; i < r; i++) {\n            start += (typeof ytMatchForStart[i + 1] !== 'undefined' ? n[i] * parseInt(ytMatchForStart[i + 1], 10) : 0);\n          }\n        }\n      }\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.youtube.com/embed/' + youtubeId + (start > 0 ? '?start=' + start : ''))\n        .attr('width', '640').attr('height', '360');\n    } else if (igMatch && igMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://instagram.com/p/' + igMatch[1] + '/embed/')\n        .attr('width', '612').attr('height', '710')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else if (vMatch && vMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', vMatch[0] + '/embed/simple')\n        .attr('width', '600').attr('height', '600')\n        .attr('class', 'vine-embed');\n    } else if (vimMatch && vimMatch[3].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('src', '//player.vimeo.com/video/' + vimMatch[3])\n        .attr('width', '640').attr('height', '360');\n    } else if (dmMatch && dmMatch[2].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', '//www.dailymotion.com/embed/video/' + dmMatch[2])\n        .attr('width', '640').attr('height', '360');\n    } else if (youkuMatch && youkuMatch[1].length) {\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '498')\n        .attr('width', '510')\n        .attr('src', '//player.youku.com/embed/' + youkuMatch[1]);\n    } else if ((qqMatch && qqMatch[1].length) || (qqMatch2 && qqMatch2[2].length)) {\n      const vid = ((qqMatch && qqMatch[1].length) ? qqMatch[1] : qqMatch2[2]);\n      $video = $('<iframe webkitallowfullscreen mozallowfullscreen allowfullscreen>')\n        .attr('frameborder', 0)\n        .attr('height', '310')\n        .attr('width', '500')\n        .attr('src', 'https://v.qq.com/txp/iframe/player.html?vid=' + vid + '&amp;auto=0');\n    } else if (mp4Match || oggMatch || webmMatch) {\n      $video = $('<video controls>')\n        .attr('src', url)\n        .attr('width', '640').attr('height', '360');\n    } else if (fbMatch && fbMatch[0].length) {\n      $video = $('<iframe>')\n        .attr('frameborder', 0)\n        .attr('src', 'https://www.facebook.com/plugins/video.php?href=' + encodeURIComponent(fbMatch[0]) + '&show_text=0&width=560')\n        .attr('width', '560').attr('height', '301')\n        .attr('scrolling', 'no')\n        .attr('allowtransparency', 'true');\n    } else {\n      // this is not a known video link. Now what, Cat? Now what?\n      return false;\n    }\n\n    $video.addClass('note-video-clip');\n\n    return $video[0];\n  }\n\n  show() {\n    const text = this.context.invoke('editor.getSelectedText');\n    this.context.invoke('editor.saveRange');\n    this.showVideoDialog(text).then((url) => {\n      // [workaround] hide dialog before restore range for IE range focus\n      this.ui.hideDialog(this.$dialog);\n      this.context.invoke('editor.restoreRange');\n\n      // build node\n      const $node = this.createVideoNode(url);\n\n      if ($node) {\n        // insert video node\n        this.context.invoke('editor.insertNode', $node);\n      }\n    }).fail(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n\n  /**\n   * show video dialog\n   *\n   * @param {jQuery} $dialog\n   * @return {Promise}\n   */\n  showVideoDialog(/* text */) {\n    return $.Deferred((deferred) => {\n      const $videoUrl = this.$dialog.find('.note-video-url');\n      const $videoBtn = this.$dialog.find('.note-video-btn');\n\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n\n        $videoUrl.on('input paste propertychange', () => {\n          this.ui.toggleBtn($videoBtn, $videoUrl.val());\n        });\n\n        if (!env.isSupportTouch) {\n          $videoUrl.trigger('focus');\n        }\n\n        $videoBtn.click((event) => {\n          event.preventDefault();\n          deferred.resolve($videoUrl.val());\n        });\n\n        this.bindEnterKey($videoUrl, $videoBtn);\n      });\n\n      this.ui.onDialogHidden(this.$dialog, () => {\n        $videoUrl.off();\n        $videoBtn.off();\n\n        if (deferred.state() === 'pending') {\n          deferred.reject();\n        }\n      });\n\n      this.ui.showDialog(this.$dialog);\n    });\n  }\n}\n","import $ from 'jquery';\nimport env from '../core/env';\n\nexport default class HelpDialog {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$body = $(document.body);\n    this.$editor = context.layoutInfo.editor;\n    this.options = context.options;\n    this.lang = this.options.langInfo;\n  }\n\n  initialize() {\n    const $container = this.options.dialogsInBody ? this.$body : this.options.container;\n    const body = [\n      '<p class=\"text-center\">',\n        '<a href=\"http://summernote.org/\" target=\"_blank\">Summernote @@VERSION@@</a> · ',\n        '<a href=\"https://github.com/summernote/summernote\" target=\"_blank\">Project</a> · ',\n        '<a href=\"https://github.com/summernote/summernote/issues\" target=\"_blank\">Issues</a>',\n      '</p>',\n    ].join('');\n\n    this.$dialog = this.ui.dialog({\n      title: this.lang.options.help,\n      fade: this.options.dialogsFade,\n      body: this.createShortcutList(),\n      footer: body,\n      callback: ($node) => {\n        $node.find('.modal-body,.note-modal-body').css({\n          'max-height': 300,\n          'overflow': 'scroll',\n        });\n      },\n    }).render().appendTo($container);\n  }\n\n  destroy() {\n    this.ui.hideDialog(this.$dialog);\n    this.$dialog.remove();\n  }\n\n  createShortcutList() {\n    const keyMap = this.options.keyMap[env.isMac ? 'mac' : 'pc'];\n    return Object.keys(keyMap).map((key) => {\n      const command = keyMap[key];\n      const $row = $('<div><div class=\"help-list-item\"></div></div>');\n      $row.append($('<label><kbd>' + key + '</kdb></label>').css({\n        'width': 180,\n        'margin-right': 10,\n      })).append($('<span/>').html(this.context.memo('help.' + command) || command));\n      return $row.html();\n    }).join('');\n  }\n\n  /**\n   * show help dialog\n   *\n   * @return {Promise}\n   */\n  showHelpDialog() {\n    return $.Deferred((deferred) => {\n      this.ui.onDialogShown(this.$dialog, () => {\n        this.context.triggerEvent('dialog.shown');\n        deferred.resolve();\n      });\n      this.ui.showDialog(this.$dialog);\n    }).promise();\n  }\n\n  show() {\n    this.context.invoke('editor.saveRange');\n    this.showHelpDialog().then(() => {\n      this.context.invoke('editor.restoreRange');\n    });\n  }\n}\n","import $ from 'jquery';\nimport lists from '../core/lists';\n\nconst AIRMODE_POPOVER_X_OFFSET = -5;\nconst AIRMODE_POPOVER_Y_OFFSET = 5;\n\nexport default class AirPopover {\n  constructor(context) {\n    this.context = context;\n    this.ui = $.summernote.ui;\n    this.options = context.options;\n\n    this.hidable = true;\n    this.onContextmenu = false;\n    this.pageX = null;\n    this.pageY = null;\n\n    this.events = {\n      'summernote.contextmenu': (e) => {\n        if (this.options.editing) {\n          e.preventDefault();\n          e.stopPropagation();\n          this.onContextmenu = true;\n          this.update(true);\n        }\n      },\n      'summernote.mousedown': (we, e) => {\n        this.pageX = e.pageX;\n        this.pageY = e.pageY;\n      },\n      'summernote.keyup summernote.mouseup summernote.scroll': (we, e) => {\n        if (this.options.editing && !this.onContextmenu) {\n          this.pageX = e.pageX;\n          this.pageY = e.pageY;\n          this.update();\n        }\n        this.onContextmenu = false;\n      },\n      'summernote.disable summernote.change summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n      'summernote.focusout': () => {\n        if (!this.$popover.is(':active,:focus')) {\n          this.hide();\n        }\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.options.airMode && !lists.isEmpty(this.options.popover.air);\n  }\n\n  initialize() {\n    this.$popover = this.ui.popover({\n      className: 'note-air-popover',\n    }).render().appendTo(this.options.container);\n    const $content = this.$popover.find('.popover-content');\n\n    this.context.invoke('buttons.build', $content, this.options.popover.air);\n\n    // disable hiding this popover preemptively by 'summernote.blur' event.\n    this.$popover.on('mousedown', () => { this.hidable = false; });\n    // (re-)enable hiding after 'summernote.blur' has been handled (aka. ignored).\n    this.$popover.on('mouseup', () => { this.hidable = true; });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  update(forcelyOpen) {\n    const styleInfo = this.context.invoke('editor.currentStyle');\n    if (styleInfo.range && (!styleInfo.range.isCollapsed() || forcelyOpen)) {\n      let rect = {\n        left: this.pageX,\n        top: this.pageY,\n      };\n\n      const containerOffset = $(this.options.container).offset();\n      rect.top -= containerOffset.top;\n      rect.left -= containerOffset.left;\n\n      this.$popover.css({\n        display: 'block',\n        left: Math.max(rect.left, 0) + AIRMODE_POPOVER_X_OFFSET,\n        top: rect.top + AIRMODE_POPOVER_Y_OFFSET,\n      });\n      this.context.invoke('buttons.updateCurrentStyle', this.$popover);\n    } else {\n      this.hide();\n    }\n  }\n\n  updateCodeview(isCodeview) {\n    this.ui.toggleBtnActive(this.$popover.find('.btn-codeview'), isCodeview);\n    if (isCodeview) {\n      this.hide();\n    } \n  }\n\n  hide() {\n    if (this.hidable) {\n      this.$popover.hide();\n    }\n  }\n}\n","import $ from 'jquery';\nimport func from '../core/func';\nimport lists from '../core/lists';\nimport dom from '../core/dom';\nimport range from '../core/range';\nimport key from '../core/key';\n\nconst POPOVER_DIST = 5;\n\nexport default class HintPopover {\n  constructor(context) {\n    this.context = context;\n\n    this.ui = $.summernote.ui;\n    this.$editable = context.layoutInfo.editable;\n    this.options = context.options;\n    this.hint = this.options.hint || [];\n    this.direction = this.options.hintDirection || 'bottom';\n    this.hints = Array.isArray(this.hint) ? this.hint : [this.hint];\n\n    this.events = {\n      'summernote.keyup': (we, e) => {\n        if (!e.isDefaultPrevented()) {\n          this.handleKeyup(e);\n        }\n      },\n      'summernote.keydown': (we, e) => {\n        this.handleKeydown(e);\n      },\n      'summernote.disable summernote.dialog.shown summernote.blur': () => {\n        this.hide();\n      },\n    };\n  }\n\n  shouldInitialize() {\n    return this.hints.length > 0;\n  }\n\n  initialize() {\n    this.lastWordRange = null;\n    this.matchingWord = null;\n    this.$popover = this.ui.popover({\n      className: 'note-hint-popover',\n      hideArrow: true,\n      direction: '',\n    }).render().appendTo(this.options.container);\n\n    this.$popover.hide();\n    this.$content = this.$popover.find('.popover-content,.note-popover-content');\n    this.$content.on('click', '.note-hint-item', (e) => {\n      this.$content.find('.active').removeClass('active');\n      $(e.currentTarget).addClass('active');\n      this.replace();\n    });\n\n    this.$popover.on('mousedown', (e) => { e.preventDefault(); });\n  }\n\n  destroy() {\n    this.$popover.remove();\n  }\n\n  selectItem($item) {\n    this.$content.find('.active').removeClass('active');\n    $item.addClass('active');\n\n    this.$content[0].scrollTop = $item[0].offsetTop - (this.$content.innerHeight() / 2);\n  }\n\n  moveDown() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $next = $current.next();\n\n    if ($next.length) {\n      this.selectItem($next);\n    } else {\n      let $nextGroup = $current.parent().next();\n\n      if (!$nextGroup.length) {\n        $nextGroup = this.$content.find('.note-hint-group').first();\n      }\n\n      this.selectItem($nextGroup.find('.note-hint-item').first());\n    }\n  }\n\n  moveUp() {\n    const $current = this.$content.find('.note-hint-item.active');\n    const $prev = $current.prev();\n\n    if ($prev.length) {\n      this.selectItem($prev);\n    } else {\n      let $prevGroup = $current.parent().prev();\n\n      if (!$prevGroup.length) {\n        $prevGroup = this.$content.find('.note-hint-group').last();\n      }\n\n      this.selectItem($prevGroup.find('.note-hint-item').last());\n    }\n  }\n\n  replace() {\n    const $item = this.$content.find('.note-hint-item.active');\n\n    if ($item.length) {\n      var node = this.nodeFromItem($item);\n      // If matchingWord length = 0 -> capture OK / open hint / but as mention capture \"\" (\\w*)\n      if (this.matchingWord !== null && this.matchingWord.length === 0) {\n        this.lastWordRange.so = this.lastWordRange.eo;\n      // Else si > 0 and normal case -> adjust range \"before\" for correct position of insertion\n      } else if (this.matchingWord !== null && this.matchingWord.length > 0 && !this.lastWordRange.isCollapsed()) {\n        let rangeCompute = this.lastWordRange.eo - this.lastWordRange.so - this.matchingWord.length;\n        if (rangeCompute > 0) {\n          this.lastWordRange.so += rangeCompute;\n        }\n      }\n      this.lastWordRange.insertNode(node);\n\n      if (this.options.hintSelect === 'next') {\n        var blank = document.createTextNode('');\n        $(node).after(blank);\n        range.createFromNodeBefore(blank).select();\n      } else {\n        range.createFromNodeAfter(node).select();\n      }\n\n      this.lastWordRange = null;\n      this.hide();\n      this.context.invoke('editor.focus');\n    }\n  }\n\n  nodeFromItem($item) {\n    const hint = this.hints[$item.data('index')];\n    const item = $item.data('item');\n    let node = hint.content ? hint.content(item) : item;\n    if (typeof node === 'string') {\n      node = dom.createText(node);\n    }\n    return node;\n  }\n\n  createItemTemplates(hintIdx, items) {\n    const hint = this.hints[hintIdx];\n    return items.map((item /*, idx */) => {\n      const $item = $('<div class=\"note-hint-item\"/>');\n      $item.append(hint.template ? hint.template(item) : item + '');\n      $item.data({\n        'index': hintIdx,\n        'item': item,\n      });\n      return $item;\n    });\n  }\n\n  handleKeydown(e) {\n    if (!this.$popover.is(':visible')) {\n      return;\n    }\n\n    if (e.keyCode === key.code.ENTER) {\n      e.preventDefault();\n      this.replace();\n    } else if (e.keyCode === key.code.UP) {\n      e.preventDefault();\n      this.moveUp();\n    } else if (e.keyCode === key.code.DOWN) {\n      e.preventDefault();\n      this.moveDown();\n    }\n  }\n\n  searchKeyword(index, keyword, callback) {\n    const hint = this.hints[index];\n    if (hint && hint.match.test(keyword) && hint.search) {\n      const matches = hint.match.exec(keyword);\n      this.matchingWord = matches[0];\n      hint.search(matches[1], callback);\n    } else {\n      callback();\n    }\n  }\n\n  createGroup(idx, keyword) {\n    const $group = $('<div class=\"note-hint-group note-hint-group-' + idx + '\"></div>');\n    this.searchKeyword(idx, keyword, (items) => {\n      items = items || [];\n      if (items.length) {\n        $group.html(this.createItemTemplates(idx, items));\n        this.show();\n      }\n    });\n\n    return $group;\n  }\n\n  handleKeyup(e) {\n    if (!lists.contains([key.code.ENTER, key.code.UP, key.code.DOWN], e.keyCode)) {\n      let range = this.context.invoke('editor.getLastRange');\n      let wordRange, keyword;\n      if (this.options.hintMode === 'words') {\n        wordRange = range.getWordsRange(range);\n        keyword = wordRange.toString();\n\n        this.hints.forEach((hint) => {\n          if (hint.match.test(keyword)) {\n            wordRange = range.getWordsMatchRange(hint.match);\n            return false;\n          }\n        });\n\n        if (!wordRange) {\n          this.hide();\n          return;\n        }\n\n        keyword = wordRange.toString();\n      } else {\n        wordRange = range.getWordRange();\n        keyword = wordRange.toString();\n      }\n\n      if (this.hints.length && keyword) {\n        this.$content.empty();\n\n        const bnd = func.rect2bnd(lists.last(wordRange.getClientRects()));\n        const containerOffset = $(this.options.container).offset();\n        if (bnd) {\n          bnd.top -= containerOffset.top;\n          bnd.left -= containerOffset.left;\n\n          this.$popover.hide();\n          this.lastWordRange = wordRange;\n          this.hints.forEach((hint, idx) => {\n            if (hint.match.test(keyword)) {\n              this.createGroup(idx, keyword).appendTo(this.$content);\n            }\n          });\n          // select first .note-hint-item\n          this.$content.find('.note-hint-item:first').addClass('active');\n\n          // set position for popover after group is created\n          if (this.direction === 'top') {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top - this.$popover.outerHeight() - POPOVER_DIST,\n            });\n          } else {\n            this.$popover.css({\n              left: bnd.left,\n              top: bnd.top + bnd.height + POPOVER_DIST,\n            });\n          }\n        }\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  show() {\n    this.$popover.show();\n  }\n\n  hide() {\n    this.$popover.hide();\n  }\n}\n","import $ from 'jquery';\nimport './summernote-en-US';\nimport '../summernote';\nimport dom from './core/dom';\nimport range from './core/range';\nimport lists from './core/lists';\nimport Editor from './module/Editor';\nimport Clipboard from './module/Clipboard';\nimport Dropzone from './module/Dropzone';\nimport Codeview from './module/Codeview';\nimport Statusbar from './module/Statusbar';\nimport Fullscreen from './module/Fullscreen';\nimport Handle from './module/Handle';\nimport AutoLink from './module/AutoLink';\nimport AutoSync from './module/AutoSync';\nimport AutoReplace from './module/AutoReplace';\nimport Placeholder from './module/Placeholder';\nimport Buttons from './module/Buttons';\nimport Toolbar from './module/Toolbar';\nimport LinkDialog from './module/LinkDialog';\nimport LinkPopover from './module/LinkPopover';\nimport ImageDialog from './module/ImageDialog';\nimport ImagePopover from './module/ImagePopover';\nimport TablePopover from './module/TablePopover';\nimport VideoDialog from './module/VideoDialog';\nimport HelpDialog from './module/HelpDialog';\nimport AirPopover from './module/AirPopover';\nimport HintPopover from './module/HintPopover';\n\n$.summernote = $.extend($.summernote, {\n  version: '@@VERSION@@',\n  plugins: {},\n\n  dom: dom,\n  range: range,\n  lists: lists,\n\n  options: {\n    langInfo: $.summernote.lang['en-US'],\n    editing: true,\n    modules: {\n      'editor': Editor,\n      'clipboard': Clipboard,\n      'dropzone': Dropzone,\n      'codeview': Codeview,\n      'statusbar': Statusbar,\n      'fullscreen': Fullscreen,\n      'handle': Handle,\n      // FIXME: HintPopover must be front of autolink\n      //  - Script error about range when Enter key is pressed on hint popover\n      'hintPopover': HintPopover,\n      'autoLink': AutoLink,\n      'autoSync': AutoSync,\n      'autoReplace': AutoReplace,\n      'placeholder': Placeholder,\n      'buttons': Buttons,\n      'toolbar': Toolbar,\n      'linkDialog': LinkDialog,\n      'linkPopover': LinkPopover,\n      'imageDialog': ImageDialog,\n      'imagePopover': ImagePopover,\n      'tablePopover': TablePopover,\n      'videoDialog': VideoDialog,\n      'helpDialog': HelpDialog,\n      'airPopover': AirPopover,\n    },\n\n    buttons: {},\n\n    lang: 'en-US',\n\n    followingToolbar: false,\n    toolbarPosition: 'top',\n    otherStaticBar: '',\n\n    // toolbar\n    codeviewKeepButton: false,\n    toolbar: [\n      ['style', ['style']],\n      ['font', ['bold', 'underline', 'clear']],\n      ['fontname', ['fontname']],\n      ['color', ['color']],\n      ['para', ['ul', 'ol', 'paragraph']],\n      ['table', ['table']],\n      ['insert', ['link', 'picture', 'video']],\n      ['view', ['fullscreen', 'codeview', 'help']],\n    ],\n\n    // popover\n    popatmouse: true,\n    popover: {\n      image: [\n        ['resize', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],\n        ['float', ['floatLeft', 'floatRight', 'floatNone']],\n        ['remove', ['removeMedia']],\n      ],\n      link: [\n        ['link', ['linkDialogShow', 'unlink']],\n      ],\n      table: [\n        ['add', ['addRowDown', 'addRowUp', 'addColLeft', 'addColRight']],\n        ['delete', ['deleteRow', 'deleteCol', 'deleteTable']],\n      ],\n      air: [\n        ['color', ['color']],\n        ['font', ['bold', 'underline', 'clear']],\n        ['para', ['ul', 'paragraph']],\n        ['table', ['table']],\n        ['insert', ['link', 'picture']],\n        ['view', ['fullscreen', 'codeview']],\n      ],\n    },\n\n    // air mode: inline editor\n    airMode: false,\n    overrideContextMenu: false, // TBD\n\n    width: null,\n    height: null,\n    linkTargetBlank: true,\n    useProtocol: true,\n    defaultProtocol: 'http://',\n\n    focus: false,\n    tabDisabled: false,\n    tabSize: 4,\n    styleWithCSS: false,\n    shortcuts: true,\n    textareaAutoSync: true,\n    tooltip: 'auto',\n    container: null,\n    maxTextLength: 0,\n    blockquoteBreakingLevel: 2,\n    spellCheck: true,\n    disableGrammar: false,\n    placeholder: null,\n    inheritPlaceholder: false,\n    // TODO: need to be documented\n    recordEveryKeystroke: false,\n    historyLimit: 200,\n\n    // TODO: need to be documented\n    showDomainOnlyForAutolink: false,\n\n    // TODO: need to be documented\n    hintMode: 'word',\n    hintSelect: 'after',\n    hintDirection: 'bottom',\n\n    styleTags: ['p', 'blockquote', 'pre', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'],\n\n    fontNames: [\n      'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',\n      'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',\n      'Tahoma', 'Times New Roman', 'Verdana',\n    ],\n    fontNamesIgnoreCheck: [],\n    addDefaultFonts: true,\n\n    fontSizes: ['8', '9', '10', '11', '12', '14', '18', '24', '36'],\n\n    fontSizeUnits: ['px', 'pt'],\n\n    // pallete colors(n x n)\n    colors: [\n      ['#000000', '#424242', '#636363', '#9C9C94', '#CEC6CE', '#EFEFEF', '#F7F7F7', '#FFFFFF'],\n      ['#FF0000', '#FF9C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#9C00FF', '#FF00FF'],\n      ['#F7C6CE', '#FFE7CE', '#FFEFC6', '#D6EFD6', '#CEDEE7', '#CEE7F7', '#D6D6E7', '#E7D6DE'],\n      ['#E79C9C', '#FFC69C', '#FFE79C', '#B5D6A5', '#A5C6CE', '#9CC6EF', '#B5A5D6', '#D6A5BD'],\n      ['#E76363', '#F7AD6B', '#FFD663', '#94BD7B', '#73A5AD', '#6BADDE', '#8C7BC6', '#C67BA5'],\n      ['#CE0000', '#E79439', '#EFC631', '#6BA54A', '#4A7B8C', '#3984C6', '#634AA5', '#A54A7B'],\n      ['#9C0000', '#B56308', '#BD9400', '#397B21', '#104A5A', '#085294', '#311873', '#731842'],\n      ['#630000', '#7B3900', '#846300', '#295218', '#083139', '#003163', '#21104A', '#4A1031'],\n    ],\n\n    // http://chir.ag/projects/name-that-color/\n    colorsName: [\n      ['Black', 'Tundora', 'Dove Gray', 'Star Dust', 'Pale Slate', 'Gallery', 'Alabaster', 'White'],\n      ['Red', 'Orange Peel', 'Yellow', 'Green', 'Cyan', 'Blue', 'Electric Violet', 'Magenta'],\n      ['Azalea', 'Karry', 'Egg White', 'Zanah', 'Botticelli', 'Tropical Blue', 'Mischka', 'Twilight'],\n      ['Tonys Pink', 'Peach Orange', 'Cream Brulee', 'Sprout', 'Casper', 'Perano', 'Cold Purple', 'Careys Pink'],\n      ['Mandy', 'Rajah', 'Dandelion', 'Olivine', 'Gulf Stream', 'Viking', 'Blue Marguerite', 'Puce'],\n      ['Guardsman Red', 'Fire Bush', 'Golden Dream', 'Chelsea Cucumber', 'Smalt Blue', 'Boston Blue', 'Butterfly Bush', 'Cadillac'],\n      ['Sangria', 'Mai Tai', 'Buddha Gold', 'Forest Green', 'Eden', 'Venice Blue', 'Meteorite', 'Claret'],\n      ['Rosewood', 'Cinnamon', 'Olive', 'Parsley', 'Tiber', 'Midnight Blue', 'Valentino', 'Loulou'],\n    ],\n\n    colorButton: {\n      foreColor: '#000000',\n      backColor: '#FFFF00',\n    },\n\n    lineHeights: ['1.0', '1.2', '1.4', '1.5', '1.6', '1.8', '2.0', '3.0'],\n\n    tableClassName: 'table table-bordered',\n\n    insertTableMaxSize: {\n      col: 10,\n      row: 10,\n    },\n\n    // By default, dialogs are attached in container.\n    dialogsInBody: false,\n    dialogsFade: false,\n\n    maximumImageFileSize: null,\n\n    callbacks: {\n      onBeforeCommand: null,\n      onBlur: null,\n      onBlurCodeview: null,\n      onChange: null,\n      onChangeCodeview: null,\n      onDialogShown: null,\n      onEnter: null,\n      onFocus: null,\n      onImageLinkInsert: null,\n      onImageUpload: null,\n      onImageUploadError: null,\n      onInit: null,\n      onKeydown: null,\n      onKeyup: null,\n      onMousedown: null,\n      onMouseup: null,\n      onPaste: null,\n      onScroll: null,\n    },\n\n    codemirror: {\n      mode: 'text/html',\n      htmlMode: true,\n      lineNumbers: true,\n    },\n\n    codeviewFilter: false,\n    codeviewFilterRegex: /<\\/*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|ilayer|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|t(?:itle|extarea)|xml)[^>]*?>/gi,\n    codeviewIframeFilter: true,\n    codeviewIframeWhitelistSrc: [],\n    codeviewIframeWhitelistSrcBase: [\n      'www.youtube.com',\n      'www.youtube-nocookie.com',\n      'www.facebook.com',\n      'vine.co',\n      'instagram.com',\n      'player.vimeo.com',\n      'www.dailymotion.com',\n      'player.youku.com',\n      'v.qq.com',\n    ],\n\n    keyMap: {\n      pc: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CTRL+Z': 'undo',\n        'CTRL+Y': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CTRL+B': 'bold',\n        'CTRL+I': 'italic',\n        'CTRL+U': 'underline',\n        'CTRL+SHIFT+S': 'strikethrough',\n        'CTRL+BACKSLASH': 'removeFormat',\n        'CTRL+SHIFT+L': 'justifyLeft',\n        'CTRL+SHIFT+E': 'justifyCenter',\n        'CTRL+SHIFT+R': 'justifyRight',\n        'CTRL+SHIFT+J': 'justifyFull',\n        'CTRL+SHIFT+NUM7': 'insertUnorderedList',\n        'CTRL+SHIFT+NUM8': 'insertOrderedList',\n        'CTRL+LEFTBRACKET': 'outdent',\n        'CTRL+RIGHTBRACKET': 'indent',\n        'CTRL+NUM0': 'formatPara',\n        'CTRL+NUM1': 'formatH1',\n        'CTRL+NUM2': 'formatH2',\n        'CTRL+NUM3': 'formatH3',\n        'CTRL+NUM4': 'formatH4',\n        'CTRL+NUM5': 'formatH5',\n        'CTRL+NUM6': 'formatH6',\n        'CTRL+ENTER': 'insertHorizontalRule',\n        'CTRL+K': 'linkDialog.show',\n      },\n\n      mac: {\n        'ESC': 'escape',\n        'ENTER': 'insertParagraph',\n        'CMD+Z': 'undo',\n        'CMD+SHIFT+Z': 'redo',\n        'TAB': 'tab',\n        'SHIFT+TAB': 'untab',\n        'CMD+B': 'bold',\n        'CMD+I': 'italic',\n        'CMD+U': 'underline',\n        'CMD+SHIFT+S': 'strikethrough',\n        'CMD+BACKSLASH': 'removeFormat',\n        'CMD+SHIFT+L': 'justifyLeft',\n        'CMD+SHIFT+E': 'justifyCenter',\n        'CMD+SHIFT+R': 'justifyRight',\n        'CMD+SHIFT+J': 'justifyFull',\n        'CMD+SHIFT+NUM7': 'insertUnorderedList',\n        'CMD+SHIFT+NUM8': 'insertOrderedList',\n        'CMD+LEFTBRACKET': 'outdent',\n        'CMD+RIGHTBRACKET': 'indent',\n        'CMD+NUM0': 'formatPara',\n        'CMD+NUM1': 'formatH1',\n        'CMD+NUM2': 'formatH2',\n        'CMD+NUM3': 'formatH3',\n        'CMD+NUM4': 'formatH4',\n        'CMD+NUM5': 'formatH5',\n        'CMD+NUM6': 'formatH6',\n        'CMD+ENTER': 'insertHorizontalRule',\n        'CMD+K': 'linkDialog.show',\n      },\n    },\n    icons: {\n      'align': 'note-icon-align',\n      'alignCenter': 'note-icon-align-center',\n      'alignJustify': 'note-icon-align-justify',\n      'alignLeft': 'note-icon-align-left',\n      'alignRight': 'note-icon-align-right',\n      'rowBelow': 'note-icon-row-below',\n      'colBefore': 'note-icon-col-before',\n      'colAfter': 'note-icon-col-after',\n      'rowAbove': 'note-icon-row-above',\n      'rowRemove': 'note-icon-row-remove',\n      'colRemove': 'note-icon-col-remove',\n      'indent': 'note-icon-align-indent',\n      'outdent': 'note-icon-align-outdent',\n      'arrowsAlt': 'note-icon-arrows-alt',\n      'bold': 'note-icon-bold',\n      'caret': 'note-icon-caret',\n      'circle': 'note-icon-circle',\n      'close': 'note-icon-close',\n      'code': 'note-icon-code',\n      'eraser': 'note-icon-eraser',\n      'floatLeft': 'note-icon-float-left',\n      'floatRight': 'note-icon-float-right',\n      'font': 'note-icon-font',\n      'frame': 'note-icon-frame',\n      'italic': 'note-icon-italic',\n      'link': 'note-icon-link',\n      'unlink': 'note-icon-chain-broken',\n      'magic': 'note-icon-magic',\n      'menuCheck': 'note-icon-menu-check',\n      'minus': 'note-icon-minus',\n      'orderedlist': 'note-icon-orderedlist',\n      'pencil': 'note-icon-pencil',\n      'picture': 'note-icon-picture',\n      'question': 'note-icon-question',\n      'redo': 'note-icon-redo',\n      'rollback': 'note-icon-rollback',\n      'square': 'note-icon-square',\n      'strikethrough': 'note-icon-strikethrough',\n      'subscript': 'note-icon-subscript',\n      'superscript': 'note-icon-superscript',\n      'table': 'note-icon-table',\n      'textHeight': 'note-icon-text-height',\n      'trash': 'note-icon-trash',\n      'underline': 'note-icon-underline',\n      'undo': 'note-icon-undo',\n      'unorderedlist': 'note-icon-unorderedlist',\n      'video': 'note-icon-video',\n    },\n  },\n});\n","import $ from 'jquery';\nimport renderer from '../base/renderer';\n\nconst editor = renderer.create('<div class=\"note-editor note-frame panel panel-default\"/>');\nconst toolbar = renderer.create('<div class=\"panel-heading note-toolbar\" role=\"toolbar\"/>');\nconst editingArea = renderer.create('<div class=\"note-editing-area\"/>');\nconst codable = renderer.create('<textarea class=\"note-codable\" aria-multiline=\"true\"/>');\nconst editable = renderer.create('<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"/>');\nconst statusbar = renderer.create([\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n  '<div class=\"note-statusbar\" role=\"status\">',\n    '<div class=\"note-resizebar\" aria-label=\"Resize\">',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n      '<div class=\"note-icon-bar\"></div>',\n    '</div>',\n  '</div>',\n].join(''));\n\nconst airEditor = renderer.create('<div class=\"note-editor note-airframe\"/>');\nconst airEditable = renderer.create([\n  '<div class=\"note-editable\" contentEditable=\"true\" role=\"textbox\" aria-multiline=\"true\"></div>',\n  '<output class=\"note-status-output\" role=\"status\" aria-live=\"polite\"></output>',\n].join(''));\n\nconst buttonGroup = renderer.create('<div class=\"note-btn-group btn-group\">');\n\nconst dropdown = renderer.create('<ul class=\"note-dropdown-menu dropdown-menu\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    const option = (typeof item === 'object') ? item.option : undefined;\n\n    const dataValue = 'data-value=\"' + value + '\"';\n    const dataOption = (option !== undefined) ? ' data-option=\"' + option + '\"' : '';\n    return '<li aria-label=\"' + value + '\"><a href=\"#\" ' + (dataValue + dataOption) + '>' + content + '</a></li>';\n  }).join('') : options.items;\n\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dropdownButtonContents = function(contents, options) {\n  return contents + ' ' + icon(options.icons.caret, 'span');\n};\n\nconst dropdownCheck = renderer.create('<ul class=\"note-dropdown-menu dropdown-menu note-check\">', function($node, options) {\n  const markup = Array.isArray(options.items) ? options.items.map(function(item) {\n    const value = (typeof item === 'string') ? item : (item.value || '');\n    const content = options.template ? options.template(item) : item;\n    return '<li aria-label=\"' + item + '\"><a href=\"#\" data-value=\"' + value + '\">' + icon(options.checkClassName) + ' ' + content + '</a></li>';\n  }).join('') : options.items;\n  $node.html(markup).attr({ 'aria-label': options.title });\n\n  if (options && options.codeviewKeepButton) {\n    $node.addClass('note-codeview-keep');\n  }\n});\n\nconst dialog = renderer.create('<div class=\"modal note-modal\" aria-hidden=\"false\" tabindex=\"-1\" role=\"dialog\"/>', function($node, options) {\n  if (options.fade) {\n    $node.addClass('fade');\n  }\n  $node.attr({\n    'aria-label': options.title,\n  });\n  $node.html([\n    '<div class=\"modal-dialog\">',\n      '<div class=\"modal-content\">',\n        (options.title ? '<div class=\"modal-header\">' +\n          '<button type=\"button\" class=\"close\" data-dismiss=\"modal\" aria-label=\"Close\" aria-hidden=\"true\">&times;</button>' +\n          '<h4 class=\"modal-title\">' + options.title + '</h4>' +\n        '</div>' : ''),\n        '<div class=\"modal-body\">' + options.body + '</div>',\n        (options.footer ? '<div class=\"modal-footer\">' + options.footer + '</div>' : ''),\n      '</div>',\n    '</div>',\n  ].join(''));\n});\n\nconst popover = renderer.create([\n  '<div class=\"note-popover popover in\">',\n    '<div class=\"arrow\"></div>',\n    '<div class=\"popover-content note-children-container\"></div>',\n  '</div>',\n].join(''), function($node, options) {\n  const direction = typeof options.direction !== 'undefined' ? options.direction : 'bottom';\n\n  $node.addClass(direction);\n\n  if (options.hideArrow) {\n    $node.find('.arrow').hide();\n  }\n});\n\nconst checkbox = renderer.create('<div class=\"checkbox\"></div>', function($node, options) {\n  $node.html([\n    '<label' + (options.id ? ' for=\"note-' + options.id + '\"' : '') + '>',\n      '<input type=\"checkbox\"' + (options.id ? ' id=\"note-' + options.id + '\"' : ''),\n        (options.checked ? ' checked' : ''),\n        ' aria-checked=\"' + (options.checked ? 'true' : 'false') + '\"/>',\n      (options.text ? options.text : ''),\n    '</label>',\n  ].join(''));\n});\n\nconst icon = function(iconClassName, tagName) {\n  tagName = tagName || 'i';\n  return '<' + tagName + ' class=\"' + iconClassName + '\"></' + tagName+'>';\n};\n\nconst ui = function(editorOptions) {\n  return {\n    editor: editor,\n    toolbar: toolbar,\n    editingArea: editingArea,\n    codable: codable,\n    editable: editable,\n    statusbar: statusbar,\n    airEditor: airEditor,\n    airEditable: airEditable,\n    buttonGroup: buttonGroup,\n    dropdown: dropdown,\n    dropdownButtonContents: dropdownButtonContents,\n    dropdownCheck: dropdownCheck,\n    dialog: dialog,\n    popover: popover,\n    checkbox: checkbox,\n    icon: icon,\n    options: editorOptions,\n\n    palette: function($node, options) {\n      return renderer.create('<div class=\"note-color-palette\"/>', function($node, options) {\n        const contents = [];\n        for (let row = 0, rowSize = options.colors.length; row < rowSize; row++) {\n          const eventName = options.eventName;\n          const colors = options.colors[row];\n          const colorsName = options.colorsName[row];\n          const buttons = [];\n          for (let col = 0, colSize = colors.length; col < colSize; col++) {\n            const color = colors[col];\n            const colorName = colorsName[col];\n            buttons.push([\n              '<button type=\"button\" class=\"note-color-btn\"',\n              'style=\"background-color:', color, '\" ',\n              'data-event=\"', eventName, '\" ',\n              'data-value=\"', color, '\" ',\n              'title=\"', colorName, '\" ',\n              'aria-label=\"', colorName, '\" ',\n              'data-toggle=\"button\" tabindex=\"-1\"></button>',\n            ].join(''));\n          }\n          contents.push('<div class=\"note-color-row\">' + buttons.join('') + '</div>');\n        }\n        $node.html(contents.join(''));\n\n        if (options.tooltip) {\n          $node.find('.note-color-btn').tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          });\n        }\n      })($node, options);\n    },\n\n    button: function($node, options) {\n      return renderer.create('<button type=\"button\" class=\"note-btn btn btn-default btn-sm\" tabindex=\"-1\">', function($node, options) {\n        if (options && options.tooltip) {\n          $node.attr({\n            title: options.tooltip,\n            'aria-label': options.tooltip,\n          }).tooltip({\n            container: options.container || editorOptions.container,\n            trigger: 'hover',\n            placement: 'bottom',\n          }).on('click', (e) => {\n            $(e.currentTarget).tooltip('hide');\n          });\n        }\n        if (options && options.codeviewButton) {\n          $node.addClass('note-codeview-keep');\n        }\n      })($node, options);\n    },\n\n    toggleBtn: function($btn, isEnable) {\n      $btn.toggleClass('disabled', !isEnable);\n      $btn.attr('disabled', !isEnable);\n    },\n\n    toggleBtnActive: function($btn, isActive) {\n      $btn.toggleClass('active', isActive);\n    },\n\n    onDialogShown: function($dialog, handler) {\n      $dialog.one('shown.bs.modal', handler);\n    },\n\n    onDialogHidden: function($dialog, handler) {\n      $dialog.one('hidden.bs.modal', handler);\n    },\n\n    showDialog: function($dialog) {\n      $dialog.modal('show');\n    },\n\n    hideDialog: function($dialog) {\n      $dialog.modal('hide');\n    },\n\n    createLayout: function($note) {\n      const $editor = (editorOptions.airMode ? airEditor([\n        editingArea([\n          codable(),\n          airEditable(),\n        ]),\n      ]) : (editorOptions.toolbarPosition === 'bottom'\n        ? editor([\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          toolbar(),\n          statusbar(),\n        ])\n        : editor([\n          toolbar(),\n          editingArea([\n            codable(),\n            editable(),\n          ]),\n          statusbar(),\n        ])\n      )).render();\n\n      $editor.insertAfter($note);\n\n      return {\n        note: $note,\n        editor: $editor,\n        toolbar: $editor.find('.note-toolbar'),\n        editingArea: $editor.find('.note-editing-area'),\n        editable: $editor.find('.note-editable'),\n        codable: $editor.find('.note-codable'),\n        statusbar: $editor.find('.note-statusbar'),\n      };\n    },\n\n    removeLayout: function($note, layoutInfo) {\n      $note.html(layoutInfo.editable.html());\n      layoutInfo.editor.remove();\n      $note.show();\n    },\n  };\n};\n\nexport default ui;\n","import $ from 'jquery';\nimport ui from './ui';\nimport '../base/settings.js';\n\nimport '../../styles/summernote-bs3.scss';\n\n$.summernote = $.extend($.summernote, {\n  ui_template: ui,\n  interface: 'bs3',\n});\n"],"sourceRoot":""}
\ No newline at end of file
-- 
GitLab