<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=Creative_Commons_License_Machine%2FKiosk_Script</id>
	<title>Creative Commons License Machine/Kiosk Script - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/index.php?action=history&amp;feed=atom&amp;title=Creative_Commons_License_Machine%2FKiosk_Script"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;action=history"/>
	<updated>2026-06-20T16:34:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=362592&amp;oldid=prev</id>
		<title>Sheridan Otoole: Use LSL tags</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=362592&amp;oldid=prev"/>
		<updated>2009-05-17T23:47:58Z</updated>

		<summary type="html">&lt;p&gt;Use LSL tags&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:47, 17 May 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the [[Kiosk Program]].&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Creative Commons License Machine/&lt;/ins&gt;Kiosk Program]].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pre&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;lsl&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;key gBlankTexture = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; // well known&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;key gBlankTexture = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; // well known&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l360&quot;&gt;Line 360:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 360:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     on_rez(integer n) { llResetScript(); }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     on_rez(integer n) { llResetScript(); }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pre&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;lsl&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Sheridan Otoole</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32399&amp;oldid=prev</id>
		<title>Zarf Vantongerloo: New page: The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the Kiosk Program.  &lt;pre&gt; k...</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32399&amp;oldid=prev"/>
		<updated>2007-09-23T05:33:32Z</updated>

		<summary type="html">&lt;p&gt;New page: The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the &lt;a href=&quot;/w/index.php?title=Kiosk_Program&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kiosk Program (page does not exist)&quot;&gt;Kiosk Program&lt;/a&gt;.  &amp;lt;pre&amp;gt; k...&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:33, 22 September 2007&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Creative Commons License Machine/&lt;/del&gt;Kiosk Program]].&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the [[Kiosk Program]].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32400&amp;oldid=prev</id>
		<title>Zarf Vantongerloo at 05:32, 23 September 2007</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Creative_Commons_License_Machine/Kiosk_Script&amp;diff=32400&amp;oldid=prev"/>
		<updated>2007-09-23T05:32:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The kiosk is actually just a general purpose state machine engine.  The particular state machine that is used for the Creative Commons LIcense Machine is in the [[Creative Commons License Machine/Kiosk Program]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
key gBlankTexture = &amp;quot;5748decc-f629-461c-9a36-a35a221fe21f&amp;quot;; // well known&lt;br /&gt;
&lt;br /&gt;
float gTimeOut = 60.0;&lt;br /&gt;
&lt;br /&gt;
integer gUserListener = 0;&lt;br /&gt;
&lt;br /&gt;
integer gLicenseChannel = 0;&lt;br /&gt;
integer gLicenseListener = 0;&lt;br /&gt;
&lt;br /&gt;
string gNode;&lt;br /&gt;
list gPath;&lt;br /&gt;
    // path of nodes, including current node at the end&lt;br /&gt;
&lt;br /&gt;
key gUser = NULL_KEY;&lt;br /&gt;
    // user we are interacting with&lt;br /&gt;
    &lt;br /&gt;
list gParams;&lt;br /&gt;
    // user parameters, stride two: [ &amp;lt;key&amp;gt;, &amp;lt;value&amp;gt; ... ]&lt;br /&gt;
&lt;br /&gt;
string gAltTrigger;&lt;br /&gt;
key gArgID;&lt;br /&gt;
string gArgMessage;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
clearUse()&lt;br /&gt;
{&lt;br /&gt;
    gNode = &amp;quot;&amp;quot;;&lt;br /&gt;
    gPath = [ ];&lt;br /&gt;
    gUser = NULL_KEY;&lt;br /&gt;
    gParams = [ ];&lt;br /&gt;
    &lt;br /&gt;
    clearNode();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
clearNode()&lt;br /&gt;
{&lt;br /&gt;
    gTimeOut = 30.0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdGo(string node)&lt;br /&gt;
{&lt;br /&gt;
    gNode = node;&lt;br /&gt;
    gPath += [ node ];&lt;br /&gt;
    llMessageLinked(LINK_THIS, 200, node, NULL_KEY);&lt;br /&gt;
    &lt;br /&gt;
    clearNode();&lt;br /&gt;
    runAnyAction(&amp;quot;init&amp;quot;, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    llSetTimerEvent(gTimeOut);&lt;br /&gt;
    if (gUserListener) { llListenRemove(gUserListener); }&lt;br /&gt;
    gUserListener = llListen(0, &amp;quot;&amp;quot;, gUser, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdReset()&lt;br /&gt;
{&lt;br /&gt;
    clearUse();&lt;br /&gt;
    cmdGo(&amp;quot;start&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdBack()&lt;br /&gt;
{&lt;br /&gt;
    integer n = llGetListLength(gPath);&lt;br /&gt;
    if (n &amp;gt;= 2) {&lt;br /&gt;
        string node = llList2String(gPath, -2);&lt;br /&gt;
        gPath = llDeleteSubList(gPath, -2, -1);&lt;br /&gt;
        cmdGo(node);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cmdUser(key id)&lt;br /&gt;
{&lt;br /&gt;
    gUser = id;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdAnyone()&lt;br /&gt;
{&lt;br /&gt;
    gUser = NULL_KEY;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdTimeOut(float t)&lt;br /&gt;
{&lt;br /&gt;
    gTimeOut = t;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdImage(string inv)&lt;br /&gt;
{&lt;br /&gt;
    llSetTexture(inv, 0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSay(string text)&lt;br /&gt;
{&lt;br /&gt;
    llSay(0, text);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdMovie() { }&lt;br /&gt;
&lt;br /&gt;
cmdGive(string inv)&lt;br /&gt;
{&lt;br /&gt;
    llGiveInventory(gUser, inv);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdWebsite()&lt;br /&gt;
{&lt;br /&gt;
    llLoadURL(gUser, &amp;quot;View the Creative Commons web site.&amp;quot;,&lt;br /&gt;
        &amp;quot;http://creativecommons.org/&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cmdSet(string param, string value)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llListFindList(gParams, [ param ]);&lt;br /&gt;
    if (i &amp;lt; 0) {&lt;br /&gt;
        gParams += [ param, value ];&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        gParams = llListReplaceList(gParams, [ value ], i + 1, i + 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSetUser(string param)&lt;br /&gt;
{&lt;br /&gt;
    cmdSet(param, llKey2Name(gUser));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdSetNow(string param)&lt;br /&gt;
{&lt;br /&gt;
    cmdSet(param, llGetSubString(llGetDate(), 0, 3));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string&lt;br /&gt;
getParam(string param)&lt;br /&gt;
{&lt;br /&gt;
    integer i = llListFindList(gParams, [ param ]);&lt;br /&gt;
    if (i &amp;lt; 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    return llList2String(gParams, i + 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdReport(string param, string prompt)&lt;br /&gt;
{&lt;br /&gt;
    string value = getParam(param);&lt;br /&gt;
    if (value == &amp;quot;&amp;quot;) return;&lt;br /&gt;
    &lt;br /&gt;
    llSay(0, prompt + value);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseImage()&lt;br /&gt;
{&lt;br /&gt;
    string commercialUse = getParam(&amp;quot;commercial-use&amp;quot;);&lt;br /&gt;
    string modifications = getParam(&amp;quot;modifications&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    string license = &amp;quot;by&amp;quot;;&lt;br /&gt;
    if (commercialUse == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nc&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;no&amp;quot;)      { license += &amp;quot;-nd&amp;quot;; }&lt;br /&gt;
    if (modifications == &amp;quot;share&amp;quot;)   { license += &amp;quot;-sa&amp;quot;; }&lt;br /&gt;
    &lt;br /&gt;
    string imageName = &amp;quot;lic-&amp;quot; + license;&lt;br /&gt;
    cmdImage(imageName);&lt;br /&gt;
    &lt;br /&gt;
    cmdSet(&amp;quot;image-key&amp;quot;, llGetInventoryKey(imageName));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseRez()&lt;br /&gt;
{&lt;br /&gt;
    gLicenseChannel = 10000000 + (integer)llFrand(10000000.0);&lt;br /&gt;
    gLicenseListener = llListen(gLicenseChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    rotation r = llEuler2Rot(&amp;lt;0, -45, 0&amp;gt; * DEG_TO_RAD) * llGetRot();&lt;br /&gt;
    &lt;br /&gt;
    llRezObject(&amp;quot;badge&amp;quot;,&lt;br /&gt;
        llGetPos() + &amp;lt;-0.358, 0.0, 0.523&amp;gt; * r,&lt;br /&gt;
        ZERO_VECTOR,&lt;br /&gt;
        r,&lt;br /&gt;
        gLicenseChannel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
finishLicense()&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(gLicenseListener);&lt;br /&gt;
    &lt;br /&gt;
    integer n = llGetListLength(gParams);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; n; i += 2) {&lt;br /&gt;
        string param = llList2String(gParams, i);&lt;br /&gt;
        string value = llList2String(gParams, i + 1);&lt;br /&gt;
        llSay(gLicenseChannel, param + &amp;quot;:&amp;quot; + value);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    rotation r = llEuler2Rot(&amp;lt;0, -45, 0&amp;gt; * DEG_TO_RAD) * llGetRot();&lt;br /&gt;
    vector p = llGetPos() + &amp;lt;-0.358, 0.0, 0.761&amp;gt; * r;&lt;br /&gt;
    llSay(gLicenseChannel, &amp;quot;done &amp;quot; + (string)p);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cmdLicenseDie()&lt;br /&gt;
{&lt;br /&gt;
    if (gLicenseChannel != 0) {&lt;br /&gt;
        llSay(gLicenseChannel, &amp;quot;die&amp;quot;);&lt;br /&gt;
        gLicenseChannel = 0;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
executeStatement(string statement)&lt;br /&gt;
{&lt;br /&gt;
    integer sep = llSubStringIndex(statement, &amp;quot;|&amp;quot;);&lt;br /&gt;
    string tail = &amp;quot;&amp;quot;;&lt;br /&gt;
    if (sep &amp;gt;= 1) {&lt;br /&gt;
        tail = llGetSubString(statement, sep + 1, -1);&lt;br /&gt;
        statement = llGetSubString(statement, 0, sep - 1);&lt;br /&gt;
    }&lt;br /&gt;
    list parts = llParseString2List(statement, [ &amp;quot; &amp;quot; ], [ ]);&lt;br /&gt;
    if (tail != &amp;quot;&amp;quot;) {&lt;br /&gt;
        parts += [ tail ];&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    string cmd = llList2String(parts, 0);&lt;br /&gt;
    string arg1 = llList2String(parts, 1);&lt;br /&gt;
    string arg2 = llList2String(parts, 2);&lt;br /&gt;
    if (arg2 == &amp;quot;*&amp;quot;) { arg2 = gArgMessage; }&lt;br /&gt;
        &lt;br /&gt;
         if (cmd == &amp;quot;back&amp;quot;)     { cmdBack(); }&lt;br /&gt;
    else if (cmd == &amp;quot;go&amp;quot;)       { cmdGo(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;reset&amp;quot;)    { cmdReset(); }&lt;br /&gt;
    else if (cmd == &amp;quot;user&amp;quot;)     { cmdUser(gArgID); }&lt;br /&gt;
    else if (cmd == &amp;quot;anyone&amp;quot;)   { cmdAnyone(); }&lt;br /&gt;
    else if (cmd == &amp;quot;timeout&amp;quot;)  { cmdTimeOut((float)arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;image&amp;quot;)    { cmdImage(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;say&amp;quot;)      { cmdSay(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;movie&amp;quot;)    { cmdMovie(); }&lt;br /&gt;
    else if (cmd == &amp;quot;give&amp;quot;)     { cmdGive(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;website&amp;quot;)  { cmdWebsite(); }&lt;br /&gt;
    else if (cmd == &amp;quot;set&amp;quot;)      { cmdSet(arg1, arg2); }&lt;br /&gt;
    else if (cmd == &amp;quot;setUser&amp;quot;)  { cmdSetUser(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;setNow&amp;quot;)   { cmdSetNow(arg1); }&lt;br /&gt;
    else if (cmd == &amp;quot;report&amp;quot;)   { cmdReport(arg1, arg2); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseImage&amp;quot;) { cmdLicenseImage(); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseRez&amp;quot;)   { cmdLicenseRez(); }&lt;br /&gt;
    else if (cmd == &amp;quot;licenseDie&amp;quot;)   { cmdLicenseDie(); }&lt;br /&gt;
    else {&lt;br /&gt;
        llOwnerSay(&amp;quot;Unknown command: &amp;quot; + cmd);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
executeBlock(string block)&lt;br /&gt;
{&lt;br /&gt;
    list statements = llParseString2List(block,&lt;br /&gt;
        [ &amp;quot; ; &amp;quot;, &amp;quot; ;&amp;quot;, &amp;quot;; &amp;quot;, &amp;quot;;&amp;quot; ], [ ]);&lt;br /&gt;
    integer n = llGetListLength(statements);&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
        executeStatement(llList2String(statements, i));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
runAnyAction(string trigger, string altTrigger, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
    gAltTrigger = altTrigger;&lt;br /&gt;
    gArgID = id;&lt;br /&gt;
    gArgMessage = message;&lt;br /&gt;
    &lt;br /&gt;
    llMessageLinked(LINK_THIS, 300, trigger, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSetTexture(gBlankTexture, 0);&lt;br /&gt;
        llOwnerSay(&amp;quot;Touch to start up.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        if (llDetectedKey(0) == llGetOwner()) {&lt;br /&gt;
            state readProgram;&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llSay(0, &amp;quot;This kiosk is under construction.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
state readProgram&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSetTexture(gBlankTexture, 0);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 100, &amp;quot;&amp;quot;, NULL_KEY);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llOwnerSay(&amp;quot;main memory: &amp;quot; + (string)llGetFreeMemory());&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        if (num == 101) {&lt;br /&gt;
            state run;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer n) { }&lt;br /&gt;
    on_rez(integer n) { llResetScript(); }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state run&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit() {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
    }&lt;br /&gt;
        &lt;br /&gt;
    touch_start(integer n) {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        if (gUser != NULL_KEY  &amp;amp;&amp;amp;  gUser != id) { return; }&lt;br /&gt;
        runAnyAction(&amp;quot;touch&amp;quot;, &amp;quot;&amp;quot;, id, &amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gTimeOut);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer ch, string who, key id, string message) {&lt;br /&gt;
        if (ch != 0  &amp;amp;&amp;amp;  ch == gLicenseChannel) {&lt;br /&gt;
            finishLicense();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        string trigger = &amp;quot;\&amp;quot;&amp;quot; + llToLower(message) + &amp;quot;\&amp;quot;&amp;quot;;&lt;br /&gt;
        runAnyAction(trigger, &amp;quot;listen&amp;quot;, id, message);&lt;br /&gt;
        llSetTimerEvent(gTimeOut);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer what) {&lt;br /&gt;
        if (what &amp;amp; CHANGED_INVENTORY) {&lt;br /&gt;
            state readProgram;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender, integer num, string str, key id) {&lt;br /&gt;
        if (num == 301) {&lt;br /&gt;
            executeBlock(str);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 399) {&lt;br /&gt;
            if (gAltTrigger != &amp;quot;&amp;quot;) {&lt;br /&gt;
                llMessageLinked(LINK_THIS, 300, gAltTrigger, NULL_KEY);&lt;br /&gt;
                gAltTrigger = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer() {&lt;br /&gt;
        cmdReset();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n) { llResetScript(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zarf Vantongerloo</name></author>
	</entry>
</feed>