aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2018-12-22 13:45:32 +0800
committerchai <chaifix@163.com>2018-12-22 13:45:32 +0800
commitdf70a616f58aa51ff6375a824fc18cbbc369e43b (patch)
treeb519fdfb2ae07de3d8dd2d08afdb7efe65457d7b /src
parent8422546ca0524e9d1f96b858d0f914fe9e6e9bff (diff)
+statemachine
Diffstat (limited to 'src')
-rw-r--r--src/libjin-lua/je_lua_embed.h14
-rw-r--r--src/libjin-lua/scripts/ai/state_machine.lua182
-rw-r--r--src/libjin-lua/scripts/ai/state_machine.lua.h260
3 files changed, 445 insertions, 11 deletions
diff --git a/src/libjin-lua/je_lua_embed.h b/src/libjin-lua/je_lua_embed.h
index a14af5e..ba3945f 100644
--- a/src/libjin-lua/je_lua_embed.h
+++ b/src/libjin-lua/je_lua_embed.h
@@ -16,6 +16,7 @@ namespace JinEngine
};
// Embed scripts.
+ #include "scripts/ai/state_machine.lua.h"
#include "scripts/graphics/graphics.lua.h"
#include "scripts/keyboard/keyboard.lua.h"
#include "scripts/mouse/mouse.lua.h"
@@ -24,11 +25,14 @@ namespace JinEngine
// In order.
static const jin_Embed modules[] = {
- { "keyboard.lua", keyboard_lua },
- { "mouse.lua", mouse_lua },
- { "graphics.lua", graphics_lua },
- { "path.lua", path_lua },
- { 0, 0 }
+ // ai
+ { "state_machine.lua", state_machine_lua },
+ // keyboard
+ { "keyboard.lua", keyboard_lua },
+ { "mouse.lua", mouse_lua },
+ { "graphics.lua", graphics_lua },
+ { "path.lua", path_lua },
+ { 0, 0 }
};
static const jin_Embed bootscript = { "app.lua", app_lua };
diff --git a/src/libjin-lua/scripts/ai/state_machine.lua b/src/libjin-lua/scripts/ai/state_machine.lua
index b4ec768..296296f 100644
--- a/src/libjin-lua/scripts/ai/state_machine.lua
+++ b/src/libjin-lua/scripts/ai/state_machine.lua
@@ -1,7 +1,185 @@
jin.ai = jin.ai or {}
-local statemachine = {}
+--[[
-jin.ai.newStateMachine = function()
+https://github.com/kyleconroy/lua-state-machine
+Copyright (c) 2012 Kyle Conroy
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+]]
+local machine = {}
+machine.__index = machine
+
+local NONE = "none"
+local ASYNC = "async"
+
+local function call_handler(handler, params)
+ if handler then
+ return handler(unpack(params))
+ end
+end
+
+local function create_transition(name)
+ local can, to, from, params
+
+ local function transition(self, ...)
+ if self.asyncState == NONE then
+ can, to = self:can(name)
+ from = self.current
+ params = { self, name, from, to, ...}
+
+ if not can then return false end
+ self.currentTransitioningEvent = name
+
+ local beforeReturn = call_handler(self["onbefore" .. name], params)
+ local leaveReturn = call_handler(self["onleave" .. from], params)
+
+ if beforeReturn == false or leaveReturn == false then
+ return false
+ end
+
+ self.asyncState = name .. "WaitingOnLeave"
+
+ if leaveReturn ~= ASYNC then
+ transition(self, ...)
+ end
+
+ return true
+ elseif self.asyncState == name .. "WaitingOnLeave" then
+ self.current = to
+
+ local enterReturn = call_handler(self["onenter" .. to] or self["on" .. to], params)
+
+ self.asyncState = name .. "WaitingOnEnter"
+
+ if enterReturn ~= ASYNC then
+ transition(self, ...)
+ end
+
+ return true
+ elseif self.asyncState == name .. "WaitingOnEnter" then
+ call_handler(self["onafter" .. name] or self["on" .. name], params)
+ call_handler(self["onstatechange"], params)
+ self.asyncState = NONE
+ self.currentTransitioningEvent = nil
+ return true
+ else
+ if string.find(self.asyncState, "WaitingOnLeave") or string.find(self.asyncState, "WaitingOnEnter") then
+ self.asyncState = NONE
+ transition(self, ...)
+ return true
+ end
+ end
+
+ self.currentTransitioningEvent = nil
+ return false
+ end
+
+ return transition
+end
+
+local function add_to_map(map, event)
+ if type(event.from) == 'string' then
+ map[event.from] = event.to
+ else
+ for _, from in ipairs(event.from) do
+ map[from] = event.to
+ end
+ end
end
+
+function machine.create(options)
+ assert(options.events)
+
+ local fsm = {}
+ setmetatable(fsm, machine)
+
+ fsm.options = options
+ fsm.current = options.initial or 'none'
+ fsm.asyncState = NONE
+ fsm.events = {}
+
+ for _, event in ipairs(options.events or {}) do
+ local name = event.name
+ fsm[name] = fsm[name] or create_transition(name)
+ fsm.events[name] = fsm.events[name] or { map = {} }
+ add_to_map(fsm.events[name].map, event)
+ end
+
+ for name, callback in pairs(options.callbacks or {}) do
+ fsm[name] = callback
+ end
+
+ return fsm
+end
+
+function machine:is(state)
+ return self.current == state
+end
+
+function machine:can(e)
+ local event = self.events[e]
+ local to = event and event.map[self.current] or event.map['*']
+ return to ~= nil, to
+end
+
+function machine:cannot(e)
+ return not self:can(e)
+end
+
+function machine:todot(filename)
+ local dotfile = io.open(filename,'w')
+ dotfile:write('digraph {\n')
+ local transition = function(event,from,to)
+ dotfile:write(string.format('%s -> %s [label=%s];\n',from,to,event))
+ end
+ for _, event in pairs(self.options.events) do
+ if type(event.from) == 'table' then
+ for _, from in ipairs(event.from) do
+ transition(event.name,from,event.to)
+ end
+ else
+ transition(event.name,event.from,event.to)
+ end
+ end
+ dotfile:write('}\n')
+ dotfile:close()
+end
+
+function machine:transition(event)
+ if self.currentTransitioningEvent == event then
+ return self[self.currentTransitioningEvent](self)
+ end
+end
+
+function machine:cancelTransition(event)
+ if self.currentTransitioningEvent == event then
+ self.asyncState = NONE
+ self.currentTransitioningEvent = nil
+ end
+end
+
+machine.NONE = NONE
+machine.ASYNC = ASYNC
+
+-- Import to Jin.
+
+jin.ai.newStateMachine = machine.create
diff --git a/src/libjin-lua/scripts/ai/state_machine.lua.h b/src/libjin-lua/scripts/ai/state_machine.lua.h
index 5c78cd6..99eb6a6 100644
--- a/src/libjin-lua/scripts/ai/state_machine.lua.h
+++ b/src/libjin-lua/scripts/ai/state_machine.lua.h
@@ -1,9 +1,261 @@
/*Auto generated, don't modify by hand.*/
static char state_machine_lua[] = {
106,105,110,46,97,105,32,61,32,106,105,110,46,97,105,32,111,114,32,123,
-125,32,13,10,13,10,108,111,99,97,108,32,115,116,97,116,101,109,97,99,
-104,105,110,101,32,61,32,123,125,13,10,13,10,106,105,110,46,97,105,46,
-110,101,119,83,116,97,116,101,77,97,99,104,105,110,101,32,61,32,102,117,
-110,99,116,105,111,110,40,41,32,13,10,13,10,101,110,100,13,10
+125,32,13,10,13,10,45,45,91,91,13,10,13,10,104,116,116,112,115,58,
+47,47,103,105,116,104,117,98,46,99,111,109,47,107,121,108,101,99,111,110,
+114,111,121,47,108,117,97,45,115,116,97,116,101,45,109,97,99,104,105,110,
+101,13,10,13,10,67,111,112,121,114,105,103,104,116,32,40,99,41,32,50,
+48,49,50,32,75,121,108,101,32,67,111,110,114,111,121,13,10,13,10,80,
+101,114,109,105,115,115,105,111,110,32,105,115,32,104,101,114,101,98,121,32,
+103,114,97,110,116,101,100,44,32,102,114,101,101,32,111,102,32,99,104,97,
+114,103,101,44,32,116,111,32,97,110,121,32,112,101,114,115,111,110,32,111,
+98,116,97,105,110,105,110,103,32,97,32,99,111,112,121,13,10,111,102,32,
+116,104,105,115,32,115,111,102,116,119,97,114,101,32,97,110,100,32,97,115,
+115,111,99,105,97,116,101,100,32,100,111,99,117,109,101,110,116,97,116,105,
+111,110,32,102,105,108,101,115,32,40,116,104,101,32,34,83,111,102,116,119,
+97,114,101,34,41,44,32,116,111,32,100,101,97,108,13,10,105,110,32,116,
+104,101,32,83,111,102,116,119,97,114,101,32,119,105,116,104,111,117,116,32,
+114,101,115,116,114,105,99,116,105,111,110,44,32,105,110,99,108,117,100,105,
+110,103,32,119,105,116,104,111,117,116,32,108,105,109,105,116,97,116,105,111,
+110,32,116,104,101,32,114,105,103,104,116,115,13,10,116,111,32,117,115,101,
+44,32,99,111,112,121,44,32,109,111,100,105,102,121,44,32,109,101,114,103,
+101,44,32,112,117,98,108,105,115,104,44,32,100,105,115,116,114,105,98,117,
+116,101,44,32,115,117,98,108,105,99,101,110,115,101,44,32,97,110,100,47,
+111,114,32,115,101,108,108,13,10,99,111,112,105,101,115,32,111,102,32,116,
+104,101,32,83,111,102,116,119,97,114,101,44,32,97,110,100,32,116,111,32,
+112,101,114,109,105,116,32,112,101,114,115,111,110,115,32,116,111,32,119,104,
+111,109,32,116,104,101,32,83,111,102,116,119,97,114,101,32,105,115,13,10,
+102,117,114,110,105,115,104,101,100,32,116,111,32,100,111,32,115,111,44,32,
+115,117,98,106,101,99,116,32,116,111,32,116,104,101,32,102,111,108,108,111,
+119,105,110,103,32,99,111,110,100,105,116,105,111,110,115,58,13,10,13,10,
+84,104,101,32,97,98,111,118,101,32,99,111,112,121,114,105,103,104,116,32,
+110,111,116,105,99,101,32,97,110,100,32,116,104,105,115,32,112,101,114,109,
+105,115,115,105,111,110,32,110,111,116,105,99,101,32,115,104,97,108,108,32,
+98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,97,108,108,13,10,
+99,111,112,105,101,115,32,111,114,32,115,117,98,115,116,97,110,116,105,97,
+108,32,112,111,114,116,105,111,110,115,32,111,102,32,116,104,101,32,83,111,
+102,116,119,97,114,101,46,13,10,13,10,84,72,69,32,83,79,70,84,87,
+65,82,69,32,73,83,32,80,82,79,86,73,68,69,68,32,34,65,83,32,
+73,83,34,44,32,87,73,84,72,79,85,84,32,87,65,82,82,65,78,84,
+89,32,79,70,32,65,78,89,32,75,73,78,68,44,32,69,88,80,82,69,
+83,83,32,79,82,13,10,73,77,80,76,73,69,68,44,32,73,78,67,76,
+85,68,73,78,71,32,66,85,84,32,78,79,84,32,76,73,77,73,84,69,
+68,32,84,79,32,84,72,69,32,87,65,82,82,65,78,84,73,69,83,32,
+79,70,32,77,69,82,67,72,65,78,84,65,66,73,76,73,84,89,44,13,
+10,70,73,84,78,69,83,83,32,70,79,82,32,65,32,80,65,82,84,73,
+67,85,76,65,82,32,80,85,82,80,79,83,69,32,65,78,68,32,78,79,
+78,73,78,70,82,73,78,71,69,77,69,78,84,46,32,73,78,32,78,79,
+32,69,86,69,78,84,32,83,72,65,76,76,32,84,72,69,13,10,65,85,
+84,72,79,82,83,32,79,82,32,67,79,80,89,82,73,71,72,84,32,72,
+79,76,68,69,82,83,32,66,69,32,76,73,65,66,76,69,32,70,79,82,
+32,65,78,89,32,67,76,65,73,77,44,32,68,65,77,65,71,69,83,32,
+79,82,32,79,84,72,69,82,13,10,76,73,65,66,73,76,73,84,89,44,
+32,87,72,69,84,72,69,82,32,73,78,32,65,78,32,65,67,84,73,79,
+78,32,79,70,32,67,79,78,84,82,65,67,84,44,32,84,79,82,84,32,
+79,82,32,79,84,72,69,82,87,73,83,69,44,32,65,82,73,83,73,78,
+71,32,70,82,79,77,44,13,10,79,85,84,32,79,70,32,79,82,32,73,
+78,32,67,79,78,78,69,67,84,73,79,78,32,87,73,84,72,32,84,72,
+69,32,83,79,70,84,87,65,82,69,32,79,82,32,84,72,69,32,85,83,
+69,32,79,82,32,79,84,72,69,82,32,68,69,65,76,73,78,71,83,32,
+73,78,32,84,72,69,13,10,83,79,70,84,87,65,82,69,46,13,10,13,
+10,93,93,13,10,108,111,99,97,108,32,109,97,99,104,105,110,101,32,61,
+32,123,125,13,10,109,97,99,104,105,110,101,46,95,95,105,110,100,101,120,
+32,61,32,109,97,99,104,105,110,101,13,10,13,10,108,111,99,97,108,32,
+78,79,78,69,32,61,32,34,110,111,110,101,34,13,10,108,111,99,97,108,
+32,65,83,89,78,67,32,61,32,34,97,115,121,110,99,34,13,10,13,10,
+108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,95,
+104,97,110,100,108,101,114,40,104,97,110,100,108,101,114,44,32,112,97,114,
+97,109,115,41,13,10,32,32,105,102,32,104,97,110,100,108,101,114,32,116,
+104,101,110,13,10,32,32,32,32,114,101,116,117,114,110,32,104,97,110,100,
+108,101,114,40,117,110,112,97,99,107,40,112,97,114,97,109,115,41,41,13,
+10,32,32,101,110,100,13,10,101,110,100,13,10,13,10,108,111,99,97,108,
+32,102,117,110,99,116,105,111,110,32,99,114,101,97,116,101,95,116,114,97,
+110,115,105,116,105,111,110,40,110,97,109,101,41,13,10,32,32,108,111,99,
+97,108,32,99,97,110,44,32,116,111,44,32,102,114,111,109,44,32,112,97,
+114,97,109,115,13,10,13,10,32,32,108,111,99,97,108,32,102,117,110,99,
+116,105,111,110,32,116,114,97,110,115,105,116,105,111,110,40,115,101,108,102,
+44,32,46,46,46,41,13,10,32,32,32,32,105,102,32,115,101,108,102,46,
+97,115,121,110,99,83,116,97,116,101,32,61,61,32,78,79,78,69,32,116,
+104,101,110,13,10,32,32,32,32,32,32,99,97,110,44,32,116,111,32,61,
+32,115,101,108,102,58,99,97,110,40,110,97,109,101,41,13,10,32,32,32,
+32,32,32,102,114,111,109,32,61,32,115,101,108,102,46,99,117,114,114,101,
+110,116,13,10,32,32,32,32,32,32,112,97,114,97,109,115,32,61,32,123,
+32,115,101,108,102,44,32,110,97,109,101,44,32,102,114,111,109,44,32,116,
+111,44,32,46,46,46,125,13,10,13,10,32,32,32,32,32,32,105,102,32,
+110,111,116,32,99,97,110,32,116,104,101,110,32,114,101,116,117,114,110,32,
+102,97,108,115,101,32,101,110,100,13,10,32,32,32,32,32,32,115,101,108,
+102,46,99,117,114,114,101,110,116,84,114,97,110,115,105,116,105,111,110,105,
+110,103,69,118,101,110,116,32,61,32,110,97,109,101,13,10,13,10,32,32,
+32,32,32,32,108,111,99,97,108,32,98,101,102,111,114,101,82,101,116,117,
+114,110,32,61,32,99,97,108,108,95,104,97,110,100,108,101,114,40,115,101,
+108,102,91,34,111,110,98,101,102,111,114,101,34,32,46,46,32,110,97,109,
+101,93,44,32,112,97,114,97,109,115,41,13,10,32,32,32,32,32,32,108,
+111,99,97,108,32,108,101,97,118,101,82,101,116,117,114,110,32,61,32,99,
+97,108,108,95,104,97,110,100,108,101,114,40,115,101,108,102,91,34,111,110,
+108,101,97,118,101,34,32,46,46,32,102,114,111,109,93,44,32,112,97,114,
+97,109,115,41,13,10,13,10,32,32,32,32,32,32,105,102,32,98,101,102,
+111,114,101,82,101,116,117,114,110,32,61,61,32,102,97,108,115,101,32,111,
+114,32,108,101,97,118,101,82,101,116,117,114,110,32,61,61,32,102,97,108,
+115,101,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,114,101,116,
+117,114,110,32,102,97,108,115,101,13,10,32,32,32,32,32,32,101,110,100,
+13,10,13,10,32,32,32,32,32,32,115,101,108,102,46,97,115,121,110,99,
+83,116,97,116,101,32,61,32,110,97,109,101,32,46,46,32,34,87,97,105,
+116,105,110,103,79,110,76,101,97,118,101,34,13,10,13,10,32,32,32,32,
+32,32,105,102,32,108,101,97,118,101,82,101,116,117,114,110,32,126,61,32,
+65,83,89,78,67,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,
+116,114,97,110,115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,
+41,13,10,32,32,32,32,32,32,101,110,100,13,10,32,32,32,32,32,32,
+13,10,32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,13,
+10,32,32,32,32,101,108,115,101,105,102,32,115,101,108,102,46,97,115,121,
+110,99,83,116,97,116,101,32,61,61,32,110,97,109,101,32,46,46,32,34,
+87,97,105,116,105,110,103,79,110,76,101,97,118,101,34,32,116,104,101,110,
+13,10,32,32,32,32,32,32,115,101,108,102,46,99,117,114,114,101,110,116,
+32,61,32,116,111,13,10,13,10,32,32,32,32,32,32,108,111,99,97,108,
+32,101,110,116,101,114,82,101,116,117,114,110,32,61,32,99,97,108,108,95,
+104,97,110,100,108,101,114,40,115,101,108,102,91,34,111,110,101,110,116,101,
+114,34,32,46,46,32,116,111,93,32,111,114,32,115,101,108,102,91,34,111,
+110,34,32,46,46,32,116,111,93,44,32,112,97,114,97,109,115,41,13,10,
+13,10,32,32,32,32,32,32,115,101,108,102,46,97,115,121,110,99,83,116,
+97,116,101,32,61,32,110,97,109,101,32,46,46,32,34,87,97,105,116,105,
+110,103,79,110,69,110,116,101,114,34,13,10,13,10,32,32,32,32,32,32,
+105,102,32,101,110,116,101,114,82,101,116,117,114,110,32,126,61,32,65,83,
+89,78,67,32,116,104,101,110,13,10,32,32,32,32,32,32,32,32,116,114,
+97,110,115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,41,13,
+10,32,32,32,32,32,32,101,110,100,13,10,32,32,32,32,32,32,13,10,
+32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,13,10,32,
+32,32,32,101,108,115,101,105,102,32,115,101,108,102,46,97,115,121,110,99,
+83,116,97,116,101,32,61,61,32,110,97,109,101,32,46,46,32,34,87,97,
+105,116,105,110,103,79,110,69,110,116,101,114,34,32,116,104,101,110,13,10,
+32,32,32,32,32,32,99,97,108,108,95,104,97,110,100,108,101,114,40,115,
+101,108,102,91,34,111,110,97,102,116,101,114,34,32,46,46,32,110,97,109,
+101,93,32,111,114,32,115,101,108,102,91,34,111,110,34,32,46,46,32,110,
+97,109,101,93,44,32,112,97,114,97,109,115,41,13,10,32,32,32,32,32,
+32,99,97,108,108,95,104,97,110,100,108,101,114,40,115,101,108,102,91,34,
+111,110,115,116,97,116,101,99,104,97,110,103,101,34,93,44,32,112,97,114,
+97,109,115,41,13,10,32,32,32,32,32,32,115,101,108,102,46,97,115,121,
+110,99,83,116,97,116,101,32,61,32,78,79,78,69,13,10,32,32,32,32,
+32,32,115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,105,
+116,105,111,110,105,110,103,69,118,101,110,116,32,61,32,110,105,108,13,10,
+32,32,32,32,32,32,114,101,116,117,114,110,32,116,114,117,101,13,10,32,
+32,32,32,101,108,115,101,13,10,32,32,32,32,9,105,102,32,115,116,114,
+105,110,103,46,102,105,110,100,40,115,101,108,102,46,97,115,121,110,99,83,
+116,97,116,101,44,32,34,87,97,105,116,105,110,103,79,110,76,101,97,118,
+101,34,41,32,111,114,32,115,116,114,105,110,103,46,102,105,110,100,40,115,
+101,108,102,46,97,115,121,110,99,83,116,97,116,101,44,32,34,87,97,105,
+116,105,110,103,79,110,69,110,116,101,114,34,41,32,116,104,101,110,13,10,
+32,32,32,32,9,9,115,101,108,102,46,97,115,121,110,99,83,116,97,116,
+101,32,61,32,78,79,78,69,13,10,32,32,32,32,9,9,116,114,97,110,
+115,105,116,105,111,110,40,115,101,108,102,44,32,46,46,46,41,13,10,32,
+32,32,32,9,9,114,101,116,117,114,110,32,116,114,117,101,13,10,32,32,
+32,32,9,101,110,100,13,10,32,32,32,32,101,110,100,13,10,13,10,32,
+32,32,32,115,101,108,102,46,99,117,114,114,101,110,116,84,114,97,110,115,
+105,116,105,111,110,105,110,103,69,118,101,110,116,32,61,32,110,105,108,13,
+10,32,32,32,32,114,101,116,117,114,110,32,102,97,108,115,101,13,10,32,
+32,101,110,100,13,10,13,10,32,32,114,101,116,117,114,110,32,116,114,97,
+110,115,105,116,105,111,110,13,10,101,110,100,13,10,13,10,108,111,99,97,
+108,32,102,117,110,99,116,105,111,110,32,97,100,100,95,116,111,95,109,97,
+112,40,109,97,112,44,32,101,118,101,110,116,41,13,10,32,32,105,102,32,
+116,121,112,101,40,101,118,101,110,116,46,102,114,111,109,41,32,61,61,32,
+39,115,116,114,105,110,103,39,32,116,104,101,110,13,10,32,32,32,32,109,
+97,112,91,101,118,101,110,116,46,102,114,111,109,93,32,61,32,101,118,101,
+110,116,46,116,111,13,10,32,32,101,108,115,101,13,10,32,32,32,32,102,
+111,114,32,95,44,32,102,114,111,109,32,105,110,32,105,112,97,105,114,115,
+40,101,118,101,110,116,46,102,114,111,109,41,32,100,111,13,10,32,32,32,
+32,32,32,109,97,112,91,102,114,111,109,93,32,61,32,101,118,101,110,116,
+46,116,111,13,10,32,32,32,32,101,110,100,13,10,32,32,101,110,100,13,
+10,101,110,100,13,10,13,10,102,117,110,99,116,105,111,110,32,109,97,99,
+104,105,110,101,46,99,114,101,97,116,101,40,111,112,116,105,111,110,115,41,
+13,10,32,32,97,115,115,101,114,116,40,111,112,116,105,111,110,115,46,101,
+118,101,110,116,115,41,13,10,13,10,32,32,108,111,99,97,108,32,102,115,
+109,32,61,32,123,125,13,10,32,32,115,101,116,109,101,116,97,116,97,98,
+108,101,40,102,115,109,44,32,109,97,99,104,105,110,101,41,13,10,13,10,
+32,32,102,115,109,46,111,112,116,105,111,110,115,32,61,32,111,112,116,105,
+111,110,115,13,10,32,32,102,115,109,46,99,117,114,114,101,110,116,32,61,
+32,111,112,116,105,111,110,115,46,105,110,105,116,105,97,108,32,111,114,32,
+39,110,111,110,101,39,13,10,32,32,102,115,109,46,97,115,121,110,99,83,
+116,97,116,101,32,61,32,78,79,78,69,13,10,32,32,102,115,109,46,101,
+118,101,110,116,115,32,61,32,123,125,13,10,13,10,32,32,102,111,114,32,
+95,44,32,101,118,101,110,116,32,105,110,32,105,112,97,105,114,115,40,111,
+112,116,105,111,110,115,46,101,118,101,110,116,115,32,111,114,32,123,125,41,
+32,100,111,13,10,32,32,32,32,108,111,99,97,108,32,110,97,109,101,32,
+61,32,101,118,101,110,116,46,110,97,109,101,13,10,32,32,32,32,102,115,
+109,91,110,97,109,101,93,32,61,32,102,115,109,91,110,97,109,101,93,32,
+111,114,32,99,114,101,97,116,101,95,116,114,97,110,115,105,116,105,111,110,
+40,110,97,109,101,41,13,10,32,32,32,32,102,115,109,46,101,118,101,110,
+116,115,91,110,97,109,101,93,32,61,32,102,115,109,46,101,118,101,110,116,
+115,91,110,97,109,101,93,32,111,114,32,123,32,109,97,112,32,61,32,123,
+125,32,125,13,10,32,32,32,32,97,100,100,95,116,111,95,109,97,112,40,
+102,115,109,46,101,118,101,110,116,115,91,110,97,109,101,93,46,109,97,112,
+44,32,101,118,101,110,116,41,13,10,32,32,101,110,100,13,10,32,32,13,
+10,32,32,102,111,114,32,110,97,109,101,44,32,99,97,108,108,98,97,99,
+107,32,105,110,32,112,97,105,114,115,40,111,112,116,105,111,110,115,46,99,
+97,108,108,98,97,99,107,115,32,111,114,32,123,125,41,32,100,111,13,10,
+32,32,32,32,102,115,109,91,110,97,109,101,93,32,61,32,99,97,108,108,
+98,97,99,107,13,10,32,32,101,110,100,13,10,13,10,32,32,114,101,116,
+117,114,110,32,102,115,109,13,10,101,110,100,13,10,13,10,102,117,110,99,
+116,105,111,110,32,109,97,99,104,105,110,101,58,105,115,40,115,116,97,116,
+101,41,13,10,32,32,114,101,116,117,114,110,32,115,101,108,102,46,99,117,
+114,114,101,110,116,32,61,61,32,115,116,97,116,101,13,10,101,110,100,13,
+10,13,10,102,117,110,99,116,105,111,110,32,109,97,99,104,105,110,101,58,
+99,97,110,40,101,41,13,10,32,32,108,111,99,97,108,32,101,118,101,110,
+116,32,61,32,115,101,108,102,46,101,118,101,110,116,115,91,101,93,13,10,
+32,32,108,111,99,97,108,32,116,111,32,61,32,101,118,101,110,116,32,97,
+110,100,32,101,118,101,110,116,46,109,97,112,91,115,101,108,102,46,99,117,
+114,114,101,110,116,93,32,111,114,32,101,118,101,110,116,46,109,97,112,91,
+39,42,39,93,13,10,32,32,114,101,116,117,114,110,32,116,111,32,126,61,
+32,110,105,108,44,32,116,111,13,10,101,110,100,13,10,13,10,102,117,110,
+99,116,105,111,110,32,109,97,99,104,105,110,101,58,99,97,110,110,111,116,
+40,101,41,13,10,32,32,114,101,116,117,114,110,32,110,111,116,32,115,101,
+108,102,58,99,97,110,40,101,41,13,10,101,110,100,13,10,13,10,102,117,
+110,99,116,105,111,110,32,109,97,99,104,105,110,101,58,116,111,100,111,116,
+40,102,105,108,101,110,97,109,101,41,13,10,32,32,108,111,99,97,108,32,
+100,111,116,102,105,108,101,32,61,32,105,111,46,111,112,101,110,40,102,105,
+108,101,110,97,109,101,44,39,119,39,41,13,10,32,32,100,111,116,102,105,
+108,101,58,119,114,105,116,101,40,39,100,105,103,114,97,112,104,32,123,92,
+110,39,41,13,10,32,32,108,111,99,97,108,32,116,114,97,110,115,105,116,
+105,111,110,32,61,32,102,117,110,99,116,105,111,110,40,101,118,101,110,116,
+44,102,114,111,109,44,116,111,41,13,10,32,32,32,32,100,111,116,102,105,
+108,101,58,119,114,105,116,101,40,115,116,114,105,110,103,46,102,111,114,109,
+97,116,40,39,37,115,32,45,62,32,37,115,32,91,108,97,98,101,108,61,
+37,115,93,59,92,110,39,44,102,114,111,109,44,116,111,44,101,118,101,110,
+116,41,41,13,10,32,32,101,110,100,13,10,32,32,102,111,114,32,95,44,
+32,101,118,101,110,116,32,105,110,32,112,97,105,114,115,40,115,101,108,102,
+46,111,112,116,105,111,110,115,46,101,118,101,110,116,115,41,32,100,111,13,
+10,32,32,32,32,105,102,32,116,121,112,101,40,101,118,101,110,116,46,102,
+114,111,109,41,32,61,61,32,39,116,97,98,108,101,39,32,116,104,101,110,
+13,10,32,32,32,32,32,32,102,111,114,32,95,44,32,102,114,111,109,32,
+105,110,32,105,112,97,105,114,115,40,101,118,101,110,116,46,102,114,111,109,
+41,32,100,111,13,10,32,32,32,32,32,32,32,32,116,114,97,110,115,105,
+116,105,111,110,40,101,118,101,110,116,46,110,97,109,101,44,102,114,111,109,
+44,101,118,101,110,116,46,116,111,41,13,10,32,32,32,32,32,32,101,110,
+100,13,10,32,32,32,32,101,108,115,101,13,10,32,32,32,32,32,32,116,
+114,97,110,115,105,116,105,111,110,40,101,118,101,110,116,46,110,97,109,101,
+44,101,118,101,110,116,46,102,114,111,109,44,101,118,101,110,116,46,116,111,
+41,13,10,32,32,32,32,101,110,100,13,10,32,32,101,110,100,13,10,32,
+32,100,111,116,102,105,108,101,58,119,114,105,116,101,40,39,125,92,110,39,
+41,13,10,32,32,100,111,116,102,105,108,101,58,99,108,111,115,101,40,41,
+13,10,101,110,100,13,10,13,10,102,117,110,99,116,105,111,110,32,109,97,
+99,104,105,110,101,58,116,114,97,110,115,105,116,105,111,110,40,101,118,101,
+110,116,41,13,10,32,32,105,102,32,115,101,108,102,46,99,117,114,114,101,
+110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,110,116,
+32,61,61,32,101,118,101,110,116,32,116,104,101,110,13,10,32,32,32,32,
+114,101,116,117,114,110,32,115,101,108,102,91,115,101,108,102,46,99,117,114,
+114,101,110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,
+110,116,93,40,115,101,108,102,41,13,10,32,32,101,110,100,13,10,101,110,
+100,13,10,13,10,102,117,110,99,116,105,111,110,32,109,97,99,104,105,110,
+101,58,99,97,110,99,101,108,84,114,97,110,115,105,116,105,111,110,40,101,
+118,101,110,116,41,13,10,32,32,105,102,32,115,101,108,102,46,99,117,114,
+114,101,110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,
+110,116,32,61,61,32,101,118,101,110,116,32,116,104,101,110,13,10,32,32,
+32,32,115,101,108,102,46,97,115,121,110,99,83,116,97,116,101,32,61,32,
+78,79,78,69,13,10,32,32,32,32,115,101,108,102,46,99,117,114,114,101,
+110,116,84,114,97,110,115,105,116,105,111,110,105,110,103,69,118,101,110,116,
+32,61,32,110,105,108,13,10,32,32,101,110,100,13,10,101,110,100,13,10,
+13,10,109,97,99,104,105,110,101,46,78,79,78,69,32,61,32,78,79,78,
+69,13,10,109,97,99,104,105,110,101,46,65,83,89,78,67,32,61,32,65,
+83,89,78,67,13,10,13,10,45,45,32,73,109,112,111,114,116,32,116,111,
+32,74,105,110,46,32,13,10,13,10,106,105,110,46,97,105,46,110,101,119,
+83,116,97,116,101,77,97,99,104,105,110,101,32,61,32,109,97,99,104,105,
+110,101,46,99,114,101,97,116,101,13,10
};