diff --git a/krzip.patch b/krzip.patch
deleted file mode 100644
index 43b98456a..000000000
--- a/krzip.patch
+++ /dev/null
@@ -1,650 +0,0 @@
-diff --git a/common/lang/lang.xml b/common/lang/lang.xml
-index 6bba46e..fdad62d 100644
---- a/common/lang/lang.xml
-+++ b/common/lang/lang.xml
-@@ -3272,6 +3272,10 @@
-
-
-
-+ -
-+
-+
-+
- -
-
-
-diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php
-index 095085a..21c26e2 100644
---- a/modules/comment/comment.model.php
-+++ b/modules/comment/comment.model.php
-@@ -1054,6 +1054,46 @@ class commentModel extends comment
- }
- }
-
-+ /**
-+ * Get the total number of comments in corresponding with member_srl.
-+ * @param int $member_srl
-+ * @return int
-+ */
-+ function getCommentCountByMemberSrl($member_srl)
-+ {
-+ $args = new stdClass();
-+ $args->member_srl = $member_srl;
-+ $output = executeQuery('comment.getCommentCountByMemberSrl', $args);
-+ $total_count = $output->data->count;
-+
-+ return (int) $total_count;
-+ }
-+
-+
-+ /**
-+ * Get comment list of the doc in corresponding woth member_srl.
-+ * @param int $member_srl
-+ * @param array $columnList
-+ * @param int $page
-+ * @param bool $is_admin
-+ * @param int $count
-+ * @return object
-+ */
-+ function getCommentListByMemberSrl($member_srl, $columnList = array(), $page = 0, $is_admin = FALSE, $count = 0)
-+ {
-+ $args = new stdClass();
-+ $args->member_srl = $member_srl;
-+ $args->list_count = $count;
-+ $output = executeQuery('comment.getCommentListByMemberSrl', $args, $columnList);
-+ $comment_list = $output->data;
-+
-+ if(!$comment_list) return;
-+ if(!is_array($comment_list)) $comment_list = array($comment_list);
-+
-+ return $comment_list;
-+
-+ }
-+
- }
- /* End of file comment.model.php */
- /* Location: ./modules/comment/comment.model.php */
-diff --git a/modules/comment/queries/getCommentCountByMemberSrl.xml b/modules/comment/queries/getCommentCountByMemberSrl.xml
-new file mode 100644
-index 0000000..f81db46
---- /dev/null
-+++ b/modules/comment/queries/getCommentCountByMemberSrl.xml
-@@ -0,0 +1,11 @@
-+
-diff --git a/modules/comment/queries/getCommentListByMemberSrl.xml b/modules/comment/queries/getCommentListByMemberSrl.xml
-new file mode 100644
-index 0000000..6d8c680
---- /dev/null
-+++ b/modules/comment/queries/getCommentListByMemberSrl.xml
-@@ -0,0 +1,19 @@
-+
-diff --git a/modules/document/document.model.php b/modules/document/document.model.php
-index 94840fc..b8938eb 100644
---- a/modules/document/document.model.php
-+++ b/modules/document/document.model.php
-@@ -1490,6 +1490,44 @@ class documentModel extends document
- }
- }
- }
-+
-+ /**
-+ * Get the total number of Document in corresponding with member_srl.
-+ * @param int $member_srl
-+ * @return int
-+ */
-+ function getDocumentCountByMemberSrl($member_srl)
-+ {
-+ $args = new stdClass();
-+ $args->member_srl = $member_srl;
-+ $output = executeQuery('document.getDocumentCountByMemberSrl', $args);
-+ $total_count = $output->data->count;
-+
-+ return (int) $total_count;
-+ }
-+
-+ /**
-+ * Get document list of the doc in corresponding woth member_srl.
-+ * @param int $member_srl
-+ * @param array $columnList
-+ * @param int $page
-+ * @param bool $is_admin
-+ * @param int $count
-+ * @return object
-+ */
-+ function getDocumentListByMemberSrl($member_srl, $columnList = array(), $page = 0, $is_admin = FALSE, $count = 0 )
-+ {
-+ $args = new stdClass();
-+ $args->member_srl = $member_srl;
-+ $args->list_count = $count;
-+ $output = executeQuery('document.getDocumentListByMemberSrl', $args, $columnList);
-+ $document_list = $output->data;
-+
-+ if(!$document_list) return;
-+ if(!is_array($document_list)) $document_list = array($document_list);
-+
-+ return $document_list;
-+ }
- }
- /* End of file document.model.php */
- /* Location: ./modules/document/document.model.php */
-diff --git a/modules/document/document.view.php b/modules/document/document.view.php
-index 788708b..497050d 100644
---- a/modules/document/document.view.php
-+++ b/modules/document/document.view.php
-@@ -176,6 +176,7 @@ class documentView extends document
- $this->setTemplatePath($this->module_path.'tpl');
- $this->setTemplateFile('saved_list_popup');
- }
-+
- }
- /* End of file document.view.php */
- /* Location: ./modules/document/document.view.php */
-diff --git a/modules/document/queries/getDocumentCountByMemberSrl.xml b/modules/document/queries/getDocumentCountByMemberSrl.xml
-new file mode 100644
-index 0000000..ed457fb
---- /dev/null
-+++ b/modules/document/queries/getDocumentCountByMemberSrl.xml
-@@ -0,0 +1,11 @@
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/modules/document/queries/getDocumentListByMemberSrl.xml b/modules/document/queries/getDocumentListByMemberSrl.xml
-new file mode 100644
-index 0000000..49e8035
---- /dev/null
-+++ b/modules/document/queries/getDocumentListByMemberSrl.xml
-@@ -0,0 +1,17 @@
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-+
-diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml
-index 5cbe433..a2f7f2b 100644
---- a/modules/member/conf/module.xml
-+++ b/modules/member/conf/module.xml
-@@ -20,6 +20,7 @@
-
-
-
-+
-
-
-
-@@ -68,6 +69,7 @@
-
-
-
-+
-
-
-
-diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml
-index 0a9eced..d5524e7 100644
---- a/modules/member/lang/lang.xml
-+++ b/modules/member/lang/lang.xml
-@@ -2619,5 +2619,16 @@
-
-
-
--
-+ -
-+
-+
-+
-+ -
-+ 스팸 작성자 차단/삭제 및 회원이 남긴 글과 댓글을 모두 휴지통 이동 또는 삭제 합니다. 이 처리는 회원이 작성한 게시물의 양에 따라 오래걸릴 수 있습니다.
]]>
-+ Spam user management. This function remove all of documents, comments]]>
-+
-+ -
-+
-+
-+
-
-diff --git a/modules/member/member.class.php b/modules/member/member.class.php
-index e7bde82..86f7059 100644
---- a/modules/member/member.class.php
-+++ b/modules/member/member.class.php
-@@ -144,6 +144,9 @@ class member extends ModuleObject {
- FileHandler::makeDir('./files/member_extra_info/profile_image');
- FileHandler::makeDir('./files/member_extra_info/signature');
-
-+ // 2013. 11. 22 add menu when popup document menu called
-+ $oModuleController->insertTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after');
-+
- return new Object();
- }
-
-@@ -208,6 +211,9 @@ class member extends ModuleObject {
- if(!is_readable('./files/ruleset/login.xml')) return true;
- if(!is_readable('./files/ruleset/find_member_account_by_question.xml')) return true;
-
-+ // 2013. 11. 22 add menu when popup document menu called
-+ if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after')) return true;
-+
- return false;
- }
-
-@@ -345,6 +351,10 @@ class member extends ModuleObject {
- if(!is_readable('./files/ruleset/find_member_account_by_question.xml'))
- $oMemberAdminController->_createFindAccountByQuestion($config->identifier);
-
-+ // 2013. 11. 22 add menu when popup document menu called
-+ if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after'))
-+ $oModuleController->insertTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after');
-+
- return new Object(0, 'success_updated');
- }
-
-diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php
-index 6a4d769..af0331c 100644
---- a/modules/member/member.controller.php
-+++ b/modules/member/member.controller.php
-@@ -2354,6 +2354,186 @@ class memberController extends member
- $this->setTemplatePath($this->module_path.'tpl');
- $this->setTemplateFile('msg_success_modify_email_address');
- }
-+
-+ /**
-+ * trigger for document.getDocumentMenu. Append to popup menu a button for procMemberSpammerManage()
-+ *
-+ * @param array &$menu_list
-+ *
-+ * @return object
-+ **/
-+ function triggerGetDocumentMenu(&$menu_list)
-+ {
-+ $is_logged = Context::get('is_logged');
-+ $logged_info = Context::get('logged_info');
-+
-+
-+ $document_srl = Context::get('target_srl');
-+
-+ $oDocumentModel = &getModel('document');
-+ $columnList = array('document_srl', 'module_srl', 'member_srl', 'ipaddress');
-+ $oDocument = $oDocumentModel->getDocument($document_srl, false, false, $columnList);
-+ $member_srl = $oDocument->get('member_srl');
-+ $module_srl = $oDocument->get('module_srl');
-+
-+ if(!$member_srl) return new Object();
-+ if(!$is_logged) return new Object();
-+ if($oDocumentModel->grant->manager != 1 || $member_srl==$logged_info->member_srl) return new Object();
-+
-+ $oDocumentController = &getController('document');
-+ $url = getUrl('','module','member','act','dispMemberSpammer','member_srl',$member_srl,'module_srl',$module_srl);
-+ $oDocumentController->addDocumentPopupMenu($url,'cmd_spammer','','popup');
-+
-+ return new Object();
-+ }
-+
-+ /**
-+ * Spammer manage. Denied user login. And delete or trash all documents. Response Ajax string
-+ *
-+ * @return object
-+ **/
-+ function procMemberSpammerManage()
-+ {
-+ $logged_info = Context::get('logged_info');
-+ $member_srl = Context::get('member_srl');
-+ $module_srl = Context::get('module_srl');
-+ $cnt_loop = Context::get('cnt_loop');
-+ $proc_type = Context::get('proc_type');
-+ $isMoveToTrash = true;
-+ if($proc_type == "delete")
-+ $isMoveToTrash = false;
-+
-+ // check grant
-+ $oModuleModel = &getModel('module');
-+ $columnList = array('module_srl', 'module');
-+ $args = new stdClass();
-+ $args->module_srl = $module_srl;
-+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl, $columnList);
-+ $grant = $oModuleModel->getGrant($module_info, $logged_info);
-+
-+ if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted');
-+ if(!$grant->manager) return new Object(-1,'msg_not_permitted');
-+
-+ $proc_msg = "";
-+
-+ $oDocumentController = &getController('document');
-+ $oDocumentModel = &getModel('document');
-+ $oCommentController = &getController('comment');
-+ $oCommentModel = &getModel('comment');
-+
-+ // delete or trash destination
-+ // proc member
-+ if($cnt_loop == 1)
-+ {
-+ $this->_spammerMember($member_srl);
-+ }
-+ // proc document and comment
-+ elseif($cnt_loop>1)
-+ {
-+ $this->_spammerDocuments($member_srl, $isMoveToTrash);
-+ }
-+
-+ // get destination count
-+ $cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl);
-+ $cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl);
-+
-+ $total_count = Context::get('total_count');
-+ $remain_count = $cnt_document + $cnt_comment;
-+ if($cnt_loop == 1) {
-+ $total_count = $remain_count;
-+ }
-+
-+ // get progress percent
-+ if( $total_count > 0 )
-+ $progress = intval( ( ( $total_count - $remain_count ) / $total_count ) * 100 );
-+ else
-+ $progress = 100;
-+
-+ $this->add('total_count', $total_count);
-+ $this->add('remain_count', $remain_count);
-+ $this->add('progress', $progress);
-+ $this->add('member_srl', $member_srl);
-+ $this->add('module_srl', $module_srl);
-+ $this->add('cnt_loop', ++$cnt_loop);
-+ $this->add('proc_type', $proc_type);
-+
-+ $this->add( "retdata", $arrJson);
-+ return new Object(0);
-+ }
-+
-+ /**
-+ * Denied user login and write description
-+ *
-+ * @param int $member_srl
-+ *
-+ * @return bool
-+ **/
-+ private function _spammerMember($member_srl) {
-+ $logged_info = Context::get('logged_info');
-+ $spam_description = Context::get('spam_description');
-+
-+ $oMemberModel = &getModel('member');
-+ $columnList = array();
-+ // get member current infomation
-+ $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList);
-+ // set change infomations
-+ $member_info->denied = "Y";
-+
-+ if( $member_info->description != "" ) $member_info->description .= "\n"; // add new line
-+ $member_info->description .= Context::getLang('cmd_spammer') . "[" . date("Y-m-d H:i:s") . " from:" . $logged_info->user_id . " info:" . $spam_description . "]";
-+
-+ $oMemberController = &getController('member');
-+ $output = executeQuery('member.updateMember', $member_info);
-+ $proc_msg .= "member info updated\t";
-+
-+ return true;
-+ }
-+
-+ /**
-+ * Delete or trash all documents
-+ *
-+ * @param int $member_srl
-+ * @param bool $isMoveToTrash
-+ *
-+ * @return bool
-+ **/
-+ private function _spammerDocuments($member_srl, $isMoveToTrash) {
-+
-+ $logged_info = Context::get('logged_info');
-+
-+ $oDocumentController = &getController('document');
-+ $oDocumentModel = &getModel('document');
-+ $oCommentController = &getController('comment');
-+ $oCommentModel = &getModel('comment');
-+
-+ // delete count by one request
-+ $getContentsCount = 10;
-+
-+ // 1. proc comment, 2. proc document
-+ $cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl);
-+ $cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl);
-+ if($cnt_comment > 0)
-+ {
-+ $columnList = array();
-+ $commentList = $oCommentModel->getCommentListByMemberSrl($member_srl, $columnList, 0, false, $getContentsCount);
-+ if($commentList) {
-+ foreach($commentList as $v) {
-+ $oCommentController->deleteComment($v->comment_srl, true, $isMoveToTrash);
-+ }
-+ }
-+ } elseif($cnt_document > 0) {
-+ $columnList = array();
-+ $documentList = $oDocumentModel->getDocumentListByMemberSrl($member_srl, $columnList, 0, false, $getContentsCount);
-+ if($documentList) {
-+ foreach($documentList as $v) {
-+ if($isMoveToTrash) $oDocumentController->moveDocumentToTrash($v);
-+ else $oDocumentController->deleteDocument($v->document_srl);
-+ }
-+ }
-+ }
-+
-+ return true;
-+ }
- }
- /* End of file member.controller.php */
- /* Location: ./modules/member/member.controller.php */
-diff --git a/modules/member/member.view.php b/modules/member/member.view.php
-index 380cecf..31c49a7 100644
---- a/modules/member/member.view.php
-+++ b/modules/member/member.view.php
-@@ -611,6 +611,43 @@ class memberView extends member
-
- Context::addHtmlHeader($js_code);
- }
-+
-+ /**
-+ * Spammer manage popup
-+ *
-+ * @return void
-+ **/
-+ function dispMemberSpammer()
-+ {
-+ $member_srl = Context::get('member_srl');
-+ $module_srl = Context::get('module_srl');
-+
-+ // check grant
-+ $oModuleModel = &getModel('module');
-+ $columnList = array('module_srl', 'module');
-+ $args = new stdClass();
-+ $args->module_srl = $module_srl;
-+ $module_info = $oModuleModel->getModuleInfoByModuleSrl($args->module_srl, $columnList);
-+ $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info'));
-+
-+ if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted');
-+ if(!$grant->manager) return new Object(-1,'msg_not_permitted');
-+
-+ $oMemberModel = &getModel('member');
-+ $spammer_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl);
-+
-+ Context::loadLang('modules/document/lang/');
-+ Context::set('spammer_info',$spammer_info);
-+ Context::set('module_srl',$module_srl);
-+
-+ // Select Pop-up layout
-+ $this->setLayoutPath('./common/tpl');
-+ $this->setLayoutFile('popup_layout');
-+
-+ $this->setTemplatePath($this->module_path.'tpl');
-+ $this->setTemplateFile('spammer');
-+ }
-+
- }
- /* End of file member.view.php */
- /* Location: ./modules/member/member.view.php */
-diff --git a/modules/member/skins/default/js/member.js b/modules/member/skins/default/js/member.js
-index 9422cfd..41c8e72 100644
---- a/modules/member/skins/default/js/member.js
-+++ b/modules/member/skins/default/js/member.js
-@@ -160,3 +160,4 @@ function doDeleteSavedDocument(document_srl, confirm_message) {
- function insertSelectedModule(id, module_srl, mid, browser_title) {
- location.href = current_url.setQuery('selected_module_srl',module_srl);
- }
-+
-diff --git a/modules/member/tpl/spammer.html b/modules/member/tpl/spammer.html
-new file mode 100644
-index 0000000..d371f0f
---- /dev/null
-+++ b/modules/member/tpl/spammer.html
-@@ -0,0 +1,110 @@
-+
-+
-+
-+
-+
-+
-+