설치한 확장기능

From XFwiki
(Difference between revisions)
Jump to: navigation, search
m (# 인터위키 (SpecialInterwiki))
Line 27: Line 27:
 
<?php
 
<?php
 
/**
 
/**
* RandomSelection -- randomly displays one of the given options.
+
* RandomSelection -- randomly displays one of the given options.
* Usage: <choose><option>A</option><option>B</option></choose>
+
* Usage: <choose><option>A</option><option>B</option></choose>
* Optional parameter: <option weight="3"> == 3x weight given
+
* Optional parameter: <option weight="3"> == 3x weight given
*
+
*
* @file
+
* @file
* @ingroup Extensions
+
* @ingroup Extensions
* @version 2.1.4
+
* @version 2.1.4
* @date 30 September 2009
+
* @date 30 September 2009
* @author Ross McClure <http://www.mediawiki.org/wiki/User:Algorithm>
+
* @author Ross McClure <http://www.mediawiki.org/wiki/User:Algorithm>
* @link http://www.mediawiki.org/wiki/Extension:RandomSelection Documentation
+
* @link http://www.mediawiki.org/wiki/Extension:RandomSelection Documentation
*/
+
*/
+
 
 
if( !defined( 'MEDIAWIKI' ) ) {
 
if( !defined( 'MEDIAWIKI' ) ) {
die( "This is not a valid entry point to MediaWiki.\n" );
+
die( "This is not a valid entry point to MediaWiki.\n" );
 
}
 
}
+
 
 
// Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980
 
// Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980
 
if( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {
 
if( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {
$wgHooks['ParserFirstCallInit'][] = 'wfRandomSelection';
+
$wgHooks['ParserFirstCallInit'][] = 'wfRandomSelection';
 
} else {
 
} else {
$wgExtensionFunctions[] = 'wfRandomSelection';
+
$wgExtensionFunctions[] = 'wfRandomSelection';
 
}
 
}
+
 
 
$wgExtensionCredits['parserhook'][] = array(
 
$wgExtensionCredits['parserhook'][] = array(
'name' => 'RandomSelection',
+
'name' => 'RandomSelection',
'version' => '2.1.4',
+
'version' => '2.1.4',
'author' => 'Ross McClure',
+
'author' => 'Ross McClure',
'description' => 'Displays a random option from the given set.',
+
'description' => 'Displays a random option from the given set.',
'url' => 'http://www.mediawiki.org/wiki/Extension:RandomSelection',
+
'url' => 'http://www.mediawiki.org/wiki/Extension:RandomSelection',
 
);
 
);
+
 
 
function wfRandomSelection() {
 
function wfRandomSelection() {
global $wgParser;
+
global $wgParser;
$wgParser->setHook( 'choose', 'renderChosen' );
+
$wgParser->setHook( 'choose', 'renderChosen' );
return true;
+
return true;
 
}
 
}
+
 
 
function renderChosen( $input, $argv, &$parser ) {
 
function renderChosen( $input, $argv, &$parser ) {
# Prevent caching
+
# Prevent caching
$parser->disableCache();
+
$parser->disableCache();
+
 
# Parse the options and calculate total weight
+
# Parse the options and calculate total weight
$len = preg_match_all( "/<option(?:(?:\\s[^>]*?)?\\sweight=[\"']?([^\\s>]+))?"
+
$len = preg_match_all( "/<option(?:(?:\\s[^>]*?)?\\sweight=[\"']?([^\\s>]+))?"
. "(?:\\s[^>]*)?>([\\s\\S]*?)<\\/option>/", $input, $out );
+
. "(?:\\s[^>]*)?>([\\s\\S]*?)<\\/option>/", $input, $out );
$r = 0;
+
$r = 0;
for( $i = 0; $i < $len; $i++ ) {
+
for( $i = 0; $i < $len; $i++ ) {
if( strlen( $out[1][$i] ) == 0 )
+
if( strlen( $out[1][$i] ) == 0 )
$out[1][$i] = 1;
+
$out[1][$i] = 1;
else
+
else
$out[1][$i] = intval( $out[1][$i] );
+
$out[1][$i] = intval( $out[1][$i] );
$r += $out[1][$i];
+
$r += $out[1][$i];
}
+
}
+
 
# Choose an option at random
+
# Choose an option at random
if( $r <= 0 )
+
if( $r <= 0 )
return '';
+
return '';
$r = mt_rand( 1, $r );
+
$r = mt_rand( 1, $r );
for( $i = 0; $i < $len; $i++ ) {
+
for( $i = 0; $i < $len; $i++ ) {
$r -= $out[1][$i];
+
$r -= $out[1][$i];
if( $r <= 0 ) {
+
if( $r <= 0 ) {
$input = $out[2][$i];
+
$input = $out[2][$i];
break;
+
break;
}
+
}
}
+
}
+
 
# If running new parser, take the easy way out
+
# If running new parser, take the easy way out
if( defined( 'Parser::VERSION' ) && version_compare( Parser::VERSION, '1.6.1', '>' ) ) {
+
if( defined( 'Parser::VERSION' ) && version_compare( Parser::VERSION, '1.6.1', '>' ) ) {
return $parser->recursiveTagParse( $input );
+
return $parser->recursiveTagParse( $input );
}
+
}
+
 
# Otherwise, create new parser to handle rendering
+
# Otherwise, create new parser to handle rendering
$localParser = new Parser();
+
$localParser = new Parser();
+
 
# Initialize defaults, then copy info from parent parser
+
# Initialize defaults, then copy info from parent parser
$localParser->clearState();
+
$localParser->clearState();
$localParser->mTagHooks        = $parser->mTagHooks;
+
$localParser->mTagHooks        = $parser->mTagHooks;
$localParser->mTemplates        = $parser->mTemplates;
+
$localParser->mTemplates        = $parser->mTemplates;
$localParser->mTemplatePath    = $parser->mTemplatePath;
+
$localParser->mTemplatePath    = $parser->mTemplatePath;
$localParser->mFunctionHooks    = $parser->mFunctionHooks;
+
$localParser->mFunctionHooks    = $parser->mFunctionHooks;
$localParser->mFunctionSynonyms = $parser->mFunctionSynonyms;
+
$localParser->mFunctionSynonyms = $parser->mFunctionSynonyms;
+
 
# Render the chosen option
+
# Render the chosen option
$output = $localParser->parse( $input, $parser->mTitle,
+
$output = $localParser->parse( $input, $parser->mTitle,
$parser->mOptions, false, false );
+
$parser->mOptions, false, false );
return $output->getText();
+
return $output->getText();
 
}
 
}
 
</pre>
 
</pre>
Line 186: Line 186:
  
 
$wgExtensionFunctions[]="wfShowHideExtension";
 
$wgExtensionFunctions[]="wfShowHideExtension";
+
 
 
function wfShowHideExtension()
 
function wfShowHideExtension()
 
{
 
{
$GLOBALS['wgParser']->setHook("showhide","ShowHideExtension");
+
$GLOBALS['wgParser']->setHook("showhide","ShowHideExtension");
 
}
 
}
+
 
 
function ShowHideExtension($in)
 
function ShowHideExtension($in)
 
{
 
{
global $wgOut;
+
global $wgOut;
static $numrun=0;
+
static $numrun=0;
+
 
$out=$wgOut->parse($in);
+
$out=$wgOut->parse($in);
if(
+
if(
                strpos($out,"__HIDER__")!==FALSE &&
+
strpos($out,"__HIDER__")!==FALSE &&
                ((
+
((
                        ($s=strpos($out,htmlentities("<show>")))!==FALSE &&
+
($s=strpos($out,htmlentities("<show>")))!==FALSE &&
                        strpos($out,htmlentities("</show>"))>$s
+
strpos($out,htmlentities("</show>"))>$s
                ) || (
+
) || (
                        ($h=strpos($out,htmlentities("<hide>")))!==FALSE &&
+
($h=strpos($out,htmlentities("<hide>")))!==FALSE &&
                        strpos($out,htmlentities("</hide>"))>$h
+
strpos($out,htmlentities("</hide>"))>$h
                ))
+
))
        ) {
+
) {
                if($numrun==0) {
+
if($numrun==0) {
                        $wgOut->addHTML(
+
$wgOut->addHTML(
 
"<script type=\"text/javascript\"><!--
 
"<script type=\"text/javascript\"><!--
 
shWas=new Array();
 
shWas=new Array();
 
function showSHToggle(show,hide,num) {
 
function showSHToggle(show,hide,num) {
        if(document.getElementById) {
+
if(document.getElementById) {
                document.writeln('<span class=\'toctoggle\'>[<a href=\"javascript:toggleSH('+num+')\" class=\"internal\">' +
+
document.writeln('<span class=\'toctoggle\'>[<a href=\"javascript:toggleSH('+num+')\" class=\"internal\">' +
                '<span id=\"showlink'+num+'\" style=\"display:none;\">' + show + '</span>' +
+
'<span id=\"showlink'+num+'\" style=\"display:none;\">' + show + '</span>' +
                '<span id=\"hidelink'+num+'\">' + hide + '</span>' +
+
'<span id=\"hidelink'+num+'\">' + hide + '</span>' +
                '</a>]</span>');
+
'</a>]</span>');
        }
+
}
 
}
 
}
 
function toggleSH(num) {
 
function toggleSH(num) {
        var shmain = document.getElementById('showhide'+num);
+
var shmain = document.getElementById('showhide'+num);
        var sh = document.getElementById('shinside'+num);
+
var sh = document.getElementById('shinside'+num);
        var showlink=document.getElementById('showlink'+num);
+
var showlink=document.getElementById('showlink'+num);
        var hidelink=document.getElementById('hidelink'+num);
+
var hidelink=document.getElementById('hidelink'+num);
        if(sh.style.display == 'none') {
+
if(sh.style.display == 'none') {
                sh.style.display = shWas[num];
+
sh.style.display = shWas[num];
                hidelink.style.display='';
+
hidelink.style.display='';
                showlink.style.display='none';
+
showlink.style.display='none';
                shmain.className = '';
+
shmain.className = '';
        } else {
+
} else {
                shWas[num] = sh.style.display;
+
shWas[num] = sh.style.display;
                sh.style.display = 'none';
+
sh.style.display = 'none';
                hidelink.style.display='none';
+
hidelink.style.display='none';
                showlink.style.display='';
+
showlink.style.display='';
                shmain.className = 'tochidden';
+
shmain.className = 'tochidden';
        }
+
}
 
} // --></script>
 
} // --></script>
 
");
 
");
                }
+
}
                $numrun++;
+
$numrun++;
+
 
                if($s!==FALSE)
+
if($s!==FALSE)
                        $act="show";
+
$act="show";
                else
+
else
                        $act="hide";
+
$act="hide";
+
 
                $hideline = ' <script type="text/javascript">showSHToggle("' . addslashes( wfMsg('showtoc') ) . '","' . addslashes( wfMsg('hidetoc') ) . '",' . $numrun . ')</script>';
+
$hideline = ' <script type="text/javascript">showSHToggle("' . addslashes( wfMsg('showtoc') ) . '","' . addslashes( wfMsg('hidetoc') ) . '",' . $numrun . ')</script>';
+
 
                $out=str_replace("__HIDER__","$hideline",$out);
+
$out=str_replace("__HIDER__","$hideline",$out);
                $out=str_replace(
+
$out=str_replace(
                        array(htmlentities("<$act>"),                htmlentities("</$act>")),
+
array(htmlentities("<$act>"),                htmlentities("</$act>")),
                        array("<div id=\"shinside$numrun\">","</div>"),
+
array("<div id=\"shinside$numrun\">","</div>"),
                        $out
+
$out
                );
+
);
$out="<span id=\"showhide$numrun\">$out</span>";
+
$out="<span id=\"showhide$numrun\">$out</span>";
if($act=="hide")
+
if($act=="hide")
$out.="<script type=\"text/javascript\">toggleSH($numrun)</script>";
+
$out.="<script type=\"text/javascript\">toggleSH($numrun)</script>";
}
+
}
return $out;
+
return $out;
 
}
 
}
  
Line 277: Line 277:
  
 
<pre>
 
<pre>
  3. Add this to your LocalSettings.php, somewhere near the bottom:
+
3. Add this to your LocalSettings.php, somewhere near the bottom:
  
      require_once("$IP/extensions/Interwiki/SpecialInterwiki.php");
+
require_once("$IP/extensions/Interwiki/SpecialInterwiki.php");
  
  4. Under that line, you have to add who can use Special:Interwiki.
+
4. Under that line, you have to add who can use Special:Interwiki.
  
        If you want that sysops can use it:
+
If you want that sysops can use it:
  
 
$wgGroupPermissions['*']['interwiki'] = false;
 
$wgGroupPermissions['*']['interwiki'] = false;
 
$wgGroupPermissions['sysop']['interwiki'] = true;
 
$wgGroupPermissions['sysop']['interwiki'] = true;
  
        If you want an additional user group: (those with the 'userrights' permission can assign this group - bureaucrats by default)
+
If you want an additional user group: (those with the 'userrights' permission can assign this group - bureaucrats by default)
  
 
$wgGroupPermissions['*']['interwiki'] = false;
 
$wgGroupPermissions['*']['interwiki'] = false;
Line 306: Line 306:
  
 
[[kowiki:인터위키]] - 한국 위키피디아의 '인터위키' 항목에 걸린다
 
[[kowiki:인터위키]] - 한국 위키피디아의 '인터위키' 항목에 걸린다
 +
 +
=== # 태그구름 ===
 +
 +
http://www.mediawiki.org/wiki/Extension:SelectCategoryTagCloud
 +
 +
<pre>
 +
require_once( 'extensions/SelectCategoryTagCloud/SelectCategoryTagCloud.php' );
 +
</pre>
 +
 +
  
 
== 확장기능 설치방법 ==
 
== 확장기능 설치방법 ==
Line 325: Line 335:
  
 
</pre>
 
</pre>
 
 
 
 
 
 
 
 
 
 
  
 
[[Category:Help]]
 
[[Category:Help]]

Revision as of 02:02, 10 November 2009

Contents

엑파위키에 설치한 확장기능 모음

# 오늘의 명언 (문장이 무작위로 나옴)

http://www.mediawiki.org/wiki/Extension:RandomSelection


<choose>
<option>"차는 미안해요." - 멀더 ([[XFeature02|극장판 2]])</option>
<option>핸드폰은 필요할 때면 안 터진다.</option>
<option>세기말이란 또다른 쓰레기같은 천년이 시작하는 것. - 호세 청([[mlm209]])</option>
<option>배우는 한 역을 하고 나면 다른 역을 위해 자신을 비워야 한다. - 서혜정</option>
<option>도겟: 키는 180 정도... (다들: 정말?)</option>
<option>우리는 우리가 아니다. ([[1X07]])</option>
<option>우선은 가장 많이 찍을 장소를 결정합니다. - 우린 이걸 이물(船首, 뱃머리)과 고물(船尾, 뱃꼬리)라고 부르는데 - 주 촬영장소를 발견하고 나서 꼬리 부분을 마저 결정하는 거죠. - 일트 존스 (장소섭외자)</option>
<option>"멀더는 나의 등대에요." - 스컬리 ([[7X04]])</option>
</choose>

Code

The code in this page will only work in MediaWiki 1.7 and above. (Alternate version for 1.5 and above)

<?php
/**
* RandomSelection -- randomly displays one of the given options.
* Usage: <choose><option>A</option><option>B</option></choose>
* Optional parameter: <option weight="3"> == 3x weight given
*
* @file
* @ingroup Extensions
* @version 2.1.4
* @date 30 September 2009
* @author Ross McClure <http://www.mediawiki.org/wiki/User:Algorithm>
* @link http://www.mediawiki.org/wiki/Extension:RandomSelection Documentation
*/

if( !defined( 'MEDIAWIKI' ) ) {
die( "This is not a valid entry point to MediaWiki.\n" );
}

// Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980
if( defined( 'MW_SUPPORTS_PARSERFIRSTCALLINIT' ) ) {
$wgHooks['ParserFirstCallInit'][] = 'wfRandomSelection';
} else {
$wgExtensionFunctions[] = 'wfRandomSelection';
}

$wgExtensionCredits['parserhook'][] = array(
'name' => 'RandomSelection',
'version' => '2.1.4',
'author' => 'Ross McClure',
'description' => 'Displays a random option from the given set.',
'url' => 'http://www.mediawiki.org/wiki/Extension:RandomSelection',
);

function wfRandomSelection() {
global $wgParser;
$wgParser->setHook( 'choose', 'renderChosen' );
return true;
}

function renderChosen( $input, $argv, &$parser ) {
# Prevent caching
$parser->disableCache();

# Parse the options and calculate total weight
$len = preg_match_all( "/<option(?:(?:\\s[^>]*?)?\\sweight=[\"']?([^\\s>]+))?"
. "(?:\\s[^>]*)?>([\\s\\S]*?)<\\/option>/", $input, $out );
$r = 0;
for( $i = 0; $i < $len; $i++ ) {
if( strlen( $out[1][$i] ) == 0 )
$out[1][$i] = 1;
else
$out[1][$i] = intval( $out[1][$i] );
$r += $out[1][$i];
}

# Choose an option at random
if( $r <= 0 )
return '';
$r = mt_rand( 1, $r );
for( $i = 0; $i < $len; $i++ ) {
$r -= $out[1][$i];
if( $r <= 0 ) {
$input = $out[2][$i];
break;
}
}

# If running new parser, take the easy way out
if( defined( 'Parser::VERSION' ) && version_compare( Parser::VERSION, '1.6.1', '>' ) ) {
return $parser->recursiveTagParse( $input );
}

# Otherwise, create new parser to handle rendering
$localParser = new Parser();

# Initialize defaults, then copy info from parent parser
$localParser->clearState();
$localParser->mTagHooks         = $parser->mTagHooks;
$localParser->mTemplates        = $parser->mTemplates;
$localParser->mTemplatePath     = $parser->mTemplatePath;
$localParser->mFunctionHooks    = $parser->mFunctionHooks;
$localParser->mFunctionSynonyms = $parser->mFunctionSynonyms;

# Render the chosen option
$output = $localParser->parse( $input, $parser->mTitle,
$parser->mOptions, false, false );
return $output->getText();
}



# ShowHide (글 접었다 펴기)

http://www.mediawiki.org/wiki/Extension:ShowHide

Syntax

Syntax is a bit more advanced than what is usual for an extension:


<showhide>
Some text (usually title) which will not be hidden __HIDER__
<hide>Text which will be hidden</hide>
</showhide>

__HIDER__ is the place where link will be put which will show or hide the text between <hide></hide> tags. In the above example, it will be the string "Text which will be hidden".

If <show></show> tags are used, the text will be shown by default, and could be hidden by clicking on hider.



Source

Helpful hint: the copyright symbol and the script tags are messing up the display. Edit this page to copy the code! --Bytesmiths 03:14, 20 December 2005 (UTC)

v 0.1.1

PHP5 version with corrections according to Smerf's comments.

Note the following version does not work correctly for me on MediaWiki 1.5. The following will work correctly on the first load, but after loading from cache, the one-time Javascript code inserted by $wgOut->addHtml does not get added leading to problems. v.0.1 above works fine for me.


<?php
# MediaWiki ShowHide extension v0.1.1
#
# Based on example code from
# http://meta.wikimedia.org/wiki/Write_your_own_MediaWiki_extension
# Contains code from MediaWiki's Skin.php and wikibits.js
#
# All other code is copyright © 2005 Nikola Smolenski <smolensk@eunet.yu>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# To install, copy the extension to your extensions directory and add line
# include("extensions/ShowHide.php");
# to the bottom of your LocalSettings.php
#
# Example syntax:
#
# <showhide>
# Some text (usually title) which will not be hidden __HIDER__
# <hide>Text which will be hidden</hide>
# </showhide>
#
# If <show></show> tags are used instead of <hide></hide>, the text will be
# shown by default
#
# For more information see its page at
# http://www.mediawiki.org/wiki/Extension:ShowHide

$wgExtensionFunctions[]="wfShowHideExtension";

function wfShowHideExtension()
{
$GLOBALS['wgParser']->setHook("showhide","ShowHideExtension");
}

function ShowHideExtension($in)
{
global $wgOut;
static $numrun=0;

$out=$wgOut->parse($in);
if(
strpos($out,"__HIDER__")!==FALSE &&
((
($s=strpos($out,htmlentities("<show>")))!==FALSE &&
strpos($out,htmlentities("</show>"))>$s
) || (
($h=strpos($out,htmlentities("<hide>")))!==FALSE &&
strpos($out,htmlentities("</hide>"))>$h
))
) {
if($numrun==0) {
$wgOut->addHTML(
"<script type=\"text/javascript\"><!--
shWas=new Array();
function showSHToggle(show,hide,num) {
if(document.getElementById) {
document.writeln('<span class=\'toctoggle\'>[<a href=\"javascript:toggleSH('+num+')\" class=\"internal\">' +
'<span id=\"showlink'+num+'\" style=\"display:none;\">' + show + '</span>' +
'<span id=\"hidelink'+num+'\">' + hide + '</span>' +
'</a>]</span>');
}
}
function toggleSH(num) {
var shmain = document.getElementById('showhide'+num);
var sh = document.getElementById('shinside'+num);
var showlink=document.getElementById('showlink'+num);
var hidelink=document.getElementById('hidelink'+num);
if(sh.style.display == 'none') {
sh.style.display = shWas[num];
hidelink.style.display='';
showlink.style.display='none';
shmain.className = '';
} else {
shWas[num] = sh.style.display;
sh.style.display = 'none';
hidelink.style.display='none';
showlink.style.display='';
shmain.className = 'tochidden';
}
} // --></script>
");
}
$numrun++;

if($s!==FALSE)
$act="show";
else
$act="hide";

$hideline = ' <script type="text/javascript">showSHToggle("' . addslashes( wfMsg('showtoc') ) . '","' . addslashes( wfMsg('hidetoc') ) . '",' . $numrun . ')</script>';

$out=str_replace("__HIDER__","$hideline",$out);
$out=str_replace(
array(htmlentities("<$act>"),                htmlentities("</$act>")),
array("<div id=\"shinside$numrun\">","</div>"),
$out
);
$out="<span id=\"showhide$numrun\">$out</span>";
if($act=="hide")
$out.="<script type=\"text/javascript\">toggleSH($numrun)</script>";
}
return $out;
}



# 주석달기 (Cite)

http://www.mediawiki.org/wiki/Extension:Cite


# 인터위키 (SpecialInterwiki)

http://www.mediawiki.org/wiki/Extension:SpecialInterwiki

3. Add this to your LocalSettings.php, somewhere near the bottom:

require_once("$IP/extensions/Interwiki/SpecialInterwiki.php");

4. Under that line, you have to add who can use Special:Interwiki.

If you want that sysops can use it:

$wgGroupPermissions['*']['interwiki'] = false;
$wgGroupPermissions['sysop']['interwiki'] = true;

If you want an additional user group: (those with the 'userrights' permission can assign this group - bureaucrats by default)

$wgGroupPermissions['*']['interwiki'] = false;
$wgGroupPermissions['interwiki']['interwiki'] = true;

인터위키 페이지로 가서 프리픽스를 등록하여 쓴다


여기서 등록한 한국 위키피디아의 프리픽스는

[[kowiki:인터위키]]


kowiki:인터위키 - 한국 위키피디아의 '인터위키' 항목에 걸린다

# 태그구름

http://www.mediawiki.org/wiki/Extension:SelectCategoryTagCloud

require_once( 'extensions/SelectCategoryTagCloud/SelectCategoryTagCloud.php' );


확장기능 설치방법

  1. 확장기능 소스(코드)를 php로 만든다
    1. php 코드를 utf-8로 만들때 BOM이 들어가지 않도록 한다. AcroEdit 상위버전에 없애는 옵션 있음
  1. 만든 php를 같은 이름의 폴더로 만들어 확장폴더에 넣는다
    1. extentions/만든확장기능/만든확장기능.php
  1. LocalSettings.php 의 맨 아랫줄에 추가한다
    1. php 코드를 utf-8로 만들때 BOM이 들어가지 않도록 한다. AcroEdit 상위버전에 없애는 옵션 있음

#오늘의 명언
require_once( "$IP/extensions/RandomSelection/RandomSelection.php" );

Personal tools
Namespaces

Variants
Actions
원전
팬활동
1013 Production
기타
그리고
Toolbox