Cycles: svn merge -r39870:r40266 https://svn.blender.org/svnroot/bf-blender/trunk...
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 17 Sep 2011 13:28:40 +0000 (13:28 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 17 Sep 2011 13:28:40 +0000 (13:28 +0000)
Merging the node changes required a lot of conflict resolution, fixed the
issues I could find but if you want stability you might want to wait a bit
before updating.

75 files changed:
1  2 
CMakeLists.txt
build_files/cmake/macros.cmake
intern/cycles/blender/addon/ui.py
intern/cycles/blender/blender_shader.cpp
release/scripts/startup/bl_ui/properties_data_modifier.py
source/blender/blenkernel/BKE_node.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/cdderivedmesh.c
source/blender/blenkernel/intern/node.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/scene.c
source/blender/blenkernel/intern/subsurf_ccg.c
source/blender/blenloader/intern/readfile.c
source/blender/blenloader/intern/writefile.c
source/blender/editors/include/ED_node.h
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface_node.c
source/blender/editors/interface/interface_panel.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/interface/interface_widgets.c
source/blender/editors/object/object_add.c
source/blender/editors/object/object_edit.c
source/blender/editors/render/render_shading.c
source/blender/editors/screen/area.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/space_node/drawnode.c
source/blender/editors/space_node/node_draw.c
source/blender/editors/space_node/node_edit.c
source/blender/editors/space_node/node_header.c
source/blender/editors/space_node/node_intern.h
source/blender/editors/space_node/node_ops.c
source/blender/editors/space_node/node_select.c
source/blender/editors/space_node/space_node.c
source/blender/editors/space_view3d/drawobject.c
source/blender/editors/space_view3d/view3d_draw.c
source/blender/gpu/GPU_material.h
source/blender/gpu/intern/gpu_material.c
source/blender/gpu/intern/gpu_shader_material.glsl
source/blender/gpu/intern/gpu_shader_material.glsl.c
source/blender/makesdna/DNA_node_types.h
source/blender/makesdna/DNA_object_types.h
source/blender/makesdna/DNA_space_types.h
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_actuator.c
source/blender/makesrna/intern/rna_main_api.c
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_nodetree_types.h
source/blender/makesrna/intern/rna_object.c
source/blender/makesrna/intern/rna_scene.c
source/blender/makesrna/intern/rna_scene_api.c
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_ui_api.c
source/blender/makesrna/intern/rna_world.c
source/blender/modifiers/intern/MOD_warp.c
source/blender/nodes/CMakeLists.txt
source/blender/nodes/NOD_shader.h
source/blender/nodes/intern/node_socket.c
source/blender/nodes/shader/node_shader_tree.c
source/blender/nodes/shader/node_shader_util.c
source/blender/nodes/shader/node_shader_util.h
source/blender/nodes/shader/nodes/node_shader_common.c
source/blender/nodes/shader/nodes/node_shader_geom.c
source/blender/nodes/texture/node_texture_tree.c
source/blender/python/intern/CMakeLists.txt
source/blender/python/intern/bpy_interface.c
source/blender/render/intern/source/pipeline.c
source/blender/render/intern/source/render_texture.c
source/blender/windowmanager/intern/wm_event_system.c
source/blenderplayer/bad_level_call_stubs/stubs.c
source/creator/CMakeLists.txt
source/creator/creator.c
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp

diff --cc CMakeLists.txt
Simple merge
Simple merge
index 86d1f19d096d1c0ea821c7ef38cf57fb4bad47ae,0000000000000000000000000000000000000000..f9ebfdc0bb5aab4a14359553753d1df9d86dc319
mode 100644,000000..100644
--- /dev/null
@@@ -1,652 -1,0 +1,652 @@@
-             if type(node) is not bpy.types.NodeGroup and node.type == nodetype:
 +#
 +# Copyright 2011, Blender Foundation.
 +#
 +# 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.
 +#
 +# This program is distributed in the hope that it will be useful,
 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +# GNU General Public License for more details.
 +#
 +# You should have received a copy of the GNU General Public License
 +# along with this program; if not, write to the Free Software Foundation,
 +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 +#
 +
 +import bpy
 +
 +from bpy.types import Panel, Menu
 +
 +from cycles import enums
 +from cycles import engine
 +
 +class CYCLES_MT_integrator_presets(Menu):
 +    bl_label = "Integrator Presets"
 +    preset_subdir = "cycles/integrator"
 +    preset_operator = "script.execute_preset"
 +    COMPAT_ENGINES = {'CYCLES'}
 +    draw = Menu.draw_preset
 +
 +class CyclesButtonsPanel():
 +    bl_space_type = "PROPERTIES"
 +    bl_region_type = "WINDOW"
 +    bl_context = "render"
 +    
 +    @classmethod
 +    def poll(cls, context):
 +        rd = context.scene.render
 +        return rd.engine == 'CYCLES'
 +
 +class CyclesRender_PT_integrator(CyclesButtonsPanel, Panel):
 +    bl_label = "Integrator"
 +    bl_options = {'DEFAULT_CLOSED'}
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        scene = context.scene
 +        cscene = scene.cycles
 +        
 +        row = layout.row(align=True)
 +        row.menu("CYCLES_MT_integrator_presets", text=bpy.types.CYCLES_MT_integrator_presets.bl_label)
 +        row.operator("render.cycles_integrator_preset_add", text="", icon="ZOOMIN")
 +        row.operator("render.cycles_integrator_preset_add", text="", icon="ZOOMOUT").remove_active = True
 +
 +        split = layout.split()
 +
 +        col = split.column()
 +        sub = col.column(align=True)
 +        sub.label(text="Samples:")
 +        sub.prop(cscene, "samples", text="Render")
 +        sub.prop(cscene, "preview_samples", text="Preview")
 +
 +        sub = col.column(align=True)
 +        sub.label("Tranparency:")
 +        sub.prop(cscene, "transparent_max_bounces", text="Max")
 +        sub.prop(cscene, "transparent_min_bounces", text="Min")
 +        sub.prop(cscene, "no_caustics")
 +
 +        col = split.column()
 +
 +        sub = col.column(align=True)
 +        sub.label(text="Bounces:")
 +        sub.prop(cscene, "max_bounces", text="Max")
 +        sub.prop(cscene, "min_bounces", text="Min")
 +
 +        sub = col.column(align=True)
 +        sub.label(text="Light Paths:")
 +        sub.prop(cscene, "diffuse_bounces", text="Diffuse")
 +        sub.prop(cscene, "glossy_bounces", text="Glossy")
 +        sub.prop(cscene, "transmission_bounces", text="Transmission")
 +
 +        #row = col.row()
 +        #row.prop(cscene, "blur_caustics")
 +        #row.active = not cscene.no_caustics
 +        
 +class CyclesRender_PT_film(CyclesButtonsPanel, Panel):
 +    bl_label = "Film"
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        scene = context.scene
 +        cscene = scene.cycles
 +
 +        split = layout.split()
 +
 +        col = split.column();
 +        col.prop(cscene, "film_exposure")
 +        col.prop(cscene, "film_transparent")
 +
 +        col = split.column()
 +        sub = col.column(align=True)
 +        sub.prop(cscene, "filter_type", text="")
 +        if cscene.filter_type != 'BOX':
 +            sub.prop(cscene, "filter_width", text="Width")
 +
 +class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
 +    bl_label = "Performance"
 +    bl_options = {'DEFAULT_CLOSED'}
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        scene = context.scene
 +        rd = scene.render
 +        cscene = scene.cycles
 +
 +        split = layout.split()
 +
 +        col = split.column(align=True)
 +
 +        col.label(text="Threads:")
 +        col.row().prop(rd, "threads_mode", expand=True)
 +        sub = col.column()
 +        sub.enabled = rd.threads_mode == 'FIXED'
 +        sub.prop(rd, "threads")
 +
 +        sub = col.column(align=True)
 +        sub.label(text="Tiles:")
 +        sub.prop(cscene, "debug_tile_size")
 +        sub.prop(cscene, "debug_min_size")
 +
 +        col = split.column()
 +
 +        sub = col.column(align=True)
 +        sub.label(text="Acceleration structure:")
 +        sub.prop(cscene, "debug_bvh_type", text="")
 +        sub.prop(cscene, "debug_use_spatial_splits")
 +
 +class CyclesRender_PT_layers(CyclesButtonsPanel, Panel):
 +    bl_label = "Layers"
 +    bl_options = {'DEFAULT_CLOSED'}
 +    COMPAT_ENGINES = {'BLENDER_RENDER'}
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        scene = context.scene
 +        rd = scene.render
 +
 +        # row = layout.row()
 +        # row.template_list(rd, "layers", rd.layers, "active_index", rows=2)
 +
 +        # col = row.column(align=True)
 +        # col.operator("scene.render_layer_add", icon='ZOOMIN', text="")
 +        # col.operator("scene.render_layer_remove", icon='ZOOMOUT', text="")
 +
 +        row = layout.row()
 +        # rl = rd.layers.active
 +        rl = rd.layers[0]
 +        row.prop(rl, "name")
 +        #row.prop(rd, "use_single_layer", text="", icon_only=True)
 +
 +        split = layout.split()
 +
 +        col = split.column()
 +        col.prop(scene, "layers", text="Scene")
 +
 +        col = split.column()
 +        col.prop(rl, "layers", text="Layer")
 +
 +        layout.separator()
 +
 +        layout.prop(rl, "material_override", text="Material")
 +
 +class Cycles_PT_post_processing(CyclesButtonsPanel, Panel):
 +    bl_label = "Post Processing"
 +    bl_options = {'DEFAULT_CLOSED'}
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        rd = context.scene.render
 +
 +        split = layout.split()
 +
 +        col = split.column()
 +        col.prop(rd, "use_compositing")
 +        col.prop(rd, "use_sequencer")
 +
 +        col = split.column()
 +        col.prop(rd, "dither_intensity", text="Dither", slider=True)
 +
 +class CyclesCamera_PT_dof(CyclesButtonsPanel, Panel):
 +    bl_label = "Depth of Field"
 +    bl_context = "data"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.camera and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        cam = context.camera
 +        ccam = cam.cycles
 +
 +        split = layout.split()
 +
 +        col = split.column()
 +        col.label("Focus:")
 +        col.prop(cam, "dof_object", text="")
 +
 +        sub = col.row()
 +        sub.active = cam.dof_object is None
 +        sub.prop(cam, "dof_distance", text="Distance")
 +
 +        col = split.column()
 +
 +        col.label("Aperture:")
 +        col.prop(ccam, "aperture_size", text="Size")
 +
 +        sub = col.column(align=True)
 +        sub.prop(ccam, "aperture_blades", text="Blades")
 +        sub.prop(ccam, "aperture_rotation", text="Rotation")
 +
 +class Cycles_PT_context_material(CyclesButtonsPanel, Panel):
 +    bl_label = "Surface"
 +    bl_context = "material"
 +    bl_options = {'HIDE_HEADER'}
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return (context.material or context.object) and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        mat = context.material
 +        ob = context.object
 +        slot = context.material_slot
 +        space = context.space_data
 +
 +        if ob:
 +            row = layout.row()
 +
 +            row.template_list(ob, "material_slots", ob, "active_material_index", rows=2)
 +
 +            col = row.column(align=True)
 +            col.operator("object.material_slot_add", icon='ZOOMIN', text="")
 +            col.operator("object.material_slot_remove", icon='ZOOMOUT', text="")
 +
 +            col.menu("MATERIAL_MT_specials", icon='DOWNARROW_HLT', text="")
 +
 +            if ob.mode == 'EDIT':
 +                row = layout.row(align=True)
 +                row.operator("object.material_slot_assign", text="Assign")
 +                row.operator("object.material_slot_select", text="Select")
 +                row.operator("object.material_slot_deselect", text="Deselect")
 +
 +        split = layout.split(percentage=0.65)
 +
 +        if ob:
 +            split.template_ID(ob, "active_material", new="material.new")
 +            row = split.row()
 +
 +            if slot:
 +                row.prop(slot, "link", text="")
 +            else:
 +                row.label()
 +        elif mat:
 +            split.template_ID(space, "pin_id")
 +            split.separator()
 +
 +class Cycles_PT_mesh_displacement(CyclesButtonsPanel, Panel):
 +    bl_label = "Displacement"
 +    bl_context = "data"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.mesh or context.curve or context.meta_ball
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        mesh = context.mesh
 +        curve = context.curve
 +        mball = context.meta_ball
 +
 +        if mesh:
 +            cdata = mesh.cycles
 +        elif curve:
 +            cdata = curve.cycles
 +        elif mball:
 +            cdata = mball.cycles
 +
 +        layout.prop(cdata, "displacement_method", text="Method")
 +        layout.prop(cdata, "use_subdivision");
 +        layout.prop(cdata, "dicing_rate");
 +
 +class CyclesObject_PT_ray_visibility(CyclesButtonsPanel, Panel):
 +    bl_label = "Ray Visibility"
 +    bl_context = "object"
 +    bl_options = {'DEFAULT_CLOSED'}
 +
 +    @classmethod
 +    def poll(cls, context):
 +        ob = context.object
 +        return ob and ob.type in ('MESH', 'CURVE', 'CURVE', 'SURFACE', 'FONT', 'META') # todo: 'LAMP'
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        ob = context.object
 +        visibility = ob.cycles_visibility
 +
 +        split = layout.split()
 +
 +        col = split.column()
 +        col.prop(visibility, "camera")
 +        col.prop(visibility, "diffuse")
 +        col.prop(visibility, "glossy")
 +
 +        col = split.column()
 +        col.prop(visibility, "transmission")
 +        col.prop(visibility, "shadow")
 +
 +def find_node(material, nodetype):
 +    if material and material.node_tree:
 +        ntree = material.node_tree
 +
 +        for node in ntree.nodes:
++            if hasattr(node, 'type') and node.type == nodetype:
 +                return node
 +    
 +    return None
 +
 +def find_node_input(node, name):
 +    for input in node.inputs:
 +        if input.name == name:
 +            return input
 +    
 +    return None
 +
 +def panel_node_draw(layout, id, output_type, input_name):
 +    if not id.node_tree:
 +        layout.prop(id, "use_nodes")
 +        return
 +
 +    ntree = id.node_tree
 +
 +    node = find_node(id, output_type)
 +    if not node:
 +        layout.label(text="No output node.")
 +    else:
 +        input = find_node_input(node, input_name)
 +        layout.template_node_view(ntree, node, input);
 +
 +class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
 +    bl_label = "Surface"
 +    bl_context = "data"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.lamp and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        mat = context.lamp
 +        panel_node_draw(layout, mat, 'OUTPUT_LAMP', 'Surface')
 +
 +class CyclesWorld_PT_surface(CyclesButtonsPanel, Panel):
 +    bl_label = "Surface"
 +    bl_context = "world"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.world and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        mat = context.world
 +        panel_node_draw(layout, mat, 'OUTPUT_WORLD', 'Surface')
 +
 +class CyclesWorld_PT_volume(CyclesButtonsPanel, Panel):
 +    bl_label = "Volume"
 +    bl_context = "world"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.world and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +        layout.active = False
 +
 +        mat = context.world
 +        panel_node_draw(layout, mat, 'OUTPUT_WORLD', 'Volume')
 +
 +class CyclesMaterial_PT_surface(CyclesButtonsPanel, Panel):
 +    bl_label = "Surface"
 +    bl_context = "material"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.material and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        mat = context.material
 +        panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Surface')
 +
 +class CyclesMaterial_PT_volume(CyclesButtonsPanel, Panel):
 +    bl_label = "Volume"
 +    bl_context = "material"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.material and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +        layout.active = False
 +
 +        mat = context.material
 +        panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Volume')
 +
 +class CyclesMaterial_PT_displacement(CyclesButtonsPanel, Panel):
 +    bl_label = "Displacement"
 +    bl_context = "material"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        return context.material and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        mat = context.material
 +        panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Displacement')
 +
 +class CyclesMaterial_PT_settings(CyclesButtonsPanel, Panel):
 +    bl_label = "Settings"
 +    bl_context = "material"
 +    bl_options = {'DEFAULT_CLOSED'}
 +
 +    @classmethod
 +    def poll(cls, context):
 +        # return context.material and CyclesButtonsPanel.poll(context)
 +        return False
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        mat = context.material
 +    
 +        row = layout.row()
 +        row.label(text="Light Group:")
 +        row.prop(mat, "light_group", text="")
 +
 +class CyclesTexture_PT_context(CyclesButtonsPanel, Panel):
 +    bl_label = ""
 +    bl_context = "texture"
 +    bl_options = {'HIDE_HEADER'}
 +    COMPAT_ENGINES = {'CYCLES'}
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        tex = context.texture
 +        space = context.space_data
 +        pin_id = space.pin_id
 +        use_pin_id = space.use_pin_id;
 +        user = context.texture_user
 +        node = context.texture_node
 +
 +        if not use_pin_id or not isinstance(pin_id, bpy.types.Texture):
 +            pin_id = None
 +
 +        if not pin_id:
 +            layout.template_texture_user()
 +
 +        if user:
 +            layout.separator()
 +
 +            split = layout.split(percentage=0.65)
 +            col = split.column()
 +
 +            if pin_id:
 +                col.template_ID(space, "pin_id")
 +            elif user:
 +                col.template_ID(user, "texture", new="texture.new")
 +            
 +            if tex:
 +                row = split.row()
 +                row.prop(tex, "use_nodes", icon="NODETREE", text="")
 +                row.label()
 +
 +                if not tex.use_nodes:
 +                    split = layout.split(percentage=0.2)
 +                    split.label(text="Type:")
 +                    split.prop(tex, "type", text="")
 +
 +class CyclesTexture_PT_nodes(CyclesButtonsPanel, Panel):
 +    bl_label = "Nodes"
 +    bl_context = "texture"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        tex = context.texture
 +        return (tex and tex.use_nodes) and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        tex = context.texture
 +        panel_node_draw(layout, tex, 'OUTPUT_TEXTURE', 'Color')
 +
 +class CyclesTexture_PT_node(CyclesButtonsPanel, Panel):
 +    bl_label = "Node"
 +    bl_context = "texture"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        node = context.texture_node
 +        return node and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +
 +        node = context.texture_node
 +        ntree = node.id_data
 +        layout.template_node_view(ntree, node, None)
 +
 +class CyclesTexture_PT_mapping(CyclesButtonsPanel, Panel):
 +    bl_label = "Mapping"
 +    bl_context = "texture"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        tex = context.texture
 +        node = context.texture_node
 +        return (node or (tex and tex.use_nodes)) and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +        layout.label("Texture coordinate mapping goes here.");
 +        layout.label("Translate, rotate, scale, projection, XYZ.")
 +
 +class CyclesTexture_PT_color(CyclesButtonsPanel, Panel):
 +    bl_label = "Color"
 +    bl_context = "texture"
 +
 +    @classmethod
 +    def poll(cls, context):
 +        tex = context.texture
 +        node = context.texture_node
 +        return (node or (tex and tex.use_nodes)) and CyclesButtonsPanel.poll(context)
 +
 +    def draw(self, context):
 +        layout = self.layout
 +        layout.label("Color modification options go here.");
 +        layout.label("Ramp, brightness, contrast, saturation.")
 +
 +def draw_device(self, context):
 +    scene = context.scene
 +    layout = self.layout
 +
 +    if scene.render.engine == "CYCLES":
 +        cscene = scene.cycles
 +
 +        available_devices = engine.available_devices()
 +        available_cuda = 'cuda' in available_devices
 +        available_opencl = 'opencl' in available_devices
 +
 +        if available_cuda or available_opencl:
 +            layout.prop(cscene, "device")
 +            if cscene.device == 'GPU' and available_cuda and available_opencl:
 +                layout.prop(cscene, "gpu_type")
 +        if cscene.device == 'CPU' and engine.with_osl():
 +            layout.prop(cscene, "shading_system")
 +
 +def draw_pause(self, context):
 +    layout = self.layout
 +    scene = context.scene
 +
 +    if scene.render.engine == "CYCLES":
 +        view = context.space_data
 +
 +        if view.viewport_shade == "RENDERED":
 +            cscene = scene.cycles
 +            layout.prop(cscene, "preview_pause", icon="PAUSE", text="")
 +
 +def get_panels():
 +    return [
 +        bpy.types.RENDER_PT_render,
 +        bpy.types.RENDER_PT_output,
 +        bpy.types.RENDER_PT_encoding,
 +        bpy.types.RENDER_PT_dimensions,
 +        bpy.types.RENDER_PT_stamp,
 +        bpy.types.WORLD_PT_context_world,
 +        bpy.types.DATA_PT_context_mesh,
 +        bpy.types.DATA_PT_context_camera,
 +        bpy.types.DATA_PT_context_lamp,
 +        bpy.types.DATA_PT_texture_space,
 +        bpy.types.DATA_PT_curve_texture_space,
 +        bpy.types.DATA_PT_mball_texture_space,
 +        bpy.types.DATA_PT_vertex_groups,
 +        bpy.types.DATA_PT_shape_keys,
 +        bpy.types.DATA_PT_uv_texture,
 +        bpy.types.DATA_PT_vertex_colors,
 +        bpy.types.DATA_PT_camera,
 +        bpy.types.DATA_PT_camera_display,
 +        bpy.types.DATA_PT_custom_props_mesh,
 +        bpy.types.DATA_PT_custom_props_camera,
 +        bpy.types.DATA_PT_custom_props_lamp,
 +        bpy.types.TEXTURE_PT_clouds,
 +        bpy.types.TEXTURE_PT_wood,
 +        bpy.types.TEXTURE_PT_marble,
 +        bpy.types.TEXTURE_PT_magic,
 +        bpy.types.TEXTURE_PT_blend,
 +        bpy.types.TEXTURE_PT_stucci,
 +        bpy.types.TEXTURE_PT_image,
 +        bpy.types.TEXTURE_PT_image_sampling,
 +        bpy.types.TEXTURE_PT_image_mapping,
 +        bpy.types.TEXTURE_PT_musgrave,
 +        bpy.types.TEXTURE_PT_voronoi,
 +        bpy.types.TEXTURE_PT_distortednoise,
 +        bpy.types.TEXTURE_PT_voxeldata,
 +        bpy.types.TEXTURE_PT_pointdensity,
 +        bpy.types.TEXTURE_PT_pointdensity_turbulence]
 +
 +def register():
 +    bpy.types.RENDER_PT_render.append(draw_device)
 +    bpy.types.VIEW3D_HT_header.append(draw_pause)
 +
 +    for panel in get_panels():
 +        panel.COMPAT_ENGINES.add('CYCLES')
 +    
 +def unregister():
 +    bpy.types.RENDER_PT_render.remove(draw_device)
 +    bpy.types.VIEW3D_HT_header.remove(draw_pause)
 +
 +    for panel in get_panels():
 +        panel.COMPAT_ENGINES.remove('CYCLES')
 +
index cba093edbad22bef2180f8e3df66e18320418cbb,0000000000000000000000000000000000000000..1f4120937731fdec971ced12a49a478cd85c95ca
mode 100644,000000..100644
--- /dev/null
@@@ -1,687 -1,0 +1,687 @@@
-       BL::RGBANodeSocket sock(get_node_output(b_node, name));
 +/*
 + * Copyright 2011, Blender Foundation.
 + *
 + * 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.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 + */
 +
 +#include "background.h"
 +#include "graph.h"
 +#include "light.h"
 +#include "nodes.h"
 +#include "scene.h"
 +#include "shader.h"
 +
 +#include "blender_sync.h"
 +#include "blender_util.h"
 +
 +#include "util_debug.h"
 +
 +CCL_NAMESPACE_BEGIN
 +
 +typedef map<void*, ShaderNode*> PtrNodeMap;
 +typedef pair<ShaderNode*, std::string> SocketPair;
 +typedef map<void*, SocketPair> PtrSockMap;
 +
 +/* Find */
 +
 +void BlenderSync::find_shader(BL::ID id, vector<uint>& used_shaders)
 +{
 +      Shader *shader = shader_map.find(id);
 +
 +      for(size_t i = 0; i < scene->shaders.size(); i++) {
 +              if(scene->shaders[i] == shader) {
 +                      used_shaders.push_back(i);
 +                      break;
 +              }
 +      }
 +}
 +
 +/* Graph */
 +
 +static BL::NodeSocket get_node_input(BL::Node *b_group_node, BL::Node b_node, const string& name)
 +{
 +      BL::Node::inputs_iterator b_in;
 +
 +      for(b_node.inputs.begin(b_in); b_in != b_node.inputs.end(); ++b_in) {
 +              if(b_in->name() == name) {
 +                      if(b_group_node) {
 +
 +                              BL::NodeTree b_ntree = BL::NodeGroup(*b_group_node).node_tree();
 +                              BL::NodeTree::links_iterator b_link;
 +
 +                              for(b_ntree.links.begin(b_link); b_link != b_ntree.links.end(); ++b_link) {
 +                                      if(b_link->to_socket().ptr.data == b_in->ptr.data) {
 +                                              BL::Node::inputs_iterator b_gin;
 +
 +                                              for(b_group_node->inputs.begin(b_gin); b_gin != b_group_node->inputs.end(); ++b_gin)
 +                                                      if(b_gin->group_socket().ptr.data == b_link->from_socket().ptr.data)
 +                                                              return *b_gin;
 +
 +                                      }
 +                              }
 +                      }
 +
 +                      return *b_in;
 +              }
 +      }
 +
 +      assert(0);
 +
 +      return *b_in;
 +}
 +
 +static BL::NodeSocket get_node_output(BL::Node b_node, const string& name)
 +{
 +      BL::Node::outputs_iterator b_out;
 +
 +      for(b_node.outputs.begin(b_out); b_out != b_node.outputs.end(); ++b_out)
 +              if(b_out->name() == name)
 +                      return *b_out;
 +
 +      assert(0);
 +
 +      return *b_out;
 +}
 +
 +static float3 get_node_output_rgba(BL::Node b_node, const string& name)
 +{
-       BL::ValueNodeSocket sock(get_node_output(b_node, name));
-       return sock.default_value()[0];
++      BL::NodeSocketRGBA sock(get_node_output(b_node, name));
 +      return get_float3(sock.default_value());
 +}
 +
 +static float get_node_output_value(BL::Node b_node, const string& name)
 +{
-       if(node != graph->output())
++      BL::NodeSocketFloatNone sock(get_node_output(b_node, name));
++      return sock.default_value();
 +}
 +
 +static ShaderNode *add_node(BL::BlendData b_data, ShaderGraph *graph, BL::Node *b_group_node, BL::ShaderNode b_node)
 +{
 +      ShaderNode *node = NULL;
 +
 +      switch(b_node.type()) {
 +              /* not supported */
 +              case BL::ShaderNode::type_CAMERA: break;
 +              case BL::ShaderNode::type_COMBRGB: break;
 +              case BL::ShaderNode::type_CURVE_RGB: break;
 +              case BL::ShaderNode::type_CURVE_VEC: break;
 +              case BL::ShaderNode::type_GEOM: break;
 +              case BL::ShaderNode::type_HUE_SAT: break;
 +              case BL::ShaderNode::type_INVERT: break;
 +              case BL::ShaderNode::type_MATERIAL: break;
 +              case BL::ShaderNode::type_MATERIAL_EXT: break;
 +              case BL::ShaderNode::type_NORMAL: break;
 +              case BL::ShaderNode::type_OUTPUT: break;
 +              case BL::ShaderNode::type_SCRIPT: break;
 +              case BL::ShaderNode::type_SEPRGB: break;
 +              case BL::ShaderNode::type_SQUEEZE: break;
 +              case BL::ShaderNode::type_TEXTURE: break;
 +              case BL::ShaderNode::type_VALTORGB: break;
 +              /* handled outside this function */
 +              case BL::ShaderNode::type_GROUP: break;
 +              /* existing blender nodes */
 +              case BL::ShaderNode::type_RGB: {
 +                      ColorNode *color = new ColorNode();
 +                      color->value = get_node_output_rgba(b_node, "Color");
 +                      node = color;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_VALUE: {
 +                      ValueNode *value = new ValueNode();
 +                      value->value = get_node_output_value(b_node, "Value");
 +                      node = value;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_MIX_RGB: {
 +                      BL::ShaderNodeMixRGB b_mix_node(b_node);
 +                      MixNode *mix = new MixNode();
 +                      mix->type = MixNode::type_enum[b_mix_node.blend_type()];
 +                      node = mix;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_RGBTOBW: {
 +                      node = new ConvertNode(SHADER_SOCKET_COLOR, SHADER_SOCKET_FLOAT);
 +                      break;
 +              }
 +              case BL::ShaderNode::type_MATH: {
 +                      BL::ShaderNodeMath b_math_node(b_node);
 +                      MathNode *math = new MathNode();
 +                      math->type = MathNode::type_enum[b_math_node.operation()];
 +                      node = math;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_VECT_MATH: {
 +                      BL::ShaderNodeVectorMath b_vector_math_node(b_node);
 +                      VectorMathNode *vmath = new VectorMathNode();
 +                      vmath->type = VectorMathNode::type_enum[b_vector_math_node.operation()];
 +                      node = vmath;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_MAPPING: {
 +                      BL::ShaderNodeMapping b_mapping_node(b_node);
 +                      MappingNode *mapping = new MappingNode();
 +                      mapping->translation = get_float3(b_mapping_node.location());
 +                      mapping->rotation = get_float3(b_mapping_node.rotation());
 +                      mapping->scale = get_float3(b_mapping_node.scale());
 +                      node = mapping;
 +                      break;
 +              }
 +
 +              /* new nodes */
 +              case BL::ShaderNode::type_OUTPUT_MATERIAL:
 +              case BL::ShaderNode::type_OUTPUT_WORLD:
 +              case BL::ShaderNode::type_OUTPUT_LAMP: {
 +                      node = graph->output();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_FRESNEL: {
 +                      node = new FresnelNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BLEND_WEIGHT: {
 +                      node = new BlendWeightNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_ADD_SHADER: {
 +                      node = new AddClosureNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_MIX_SHADER: {
 +                      node = new MixClosureNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_ATTRIBUTE: {
 +                      AttributeNode *attr = new AttributeNode();
 +                      attr->attribute = "";
 +                      node = attr;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BACKGROUND: {
 +                      node = new BackgroundNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_HOLDOUT: {
 +                      node = new HoldoutNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BSDF_ANISOTROPIC: {
 +                      node = new WardBsdfNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BSDF_DIFFUSE: {
 +                      node = new DiffuseBsdfNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BSDF_GLOSSY: {
 +                      BL::ShaderNodeBsdfGlossy b_glossy_node(b_node);
 +                      GlossyBsdfNode *glossy = new GlossyBsdfNode();
 +
 +                      switch(b_glossy_node.distribution()) {
 +                              case BL::ShaderNodeBsdfGlossy::distribution_SHARP:
 +                                      glossy->distribution = ustring("Sharp");
 +                                      break;
 +                              case BL::ShaderNodeBsdfGlossy::distribution_BECKMANN:
 +                                      glossy->distribution = ustring("Beckmann");
 +                                      break;
 +                              case BL::ShaderNodeBsdfGlossy::distribution_GGX:
 +                                      glossy->distribution = ustring("GGX");
 +                                      break;
 +                      }
 +                      node = glossy;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BSDF_GLASS: {
 +                      BL::ShaderNodeBsdfGlass b_glass_node(b_node);
 +                      GlassBsdfNode *glass = new GlassBsdfNode();
 +                      switch(b_glass_node.distribution()) {
 +                              case BL::ShaderNodeBsdfGlass::distribution_SHARP:
 +                                      glass->distribution = ustring("Sharp");
 +                                      break;
 +                              case BL::ShaderNodeBsdfGlass::distribution_BECKMANN:
 +                                      glass->distribution = ustring("Beckmann");
 +                                      break;
 +                              case BL::ShaderNodeBsdfGlass::distribution_GGX:
 +                                      glass->distribution = ustring("GGX");
 +                                      break;
 +                      }
 +                      node = glass;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BSDF_TRANSLUCENT: {
 +                      node = new TranslucentBsdfNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BSDF_TRANSPARENT: {
 +                      node = new TransparentBsdfNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_BSDF_VELVET: {
 +                      node = new VelvetBsdfNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_EMISSION: {
 +                      node = new EmissionNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_GEOMETRY: {
 +                      node = new GeometryNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_LIGHT_PATH: {
 +                      node = new LightPathNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_IMAGE: {
 +                      BL::ShaderNodeTexImage b_image_node(b_node);
 +                      BL::Image b_image(b_image_node.image());
 +                      ImageTextureNode *image = new ImageTextureNode();
 +                      /* todo: handle generated/builtin images */
 +                      if(b_image)
 +                              image->filename = blender_absolute_path(b_data, b_image, b_image.filepath());
 +                      image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
 +                      node = image;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_ENVIRONMENT: {
 +                      BL::ShaderNodeTexEnvironment b_env_node(b_node);
 +                      BL::Image b_image(b_env_node.image());
 +                      EnvironmentTextureNode *env = new EnvironmentTextureNode();
 +                      if(b_image)
 +                              env->filename = blender_absolute_path(b_data, b_image, b_image.filepath());
 +                      env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];
 +                      node = env;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_NOISE: {
 +                      node = new NoiseTextureNode();
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_BLEND: {
 +                      BL::ShaderNodeTexBlend b_blend_node(b_node);
 +                      BlendTextureNode *blend = new BlendTextureNode();
 +                      blend->progression = BlendTextureNode::progression_enum[(int)b_blend_node.progression()];
 +                      blend->axis = BlendTextureNode::axis_enum[(int)b_blend_node.axis()];
 +                      node = blend;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_VORONOI: {
 +                      BL::ShaderNodeTexVoronoi b_voronoi_node(b_node);
 +                      VoronoiTextureNode *voronoi = new VoronoiTextureNode();
 +                      voronoi->distance_metric = VoronoiTextureNode::distance_metric_enum[(int)b_voronoi_node.distance_metric()];
 +                      voronoi->coloring = VoronoiTextureNode::coloring_enum[(int)b_voronoi_node.coloring()];
 +                      node = voronoi;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_MAGIC: {
 +                      BL::ShaderNodeTexMagic b_magic_node(b_node);
 +                      MagicTextureNode *magic = new MagicTextureNode();
 +                      magic->depth = b_magic_node.turbulence_depth();
 +                      node = magic;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_MARBLE: {
 +                      BL::ShaderNodeTexMarble b_marble_node(b_node);
 +                      MarbleTextureNode *marble = new MarbleTextureNode();
 +                      marble->depth = b_marble_node.turbulence_depth();
 +                      marble->basis = MarbleTextureNode::basis_enum[(int)b_marble_node.noise_basis()];
 +                      marble->type = MarbleTextureNode::type_enum[(int)b_marble_node.marble_type()];
 +                      marble->wave = MarbleTextureNode::wave_enum[(int)b_marble_node.wave_type()];
 +                      marble->hard = b_marble_node.noise_type() == BL::ShaderNodeTexMarble::noise_type_HARD;
 +                      node = marble;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_CLOUDS: {
 +                      BL::ShaderNodeTexClouds b_clouds_node(b_node);
 +                      CloudsTextureNode *clouds = new CloudsTextureNode();
 +                      clouds->depth = b_clouds_node.turbulence_depth();
 +                      clouds->basis = CloudsTextureNode::basis_enum[(int)b_clouds_node.noise_basis()];
 +                      clouds->hard = b_clouds_node.noise_type() == BL::ShaderNodeTexClouds::noise_type_HARD;
 +                      node = clouds;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_WOOD: {
 +                      BL::ShaderNodeTexWood b_wood_node(b_node);
 +                      WoodTextureNode *wood = new WoodTextureNode();
 +                      wood->type = WoodTextureNode::type_enum[(int)b_wood_node.wood_type()];
 +                      wood->basis = WoodTextureNode::basis_enum[(int)b_wood_node.noise_basis()];
 +                      wood->hard = b_wood_node.noise_type() == BL::ShaderNodeTexWood::noise_type_HARD;
 +                      wood->wave = WoodTextureNode::wave_enum[(int)b_wood_node.wave_type()];
 +                      node = wood;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_MUSGRAVE: {
 +                      BL::ShaderNodeTexMusgrave b_musgrave_node(b_node);
 +                      MusgraveTextureNode *musgrave = new MusgraveTextureNode();
 +                      musgrave->type = MusgraveTextureNode::type_enum[(int)b_musgrave_node.musgrave_type()];
 +                      musgrave->basis = MusgraveTextureNode::basis_enum[(int)b_musgrave_node.noise_basis()];
 +                      node = musgrave;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_STUCCI: {
 +                      BL::ShaderNodeTexStucci b_stucci_node(b_node);
 +                      StucciTextureNode *stucci = new StucciTextureNode();
 +                      stucci->type = StucciTextureNode::type_enum[(int)b_stucci_node.stucci_type()];
 +                      stucci->basis = StucciTextureNode::basis_enum[(int)b_stucci_node.noise_basis()];
 +                      stucci->hard = b_stucci_node.noise_type() == BL::ShaderNodeTexStucci::noise_type_HARD;
 +                      node = stucci;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_DISTORTED_NOISE: {
 +                      BL::ShaderNodeTexDistortedNoise b_distnoise_node(b_node);
 +                      DistortedNoiseTextureNode *distnoise = new DistortedNoiseTextureNode();
 +                      distnoise->basis = DistortedNoiseTextureNode::basis_enum[(int)b_distnoise_node.noise_basis()];
 +                      distnoise->distortion_basis = DistortedNoiseTextureNode::basis_enum[(int)b_distnoise_node.noise_distortion()];
 +                      node = distnoise;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_COORD: {
 +                      node = new TextureCoordinateNode();;
 +                      break;
 +              }
 +              case BL::ShaderNode::type_TEX_SKY: {
 +                      BL::ShaderNodeTexSky b_sky_node(b_node);
 +                      SkyTextureNode *sky = new SkyTextureNode();
 +                      sky->sun_direction = get_float3(b_sky_node.sun_direction());
 +                      sky->turbidity = b_sky_node.turbidity();
 +                      node = sky;
 +                      break;
 +              }
 +      }
 +
-                                                       BL::ValueNodeSocket value_sock(sock);
-                                                       input->set(value_sock.default_value()[0]);
++      if(node && node != graph->output())
 +              graph->add(node);
 +
 +      return node;
 +}
 +
 +static const char *node_socket_map_name(const char *name)
 +{
 +      if(strstr(name, "Shader")) {
 +              if(strcmp(name, "Shader") == 0)
 +                      return "Closure";
 +              if(strcmp(name, "Shader1") == 0)
 +                      return "Closure1";
 +              if(strcmp(name, "Shader2") == 0)
 +                      return "Closure2";
 +      }
 +
 +      return name;
 +}
 +
 +static void add_nodes(BL::BlendData b_data, ShaderGraph *graph, BL::ShaderNodeTree b_ntree, BL::Node *b_group_node, PtrSockMap& sockets_map)
 +{
 +      /* add nodes */
 +      BL::ShaderNodeTree::nodes_iterator b_node;
 +      PtrNodeMap node_map;
 +      map<void*, PtrSockMap> node_groups;
 +
 +      for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
 +              if(b_node->is_a(&RNA_NodeGroup)) {
 +                      BL::NodeGroup b_gnode(*b_node);
 +                      BL::ShaderNodeTree b_group_ntree(b_gnode.node_tree());
 +
 +                      node_groups[b_node->ptr.data] = PtrSockMap();
 +                      add_nodes(b_data, graph, b_group_ntree, &b_gnode, node_groups[b_node->ptr.data]);
 +              }
 +              else {
 +                      ShaderNode *node = add_node(b_data, graph, b_group_node, BL::ShaderNode(*b_node));
 +
 +                      if(node) {
 +                              BL::Node::inputs_iterator b_input;
 +                              BL::Node::outputs_iterator b_output;
 +
 +                              node_map[b_node->ptr.data] = node;
 +
 +                              for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) {
 +                                      ShaderInput *input = node->input(node_socket_map_name(b_input->name().c_str()));
 +                                      BL::NodeSocket sock(get_node_input(b_group_node, *b_node, b_input->name()));
 +
 +                                      assert(input);
 +
 +                                      /* copy values for non linked inputs */
 +                                      switch(input->type) {
 +                                              case SHADER_SOCKET_FLOAT: {
-                                                       BL::RGBANodeSocket rgba_sock(sock);
++                                                      BL::NodeSocketFloatNone value_sock(sock);
++                                                      input->set(value_sock.default_value());
 +                                                      break;
 +                                              }
 +                                              case SHADER_SOCKET_COLOR: {
-                                                       BL::VectorNodeSocket vec_sock(sock);
++                                                      BL::NodeSocketRGBA rgba_sock(sock);
 +                                                      input->set(get_float3(rgba_sock.default_value()));
 +                                                      break;
 +                                              }
 +                                              case SHADER_SOCKET_NORMAL:
 +                                              case SHADER_SOCKET_POINT:
 +                                              case SHADER_SOCKET_VECTOR: {
++                                                      BL::NodeSocketVectorNone vec_sock(sock);
 +                                                      input->set(get_float3(vec_sock.default_value()));
 +                                                      break;
 +                                              }
 +                                              case SHADER_SOCKET_CLOSURE:
 +                                                      break;
 +                                      }
 +                              }
 +                      }
 +              }
 +      }
 +
 +      /* connect nodes */
 +      BL::NodeTree::links_iterator b_link;
 +
 +      for(b_ntree.links.begin(b_link); b_link != b_ntree.links.end(); ++b_link) {
 +              /* get blender link data */
 +              BL::Node b_from_node = b_link->from_node();
 +              BL::Node b_to_node = b_link->to_node();
 +
 +              BL::NodeSocket b_from_sock = b_link->from_socket();
 +              BL::NodeSocket b_to_sock = b_link->to_socket();
 +
 +              /* if link with group socket, add to map so we can connect it later */
 +              if(b_group_node) {
 +                      if(!b_from_node) {
 +                              sockets_map[b_from_sock.ptr.data] =
 +                                      SocketPair(node_map[b_to_node.ptr.data], b_to_sock.name());
 +
 +                              continue;
 +                      }
 +                      else if(!b_to_node) {
 +                              sockets_map[b_to_sock.ptr.data] =
 +                                      SocketPair(node_map[b_from_node.ptr.data], b_from_sock.name());
 +
 +                              continue;
 +                      }
 +              }
 +
 +              ShaderNode *from_node, *to_node;
 +              string from_name, to_name;
 +
 +              /* from sock */
 +              if(b_from_node.is_a(&RNA_NodeGroup)) {
 +                      /* group node */
 +                      BL::NodeSocket group_sock = b_from_sock.group_socket();
 +                      SocketPair& pair = node_groups[b_from_node.ptr.data][group_sock.ptr.data];
 +
 +                      from_node = pair.first;
 +                      from_name = pair.second;
 +              }
 +              else {
 +                      /* regular node */
 +                      from_node = node_map[b_from_node.ptr.data];
 +                      from_name = b_from_sock.name();
 +              }
 +
 +              /* to sock */
 +              if(b_to_node.is_a(&RNA_NodeGroup)) {
 +                      /* group node */
 +                      BL::NodeSocket group_sock = b_to_sock.group_socket();
 +                      SocketPair& pair = node_groups[b_to_node.ptr.data][group_sock.ptr.data];
 +
 +                      to_node = pair.first;
 +                      to_name = pair.second;
 +              }
 +              else {
 +                      /* regular node */
 +                      to_node = node_map[b_to_node.ptr.data];
 +                      to_name = b_to_sock.name();
 +              }
 +
 +              /* in case of groups there may not actually be a node inside the group
 +                 that the group socket connects to, so from_node or to_node may be NULL */
 +              if(from_node && to_node)
 +                      graph->connect(from_node->output(node_socket_map_name(from_name.c_str())), to_node->input(node_socket_map_name(to_name.c_str())));
 +      }
 +}
 +
 +/* Sync Materials */
 +
 +void BlenderSync::sync_materials()
 +{
 +      shader_map.set_default(scene->shaders[scene->default_surface]);
 +
 +      /* material loop */
 +      BL::BlendData::materials_iterator b_mat;
 +
 +      for(b_data.materials.begin(b_mat); b_mat != b_data.materials.end(); ++b_mat) {
 +              Shader *shader;
 +              
 +              /* test if we need to sync */
 +              if(shader_map.sync(&shader, *b_mat)) {
 +                      ShaderGraph *graph = new ShaderGraph();
 +
 +                      shader->name = b_mat->name();
 +
 +                      /* create nodes */
 +                      if(b_mat->use_nodes() && b_mat->node_tree()) {
 +                              PtrSockMap sock_to_node;
 +                              BL::ShaderNodeTree b_ntree(b_mat->node_tree());
 +
 +                              add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
 +                      }
 +                      else {
 +                              ShaderNode *closure, *out;
 +
 +                              closure = graph->add(new DiffuseBsdfNode());
 +                              closure->input("Color")->value = get_float3(b_mat->diffuse_color());
 +                              out = graph->output();
 +
 +                              graph->connect(closure->output("BSDF"), out->input("Surface"));
 +                      }
 +
 +                      shader->set_graph(graph);
 +                      shader->tag_update(scene);
 +              }
 +      }
 +}
 +
 +/* Sync World */
 +
 +void BlenderSync::sync_world()
 +{
 +      Background *background = scene->background;
 +      Background prevbackground = *background;
 +
 +      BL::World b_world = b_scene.world();
 +
 +      if(world_recalc || b_world.ptr.data != world_map) {
 +              Shader *shader = scene->shaders[scene->default_background];
 +              ShaderGraph *graph = new ShaderGraph();
 +
 +              /* create nodes */
 +              if(b_world && b_world.use_nodes() && b_world.node_tree()) {
 +                      PtrSockMap sock_to_node;
 +                      BL::ShaderNodeTree b_ntree(b_world.node_tree());
 +
 +                      add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
 +              }
 +              else if(b_world) {
 +                      ShaderNode *closure, *out;
 +
 +                      closure = graph->add(new BackgroundNode());
 +                      closure->input("Color")->value = get_float3(b_world.horizon_color());
 +                      out = graph->output();
 +
 +                      graph->connect(closure->output("Background"), out->input("Surface"));
 +              }
 +
 +              shader->set_graph(graph);
 +              shader->tag_update(scene);
 +      }
 +
 +      PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
 +      background->transparent = get_boolean(cscene, "film_transparent");
 +
 +      if(background->modified(prevbackground))
 +              background->tag_update(scene);
 +
 +      world_map = b_world.ptr.data;
 +      world_recalc = false;
 +}
 +
 +/* Sync Lamps */
 +
 +void BlenderSync::sync_lamps()
 +{
 +      shader_map.set_default(scene->shaders[scene->default_light]);
 +
 +      /* lamp loop */
 +      BL::BlendData::lamps_iterator b_lamp;
 +
 +      for(b_data.lamps.begin(b_lamp); b_lamp != b_data.lamps.end(); ++b_lamp) {
 +              Shader *shader;
 +              
 +              /* test if we need to sync */
 +              if(shader_map.sync(&shader, *b_lamp)) {
 +                      ShaderGraph *graph = new ShaderGraph();
 +
 +                      /* create nodes */
 +                      if(b_lamp->use_nodes() && b_lamp->node_tree()) {
 +                              shader->name = b_lamp->name();
 +
 +                              PtrSockMap sock_to_node;
 +                              BL::ShaderNodeTree b_ntree(b_lamp->node_tree());
 +
 +                              add_nodes(b_data, graph, b_ntree, NULL, sock_to_node);
 +                      }
 +                      else {
 +                              ShaderNode *closure, *out;
 +
 +                              closure = graph->add(new EmissionNode());
 +                              closure->input("Color")->value = get_float3(b_lamp->color());
 +                              closure->input("Strength")->value.x = b_lamp->energy()*10.0f;
 +                              out = graph->output();
 +
 +                              graph->connect(closure->output("Emission"), out->input("Surface"));
 +                      }
 +
 +                      shader->set_graph(graph);
 +                      shader->tag_update(scene);
 +              }
 +      }
 +}
 +
 +void BlenderSync::sync_shaders()
 +{
 +      shader_map.pre_sync();
 +
 +      sync_world();
 +      sync_lamps();
 +      sync_materials();
 +
 +      /* false = don't delete unused shaders, not supported */
 +      shader_map.post_sync(false);
 +}
 +
 +CCL_NAMESPACE_END
 +
index ae7013ae2934a567c80544e83b77c995b3efe23d,1de3c295f4da30af5b3640a50f245890960a40a5..d269b2932d61ff43b290d29450b0c66669226674
@@@ -63,25 -71,71 +71,72 @@@ struct Object
  
  /* ************** NODE TYPE DEFINITIONS ***** */
  
- typedef struct bNodeSocketType {
+ /** Compact definition of a node socket.
+  * Can be used to quickly define a list of static sockets for a node,
+  * which are added to each new node of that type. 
+  *
+  * \deprecated New nodes should add default sockets in the initialization
+  * function instead. This struct is mostly kept for old nodes and should
+  * be removed some time.
+  */
+ typedef struct bNodeSocketTemplate {
        int type, limit;
-       const char *name;
-       float val1, val2, val3, val4;   /* default alloc value for inputs */
-       float min, max;                                 /* default range for inputs */
+       char name[32];
+       float val1, val2, val3, val4;   /* default alloc value for inputs */
+       float min, max;
+       PropertySubType subtype;
 +      int flag;
        
        /* after this line is used internal only */
-       struct bNodeSocket *sock;               /* used during verify_types */
+       struct bNodeSocket *sock;               /* used to hold verified socket */
+ } bNodeSocketTemplate;
+ typedef void (*NodeSocketButtonFunction)(const struct bContext *C, struct uiBlock *block, 
+                                                                                struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock,
+                                                                                const char *name, int x, int y, int width);
+ /** Defines a socket type.
+  * Defines the appearance and behavior of a socket in the UI.
+  */
+ typedef struct bNodeSocketType {
+       int type;
+       char ui_name[32];
+       char ui_description[128];
+       int ui_icon;
+       char ui_color[4];
+       
+       const char *value_structname;
+       int value_structsize;
+       
+       NodeSocketButtonFunction buttonfunc;
  } bNodeSocketType;
  
+ /** Template for creating a node.
+  * Stored required parameters to make a new node of a specific type.
+  */
+ typedef struct bNodeTemplate {
+       int type;
+       
+       /* group tree */
+       struct bNodeTree *ngroup;
+ } bNodeTemplate;
+ /** Defines a node type.
+  * Initial attributes and constants for a node as well as callback functions
+  * implementing the node behavior.
+  */
  typedef struct bNodeType {
        void *next,*prev;
+       short needs_free;               /* set for allocated types that need to be freed */
+       
        int type;
-       const char *name; /* can be allocated too */
+       char name[32];
        float width, minwidth, maxwidth;
+       float height, minheight, maxheight;
        short nclass, flag;
        
-       bNodeSocketType *inputs, *outputs;
+       /* templates for static sockets */
+       bNodeSocketTemplate *inputs, *outputs;
        
        char storagename[64];                   /* struct name for DNA */
        
  #define NODE_FREEBUFS 8
  #define NODE_SKIPPED  16
  
+ /* sim_exec return value */
+ #define NODE_EXEC_FINISHED    0
+ #define NODE_EXEC_SUSPEND     1
  /* nodetype->nclass, for add-menu and themes */
- #define NODE_CLASS_INPUT              0
- #define NODE_CLASS_OUTPUT             1
- #define NODE_CLASS_OP_COLOR           3
- #define NODE_CLASS_OP_VECTOR  4
- #define NODE_CLASS_OP_FILTER  5
- #define NODE_CLASS_GROUP              6
- #define NODE_CLASS_FILE                       7
- #define NODE_CLASS_CONVERTOR  8
- #define NODE_CLASS_MATTE              9
- #define NODE_CLASS_DISTORT            10
- #define NODE_CLASS_OP_DYNAMIC 11
- #define NODE_CLASS_PATTERN            12
- #define NODE_CLASS_TEXTURE            13
- #define NODE_CLASS_SHADER             14
- /* bNodeSocketType flag */
- #define SOCK_NO_VALUE                 1
+ #define NODE_CLASS_INPUT                      0
+ #define NODE_CLASS_OUTPUT                     1
+ #define NODE_CLASS_OP_COLOR                   3
+ #define NODE_CLASS_OP_VECTOR          4
+ #define NODE_CLASS_OP_FILTER          5
+ #define NODE_CLASS_GROUP                      6
+ #define NODE_CLASS_FILE                               7
+ #define NODE_CLASS_CONVERTOR          8
+ #define NODE_CLASS_MATTE                      9
+ #define NODE_CLASS_DISTORT                    10
+ #define NODE_CLASS_OP_DYNAMIC         11
+ #define NODE_CLASS_PATTERN                    12
+ #define NODE_CLASS_TEXTURE                    13
+ #define NODE_CLASS_EXECUTION          14
+ #define NODE_CLASS_GETDATA                    15
+ #define NODE_CLASS_SETDATA                    16
+ #define NODE_CLASS_MATH                               17
+ #define NODE_CLASS_MATH_VECTOR                18
+ #define NODE_CLASS_MATH_ROTATION      19
+ #define NODE_CLASS_PARTICLES          25
+ #define NODE_CLASS_TRANSFORM          30
+ #define NODE_CLASS_COMBINE                    31
++#define NODE_CLASS_SHADER                     40
+ #define NODE_CLASS_LAYOUT                     100
  
  /* enum values for input/output */
  #define SOCK_IN               1
index 49cda7e8736705117df115bdb0170308b36f0037,89fd3ff9c1384d228cde6b1dd624be3e0b5586d1..c5392a0dec3e11300c28ac9128b75a98e15d1e00
  #include <string.h>
  #include <limits.h>
  
- #include "DNA_anim_types.h"
 +#include "DNA_action_types.h"
- #include "DNA_lamp_types.h"
- #include "DNA_material_types.h"
+ #include "DNA_anim_types.h"
  #include "DNA_node_types.h"
- #include "DNA_world_types.h"
 +#include "DNA_node_types.h"
+ #include "DNA_scene_types.h"
 -#include "DNA_action_types.h"
  
+ #include "BLI_string.h"
+ #include "BLI_math.h"
  #include "BLI_listbase.h"
- #include "RNA_access.h"
+ #include "BLI_path_util.h"
+ #include "BLI_utildefines.h"
  
  #include "BKE_animsys.h"
  #include "BKE_action.h"
@@@ -1600,98 -1077,106 +1078,105 @@@ void ntreeMakeLocal(bNodeTree *ntree
                
                newtree->id.us= 0;
                
-               if(ntree->type==NTREE_SHADER) {
-                       Material *ma;
-                       Lamp *la;
-                       World *wrld;
--
-                       for(ma= G.main->mat.first; ma; ma= ma->id.next) {
-                               if(ma->nodetree) {
-                                       bNode *node;
-                                       
-                                       /* find if group is in tree */
-                                       for(node= ma->nodetree->nodes.first; node; node= node->next) {
-                                               if(node->id == (ID *)ntree) {
-                                                       if(ma->id.lib==NULL) {
-                                                               node->id= &newtree->id;
-                                                               newtree->id.us++;
-                                                               ntree->id.us--;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
+               cd.new_id = &newtree->id;
+               treetype->foreach_nodetree(G.main, &cd, &ntreeMakeLocal_LinkNew);
+       }
+ }
  
-                       for(la= G.main->lamp.first; la; la= la->id.next) {
-                               if(la->nodetree) {
-                                       bNode *node;
-                                       
-                                       /* find if group is in tree */
-                                       for(node= la->nodetree->nodes.first; node; node= node->next) {
-                                               if(node->id == (ID *)ntree) {
-                                                       if(la->id.lib==NULL) {
-                                                               node->id= &newtree->id;
-                                                               newtree->id.us++;
-                                                               ntree->id.us--;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
+ int ntreeNodeExists(bNodeTree *ntree, bNode *testnode)
+ {
+       bNode *node= ntree->nodes.first;
+       for(; node; node= node->next)
+               if(node==testnode)
+                       return 1;
+       return 0;
+ }
  
-                       for(wrld= G.main->world.first; wrld; wrld= wrld->id.next) {
-                               if(wrld->nodetree) {
-                                       bNode *node;
-                                       
-                                       /* find if group is in tree */
-                                       for(node= wrld->nodetree->nodes.first; node; node= node->next) {
-                                               if(node->id == (ID *)ntree) {
-                                                       if(wrld->id.lib==NULL) {
-                                                               node->id= &newtree->id;
-                                                               newtree->id.us++;
-                                                               ntree->id.us--;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-               else if(ntree->type==NTREE_COMPOSIT) {
-                       Scene *sce;
-                       for(sce= G.main->scene.first; sce; sce= sce->id.next) {
-                               if(sce->nodetree) {
-                                       bNode *node;
-                                       
-                                       /* find if group is in tree */
-                                       for(node= sce->nodetree->nodes.first; node; node= node->next) {
-                                               if(node->id == (ID *)ntree) {
-                                                       if(sce->id.lib==NULL) {
-                                                               node->id= &newtree->id;
-                                                               newtree->id.us++;
-                                                               ntree->id.us--;
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-               else if(ntree->type==NTREE_TEXTURE) {
-                       Tex *tx;
-                       for(tx= G.main->tex.first; tx; tx= tx->id.next) {
-                               if(tx->nodetree) {
-                                       bNode *node;
-                                       
-                                       /* find if group is in tree */
-                                       for(node= tx->nodetree->nodes.first; node; node= node->next) {
-                                               if(node->id == (ID *)ntree) {
-                                                       if(tx->id.lib==NULL) {
-                                                               node->id= &newtree->id;
-                                                               newtree->id.us++;
-                                                               ntree->id.us--;
-                                                       }
-                                               }
-                                       }
-                               }
+ int ntreeOutputExists(bNode *node, bNodeSocket *testsock)
+ {
+       bNodeSocket *sock= node->outputs.first;
+       for(; sock; sock= sock->next)
+               if(sock==testsock)
+                       return 1;
+       return 0;
+ }
+ /* returns localized tree for execution in threads */
+ bNodeTree *ntreeLocalize(bNodeTree *ntree)
+ {
+       bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+       bNodeTree *ltree;
+       bNode *node;
+       
+       bAction *action_backup= NULL, *tmpact_backup= NULL;
+       
+       /* Workaround for copying an action on each render!
+        * set action to NULL so animdata actions dont get copied */
+       AnimData *adt= BKE_animdata_from_id(&ntree->id);
+       if(adt) {
+               action_backup= adt->action;
+               tmpact_backup= adt->tmpact;
+               adt->action= NULL;
+               adt->tmpact= NULL;
+       }
+       /* node copy func */
+       ltree= ntreeCopyTree(ntree);
+       if(adt) {
+               AnimData *ladt= BKE_animdata_from_id(&ltree->id);
+               adt->action= ladt->action= action_backup;
+               adt->tmpact= ladt->tmpact= tmpact_backup;
+               if(action_backup) action_backup->id.us++;
+               if(tmpact_backup) tmpact_backup->id.us++;
+               
+       }
+       /* end animdata uglyness */
+       /* ensures only a single output node is enabled */
+       ntreeSetOutput(ntree);
+       for(node= ntree->nodes.first; node; node= node->next) {
+               /* store new_node pointer to original */
+               node->new_node->new_node= node;
+       }
+       if (ntreetype->localize)
+               ntreetype->localize(ltree, ntree);
+       return ltree;
+ }
+ /* sync local composite with real tree */
+ /* local tree is supposed to be running, be careful moving previews! */
+ /* is called by jobs manager, outside threads, so it doesnt happen during draw */
+ void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
+ {
+       bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+       if (ntreetype->local_sync)
+               ntreetype->local_sync(localtree, ntree);
+ }
+ /* merge local tree results back, and free local tree */
+ /* we have to assume the editor already changed completely */
+ void ntreeLocalMerge(bNodeTree *localtree, bNodeTree *ntree)
+ {
+       bNodeTreeType *ntreetype= ntreeGetType(ntree->type);
+       bNode *lnode;
+       
+       /* move over the compbufs and previews */
+       for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
+               if(ntreeNodeExists(ntree, lnode->new_node)) {
+                       if(lnode->preview && lnode->preview->rect) {
+                               nodeFreePreview(lnode->new_node);
+                               lnode->new_node->preview= lnode->preview;
+                               lnode->preview= NULL;
                        }
                }
        }
@@@ -3675,54 -1850,35 +1854,60 @@@ static void registerCompositNodes(ListB
  
  static void registerShaderNodes(ListBase *ntypelist) 
  {
-       register_node_type_group(ntypelist);
+       register_node_type_frame(ntypelist);
 +
 +      register_node_type_sh_value(ntypelist);
 +      register_node_type_sh_rgb(ntypelist);
 +      register_node_type_sh_math(ntypelist);
 +      register_node_type_sh_vect_math(ntypelist);
+       
+       register_node_type_sh_group(ntypelist);
+ //    register_node_type_sh_forloop(ntypelist);
+ //    register_node_type_sh_whileloop(ntypelist);
+       
 -      register_node_type_sh_output(ntypelist);
++      //register_node_type_sh_output(ntypelist);
        register_node_type_sh_mix_rgb(ntypelist);
 -      register_node_type_sh_valtorgb(ntypelist);
        register_node_type_sh_rgbtobw(ntypelist);
 -      register_node_type_sh_normal(ntypelist);
 -      register_node_type_sh_geom(ntypelist);
        register_node_type_sh_mapping(ntypelist);
 -      register_node_type_sh_curve_vec(ntypelist);
 -      register_node_type_sh_curve_rgb(ntypelist);
 -      register_node_type_sh_math(ntypelist);
 -      register_node_type_sh_vect_math(ntypelist);
 -      register_node_type_sh_squeeze(ntypelist);
 -      register_node_type_sh_camera(ntypelist);
 -      register_node_type_sh_material(ntypelist);
 -      register_node_type_sh_material_ext(ntypelist);
 -      register_node_type_sh_value(ntypelist);
 -      register_node_type_sh_rgb(ntypelist);
 -      register_node_type_sh_texture(ntypelist);
 -//    register_node_type_sh_dynamic(ntypelist);
 -      register_node_type_sh_invert(ntypelist);
 -      register_node_type_sh_seprgb(ntypelist);
 -      register_node_type_sh_combrgb(ntypelist);
 -      register_node_type_sh_hue_sat(ntypelist);
 +      //register_node_type_sh_texture(ntypelist);
 +
 +      register_node_type_sh_attribute(ntypelist);
 +      register_node_type_sh_geometry(ntypelist);
 +      register_node_type_sh_light_path(ntypelist);
 +      register_node_type_sh_fresnel(ntypelist);
 +      register_node_type_sh_blend_weight(ntypelist);
 +      register_node_type_sh_tex_coord(ntypelist);
 +
 +      register_node_type_sh_background(ntypelist);
 +      register_node_type_sh_bsdf_diffuse(ntypelist);
 +      register_node_type_sh_bsdf_glass(ntypelist);
 +      register_node_type_sh_bsdf_glossy(ntypelist);
 +      register_node_type_sh_bsdf_translucent(ntypelist);
 +      register_node_type_sh_bsdf_transparent(ntypelist);
 +      register_node_type_sh_bsdf_velvet(ntypelist);
 +      register_node_type_sh_emission(ntypelist);
 +      register_node_type_sh_mix_shader(ntypelist);
 +      register_node_type_sh_add_shader(ntypelist);
 +      register_node_type_sh_holdout(ntypelist);
 +
 +      register_node_type_sh_output_lamp(ntypelist);
 +      register_node_type_sh_output_material(ntypelist);
 +      //register_node_type_sh_output_texture(ntypelist);
 +      register_node_type_sh_output_world(ntypelist);
 +
 +      register_node_type_sh_tex_blend(ntypelist);
 +      register_node_type_sh_tex_clouds(ntypelist);
 +      register_node_type_sh_tex_distnoise(ntypelist);
 +      register_node_type_sh_tex_image(ntypelist);
 +      register_node_type_sh_tex_environment(ntypelist);
 +      register_node_type_sh_tex_magic(ntypelist);
 +      register_node_type_sh_tex_marble(ntypelist);
 +      register_node_type_sh_tex_musgrave(ntypelist);
 +      register_node_type_sh_tex_noise(ntypelist);
 +      register_node_type_sh_tex_sky(ntypelist);
 +      register_node_type_sh_tex_stucci(ntypelist);
 +      register_node_type_sh_tex_voronoi(ntypelist);
 +      register_node_type_sh_tex_wood(ntypelist);
  }
  
  static void registerTextureNodes(ListBase *ntypelist)
index 44dfdbddfa144a610827112f96f3cff8b8ed993e,d0c34376aea6ed26418306ee4e111403f9cb822a..ff01a064fe85aa100c3f0013fdc92ecfca0b63ec
@@@ -2054,6 -2054,17 +2056,61 @@@ static void lib_link_nodetree(FileData 
        }
  }
  
++static void ntree_tmp_cycles_version_patch(bNodeTree *ntree)
++{
++      bNode *node;
++      bNodeSocket *sock;
++
++      for(node=ntree->nodes.first; node; node=node->next) {
++              if(node->type == SH_NODE_FRESNEL) {
++
++                      for(sock=node->inputs.first; sock; sock=sock->next) {
++                              if(strcmp(sock->name, "Fresnel") == 0) {
++                                      bNodeSocket *osock;
++
++                                      node->type = SH_NODE_BLEND_WEIGHT;
++                                      strcpy(sock->name, "Blend");
++
++                                      for(osock=node->outputs.first; osock; osock=osock->next)
++                                              if(strcmp(osock->name, "Fac") == 0)
++                                                      strcpy(osock->name, "Fresnel");
++                              }
++                      }
++              }
++              else {
++                      for(sock=node->inputs.first; sock; sock=sock->next) {
++                              if(strcmp(sock->name, "Closure1") == 0)
++                                      strcpy(sock->name, "Shader1");
++
++                              if(strcmp(sock->name, "Closure2") == 0)
++                                      strcpy(sock->name, "Shader2");
++
++                              if(strcmp(sock->name, "Fresnel") == 0) {
++                                      strcpy(sock->name, "IOR");
++                                      sock->ns.vec[0] = 1.0f/MAX2(1.0f - sock->ns.vec[0], 1e-5f);
++                              }
++                      }
++
++                      for(sock=node->outputs.first; sock; sock=sock->next)
++                              if(strcmp(sock->name, "Closure") == 0)
++                                      strcpy(sock->name, "Shader");
++              }
++      }
++}
++
+ static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), bNodeTree *ntree)
+ {
+       bNode *node;
++
++      ntree_tmp_cycles_version_patch(ntree);
+       
+       ntreeInitTypes(ntree);
+       
+       /* XXX could be replaced by do_versions for new nodes */
+       for (node=ntree->nodes.first; node; node=node->next)
+               node_verify_socket_templates(ntree, node);
+ }
  /* updates group node socket own_index so that
   * external links to/from the group node are preserved.
   */
@@@ -2158,87 -2135,57 +2181,58 @@@ static void lib_verify_nodetree(Main *m
                        reinit_nodesystem();
                }*/
        
-       /* now create the own typeinfo structs an verify nodes */
-       /* here we still assume no groups in groups */
-       for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
-               ntree_tmp_cycles_version_patch(ntree);
-               ntreeVerifyTypes(ntree);                /* internal nodes, no groups! */
+       /* set node->typeinfo pointers */
+       for (i=0; i < NUM_NTREE_TYPES; ++i) {
+               ntreetype= ntreeGetType(i);
+               if (ntreetype && ntreetype->foreach_nodetree)
+                       ntreetype->foreach_nodetree(main, NULL, lib_nodetree_init_types_cb);
        }
 -              ntreeInitTypes(ntree);
+       for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
++              lib_nodetree_init_types_cb(NULL, NULL, ntree);
        
        {
-               /*int has_old_groups=0;*/ /*UNUSED*/
+               int has_old_groups=0;
                /* XXX this should actually be part of do_versions, but since we need
                 * finished library linking, it is not possible there. Instead in do_versions
                 * we have set the NTREE_DO_VERSIONS flag, so at this point we can do the
                 * actual group node updates.
                 */
                for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
-                       if (ntree->flag & NTREE_DO_VERSIONS) {
+                       if (ntree->flag & NTREE_DO_VERSIONS_GROUP_EXPOSE) {
                                /* this adds copies and links from all unlinked internal sockets to group inputs/outputs. */
-                               nodeGroupExposeAllSockets(ntree);
-                               /*has_old_groups = 1;*/ /*UNUSED*/
-                       }
-               }
-               /* now verify all types in material trees, groups are set OK now */
-               for(ma= main->mat.first; ma; ma= ma->id.next) {
-                       if(ma->nodetree) {
-                               ntree_tmp_cycles_version_patch(ma->nodetree);
-                               lib_nodetree_do_versions_group(ma->nodetree);
-                       }
-               }
-               /* and scene trees */
-               for(sce= main->scene.first; sce; sce= sce->id.next) {
-                       if(sce->nodetree)
-                               lib_nodetree_do_versions_group(sce->nodetree);
-               }
-               /* and texture trees */
-               for(tx= main->tex.first; tx; tx= tx->id.next) {
-                       if(tx->nodetree)
-                               lib_nodetree_do_versions_group(tx->nodetree);
-               }
-               /* and world trees */
-               for(wrld= main->world.first; wrld; wrld= wrld->id.next) {
-                       if(wrld->nodetree) {
-                               ntree_tmp_cycles_version_patch(wrld->nodetree);
-                               lib_nodetree_do_versions_group(wrld->nodetree);
+                               node_group_expose_all_sockets(ntree);
+                               has_old_groups = 1;
                        }
                }
-               /* and lamp trees */
-               for(la= main->lamp.first; la; la= la->id.next) {
-                       if(la->nodetree) {
-                               ntree_tmp_cycles_version_patch(la->nodetree);
-                               lib_nodetree_do_versions_group(la->nodetree);
+               
+               if (has_old_groups) {
+                       for (i=0; i < NUM_NTREE_TYPES; ++i) {
+                               ntreetype= ntreeGetType(i);
+                               if (ntreetype && ntreetype->foreach_nodetree)
+                                       ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_group_indices_cb);
                        }
                }
-                       
+               
                for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
-                       ntree->flag &= ~NTREE_DO_VERSIONS;
-       }
-       /* now verify all types in material trees, groups are set OK now */
-       for(ma= main->mat.first; ma; ma= ma->id.next) {
-               if(ma->nodetree)
-                       ntreeVerifyTypes(ma->nodetree);
+                       ntree->flag &= ~NTREE_DO_VERSIONS_GROUP_EXPOSE;
        }
-       /* and world trees */
-       for(wrld= main->world.first; wrld; wrld= wrld->id.next) {
-               if(wrld->nodetree)
-                       ntreeVerifyTypes(wrld->nodetree);
-       }
-       /* and lamp trees */
-       for(la= main->lamp.first; la; la= la->id.next) {
-               if(la->nodetree)
-                       ntreeVerifyTypes(la->nodetree);
-       }
-       /* and scene trees */
-       for(sce= main->scene.first; sce; sce= sce->id.next) {
-               if(sce->nodetree)
-                       ntreeVerifyTypes(sce->nodetree);
+       
+       /* verify all group user nodes */
+       for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next) {
+               ntreeVerifyNodes(main, &ntree->id);
        }
-       /* and texture trees */
-       for(tx= main->tex.first; tx; tx= tx->id.next) {
-               if(tx->nodetree)
-                       ntreeVerifyTypes(tx->nodetree);
+       
+       /* make update calls where necessary */
+       {
+               for(ntree= main->nodetree.first; ntree; ntree= ntree->id.next)
+                       if (ntree->update)
+                               ntreeUpdateTree(ntree);
++
+               for (i=0; i < NUM_NTREE_TYPES; ++i) {
+                       ntreetype= ntreeGetType(i);
+                       if (ntreetype && ntreetype->foreach_nodetree)
+                               ntreetype->foreach_nodetree(main, NULL, lib_nodetree_do_versions_update_cb);
+               }
        }
  }
  
@@@ -5041,19 -4996,22 +5058,26 @@@ static void lib_link_screen(FileData *f
                                                SpaceNode *snode= (SpaceNode *)sl;
                                                
                                                snode->id= newlibadr(fd, sc->id.lib, snode->id);
+                                               snode->edittree= NULL;
                                                
-                                               /* internal data, a bit patchy */
-                                               if(snode->id) {
-                                                       if(GS(snode->id->name)==ID_MA)
-                                                               snode->nodetree= ((Material *)snode->id)->nodetree;
-                                                       else if(GS(snode->id->name)==ID_WO)
-                                                               snode->nodetree= ((World *)snode->id)->nodetree;
-                                                       else if(GS(snode->id->name)==ID_LA)
-                                                               snode->nodetree= ((Lamp *)snode->id)->nodetree;
-                                                       else if(GS(snode->id->name)==ID_SCE)
-                                                               snode->nodetree= ((Scene *)snode->id)->nodetree;
-                                                       else if(GS(snode->id->name)==ID_TE)
-                                                               snode->nodetree= ((Tex *)snode->id)->nodetree;
+                                               if (ELEM3(snode->treetype, NTREE_COMPOSIT, NTREE_SHADER, NTREE_TEXTURE)) {
+                                                       /* internal data, a bit patchy */
+                                                       snode->nodetree= NULL;
+                                                       if(snode->id) {
+                                                               if(GS(snode->id->name)==ID_MA)
+                                                                       snode->nodetree= ((Material *)snode->id)->nodetree;
++                                                              else if(GS(snode->id->name)==ID_WO)
++                                                                      snode->nodetree= ((World *)snode->id)->nodetree;
++                                                              else if(GS(snode->id->name)==ID_LA)
++                                                                      snode->nodetree= ((Lamp *)snode->id)->nodetree;
+                                                               else if(GS(snode->id->name)==ID_SCE)
+                                                                       snode->nodetree= ((Scene *)snode->id)->nodetree;
+                                                               else if(GS(snode->id->name)==ID_TE)
+                                                                       snode->nodetree= ((Tex *)snode->id)->nodetree;
+                                                       }
+                                               }
+                                               else {
+                                                       snode->nodetree= newlibadr_us(fd, sc->id.lib, snode->nodetree);
                                                }
                                                
                                                snode->linkdrag.first = snode->linkdrag.last = NULL;
@@@ -7039,6 -6980,62 +7062,89 @@@ static void do_version_bone_roll_256(Bo
                do_version_bone_roll_256(child);
  }
  
 -      for (sock=ntree->inputs.first; sock; sock=sock->next)
 -              sock->flag |= SOCK_DYNAMIC;
 -      for (sock=ntree->outputs.first; sock; sock=sock->next)
 -              sock->flag |= SOCK_DYNAMIC;
+ static void do_versions_socket_default_value(bNodeSocket *sock)
+ {
+       bNodeSocketValueFloat *valfloat;
+       bNodeSocketValueVector *valvector;
+       bNodeSocketValueRGBA *valrgba;
+       
+       if (sock->default_value)
+               return;
+       
+       switch (sock->type) {
+       case SOCK_FLOAT:
+               valfloat = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
+               valfloat->value = sock->ns.vec[0];
+               valfloat->min = sock->ns.min;
+               valfloat->max = sock->ns.max;
+               valfloat->subtype = PROP_NONE;
+               break;
+       case SOCK_VECTOR:
+               valvector = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
+               copy_v3_v3(valvector->value, sock->ns.vec);
+               valvector->min = sock->ns.min;
+               valvector->max = sock->ns.max;
+               valvector->subtype = PROP_NONE;
+               break;
+       case SOCK_RGBA:
+               valrgba = sock->default_value = MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
+               copy_v4_v4(valrgba->value, sock->ns.vec);
+               break;
+       }
+ }
+ static void do_versions_nodetree_default_value(bNodeTree *ntree)
+ {
+       bNode *node;
+       bNodeSocket *sock;
+       for (node=ntree->nodes.first; node; node=node->next) {
+               for (sock=node->inputs.first; sock; sock=sock->next)
+                       do_versions_socket_default_value(sock);
+               for (sock=node->outputs.first; sock; sock=sock->next)
+                       do_versions_socket_default_value(sock);
+       }
+       for (sock=ntree->inputs.first; sock; sock=sock->next)
+               do_versions_socket_default_value(sock);
+       for (sock=ntree->outputs.first; sock; sock=sock->next)
+               do_versions_socket_default_value(sock);
+ }
++static void do_versions_nodetree_clear_dynamic_sockets(bNodeTree *ntree)
++{
++      /* conflict with cycles flag .. */
++      bNodeSocket *sock;
++
++      for (sock=ntree->inputs.first; sock; sock=sock->next) {
++              if (sock->flag & SOCK_DYNAMIC) {
++                      sock->flag &= ~SOCK_DYNAMIC;
++                      sock->flag |= SOCK_COLLAPSED;
++              }
++      }
++      for (sock=ntree->outputs.first; sock; sock=sock->next) {
++              if (sock->flag & SOCK_DYNAMIC) {
++                      sock->flag &= ~SOCK_DYNAMIC;
++                      sock->flag |= SOCK_COLLAPSED;
++              }
++      }
++}
++
+ static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree)
+ {
+       bNodeSocket *sock;
++      for (sock=ntree->inputs.first; sock; sock=sock->next) {
++              if(sock->flag & SOCK_DYNAMIC)
++                      sock->flag |= SOCK_COLLAPSED;
++              else
++                      sock->flag |= SOCK_DYNAMIC;
++      }
++      for (sock=ntree->outputs.first; sock; sock=sock->next) {
++              if(sock->flag & SOCK_DYNAMIC)
++                      sock->flag |= SOCK_COLLAPSED;
++              else
++                      sock->flag |= SOCK_DYNAMIC;
++      }
+ }
  static void do_versions(FileData *fd, Library *lib, Main *main)
  {
        /* WATCH IT!!!: pointers from libdata have not been converted */
                }
        }
  
+       if (main->versionfile < 259 || (main->versionfile == 259 && main->subversionfile < 2)){
+               {
+                       /* Convert default socket values from bNodeStack */
+                       Scene *sce;
+                       Material *mat;
++                      Lamp *la;
+                       Tex *tex;
+                       bNodeTree *ntree;
++                      World *wo;
++
+                       for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
+                               do_versions_nodetree_default_value(ntree);
+                               ntree->update |= NTREE_UPDATE;
+                       }
+                       for (sce=main->scene.first; sce; sce=sce->id.next)
+                               if (sce->nodetree) {
++                              do_versions_nodetree_clear_dynamic_sockets(sce->nodetree);
+                               do_versions_nodetree_default_value(sce->nodetree);
+                               sce->nodetree->update |= NTREE_UPDATE;
+                       }
+                       for (mat=main->mat.first; mat; mat=mat->id.next)
+                               if (mat->nodetree) {
++                              do_versions_nodetree_clear_dynamic_sockets(mat->nodetree);
+                               do_versions_nodetree_default_value(mat->nodetree);
+                               mat->nodetree->update |= NTREE_UPDATE;
+                       }
++                      for (la=main->lamp.first; la; la=la->id.next)
++                              if (la->nodetree) {
++                              do_versions_nodetree_clear_dynamic_sockets(la->nodetree);
++                              do_versions_nodetree_default_value(la->nodetree);
++                              la->nodetree->update |= NTREE_UPDATE;
++                      }
++                      for (wo=main->world.first; wo; wo=wo->id.next)
++                              if (wo->nodetree) {
++                              do_versions_nodetree_clear_dynamic_sockets(wo->nodetree);
++                              do_versions_nodetree_default_value(wo->nodetree);
++                              wo->nodetree->update |= NTREE_UPDATE;
++                      }
+                       for (tex=main->tex.first; tex; tex=tex->id.next)
+                               if (tex->nodetree) {
++                              do_versions_nodetree_clear_dynamic_sockets(tex->nodetree);
+                               do_versions_nodetree_default_value(tex->nodetree);
+                               tex->nodetree->update |= NTREE_UPDATE;
+                       }
+               }
+               /* add SOCK_DYNAMIC flag to existing group sockets */
+               {
+                       bNodeTree *ntree;
+                       /* only need to do this for trees in main, local trees are not used as groups */
+                       for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next) {
+                               do_versions_nodetree_dynamic_sockets(ntree);
+                               ntree->update |= NTREE_UPDATE;
+                       }
+               }
+               {
+                       /* Initialize group tree nodetypes.
+                        * These are used to distinguish tree types and
+                        * associate them with specific node types for polling.
+                        */
+                       bNodeTree *ntree;
+                       /* all node trees in main->nodetree are considered groups */
+                       for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
+                               ntree->nodetype = NODE_GROUP;
+               }
+       }
        /* put compatibility code here until next subversion bump */
  
        {
index 09aaef424955fb29ccd513935f2223b756c54291,1cbf45960d33bc4a1a64b3c7efecf9027d075696..f2eab51c5b96d52302427978595332db9da18dfe
@@@ -57,12 -59,10 +59,13 @@@ void ED_node_texture_default(struct Te
  void ED_node_link_intersect_test(struct ScrArea *sa, int test);
  void ED_node_link_insert(struct ScrArea *sa);
  
- void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
+ void ED_node_update_hierarchy(struct bContext *C, struct bNodeTree *ntree);
  
 -/* node ops.c */
+ void ED_node_set_active(struct Main *bmain, struct bNodeTree *ntree, struct bNode *node);
 +/* node_layout.c */
 +void ED_node_tree_auto_layout(struct bNodeTree *ntree, struct bNode *root);
 +
 +/* node_ops.c */
  void ED_operatormacros_node(void);
  
  #endif /* ED_NODE_H */
index 39d3755af51a7c0105b195a97fcd9d6b1a6cb021,0000000000000000000000000000000000000000..354423a4db37ae315b9ef0b294aaf7d3ac6e8695
mode 100644,000000..100644
--- /dev/null
@@@ -1,584 -1,0 +1,585 @@@
-                       if(arg->ngroup)
-                               node_from = nodeAddNodeType(ntree, NODE_GROUP, arg->ngroup, NULL);
 +/*
 + * $Id$
 + *
 + * ***** BEGIN GPL LICENSE BLOCK *****
 + *
 + * 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.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software Foundation,
 + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 + *
 + * Contributor(s): Blender Foundation 2009.
 + *
 + * ***** END GPL LICENSE BLOCK *****
 + */
 +
 +/** \file blender/editors/interface/interface_node.c
 + *  \ingroup edinterface
 + */
 +
 +#include <stdlib.h>
 +#include <stddef.h>
 +#include <string.h>
 +
 +#include "MEM_guardedalloc.h"
 +
 +#include "DNA_node_types.h"
 +#include "DNA_screen_types.h"
 +
 +#include "BLI_listbase.h"
 +#include "BLI_string.h"
 +#include "BLI_utildefines.h"
 +
 +#include "BKE_context.h"
 +#include "BKE_depsgraph.h"
 +#include "BKE_library.h"
 +#include "BKE_main.h"
 +#include "BKE_node.h"
 +
 +#include "RNA_access.h"
 +
 +#include "WM_api.h"
 +#include "WM_types.h"
 +
 +#include "UI_interface.h"
 +#include "interface_intern.h"
 +
 +#include "ED_node.h"
 +
 +/************************* Node Link Menu **************************/
 +
 +#define UI_NODE_LINK_ADD              0
 +#define UI_NODE_LINK_DISCONNECT       -1
 +#define UI_NODE_LINK_REMOVE           -2
 +
 +typedef struct NodeLinkArg {
 +      bNodeTree *ntree;
 +      bNode *node;
 +      bNodeSocket *sock;
 +
 +      bNodeTree *ngroup;
 +      int type;
 +      int output;
 +} NodeLinkArg;
 +
 +static void ui_node_tag_recursive(bNode *node)
 +{
 +      bNodeSocket *input;
 +
 +      if(!node || (node->flag & NODE_TEST))
 +              return; /* in case of cycles */
 +      
 +      node->flag |= NODE_TEST;
 +
 +      for(input=node->inputs.first; input; input=input->next)
 +              if(input->link)
 +                      ui_node_tag_recursive(input->link->fromnode);
 +}
 +
 +static void ui_node_clear_recursive(bNode *node)
 +{
 +      bNodeSocket *input;
 +
 +      if(!node || !(node->flag & NODE_TEST))
 +              return; /* in case of cycles */
 +      
 +      node->flag &= ~NODE_TEST;
 +
 +      for(input=node->inputs.first; input; input=input->next)
 +              if(input->link)
 +                      ui_node_clear_recursive(input->link->fromnode);
 +}
 +
 +static void ui_node_remove_linked(bNodeTree *ntree, bNode *rem_node)
 +{
 +      bNode *node, *next;
 +      bNodeSocket *sock;
 +
 +      if(!rem_node)
 +              return;
 +
 +      /* tag linked nodes to be removed */
 +      for(node=ntree->nodes.first; node; node=node->next)
 +              node->flag &= ~NODE_TEST;
 +      
 +      ui_node_tag_recursive(rem_node);
 +
 +      /* clear tags on nodes that are still used by other nodes */
 +      for(node=ntree->nodes.first; node; node=node->next)
 +              if(!(node->flag & NODE_TEST))
 +                      for(sock=node->inputs.first; sock; sock=sock->next)
 +                              if(sock->link && sock->link->fromnode != rem_node)
 +                                      ui_node_clear_recursive(sock->link->fromnode);
 +
 +      /* remove nodes */
 +      for(node=ntree->nodes.first; node; node=next) {
 +              next = node->next;
 +
 +              if(node->flag & NODE_TEST) {
 +                      if(node->id)
 +                              node->id->us--;
 +                      nodeFreeNode(ntree, node);
 +              }
 +      }
 +      
 +      //node_tree_verify_groups(ntree);
 +}
 +
 +static void ui_node_sock_name(bNodeSocket *sock, char name[UI_MAX_NAME_STR])
 +{
 +      if(sock->link && sock->link->fromnode) {
 +              bNode *node = sock->link->fromnode;
 +
 +              if(node->type == NODE_GROUP)
 +                      BLI_strncpy(name, node->id->name+2, UI_MAX_NAME_STR);
 +              else
 +                      BLI_strncpy(name, node->typeinfo->name, UI_MAX_NAME_STR);
 +
 +              if(node->inputs.first == NULL &&
 +                 node->outputs.first != node->outputs.last &&
 +                 !(node->typeinfo->flag & NODE_OPTIONS))
 +                      BLI_snprintf(name, UI_MAX_NAME_STR, "%s | %s", name, sock->link->fromsock->name);
 +      }
 +      else if(sock->type == SOCK_SHADER)
 +              BLI_strncpy(name, "None", UI_MAX_NAME_STR);
 +      else
 +              BLI_strncpy(name, "Default", UI_MAX_NAME_STR);
 +}
 +
 +static void ui_node_link(bContext *C, void *arg_p, void *event_p)
 +{
 +      NodeLinkArg *arg = (NodeLinkArg*)arg_p;
 +      bNode *node_to = arg->node;
 +      bNodeSocket *sock_to = arg->sock;
 +      bNodeTree *ntree = arg->ntree;
 +      bNode *node_from;
 +      bNodeSocket *sock_from;
 +      int event = GET_INT_FROM_POINTER(event_p);
 +
 +      if(event == UI_NODE_LINK_DISCONNECT) {
 +              /* disconnect */
 +              if(sock_to->link)
 +                      nodeRemLink(ntree, sock_to->link);
 +      }
 +      else if(event == UI_NODE_LINK_REMOVE) {
 +              /* remove */
 +              if(sock_to->link)
 +                      ui_node_remove_linked(ntree, sock_to->link->fromnode);
 +      }
 +      else {
 +              bNode *node_prev = NULL;
 +
 +              /* unlink existing node */
 +              if(sock_to->link) {
 +                      node_prev = sock_to->link->fromnode;
 +                      nodeRemLink(ntree, sock_to->link);
 +              }
 +
 +              /* find existing node that we can use */
 +              for(node_from=ntree->nodes.first; node_from; node_from=node_from->next)
 +                      if(node_from->type == arg->type)
 +                              break;
 +
 +              if(node_from)
 +                      if(!(node_from->inputs.first == NULL && !(node_from->typeinfo->flag & NODE_OPTIONS)))
 +                              node_from = NULL;
 +
 +              if(node_prev && node_prev->type == arg->type &&
 +                      (arg->type != NODE_GROUP || node_prev->id == &arg->ngroup->id)) {
 +                      /* keep the previous node if it's the same type */
 +                      node_from = node_prev;
 +              }
 +              else if(!node_from) {
++                      bNodeTemplate ntemp;
++
 +                      /* add new node */
-                               node_from = nodeAddNodeType(ntree, arg->type, NULL, NULL);
++                      if(arg->ngroup) {
++                              ntemp.type = NODE_GROUP;
++                              ntemp.ngroup = arg->ngroup;
++                      }
 +                      else
-                                               memcpy(sock_from->ns.vec, sock_prev->ns.vec, sizeof(sock_from->ns.vec));
++                              ntemp.type = arg->type;
 +
++                      node_from= nodeAddNode(ntree, &ntemp);
 +                      node_from->locx = node_to->locx - (node_from->typeinfo->width + 50);
 +                      node_from->locy = node_to->locy;
 +
 +                      if(node_from->id)
 +                              id_us_plus(node_from->id);
 +              }
 +
 +              nodeSetActive(ntree, node_from);
 +
 +              /* add link */
 +              sock_from = BLI_findlink(&node_from->outputs, arg->output);
 +              nodeAddLink(ntree, node_from, sock_from, node_to, sock_to);
 +
 +              /* copy input sockets from previous node */
 +              if(node_prev && node_from != node_prev) {
 +                      bNodeSocket *sock_prev, *sock_from;
 +
 +                      for(sock_prev=node_prev->inputs.first; sock_prev; sock_prev=sock_prev->next) {
 +                              for(sock_from=node_from->inputs.first; sock_from; sock_from=sock_from->next) {
 +                                      if(strcmp(sock_prev->name, sock_from->name) == 0 && sock_prev->type == sock_from->type) {
 +                                              bNodeLink *link = sock_prev->link;
 +
 +                                              if(link && link->fromnode) {
 +                                                      nodeAddLink(ntree, link->fromnode, link->fromsock, node_from, sock_from);
 +                                                      nodeRemLink(ntree, link);
 +                                              }
 +
-       ntreeSolveOrder(ntree);
++                                              if(sock_prev->default_value) {
++                                                      if(sock_from->default_value)
++                                                              MEM_freeN(sock_from->default_value);
++
++                                                      sock_from->default_value = MEM_dupallocN(sock_prev->default_value);
++                                              }
 +                                      }
 +                              }
 +                      }
 +
 +                      /* remove node */
 +                      ui_node_remove_linked(ntree, node_prev);
 +              }
 +
 +              NodeTagChanged(ntree, node_from);
 +      }
 +
 +      NodeTagChanged(ntree, node_to);
- static bNodeSocketType *ui_node_input_socket_type(bNode *node, bNodeSocket *sock)
- {
-       if(node->type == NODE_GROUP)
-               return NULL;
-       
-       return &node->typeinfo->inputs[BLI_findindex(&node->inputs, sock)];
- }
++      ntreeUpdateTree(ntree);
 +
 +      ED_node_generic_update(CTX_data_main(C), ntree, node_to);
 +}
 +
 +static int ui_compatible_sockets(int typeA, int typeB)
 +{
 +      if(typeA == SOCK_SHADER || typeB == SOCK_SHADER)
 +              return (typeA == typeB);
 +      
 +      return (typeA == typeB);
 +}
 +
-               for(ntype=ntree->alltypes.first; ntype; ntype=ntype->next) {
-                       bNodeSocketType *stype;
 +static void ui_node_menu_column(Main *bmain, NodeLinkArg *arg, uiLayout *layout, const char *cname, int nclass)
 +{
 +      bNodeTree *ntree = arg->ntree;
 +      bNodeSocket *sock = arg->sock;
 +      uiLayout *column = NULL;
 +      uiBlock *block = uiLayoutGetBlock(layout);
 +      uiBut *but;
 +      bNodeType *ntype;
 +      bNodeTree *ngroup;
 +      NodeLinkArg *argN;
 +      int first = 1;
 +
 +      if(nclass == NODE_CLASS_GROUP) {
 +              for(ngroup=bmain->nodetree.first; ngroup; ngroup=ngroup->id.next) {
 +                      bNodeSocket *gsock;
 +                      char name[UI_MAX_NAME_STR];
 +                      int i, j, num = 0;
 +
 +                      if(ngroup->type != ntree->type)
 +                              continue;
 +
 +                      for(gsock=ngroup->inputs.first; gsock; gsock=gsock->next)
 +                              if(ui_compatible_sockets(gsock->type, sock->type))
 +                                      num++;
 +
 +                      for(i=0, j=0, gsock=ngroup->outputs.first; gsock; gsock=gsock->next, i++) {
 +                              if(!ui_compatible_sockets(gsock->type, sock->type))
 +                                      continue;
 +
 +                              if(first) {
 +                                      column= uiLayoutColumn(layout, 0);
 +                                      uiBlockSetCurLayout(block, column);
 +
 +                                      uiItemL(column, cname, ICON_NONE);
 +                                      but= block->buttons.last;
 +                                      but->flag= UI_TEXT_LEFT;
 +
 +                                      first = 0;
 +                              }
 +
 +                              if(num > 1) {
 +                                      if(j == 0) {
 +                                              uiItemL(column, ngroup->id.name+2, ICON_NONE);
 +                                              but= block->buttons.last;
 +                                              but->flag= UI_TEXT_LEFT;
 +                                      }
 +
 +                                      BLI_snprintf(name, UI_MAX_NAME_STR, "  %s", gsock->name);
 +                                      j++;
 +                              }
 +                              else
 +                                      BLI_strncpy(name, ngroup->id.name+2, UI_MAX_NAME_STR);
 +
 +                              but = uiDefBut(block, BUT, 0, ngroup->id.name+2, 0, 0, UI_UNIT_X*4, UI_UNIT_Y,
 +                                      NULL, 0.0, 0.0, 0.0, 0.0, "Add node to input");
 +
 +                              argN = MEM_dupallocN(arg);
 +                              argN->ngroup = ngroup;
 +                              argN->output = i;
 +                              uiButSetNFunc(but, ui_node_link, argN, NULL);
 +                      }
 +              }
 +      }
 +      else {
-                       for(i=0, stype=ntype->outputs; stype && stype->type != -1; stype++, i++)
-                               if(ui_compatible_sockets(stype->type, sock->type))
++              bNodeTreeType *ttype= ntreeGetType(ntree->type);
++
++              for(ntype=ttype->node_types.first; ntype; ntype=ntype->next) {
++                      bNodeSocketTemplate *stemp;
 +                      char name[UI_MAX_NAME_STR];
 +                      int i, j, num = 0;
 +
 +                      if(ntype->nclass != nclass)
 +                              continue;
 +
-                       for(i=0, j=0, stype=ntype->outputs; stype && stype->type != -1; stype++, i++) {
-                               if(!ui_compatible_sockets(stype->type, sock->type))
++                      for(i=0, stemp=ntype->outputs; stemp && stemp->type != -1; stemp++, i++)
++                              if(ui_compatible_sockets(stemp->type, sock->type))
 +                                      num++;
 +
-                                       BLI_snprintf(name, UI_MAX_NAME_STR, "  %s", stype->name);
++                      for(i=0, j=0, stemp=ntype->outputs; stemp && stemp->type != -1; stemp++, i++) {
++                              if(!ui_compatible_sockets(stemp->type, sock->type))
 +                                      continue;
 +
 +                              if(first) {
 +                                      column= uiLayoutColumn(layout, 0);
 +                                      uiBlockSetCurLayout(block, column);
 +
 +                                      uiItemL(column, cname, ICON_NONE);
 +                                      but= block->buttons.last;
 +                                      but->flag= UI_TEXT_LEFT;
 +
 +                                      first = 0;
 +                              }
 +
 +                              if(num > 1) {
 +                                      if(j == 0) {
 +                                              uiItemL(column, ntype->name, ICON_NONE);
 +                                              but= block->buttons.last;
 +                                              but->flag= UI_TEXT_LEFT;
 +                                      }
 +
-       bNodeSocketType *stype = ui_node_input_socket_type(node, sock);
++                                      BLI_snprintf(name, UI_MAX_NAME_STR, "  %s", stemp->name);
 +                                      j++;
 +                              }
 +                              else
 +                                      BLI_strncpy(name, ntype->name, UI_MAX_NAME_STR);
 +
 +                              but = uiDefBut(block, BUT, 0, name, 0, 0, UI_UNIT_X*4, UI_UNIT_Y,
 +                                      NULL, 0.0, 0.0, 0.0, 0.0, "Add node to input");
 +
 +                              argN = MEM_dupallocN(arg);
 +                              argN->type = ntype->type;
 +                              argN->output = i;
 +                              uiButSetNFunc(but, ui_node_link, argN, NULL);
 +                      }
 +              }
 +      }
 +}
 +
 +static void ui_template_node_link_menu(bContext *C, uiLayout *layout, void *but_p)
 +{
 +      Main *bmain= CTX_data_main(C);
 +      uiBlock *block = uiLayoutGetBlock(layout);
 +      uiBut *but = (uiBut*)but_p;
 +      uiLayout *split, *column;
 +      NodeLinkArg *arg = (NodeLinkArg*)but->func_argN;
 +      bNodeSocket *sock = arg->sock;
 +      
 +      uiBlockSetCurLayout(block, layout);
 +      split= uiLayoutSplit(layout, 0, 0);
 +
 +      ui_node_menu_column(bmain, arg, split, "Input", NODE_CLASS_INPUT);
 +      ui_node_menu_column(bmain, arg, split, "Output", NODE_CLASS_OUTPUT);
 +      ui_node_menu_column(bmain, arg, split, "Shader", NODE_CLASS_SHADER);
 +      ui_node_menu_column(bmain, arg, split, "Texture", NODE_CLASS_TEXTURE);
 +      ui_node_menu_column(bmain, arg, split, "Color", NODE_CLASS_OP_COLOR);
 +      ui_node_menu_column(bmain, arg, split, "Vector", NODE_CLASS_OP_VECTOR);
 +      ui_node_menu_column(bmain, arg, split, "Convertor", NODE_CLASS_CONVERTOR);
 +
 +      column= uiLayoutColumn(split, 0);
 +      uiBlockSetCurLayout(block, column);
 +
 +      if(sock->link) {
 +              uiItemL(column, "Link", ICON_NONE);
 +              but= block->buttons.last;
 +              but->flag= UI_TEXT_LEFT;
 +
 +              but = uiDefBut(block, BUT, 0, "Remove", 0, 0, UI_UNIT_X*4, UI_UNIT_Y,
 +                      NULL, 0.0, 0.0, 0.0, 0.0, "Remove nodes connected to the input");
 +              uiButSetNFunc(but, ui_node_link, MEM_dupallocN(arg), SET_INT_IN_POINTER(UI_NODE_LINK_REMOVE));
 +
 +              but = uiDefBut(block, BUT, 0, "Disconnect", 0, 0, UI_UNIT_X*4, UI_UNIT_Y,
 +                      NULL, 0.0, 0.0, 0.0, 0.0, "Disconnect nodes connected to the input");
 +              uiButSetNFunc(but, ui_node_link, MEM_dupallocN(arg), SET_INT_IN_POINTER(UI_NODE_LINK_DISCONNECT));
 +      }
 +
 +      ui_node_menu_column(bmain, arg, column, "Group", NODE_CLASS_GROUP);
 +}
 +
 +void uiTemplateNodeLink(uiLayout *layout, bNodeTree *ntree, bNode *node, bNodeSocket *sock)
 +{
 +      uiBlock *block = uiLayoutGetBlock(layout);
 +      NodeLinkArg *arg;
 +      uiBut *but;
-       if(sock->link || sock->type == SOCK_SHADER || (stype && (stype->flag & SOCK_NO_VALUE))) {
 +
 +      arg = MEM_callocN(sizeof(NodeLinkArg), "NodeLinkArg");
 +      arg->ntree = ntree;
 +      arg->node = node;
 +      arg->sock = sock;
 +      arg->type = 0;
 +      arg->output = 0;
 +
 +      uiBlockSetCurLayout(block, layout);
 +
-               bNodeSocketType *stype = ui_node_input_socket_type(node, input);
++      if(sock->link || sock->type == SOCK_SHADER || (sock->flag & SOCK_HIDE_VALUE)) {
 +              char name[UI_MAX_NAME_STR];
 +              ui_node_sock_name(sock, name);
 +              but= uiDefMenuBut(block, ui_template_node_link_menu, NULL, name, 0, 0, UI_UNIT_X*4, UI_UNIT_Y, "");
 +      }
 +      else
 +              but= uiDefIconMenuBut(block, ui_template_node_link_menu, NULL, ICON_NONE, 0, 0, UI_UNIT_X, UI_UNIT_Y, "");
 +
 +      but->type= MENU;
 +      but->flag |= UI_TEXT_LEFT|UI_BUT_NODE_LINK;
 +      but->poin= (char*)but;
 +      but->func_argN = arg;
 +
 +      if(sock->link && sock->link->fromnode)
 +              if(sock->link->fromnode->flag & NODE_ACTIVE_TEXTURE)
 +                      but->flag |= UI_BUT_NODE_ACTIVE;
 +}
 +
 +/************************* Node Tree Layout **************************/
 +
 +static void ui_node_draw_input(uiLayout *layout, bContext *C,
 +      bNodeTree *ntree, bNode *node, bNodeSocket *input, int depth);
 +
 +static void ui_node_draw_node(uiLayout *layout, bContext *C, bNodeTree *ntree, bNode *node, int depth)
 +{
 +      bNodeSocket *input;
 +      uiLayout *col, *split;
 +      PointerRNA nodeptr;
 +
 +      RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr);
 +
 +      if(node->typeinfo->uifunc) {
 +              if(node->type != NODE_GROUP) {
 +                      split = uiLayoutSplit(layout, 0.35f, 0);
 +                      col = uiLayoutColumn(split, 0);
 +                      col = uiLayoutColumn(split, 0);
 +
 +                      node->typeinfo->uifunc(col, C, &nodeptr);
 +              }
 +      }
 +
 +      for(input=node->inputs.first; input; input=input->next)
 +              ui_node_draw_input(layout, C, ntree, node, input, depth+1);
 +}
 +
 +static void ui_node_draw_input(uiLayout *layout, bContext *C, bNodeTree *ntree, bNode *node, bNodeSocket *input, int depth)
 +{
 +      PointerRNA inputptr;
 +      uiBlock *block = uiLayoutGetBlock(layout);
 +      uiBut *bt;
 +      uiLayout *split, *row, *col;
 +      bNode *lnode;
 +      char label[UI_MAX_NAME_STR];
 +      int indent = (depth > 1)? 2*(depth - 1): 0;
 +
 +      /* to avoid eternal loops on cyclic dependencies */
 +      node->flag |= NODE_TEST;
 +      lnode = (input->link)? input->link->fromnode: NULL;
 +
 +      /* socket RNA pointer */
 +      RNA_pointer_create(&ntree->id, &RNA_NodeSocket, input, &inputptr);
 +
 +      /* indented label */
 +      memset(label, ' ', indent);
 +      label[indent] = '\0';
 +      BLI_snprintf(label, UI_MAX_NAME_STR, "%s%s:", label, input->name);
 +
 +      /* split in label and value */
 +      split = uiLayoutSplit(layout, 0.35f, 0);
 +
 +      row = uiLayoutRow(split, 1);
 +
 +      if(depth > 0) {
 +              uiBlockSetEmboss(block, UI_EMBOSSN);
 +
 +              if(lnode && (lnode->inputs.first || (lnode->typeinfo->uifunc && lnode->type != NODE_GROUP))) {
 +                      int icon = (input->flag & SOCK_COLLAPSED)? ICON_DISCLOSURE_TRI_RIGHT: ICON_DISCLOSURE_TRI_DOWN;
 +                      uiItemR(row, &inputptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", icon);
 +              }
 +              else
 +                      uiItemL(row, "", ICON_BLANK1);
 +
 +              bt = block->buttons.last;
 +              bt->x2 = UI_UNIT_X/2;
 +
 +              uiBlockSetEmboss(block, UI_EMBOSS);
 +      }
 +
 +      uiItemL(row, label, ICON_NONE);
 +
 +      if(lnode) {
 +              /* input linked to a node */
 +              uiTemplateNodeLink(split, ntree, node, input);
 +
 +              if(!(input->flag & SOCK_COLLAPSED)) {
 +                      if(depth == 0)
 +                              uiItemS(layout);
 +
 +                      ui_node_draw_node(layout, C, ntree, lnode, depth);
 +              }
 +      }
 +      else {
-               if(input->type != SOCK_SHADER && (!stype || !(stype->flag & SOCK_NO_VALUE))) {
 +              /* input not linked, show value */
++              if(input->type != SOCK_SHADER && !(input->flag & SOCK_HIDE_VALUE)) {
 +                      if(input->type == SOCK_VECTOR) {
 +                              row = uiLayoutRow(split, 0);
 +                              col = uiLayoutColumn(row, 0);
 +
 +                              uiItemR(col, &inputptr, "default_value", 0, "", 0);
 +                      }
 +                      else {
 +                              row = uiLayoutRow(split, 1);
 +                              uiItemR(row, &inputptr, "default_value", 0, "", 0);
 +                      }
 +              }
 +              else
 +                      row = uiLayoutRow(split, 0);
 +
 +              uiTemplateNodeLink(row, ntree, node, input);
 +      }
 +
 +      /* clear */
 +      node->flag &= ~NODE_TEST;
 +}
 +
 +void uiTemplateNodeView(uiLayout *layout, bContext *C, bNodeTree *ntree, bNode *node, bNodeSocket *input)
 +{
 +      bNode *tnode;
 +
 +      if(!ntree)
 +              return;
 +
 +      /* clear for cycle check */
 +      for(tnode=ntree->nodes.first; tnode; tnode=tnode->next)
 +              tnode->flag &= ~NODE_TEST;
 +
 +      if(input)
 +              ui_node_draw_input(layout, C, ntree, node, input, 0);
 +      else
 +              ui_node_draw_node(layout, C, ntree, node, 0);
 +}
 +
index 9d9996cddb36bc0db99a9e4540f80483d36ac69c,cd1d250d6a46b0b07cd18d59dc28c6e0bd38e7cb..efa9f47e107cc92b4e72f1c19aa85dcd5034287c
@@@ -536,8 -537,8 +536,8 @@@ void ui_draw_aligned_panel(uiStyle *sty
                
                /* in some occasions, draw a border */
                if(panel->flag & PNL_SELECT) {
-                       if(panel->control & UI_PNL_SOLID) uiSetRoundBox(15);
-                       else uiSetRoundBox(0);
+                       if(panel->control & UI_PNL_SOLID) uiSetRoundBox(UI_CNR_ALL);
 -                      else uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
++                      else uiSetRoundBox(UI_CNR_NONE);
                        
                        UI_ThemeColorShade(TH_BACK, -120);
                        uiRoundRect(0.5f + rect->xmin, 0.5f + rect->ymin, 0.5f + rect->xmax, 0.5f + headrect.ymax+1, 8);
Simple merge
index 9471fa630d1c61de55a2cf9c23d6ac3a12bc1f81,cd521f7e8c712dc0e5e3ccba9f2523f589b98baa..2730298b12e9b73a429610829dcb711965a9da6d
  #include "node_intern.h"
  
  
+ // XXX interface.h
+ extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
+ /* ****************** SOCKET BUTTON DRAW FUNCTIONS ***************** */
+ static void node_sync_cb(bContext *UNUSED(C), void *snode_v, void *node_v)
+ {
+       SpaceNode *snode= snode_v;
+       
+       if(snode->treetype==NTREE_SHADER) {
+               nodeShaderSynchronizeID(node_v, 1);
+               // allqueue(REDRAWBUTSSHADING, 0);
+       }
+ }
++static void node_socket_button_label(const bContext *UNUSED(C), uiBlock *block,
++                                                        bNodeTree *UNUSED(ntree), bNode *UNUSED(node), bNodeSocket *sock,
++                                                        const char *UNUSED(name), int x, int y, int width)
++{
++      uiDefBut(block, LABEL, 0, sock->name, x, y, width, NODE_DY, NULL, 0, 0, 0, 0, "");
++}
++
++
+ static void node_socket_button_default(const bContext *C, uiBlock *block,
+                                                               bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+                                                               const char *name, int x, int y, int width)
+ {
+       PointerRNA ptr;
+       uiBut *bt;
+       
+       RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+       
+       bt = uiDefButR(block, NUM, B_NODE_EXEC, name,
+                                  x, y+1, width, NODE_DY-2, 
+                                  &ptr, "default_value", 0, 0, 0, -1, -1, NULL);
+       if (node)
+               uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node);
+ }
+ typedef struct SocketComponentMenuArgs {
+       PointerRNA ptr;
+       int x, y, width;
+       uiButHandleFunc cb;
+       void *arg1, *arg2;
+ } SocketComponentMenuArgs;
+ /* NOTE: this is a block-menu, needs 0 events, otherwise the menu closes */
+ static uiBlock *socket_component_menu(bContext *C, ARegion *ar, void *args_v)
+ {
+       SocketComponentMenuArgs *args= (SocketComponentMenuArgs*)args_v;
+       uiBlock *block;
+       uiLayout *layout;
+       
+       block= uiBeginBlock(C, ar, "socket menu", UI_EMBOSS);
+       uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
+       
+       layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, NODE_DY, U.uistyles.first), 0);
+       
+       uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE);
+       
+       return block;
+ }
+ static void node_socket_button_components(const bContext *C, uiBlock *block,
+                                                                  bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+                                                                  const char *name, int x, int y, int width)
+ {
+       PointerRNA ptr;
+       SocketComponentMenuArgs *args;
+       
+       RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+       
+       args= MEM_callocN(sizeof(SocketComponentMenuArgs), "SocketComponentMenuArgs");
+       
+       args->ptr = ptr;
+       args->x = x;
+       args->y = y;
+       args->width = width;
+       args->cb = node_sync_cb;
+       args->arg1 = CTX_wm_space_node(C);
+       args->arg2 = node;
+       
+       uiDefBlockButN(block, socket_component_menu, args, name, x, y+1, width, NODE_DY-2, "");
+ }
+ static void node_socket_button_color(const bContext *C, uiBlock *block,
+                                                         bNodeTree *ntree, bNode *node, bNodeSocket *sock,
+                                                         const char *name, int x, int y, int width)
+ {
+       PointerRNA ptr;
+       uiBut *bt;
+       int labelw= width - 40;
+       
+       RNA_pointer_create(&ntree->id, &RNA_NodeSocket, sock, &ptr);
+       
+       bt=uiDefButR(block, COL, B_NODE_EXEC, "",
+                                x, y+2, (labelw>0 ? 40 : width), NODE_DY-2, 
+                                &ptr, "default_value", 0, 0, 0, -1, -1, NULL);
+       if (node)
+               uiButSetFunc(bt, node_sync_cb, CTX_wm_space_node(C), node);
+       
+       if (name[0]!='\0' && labelw>0)
+               uiDefBut(block, LABEL, 0, name, x + 40, y+2, labelw, NODE_DY-2, NULL, 0, 0, 0, 0, "");
+ }
+ /* ****************** BASE DRAW FUNCTIONS FOR NEW OPERATOR NODES ***************** */
+ static void node_draw_socket_new(bNodeSocket *sock, float size)
+ {
+       float x=sock->locx, y=sock->locy;
+       
+       /* 16 values of sin function */
+       static float si[16] = {
+               0.00000000f, 0.39435585f,0.72479278f,0.93775213f,
+               0.99871650f,0.89780453f,0.65137248f,0.29936312f,
+               -0.10116832f,-0.48530196f,-0.79077573f,-0.96807711f,
+               -0.98846832f,-0.84864425f,-0.57126821f,-0.20129852f
+       };
+       /* 16 values of cos function */
+       static float co[16] ={
+               1.00000000f,0.91895781f,0.68896691f,0.34730525f,
+               -0.05064916f,-0.44039415f,-0.75875812f,-0.95413925f,
+               -0.99486932f,-0.87434661f,-0.61210598f,-0.25065253f,
+               0.15142777f,0.52896401f,0.82076344f,0.97952994f,
+       };
+       int a;
+       
+       glColor3ub(180, 180, 180);
+       
+       glBegin(GL_POLYGON);
+       for(a=0; a<16; a++)
+               glVertex2f(x+size*si[a], y+size*co[a]);
+       glEnd();
+       
+       glColor4ub(0, 0, 0, 150);
+       glEnable(GL_BLEND);
+       glEnable( GL_LINE_SMOOTH );
+       glBegin(GL_LINE_LOOP);
+       for(a=0; a<16; a++)
+               glVertex2f(x+size*si[a], y+size*co[a]);
+       glEnd();
+       glDisable( GL_LINE_SMOOTH );
+       glDisable(GL_BLEND);
+ }
  /* ****************** BUTTON CALLBACKS FOR ALL TREES ***************** */
  
  static void node_buts_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@@ -1525,24 -1985,60 +2126,63 @@@ static void node_texture_set_butfunc(bN
  
  void ED_init_node_butfuncs(void)
  {
+       bNodeTreeType *treetype;
        bNodeType *ntype;
-       
-       /* shader nodes */
-       ntype= node_all_shaders.first;
-       while(ntype) {
-               node_shader_set_butfunc(ntype);
-               ntype= ntype->next;
-       }
-       /* composit nodes */
-       ntype= node_all_composit.first;
-       while(ntype) {
-               node_composit_set_butfunc(ntype);
-               ntype= ntype->next;
+       bNodeSocketType *stype;
+       int i;
+       
+       /* node type ui functions */
+       for (i=0; i < NUM_NTREE_TYPES; ++i) {
+               treetype = ntreeGetType(i);
+               if (treetype) {
+                       for (ntype= treetype->node_types.first; ntype; ntype= ntype->next) {
+                               /* default ui functions */
+                               ntype->drawfunc = node_draw_default;
+                               ntype->drawupdatefunc = node_update_default;
+                               ntype->uifunc = NULL;
+                               ntype->uifuncbut = NULL;
+                               ntype->resize_area_func = node_resize_area_default;
+                               
+                               node_common_set_butfunc(ntype);
+                               
+                               switch (i) {
+                               case NTREE_COMPOSIT:
+                                       node_composit_set_butfunc(ntype);
+                                       break;
+                               case NTREE_SHADER:
+                                       node_shader_set_butfunc(ntype);
+                                       break;
+                               case NTREE_TEXTURE:
+                                       node_texture_set_butfunc(ntype);
+                                       break;
+                               }
+                       }
+               }
        }
-       ntype = node_all_textures.first;
-       while(ntype) {
-               node_texture_set_butfunc(ntype);
-               ntype= ntype->next;
+       
+       /* socket type ui functions */
+       for (i=0; i < NUM_SOCKET_TYPES; ++i) {
+               stype = ntreeGetSocketType(i);
+               if (stype) {
+                       switch(stype->type) {
+                       case SOCK_FLOAT:
+                       case SOCK_INT:
+                       case SOCK_BOOLEAN:
+                               stype->buttonfunc = node_socket_button_default;
+                               break;
+                       case SOCK_VECTOR:
+                               stype->buttonfunc = node_socket_button_components;
+                               break;
+                       case SOCK_RGBA:
+                               stype->buttonfunc = node_socket_button_color;
+                               break;
++                      case SOCK_SHADER:
++                              stype->buttonfunc = node_socket_button_label;
++                              break;
+                       default:
+                               stype->buttonfunc = NULL;
+                       }
+               }
        }
  }
  
index 8f243cc659f8b9dbbbf5a656dbf940058f9dbcfb,c1b114d5436e79d65e793bf8ac1e66bba8b45e29..75be272957b5bb262bb94c1409af54b255dc41ab
@@@ -875,25 -677,21 +688,21 @@@ static void node_draw_basis(const bCont
  
        
        /* socket inputs, buttons */
 -      for(sock= node->inputs.first; sock; sock= sock->next) {
 +      for(i= 0, sock= node->inputs.first; sock; sock= sock->next, i++) {
-               if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
-                       bNodeSocketType *stype = (node->type == NODE_GROUP)? NULL: &node->typeinfo->inputs[i];
-                       socket_circle_draw(sock, socket_size);
-                       
-                       if(node->block && sock->link==NULL) {
-                               if((stype && stype->flag & SOCK_NO_VALUE) || sock->type==SOCK_SHADER) {
-                                       uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f), 
-                                                        (short)(node->width-NODE_DY), NODE_DY,  NULL, 0, 0, 0, 0, "");
-                               }
-                               else {
-                                       node_draw_socket_button(ntree, sock, sock->name, node->block, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, node_sync_cb, snode, node);
-                               }
-                       }
-                       else {
-                               uiDefBut(node->block, LABEL, 0, sock->name, (short)(sock->locx+7), (short)(sock->locy-9.0f), 
-                                                (short)(node->width-NODE_DY), NODE_DY,  NULL, 0, 0, 0, 0, "");
-                       }
+               bNodeSocketType *stype= ntreeGetSocketType(sock->type);
+               
+               if(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))
+                       continue;
+               
+               node_socket_circle_draw(ntree, sock, NODE_SOCKSIZE);
+               
 -              if (sock->link) {
++              if (sock->link || (sock->flag & SOCK_HIDE_VALUE)) {
+                       uiDefBut(node->block, LABEL, 0, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY, NODE_DY,
+                                        NULL, 0, 0, 0, 0, "");
+               }
+               else {
+                       if (stype->buttonfunc)
+                               stype->buttonfunc(C, node->block, ntree, node, sock, sock->name, sock->locx+NODE_DYS, sock->locy-NODE_DYS, node->width-NODE_DY);
                }
        }
        
index ca59a9ed6a94f2a4e058b55a6e54c6c9f96c6f4f,5f58f540aae229574acf7923c66612d60b13c744..33207bbc763f0e197a5e5c4a729bb92f76d009e4
  
  #include "MEM_guardedalloc.h"
  
 -#include "DNA_object_types.h"
+ #include "DNA_ID.h"
 +#include "DNA_lamp_types.h"
  #include "DNA_material_types.h"
  #include "DNA_node_types.h"
 +#include "DNA_object_types.h"
+ #include "DNA_particle_types.h"
  #include "DNA_scene_types.h"
 +#include "DNA_world_types.h"
  
  #include "BLI_math.h"
  #include "BLI_blenlib.h"
@@@ -273,50 -279,32 +283,53 @@@ void ED_node_shader_default(ID *id
  {
        bNode *in, *out;
        bNodeSocket *fromsock, *tosock;
 +      bNodeTree *ntree;
+       bNodeTemplate ntemp;
 +      int output_type, shader_type;
        
-       ntree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, FALSE);
 -      /* but lets check it anyway */
 -      if(ma->nodetree) {
 -              if (G.f & G_DEBUG)
 -                      printf("error in shader initialize\n");
 -              return;
++      ntree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0);
 +
 +      switch(GS(id->name)) {
 +              case ID_MA:
 +                      ((Material*)id)->nodetree = ntree;
 +                      output_type = SH_NODE_OUTPUT_MATERIAL;
 +                      shader_type = SH_NODE_BSDF_DIFFUSE;
 +                      break;
 +              case ID_WO:
 +                      ((World*)id)->nodetree = ntree;
 +                      output_type = SH_NODE_OUTPUT_WORLD;
 +                      shader_type = SH_NODE_BACKGROUND;
 +                      break;
 +              case ID_LA:
 +                      ((Lamp*)id)->nodetree = ntree;
 +                      output_type = SH_NODE_OUTPUT_LAMP;
 +                      shader_type = SH_NODE_EMISSION;
 +                      break;
 +              case ID_TE:
 +                      ((Tex*)id)->nodetree = ntree;
 +                      output_type = SH_NODE_OUTPUT_TEXTURE;
 +                      shader_type = SH_NODE_TEX_CLOUDS;
 +                      break;
 +              default:
 +                      printf("ED_node_shader_default called on wrong ID type.\n");
 +                      return;
        }
        
-       out= nodeAddNodeType(ntree, output_type, NULL, NULL);
 -      ma->nodetree= ntreeAddTree("Shader Nodetree", NTREE_SHADER, 0);
 -      
 -      ntemp.type = SH_NODE_OUTPUT;
 -      out= nodeAddNode(ma->nodetree, &ntemp);
++      ntemp.type = output_type;
++      out= nodeAddNode(ntree, &ntemp);
        out->locx= 300.0f; out->locy= 300.0f;
        
-       in= nodeAddNodeType(ntree, shader_type, NULL, NULL);
 -      ntemp.type = SH_NODE_MATERIAL;
 -      in= nodeAddNode(ma->nodetree, &ntemp);
++      ntemp.type = shader_type;
++      in= nodeAddNode(ntree, &ntemp);
        in->locx= 10.0f; in->locy= 300.0f;
 -      nodeSetActive(ma->nodetree, in);
 +      nodeSetActive(ntree, in);
        
        /* only a link from color to color */
        fromsock= in->outputs.first;
        tosock= out->inputs.first;
 -      nodeAddLink(ma->nodetree, in, fromsock, out, tosock);
 +      nodeAddLink(ntree, in, fromsock, out, tosock);
        
-       ntreeSolveOrder(ntree); /* needed for pointers */
 -      ntreeUpdateTree(ma->nodetree);
++      ntreeUpdateTree(ntree);
  }
  
  /* assumes nothing being done in ntree yet, sets the default in/out node */
@@@ -360,11 -351,9 +376,12 @@@ void ED_node_composit_default(Scene *sc
  /* called from shading buttons or header */
  void ED_node_texture_default(Tex *tx)
  {
 +      ED_node_shader_default(&tx->id);
 +
 +#if 0
        bNode *in, *out;
        bNodeSocket *fromsock, *tosock;
+       bNodeTemplate ntemp;
        
        /* but lets check it anyway */
        if(tx->nodetree) {
        tosock= out->inputs.first;
        nodeAddLink(tx->nodetree, in, fromsock, out, tosock);
        
-       ntreeSolveOrder(tx->nodetree);  /* needed for pointers */
+       ntreeUpdateTree(tx->nodetree);
 +#endif
  }
  
  /* id is supposed to contain a node tree */
  void node_tree_from_ID(ID *id, bNodeTree **ntree, bNodeTree **edittree, int *treetype)
  {
-       bNode *node= NULL;
-       short idtype= GS(id->name);
-       if(idtype == ID_MA) {
-               *ntree= ((Material*)id)->nodetree;
-               if(treetype) *treetype= NTREE_SHADER;
-       }
-       else if(idtype == ID_LA) {
-               *ntree= ((Lamp*)id)->nodetree;
-               if(treetype) *treetype= NTREE_SHADER;
-       }
-       else if(idtype == ID_WO) {
-               *ntree= ((World*)id)->nodetree;
-               if(treetype) *treetype= NTREE_SHADER;
-       }
-       else if(idtype == ID_SCE) {
-               *ntree= ((Scene*)id)->nodetree;
-               if(treetype) *treetype= NTREE_COMPOSIT;
-       }
-       else if(idtype == ID_TE) {
-               *ntree= ((Tex*)id)->nodetree;
-               if(treetype) *treetype= (*ntree)? (*ntree)->type: NTREE_SHADER;
+       if (id) {
+               bNode *node= NULL;
+               short idtype= GS(id->name);
+       
+               if(idtype == ID_NT) {
+                       *ntree= (bNodeTree*)id;
+                       if(treetype) *treetype= (*ntree)->type;
+               }
+               else if(idtype == ID_MA) {
+                       *ntree= ((Material*)id)->nodetree;
+                       if(treetype) *treetype= NTREE_SHADER;
+               }
++              else if(idtype == ID_LA) {
++                      *ntree= ((Lamp*)id)->nodetree;
++                      if(treetype) *treetype= NTREE_SHADER;
++              }
++              else if(idtype == ID_WO) {
++                      *ntree= ((World*)id)->nodetree;
++                      if(treetype) *treetype= NTREE_SHADER;
++              }
+               else if(idtype == ID_SCE) {
+                       *ntree= ((Scene*)id)->nodetree;
+                       if(treetype) *treetype= NTREE_COMPOSIT;
+               }
+               else if(idtype == ID_TE) {
+                       *ntree= ((Tex*)id)->nodetree;
 -                      if(treetype) *treetype= NTREE_TEXTURE;
++                      if(treetype) *treetype= (*ntree)? (*ntree)->type: NTREE_SHADER;
+               }
+               else {
+                       if(treetype) *treetype= 0;
+                       return;
+               }
+       
+               /* find editable group */
+               if(edittree) {
+                       if(*ntree)
+                               for(node= (*ntree)->nodes.first; node; node= node->next)
+                                       if(nodeGroupEditGet(node))
+                                               break;
+                       
+                       if(node && node->id)
+                               *edittree= (bNodeTree *)node->id;
+                       else
+                               *edittree= *ntree;
+               }
        }
        else {
+               *ntree= NULL;
                if(treetype) *treetype= 0;
-               return;
-       }
-       /* find editable group */
-       if(edittree) {
-               if(*ntree)
-                       for(node= (*ntree)->nodes.first; node; node= node->next)
-                               if(node->flag & NODE_GROUP_EDIT)
-                                       break;
-               
-               if(node && node->id)
-                       *edittree= (bNodeTree *)node->id;
-               else
-                       *edittree= *ntree;
        }
  }
  
@@@ -3412,34 -3537,67 +3599,98 @@@ void NODE_OT_add_file(wmOperatorType *o
        RNA_def_string(ot->srna, "name", "Image", 24, "Name", "Datablock name to assign.");
  }
  
 -
 +/* ****************** Auto Layout Operator  ******************* */
 +
 +static int node_auto_layout_exec(bContext *C, wmOperator *UNUSED(op))
 +{
 +      SpaceNode *snode= CTX_wm_space_node(C);
 +      bNode *node;
 +
 +      for(node=snode->edittree->nodes.first; node; node=node->next)
 +              if(node->flag & SELECT)
 +                      ED_node_tree_auto_layout(snode->edittree, node);
 +
 +      snode_notify(C, snode);
 +      
 +      return OPERATOR_FINISHED;
 +}
 +
 +void NODE_OT_auto_layout(wmOperatorType *ot)
 +{
 +      /* identifiers */
 +      ot->name= "Auto Layout Nodes";
 +      ot->description= "Automatically layout nodes with the selected nodes as root";
 +      ot->idname= "NODE_OT_auto_layout";
 +      
 +      /* callbacks */
 +      ot->exec= node_auto_layout_exec;
 +      ot->poll= ED_operator_node_active;
 +      
 +      /* flags */
 +      ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 +}
 +
+ /********************** New node tree operator *********************/
+ static int new_node_tree_exec(bContext *C, wmOperator *op)
+ {
+       SpaceNode *snode;
+       bNodeTree *ntree;
+       PointerRNA ptr, idptr;
+       PropertyRNA *prop;
+       int treetype;
+       char treename[MAX_ID_NAME-2] = "NodeTree";
+       
+       /* retrieve state */
+       snode= CTX_wm_space_node(C);
+       
+       if (RNA_property_is_set(op->ptr, "type"))
+               treetype = RNA_enum_get(op->ptr, "type");
+       else
+               treetype = snode->treetype;
+       
+       if (RNA_property_is_set(op->ptr, "name"))
+               RNA_string_get(op->ptr, "name", treename);
+       
+       ntree = ntreeAddTree(treename, treetype, 0);
+       if(!ntree)
+               return OPERATOR_CANCELLED;
+       
+       /* hook into UI */
+       uiIDContextProperty(C, &ptr, &prop);
+       if(prop) {
+               RNA_id_pointer_create(&ntree->id, &idptr);
+               RNA_property_pointer_set(&ptr, prop, idptr);
+               /* RNA_property_pointer_set increases the user count,
+                * fixed here as the editor is the initial user.
+                */
+               --ntree->id.us;
+               RNA_property_update(C, &ptr, prop);
+       }
+       else if(snode) {
+               Scene *scene= CTX_data_scene(C);
+               snode->nodetree = ntree;
+               
+               ED_node_tree_update(snode, scene);
+       }
+       
+       return OPERATOR_FINISHED;
+ }
+ void NODE_OT_new_node_tree(wmOperatorType *ot)
+ {
+       /* identifiers */
+       ot->name= "New node tree";
+       ot->idname= "NODE_OT_new_node_tree";
+       
+       /* api callbacks */
+       ot->exec= new_node_tree_exec;
+       ot->poll= ED_operator_node_active;
+       
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+       
+       RNA_def_enum(ot->srna, "type", nodetree_type_items, NTREE_COMPOSIT, "Tree Type", "");
+       RNA_def_string(ot->srna, "name", "NodeTree", MAX_ID_NAME-2, "Name", "");
+ }
++
index 63eab2349b287843f75c2668feaa6f5123e4e6d5,7077f4a749757098d27a299b1bf554fec8d98462..45671b85d896d7b7570ecde961ad43b99ff339ec
  #include "BLI_utildefines.h"
  
  #include "BKE_context.h"
 -#include "BKE_screen.h"
 -#include "BKE_node.h"
+ #include "BKE_global.h"
- #include "BKE_node.h"
- #include "BKE_main.h"
+ #include "BKE_main.h"
++#include "BKE_node.h"
 +#include "BKE_scene.h"
 +#include "BKE_screen.h"
+ #include "RNA_access.h"
  
  #include "WM_api.h"
  #include "WM_types.h"
@@@ -183,38 -225,37 +227,41 @@@ static void node_menu_add(const bContex
                uiLayoutSetActive(layout, 0);
  
        if(snode->treetype==NTREE_SHADER) {
-               uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
-               uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
-               if(scene_use_new_shading_system(scene))
-                       uiItemMenuF(layout, "Shader", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_SHADER));
-               if(scene_use_new_shading_system(scene))
-                       uiItemMenuF(layout, "Texture", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
-               uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
-               uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
-               uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
-               uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
-               //uiItemMenuF(layout, "Dynamic", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
+               uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+               uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
++              if(scene_use_new_shading_system(scene)) {
++                      uiItemMenuF(layout, "Shader", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_SHADER));
++                      uiItemMenuF(layout, "Texture", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
++              }
+               uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+               uiItemMenuF(layout, "Vector", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+               uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+               uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
 -              uiItemMenuF(layout, "Dynamic", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
++              //uiItemMenuF(layout, "Dynamic", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_DYNAMIC));
+               uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
        }
        else if(snode->treetype==NTREE_COMPOSIT) {
-               uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
-               uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
-               uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
-               uiItemMenuF(layout, "Vector", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
-               uiItemMenuF(layout, "Filter", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER));
-               uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
-               uiItemMenuF(layout, "Matte", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE));
-               uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
-               uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+               uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+               uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+               uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+               uiItemMenuF(layout, "Vector", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_VECTOR));
+               uiItemMenuF(layout, "Filter", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_FILTER));
+               uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+               uiItemMenuF(layout, "Matte", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_MATTE));
+               uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+               uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+               uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
        }
        else if(snode->treetype==NTREE_TEXTURE) {
-               uiItemMenuF(layout, "Input", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
-               uiItemMenuF(layout, "Output", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
-               uiItemMenuF(layout, "Color", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
-               uiItemMenuF(layout, "Patterns", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN));
-               uiItemMenuF(layout, "Textures", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
-               uiItemMenuF(layout, "Convertor", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
-               uiItemMenuF(layout, "Distort", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
-               uiItemMenuF(layout, "Group", 0, node_auto_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+               uiItemMenuF(layout, "Input", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_INPUT));
+               uiItemMenuF(layout, "Output", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OUTPUT));
+               uiItemMenuF(layout, "Color", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_OP_COLOR));
+               uiItemMenuF(layout, "Patterns", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_PATTERN));
+               uiItemMenuF(layout, "Textures", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_TEXTURE));
+               uiItemMenuF(layout, "Convertor", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_CONVERTOR));
+               uiItemMenuF(layout, "Distort", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_DISTORT));
+               uiItemMenuF(layout, "Group", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_GROUP));
+               uiItemMenuF(layout, "Layout", 0, node_add_menu, SET_INT_IN_POINTER(NODE_CLASS_LAYOUT));
        }
  }
  
index 2939676d05111670e63ec63d10f0d848aa4fb92f,3751d8efae8b7ca0c6c08af55821f11a177c527d..2f29976d4bbbfdc56a7226bdd77428e8ded454e8
@@@ -146,8 -155,8 +155,10 @@@ void NODE_OT_backimage_sample(wmOperato
  
  void NODE_OT_add_file(struct wmOperatorType *ot);
  
 +void NODE_OT_auto_layout(struct wmOperatorType *ot);
 +
+ void NODE_OT_new_node_tree(struct wmOperatorType *ot);
  extern const char *node_context_dir[];
  
  // XXXXXX
index 6a49fc2898b9a63c2c7755ac7f6c4342145777d6,153d703ddf67a982b7c754a298701d38f5a7244a..f1a8b4b13f8f405977a9e970a19b9f044519c064
@@@ -96,8 -96,8 +96,10 @@@ void node_operatortypes(void
        WM_operatortype_append(NODE_OT_backimage_sample);
        
        WM_operatortype_append(NODE_OT_add_file);
 +
 +      WM_operatortype_append(NODE_OT_auto_layout);
+       
+       WM_operatortype_append(NODE_OT_new_node_tree);
  }
  
  void ED_operatormacros_node(void)
Simple merge
index 2da907ad200b446dbe59fe987be7ce510d90ac16,9aa453af4d6bf5b0289780d40deb56424f3f95ff..f44316883f4201d54da38e37387d6713bcacade7
@@@ -1691,3 -1676,187 +1691,187 @@@ int GPU_lamp_shadow_layer(GPULamp *lamp
                return -1;
  }
  
 -      mat = GPU_material_from_blender(scene, ma);
+ /* export the GLSL shader */
+ GPUShaderExport *GPU_shader_export(struct Scene *scene, struct Material *ma)
+ {
+       static struct {
+               GPUBuiltin gputype;
+               GPUDynamicType dynamictype;
+               GPUDataType datatype;
+       } builtins[] = { 
+               { GPU_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWMAT, GPU_DATA_16F },
+               { GPU_INVERSE_VIEW_MATRIX, GPU_DYNAMIC_OBJECT_VIEWIMAT, GPU_DATA_16F },
+               { GPU_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_MAT, GPU_DATA_16F },
+               { GPU_INVERSE_OBJECT_MATRIX, GPU_DYNAMIC_OBJECT_IMAT, GPU_DATA_16F },
+               { GPU_OBCOLOR, GPU_DYNAMIC_OBJECT_COLOR, GPU_DATA_4F },
+               { 0 }
+       };
+       GPUShaderExport *shader = NULL;
+       GPUPass *pass;
+       GPUInput *input;
+       GPUMaterial *mat;
+       GPUInputUniform *uniform;
+       GPUInputAttribute *attribute;
+       GLint lastbindcode;
+       int i, liblen, fraglen;
+       if(!GPU_glsl_support())
+               return NULL;
++      mat = GPU_material_from_blender(scene, ma, OB_TEXTURE);
+       pass = (mat)? mat->pass: NULL;
+       if(pass && pass->fragmentcode && pass->vertexcode) {
+               shader = MEM_callocN(sizeof(GPUShaderExport), "GPUShaderExport");
+               for(input = pass->inputs.first; input; input = input->next) {
+                       uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform");
+                       if(input->ima) {
+                               /* image sampler uniform */
+                               uniform->type = GPU_DYNAMIC_SAMPLER_2DIMAGE;
+                               uniform->datatype = GPU_DATA_1I;
+                               uniform->image = input->ima;
+                               uniform->texnumber = input->texid;
+                               BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+                       }
+                       else if(input->tex) {
+                               /* generated buffer */
+                               uniform->texnumber = input->texid;
+                               uniform->datatype = GPU_DATA_1I;
+                               BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+                               switch(input->textype) {
+                               case GPU_SHADOW2D:
+                                       uniform->type = GPU_DYNAMIC_SAMPLER_2DSHADOW;
+                                       uniform->lamp = input->dynamicdata;
+                                       break;
+                               case GPU_TEX2D:
+                                       if(GPU_texture_opengl_bindcode(input->tex)) {
+                                               uniform->type = GPU_DYNAMIC_SAMPLER_2DBUFFER;
+                                               glGetIntegerv(GL_TEXTURE_BINDING_2D, &lastbindcode);
+                                               glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(input->tex));
+                                               uniform->texsize = GPU_texture_opengl_width(input->tex) * GPU_texture_opengl_height(input->tex);
+                                               uniform->texpixels = MEM_mallocN(uniform->texsize*4, "RGBApixels");
+                                               glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, uniform->texpixels); 
+                                               glBindTexture(GL_TEXTURE_2D, lastbindcode);
+                                       }
+                                       break;
+                               }
+                       }
+                       else {
+                               uniform->type = input->dynamictype;
+                               BLI_strncpy(uniform->varname, input->shadername, sizeof(uniform->varname));
+                               switch(input->type) {
+                               case 1:
+                                       uniform->datatype = GPU_DATA_1F;
+                                       break;
+                               case 2:
+                                       uniform->datatype = GPU_DATA_2F;
+                                       break;
+                               case 3:
+                                       uniform->datatype = GPU_DATA_3F;
+                                       break;
+                               case 4:
+                                       uniform->datatype = GPU_DATA_4F;
+                                       break;
+                               case 9:
+                                       uniform->datatype = GPU_DATA_9F;
+                                       break;
+                               case 16:
+                                       uniform->datatype = GPU_DATA_16F;
+                                       break;
+                               }
+                               if(uniform->type >= GPU_DYNAMIC_LAMP_FIRST && uniform->type <= GPU_DYNAMIC_LAMP_LAST)
+                                       uniform->lamp = input->dynamicdata;
+                       }
+                       if(uniform->type != GPU_DYNAMIC_NONE)
+                               BLI_addtail(&shader->uniforms, uniform);
+                       else
+                               MEM_freeN(uniform);
+               }
+               /* process builtin uniform */
+               for(i=0; builtins[i].gputype; i++) {
+                       if(mat->builtins & builtins[i].gputype) {
+                               uniform = MEM_callocN(sizeof(GPUInputUniform), "GPUInputUniform");
+                               uniform->type = builtins[i].dynamictype;
+                               uniform->datatype = builtins[i].datatype;
+                               BLI_strncpy(uniform->varname, GPU_builtin_name(builtins[i].gputype), sizeof(uniform->varname));
+                               BLI_addtail(&shader->uniforms, uniform);
+                       }
+               }
+               // now link fragement shader with library shader
+               // TBD: remove the function that are not used in the main function
+               liblen = (pass->libcode) ? strlen(pass->libcode) : 0;
+               fraglen = strlen(pass->fragmentcode);
+               shader->fragment = (char *)MEM_mallocN(liblen+fraglen+1, "GPUFragShader");
+               if(pass->libcode)
+                       memcpy(shader->fragment, pass->libcode, liblen);
+               memcpy(&shader->fragment[liblen], pass->fragmentcode, fraglen);
+               shader->fragment[liblen+fraglen] = 0;
+               // export the attribute
+               for(i=0; i<mat->attribs.totlayer; i++) {
+                       attribute = MEM_callocN(sizeof(GPUInputAttribute), "GPUInputAttribute");
+                       attribute->type = mat->attribs.layer[i].type;
+                       attribute->number = mat->attribs.layer[i].glindex;
+                       BLI_snprintf(attribute->varname, sizeof(attribute->varname), "att%d", mat->attribs.layer[i].attribid);
+                       switch(attribute->type) {
+                       case CD_TANGENT:
+                               attribute->datatype = GPU_DATA_4F;
+                               break;
+                       case CD_MTFACE:
+                               attribute->datatype = GPU_DATA_2F;
+                               attribute->name = mat->attribs.layer[i].name;
+                               break;
+                       case CD_MCOL:
+                               attribute->datatype = GPU_DATA_4UB;
+                               attribute->name = mat->attribs.layer[i].name;
+                               break;
+                       case CD_ORCO:
+                               attribute->datatype = GPU_DATA_3F;
+                               break;
+                       }
+                       if(attribute->datatype != GPU_DATA_NONE)
+                               BLI_addtail(&shader->attributes, attribute);
+                       else
+                               MEM_freeN(attribute);
+               }
+               // export the vertex shader
+               shader->vertex = BLI_strdup(pass->vertexcode);
+       }
+       return shader;
+ }
+ void GPU_free_shader_export(GPUShaderExport *shader)
+ {
+       GPUInputUniform *uniform;
+       if(shader == NULL)
+               return;
+       for(uniform = shader->uniforms.first; uniform; uniform=uniform->next)
+               if(uniform->texpixels)
+                       MEM_freeN(uniform->texpixels);
+       BLI_freelistN(&shader->uniforms);
+       BLI_freelistN(&shader->attributes);
+       if(shader->vertex)
+               MEM_freeN(shader->vertex);
+       if(shader->fragment)
+               MEM_freeN(shader->fragment);
+       MEM_freeN(shader);
+ }
index 2831e99b37ef69313df6130883db8e1bbcde5195,b551ee9dda1936df4945ef2f1f1f4803f72f969a..e284c42532b7264c8424480938c978f2a777f8a4
  /* DataToC output of file <gpu_shader_material_glsl> */
  
- int datatoc_gpu_shader_material_glsl_size= 46208;
 -int datatoc_gpu_shader_material_glsl_size= 39910;
++int datatoc_gpu_shader_material_glsl_size= 46289;
  char datatoc_gpu_shader_material_glsl[]= {
-  10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,
- 101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,
- 118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101,
-  99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,
- 104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120,
-  32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50,
-  93, 41, 41, 59, 10,  9, 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98,
-  91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,
- 105,110, 59, 10, 10,  9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10,
-   9,  9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,115, 32, 61,
-  32, 48, 46, 48, 59, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61, 61, 32, 48,
-  46, 48, 41, 32,123, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9, 99, 32,
-  61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,
- 120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41,
-  32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,114,103, 98,
-  46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93,
-  59, 10,  9,  9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10,
-  10,  9,  9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10,  9,  9,  9,104, 32,
-  43, 61, 32, 49, 46, 48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44,
-  32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,
- 101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111,
-  97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10,  9,118,101, 99, 51,
-  32,114,103, 98, 59, 10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10,  9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59,
-  10,  9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10,  9,  9,114,
- 103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,
-   9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,  9,  9,104, 32, 42,
-  61, 32, 54, 46, 48, 59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10,  9,  9,102, 32, 61, 32,104, 32, 45,
-  32,105, 59, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10,  9,  9,112, 32, 61,
-  32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59,
-  10,  9,  9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10,  9,  9, 10,  9,
-   9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,
- 112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,
- 101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46,
-  48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10,  9,  9,101,108,115,101, 32,105,
- 102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41,
-  59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99,
-  51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44,
-  32,112, 44, 32,113, 41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,
- 104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,
- 103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10,  9,
-   9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48,
-  47, 49, 50, 46, 57, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43,
-  32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,
- 111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123,
-  10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32,
-  60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10,  9,101,108,115,101, 10,  9,  9,
- 114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45,
-  32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103,
-  98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111,
-  41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103,
-  98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,
- 116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,
- 111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109,
-  46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,
- 118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,
- 102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111,
-  46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,
- 114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103,
-  98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,
- 114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,
- 111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80,
-  73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 35,100,101,102,105,110,101,
-  32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56, 56, 54, 49, 56, 51, 55, 57, 48, 54, 57, 10, 10, 47, 42, 42,
-  42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42,
-  42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99,
-  52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,
- 108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,
- 108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41,
-  59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,
- 118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,
- 117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125,
-  10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109,
-  97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101,
-  99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51,
-  32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99,
-  51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
- 117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,
- 111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,
- 108, 32, 61, 32, 99,111, 59, 10,  9,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41,
-  59, 10,  9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99,
-  97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,
-   9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,
- 108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,
- 114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,
- 108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,102,114,111,
- 110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101,
-  99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,
- 101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,
- 111,109, 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99,
-  32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,
- 105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,
- 111,117,116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46,
-  48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99,
-  41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,
- 101, 99, 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44,
-  32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32,
-  61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,
- 111, 41, 59, 10,  9,111,117,116,118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10,
-  10,118,111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116,
-  32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
-  97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,
- 117, 98,116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,
- 111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,
- 108, 49, 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121,
-  40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
-  97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,
- 108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,
- 108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
-  41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61,
-  32, 48, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,
- 108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44,
-  32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,
- 105,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111,
-  97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,
- 118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,
- 103,101,110,116, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
-  41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
- 109, 97,116,104, 95, 97,115,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,
- 117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32,
-  62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,
- 101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,
- 104, 95, 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
-  97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32,
-  45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,
- 101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,
- 116, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
-  10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
- 109, 97,116,104, 95,112,111,119, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44,
-  32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62,
-  61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50,
-  41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100,
-  32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50,
-  44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62,
-  32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,
- 111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,
- 111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,
- 111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
- 111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,
- 108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49,
-  44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
- 123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,
- 118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,
- 108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,
- 108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110,
-  40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
-  97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,
- 111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48,
-  46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,
 - 10,102,108,111, 97,116,
 - 32,101,120,112, 95, 98,108,101,110,100,101,114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,
 -112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,
 -103, 98, 95,116,111, 95,104,115,118, 40,118,101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
 - 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,
 -118, 44, 32, 99,100,101,108,116, 97, 59, 10,  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,120,
 - 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9,
 - 99,109,105,110, 32, 61, 32,109,105,110, 40,114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,
 -103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10,  9,
 -118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10,  9,  9,115, 32, 61, 32,
 - 99,100,101,108,116, 97, 47, 99,109, 97,120, 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,115, 32, 61, 32, 48, 46, 48, 59, 10,
 -  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10,
 -  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9, 99, 32, 61, 32, 40,118,101, 99,
 - 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,
 -100,101,108,116, 97, 59, 10, 10,  9,  9,105,102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99,
 - 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109,
 - 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48, 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10,  9,  9,101,108,
 -115,101, 32,104, 32, 61, 32, 52, 46, 48, 32, 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10,  9,  9,104, 32, 47,
 - 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,102, 32, 40,104, 60, 48, 46, 48, 41, 10,  9,  9,  9,104, 32, 43, 61, 32, 49, 46, 48,
 - 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103,
 - 98, 46,119, 41, 59, 10,125, 10, 10,118,111,105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,
 -118, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,105, 44, 32,
 -102, 44, 32,112, 44, 32,113, 44, 32,116, 44, 32,104, 44, 32,115, 44, 32,118, 59, 10,  9,118,101, 99, 51, 32,114,103, 98, 59, 10,
 - 10,  9,104, 32, 61, 32,104,115,118, 91, 48, 93, 59, 10,  9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10,  9,118, 32, 61, 32,
 -104,115,118, 91, 50, 93, 59, 10, 10,  9,105,102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 32, 61, 32,118,
 -101, 99, 51, 40,118, 44, 32,118, 44, 32,118, 41, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9,105,102, 40,104, 61,
 - 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,  9,  9,104, 32, 42, 61, 32, 54, 46, 48, 59,
 - 10,  9,  9,105, 32, 61, 32,102,108,111,111,114, 40,104, 41, 59, 10,  9,  9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10,  9,  9,
 -114,103, 98, 32, 61, 32,118,101, 99, 51, 40,102, 44, 32,102, 44, 32,102, 41, 59, 10,  9,  9,112, 32, 61, 32,118, 42, 40, 49, 46,
 - 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10,  9,  9,116, 32, 61,
 - 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42, 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10,  9,  9, 10,  9,  9,105,102, 32, 40,105,
 - 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10,  9,  9,
 -101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44,
 - 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98,
 - 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,118, 44, 32,116, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61,
 - 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10,  9,  9,101,108,
 -115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112,
 - 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41,
 - 59, 10,  9,125, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41,
 - 59, 10,125, 10, 10,102,108,111, 97,116, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,111,
 - 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10,  9,  9,114,101,116,117,114,
 -110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50,
 - 41, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53,
 - 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53, 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,105,
 -110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99,
 - 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48, 56, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41,
 - 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 49, 50, 46, 57, 50, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110,
 - 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53,
 - 59, 10,125, 10, 10,118,111,105,100, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99, 52,
 - 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,
 -111,108, 95,116,111, 46,114, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,
 -102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,
 -101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,
 -115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9,
 - 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,108,
 -105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,
 -111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,
 -105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,
 -111,108, 95,116,111, 46,103, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,
 -102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,
 -111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32,
 - 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52,
 - 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
 - 32, 83, 72, 65, 68, 69, 82, 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,
 -118,111,105,100, 32,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108,
 - 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,
 - 97,116,116,118, 99,111,108, 46,120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48,
 - 44, 32, 97,116,116,118, 99,111,108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100,
 - 32,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101,
 - 99, 51, 32,117,118, 41, 10,123, 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,
 -118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,
 -111,109, 40,118,101, 99, 51, 32, 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,
 -110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44,
 - 32,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,
 -111,117,116, 32,118,101, 99, 51, 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,
 -117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,
 -101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,
 -108,111, 97,116, 32,102,114,111,110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10,  9,
 -118,105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10,  9,103,108,111, 98, 97,108,
 - 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41,
 - 46,120,121,122, 59, 10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,  9,117,118, 95, 97,116,116,114,105,
 - 98,117,116,101, 40, 97,116,116,117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109,
 - 97,108,105,122,101, 40,110,111,114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,
 -114,109, 97,108, 32,105,115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,
 -116,101, 40, 97,116,116,118, 99,111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32,
 - 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109,
 - 97,116, 52, 32,109, 97,116, 44, 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101,
 - 99, 44, 32,102,108,111, 97,116, 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116,
 - 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42,
 - 32,118,101, 99, 52, 40,118,101, 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,105,102, 40,100,111,109,105,110, 32,
 - 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,
 -105,110,118,101, 99, 41, 59, 10,  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,
 -101, 99, 32, 61, 32,109,105,110, 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,
 -100, 32, 99, 97,109,101,114, 97, 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,
 -101,119, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,
 -116, 32,111,117,116,100,105,115,116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,
 -122, 41, 59, 10,  9,111,117,116,100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10,  9,111,117,116,118,
 -105,101,119, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,
 -104, 95, 97,100,100, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,
 -116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49,
 - 32, 43, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,
 -108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116,
 - 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50,
 - 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,
++ 10,102,108,111, 97,116, 32,101,120,112, 95, 98,108,101,110,100,101,
++114, 40,102,108,111, 97,116, 32,102, 41, 10,123, 10,  9,114,101,116,117,114,110, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56,
++ 49, 56, 50, 56, 52, 54, 44, 32,102, 41, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98, 95,116,111, 95,104,115,118, 40,118,
++101, 99, 52, 32,114,103, 98, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111,
++ 97,116, 32, 99,109, 97,120, 44, 32, 99,109,105,110, 44, 32,104, 44, 32,115, 44, 32,118, 44, 32, 99,100,101,108,116, 97, 59, 10,
++  9,118,101, 99, 51, 32, 99, 59, 10, 10,  9, 99,109, 97,120, 32, 61, 32,109, 97,120, 40,114,103, 98, 91, 48, 93, 44, 32,109, 97,
++120, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,109,105,110, 32, 61, 32,109,105,110, 40,
++114,103, 98, 91, 48, 93, 44, 32,109,105,110, 40,114,103, 98, 91, 49, 93, 44, 32,114,103, 98, 91, 50, 93, 41, 41, 59, 10,  9, 99,
++100,101,108,116, 97, 32, 61, 32, 99,109, 97,120, 45, 99,109,105,110, 59, 10, 10,  9,118, 32, 61, 32, 99,109, 97,120, 59, 10,  9,
++105,102, 32, 40, 99,109, 97,120, 33, 61, 48, 46, 48, 41, 10,  9,  9,115, 32, 61, 32, 99,100,101,108,116, 97, 47, 99,109, 97,120,
++ 59, 10,  9,101,108,115,101, 32,123, 10,  9,  9,115, 32, 61, 32, 48, 46, 48, 59, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,
++  9,125, 10, 10,  9,105,102, 32, 40,115, 32, 61, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,104, 32, 61, 32, 48, 46, 48, 59, 10,
++  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9, 99, 32, 61, 32, 40,118,101, 99, 51, 40, 99,109, 97,120, 44, 32, 99,109, 97,
++120, 44, 32, 99,109, 97,120, 41, 32, 45, 32,114,103, 98, 46,120,121,122, 41, 47, 99,100,101,108,116, 97, 59, 10, 10,  9,  9,105,
++102, 32, 40,114,103, 98, 46,120, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 99, 91, 50, 93, 32, 45, 32, 99, 91, 49, 93, 59,
++ 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,114,103, 98, 46,121, 61, 61, 99,109, 97,120, 41, 32,104, 32, 61, 32, 50, 46, 48,
++ 32, 43, 32, 99, 91, 48, 93, 32, 45, 32, 32, 99, 91, 50, 93, 59, 10,  9,  9,101,108,115,101, 32,104, 32, 61, 32, 52, 46, 48, 32,
++ 43, 32, 99, 91, 49, 93, 32, 45, 32, 99, 91, 48, 93, 59, 10, 10,  9,  9,104, 32, 47, 61, 32, 54, 46, 48, 59, 10, 10,  9,  9,105,
++102, 32, 40,104, 60, 48, 46, 48, 41, 10,  9,  9,  9,104, 32, 43, 61, 32, 49, 46, 48, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,
++111,108, 32, 61, 32,118,101, 99, 52, 40,104, 44, 32,115, 44, 32,118, 44, 32,114,103, 98, 46,119, 41, 59, 10,125, 10, 10,118,111,
++105,100, 32,104,115,118, 95,116,111, 95,114,103, 98, 40,118,101, 99, 52, 32,104,115,118, 44, 32,111,117,116, 32,118,101, 99, 52,
++ 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,105, 44, 32,102, 44, 32,112, 44, 32,113, 44, 32,116, 44,
++ 32,104, 44, 32,115, 44, 32,118, 59, 10,  9,118,101, 99, 51, 32,114,103, 98, 59, 10, 10,  9,104, 32, 61, 32,104,115,118, 91, 48,
++ 93, 59, 10,  9,115, 32, 61, 32,104,115,118, 91, 49, 93, 59, 10,  9,118, 32, 61, 32,104,115,118, 91, 50, 93, 59, 10, 10,  9,105,
++102, 40,115, 61, 61, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,118, 44, 32,118,
++ 41, 59, 10,  9,125, 10,  9,101,108,115,101, 32,123, 10,  9,  9,105,102, 40,104, 61, 61, 49, 46, 48, 41, 10,  9,  9,  9,104, 32,
++ 61, 32, 48, 46, 48, 59, 10,  9,  9, 10,  9,  9,104, 32, 42, 61, 32, 54, 46, 48, 59, 10,  9,  9,105, 32, 61, 32,102,108,111,111,
++114, 40,104, 41, 59, 10,  9,  9,102, 32, 61, 32,104, 32, 45, 32,105, 59, 10,  9,  9,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,
++102, 44, 32,102, 44, 32,102, 41, 59, 10,  9,  9,112, 32, 61, 32,118, 42, 40, 49, 46, 48, 45,115, 41, 59, 10,  9,  9,113, 32, 61,
++ 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,102, 41, 41, 59, 10,  9,  9,116, 32, 61, 32,118, 42, 40, 49, 46, 48, 45, 40,115, 42,
++ 40, 49, 46, 48, 45,102, 41, 41, 41, 59, 10,  9,  9, 10,  9,  9,105,102, 32, 40,105, 32, 61, 61, 32, 48, 46, 48, 41, 32,114,103,
++ 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,116, 44, 32,112, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32,
++ 61, 61, 32, 49, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,113, 44, 32,118, 44, 32,112, 41, 59, 10,  9,  9,101,
++108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 50, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,112, 44, 32,
++118, 44, 32,116, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61, 32, 51, 46, 48, 41, 32,114,103, 98, 32,
++ 61, 32,118,101, 99, 51, 40,112, 44, 32,113, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,101, 32,105,102, 32, 40,105, 32, 61, 61,
++ 32, 52, 46, 48, 41, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,116, 44, 32,112, 44, 32,118, 41, 59, 10,  9,  9,101,108,115,
++101, 32,114,103, 98, 32, 61, 32,118,101, 99, 51, 40,118, 44, 32,112, 44, 32,113, 41, 59, 10,  9,125, 10, 10,  9,111,117,116, 99,
++111,108, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 44, 32,104,115,118, 46,119, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,
++115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102,
++ 40, 99, 32, 60, 32, 48, 46, 48, 52, 48, 52, 53, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41,
++ 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32, 40, 49, 46, 48, 47, 49, 50, 46, 57, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,
++114,101,116,117,114,110, 32,112,111,119, 40, 40, 99, 32, 43, 32, 48, 46, 48, 53, 53, 41, 42, 40, 49, 46, 48, 47, 49, 46, 48, 53,
++ 53, 41, 44, 32, 50, 46, 52, 41, 59, 10,125, 10, 10,102,108,111, 97,116, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,
++115,114,103, 98, 40,102,108,111, 97,116, 32, 99, 41, 10,123, 10,  9,105,102, 40, 99, 32, 60, 32, 48, 46, 48, 48, 51, 49, 51, 48,
++ 56, 41, 10,  9,  9,114,101,116,117,114,110, 32, 40, 99, 32, 60, 32, 48, 46, 48, 41, 63, 32, 48, 46, 48, 58, 32, 99, 32, 42, 32,
++ 49, 50, 46, 57, 50, 59, 10,  9,101,108,115,101, 10,  9,  9,114,101,116,117,114,110, 32, 49, 46, 48, 53, 53, 32, 42, 32,112,111,
++119, 40, 99, 44, 32, 49, 46, 48, 47, 50, 46, 52, 41, 32, 45, 32, 48, 46, 48, 53, 53, 59, 10,125, 10, 10,118,111,105,100, 32,115,
++114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,
++111,117,116, 32,118,101, 99, 52, 32, 99,111,108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,115,
++114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,
++111,108, 95,116,111, 46,103, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,101, 97,114,114,103, 98, 40, 99,111,108, 95,
++102,114,111,109, 46,103, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 98, 32, 61, 32,115,114,103, 98, 95,116,111, 95,108,105,110,
++101, 97,114,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32,
++ 99,111,108, 95,102,114,111,109, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111,
++ 95,115,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 95,102,114,111,109, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,
++108, 95,116,111, 41, 10,123, 10,  9, 99,111,108, 95,116,111, 46,114, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111,
++ 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,114, 41, 59, 10,  9, 99,111,108, 95,116,111, 46,103, 32, 61, 32,108,
++105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,102,114,111,109, 46,103, 41, 59, 10,  9, 99,
++111,108, 95,116,111, 46, 98, 32, 61, 32,108,105,110,101, 97,114,114,103, 98, 95,116,111, 95,115,114,103, 98, 40, 99,111,108, 95,
++102,114,111,109, 46, 98, 41, 59, 10,  9, 99,111,108, 95,116,111, 46, 97, 32, 61, 32, 99,111,108, 95,102,114,111,109, 46, 97, 59,
++ 10,125, 10, 10, 35,100,101,102,105,110,101, 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 57, 55,
++ 57, 51, 50, 51, 56, 52, 54, 10, 35,100,101,102,105,110,101, 32, 77, 95, 49, 95, 80, 73, 32, 48, 46, 51, 49, 56, 51, 48, 57, 56,
++ 56, 54, 49, 56, 51, 55, 57, 48, 54, 57, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82, 32,
++ 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,118, 99,111,
++108, 95, 97,116,116,114,105, 98,117,116,101, 40,118,101, 99, 52, 32, 97,116,116,118, 99,111,108, 44, 32,111,117,116, 32,118,101,
++ 99, 52, 32,118, 99,111,108, 41, 10,123, 10,  9,118, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 97,116,116,118, 99,111,108, 46,
++120, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,108, 46,121, 47, 50, 53, 53, 46, 48, 44, 32, 97,116,116,118, 99,111,
++108, 46,122, 47, 50, 53, 53, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,117,118, 95, 97,116,116,114,
++105, 98,117,116,101, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123,
++ 10,  9,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101, 99, 50, 40, 49, 46, 48,
++ 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32,
++ 99,111, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,118,
++101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,118,101, 99, 52, 32, 97,116,
++116,118, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51,
++ 32,108,111, 99, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
++111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109,
++ 97,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,118, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,102,114,111,
++110,116, 98, 97, 99,107, 41, 10,123, 10,  9,108,111, 99, 97,108, 32, 61, 32, 99,111, 59, 10,  9,118,105,101,119, 32, 61, 32,110,
++111,114,109, 97,108,105,122,101, 40,108,111, 99, 97,108, 41, 59, 10,  9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,
++105,110,118,109, 97,116, 42,118,101, 99, 52, 40,108,111, 99, 97,108, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,111,
++114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,  9,117,118, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,
++117,118, 44, 32,117,118, 41, 59, 10,  9,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,108,105,122,101, 40,110,111,
++114, 41, 59,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,115, 32,
++110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,118, 99,111,108, 95, 97,116,116,114,105, 98,117,116,101, 40, 97,116,116,118, 99,
++111,108, 44, 32,118, 99,111,108, 41, 59, 10,  9,102,114,111,110,116, 98, 97, 99,107, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,
++118,111,105,100, 32,109, 97,112,112,105,110,103, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,109, 97,116, 52, 32,109, 97,116, 44,
++ 32,118,101, 99, 51, 32,109,105,110,118,101, 99, 44, 32,118,101, 99, 51, 32,109, 97,120,118,101, 99, 44, 32,102,108,111, 97,116,
++ 32,100,111,109,105,110, 44, 32,102,108,111, 97,116, 32,100,111,109, 97,120, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,
++116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 40,109, 97,116, 32, 42, 32,118,101, 99, 52, 40,118,101,
++ 99, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,  9,105,102, 40,100,111,109,105,110, 32, 61, 61, 32, 49, 46, 48, 41, 10,
++  9,  9,111,117,116,118,101, 99, 32, 61, 32,109, 97,120, 40,111,117,116,118,101, 99, 44, 32,109,105,110,118,101, 99, 41, 59, 10,
++  9,105,102, 40,100,111,109, 97,120, 32, 61, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32,109,105,110,
++ 40,111,117,116,118,101, 99, 44, 32,109, 97,120,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99, 97,109,101,114, 97,
++ 40,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,105,101,119, 44, 32,111,117,116, 32,
++102,108,111, 97,116, 32,111,117,116,100,101,112,116,104, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,105,115,
++116, 41, 10,123, 10,  9,111,117,116,100,101,112,116,104, 32, 61, 32, 97, 98,115, 40, 99,111, 46,122, 41, 59, 10,  9,111,117,116,
++100,105,115,116, 32, 61, 32,108,101,110,103,116,104, 40, 99,111, 41, 59, 10,  9,111,117,116,118,105,101,119, 32, 61, 32,110,111,
++114,109, 97,108,105,122,101, 40, 99,111, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,100,100, 40,102,108,
 +111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
- 111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,
- 118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59,
-  10,125, 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,
- 116, 32,119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116,
-  32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,
- 112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,
- 105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101,
-  99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44,
-  32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,
-  49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93,
-  41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91,
-  50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,
- 101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99,
-  44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,
- 118, 49, 32, 45, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48,
-  93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99,
-  91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114,
-  97,103,101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,
- 117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
- 101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,
- 117,116,118,101, 99, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,
- 101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118,
-  49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116,
-  32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40,
-  48, 44, 32, 48, 44, 32, 48, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59,
-  10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44,
-  32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,
- 108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118,
-  49, 44, 32,118, 50, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41,
-  59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99,
-  51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
- 111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,
- 111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,
- 101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
- 111,117,116,118, 41, 10,123, 10,  9,111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109,
-  97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
- 111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,
- 110,111,114, 32, 61, 32,100,105,114, 59, 10,  9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,
- 111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97,
-  99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44,
-  32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,
- 116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48,
-  41, 42, 48, 46, 53, 41, 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40,
-  99,117,114,118,101,109, 97,112, 44, 32, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,121, 59, 10,
-   9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,
-  40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32,
-  33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32,
-  43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,
- 101,115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,
- 108,101,114, 49, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41,
-  10,123, 10,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,
- 112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,114, 41, 46, 97, 41,
-  46,114, 59, 10,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109,
-  97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46,103, 41, 46, 97,
-  41, 46,103, 59, 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,
- 109, 97,112, 44, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32, 99,111,108, 46, 98, 41, 46,
-  97, 41, 46, 98, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108,
-  32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41,
-  41, 59, 10, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,
- 101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
- 116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,
- 101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108,
-  41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,
- 103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
-  10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,
- 101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
-  97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,
- 111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46,
-  48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51,
-  32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,
- 125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,
- 117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10,
-  10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
++111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 43, 32,118, 97,108, 50, 59,
++ 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,115,117, 98,116,114, 97, 99,116, 40,102,108,111, 97,116, 32,118, 97,108,
++ 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41,
++ 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 45, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,
++100, 32,109, 97,116,104, 95,109,117,108,116,105,112,108,121, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,
++116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,
++118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,
++100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,
++117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 50, 32, 61, 61, 32,
++ 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,
++118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,
++115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
++ 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
++109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116,
++ 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115, 40,118, 97,108, 41, 59, 10,125,
++ 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,
++117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,116, 97,110,
++ 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,110, 40,102,108,111, 97,116, 32,118,
++ 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108,
++ 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108,
++ 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48,
++ 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,111, 97,116, 32,118, 97,108, 44,
++ 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 32, 60, 61,
++ 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,
++ 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59,
++ 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,
++116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 97,116, 97,110,
++ 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119, 40,102,108,111, 97,116, 32,118, 97,
+ 108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
 - 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 42, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,
 -105,100, 32,109, 97,116,104, 95,100,105,118,105,100,101, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116,
 - 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,
 -118, 97,108, 50, 32, 61, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,
 -115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 49, 32, 47, 32,118, 97,108, 50, 59, 10,125, 10, 10,118,111,
 -105,100, 32,109, 97,116,104, 95,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,
 -116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,115,105,110, 40,118, 97,108, 41, 59, 10,
 -125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 99,111,115,105,110,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,
 -117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 99,111,115,
 - 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,116, 97,110,103,101,110,116, 40,102,108,111, 97,
 -116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
 - 97,108, 32, 61, 32,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,115,105,110,
 - 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
 -  9,105,102, 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,
 -  9,  9,111,117,116,118, 97,108, 32, 61, 32, 97,115,105,110, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,
 -116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97, 99,111,115, 40,102,108,
 -111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102,
 - 32, 40,118, 97,108, 32, 60, 61, 32, 49, 46, 48, 32, 38, 38, 32,118, 97,108, 32, 62, 61, 32, 45, 49, 46, 48, 41, 10,  9,  9,111,
 -117,116,118, 97,108, 32, 61, 32, 97, 99,111,115, 40,118, 97,108, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,
 -108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95, 97,116, 97,110, 40,102,108,111, 97,116,
 - 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,
 -108, 32, 61, 32, 97,116, 97,110, 40,118, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,112,111,119, 40,
 -102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,
 -116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10,  9,  9,
 -111,117,116,118, 97,108, 32, 61, 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,
 -  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103,
 - 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111,
 - 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,
 -118, 97,108, 50, 32, 62, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41,
 - 32, 47, 32,108,111,103, 50, 40,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 61, 32, 48,
 - 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44,
 - 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
 - 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,
 -111,105,100, 32,109, 97,116,104, 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118,
++ 41, 10,123, 10,  9,105,102, 32, 40,118, 97,108, 49, 32, 62, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61,
++ 32,112,111,119, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108,
++ 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,111,103, 40,102,108,111, 97,116, 32,118,
++ 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
++108, 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32, 48, 46, 48, 32, 32, 38, 38, 32,118, 97,108, 50, 32, 62, 32, 48,
++ 46, 48, 41, 10,  9,  9,111,117,116,118, 97,108, 61, 32,108,111,103, 50, 40,118, 97,108, 49, 41, 32, 47, 32,108,111,103, 50, 40,
++118, 97,108, 50, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,
++111,105,100, 32,109, 97,116,104, 95,109, 97,120, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118,
+  97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108,
 - 32, 61, 32,109,105,110, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
 - 95,114,111,117,110,100, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
 - 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59,
 - 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,
 -108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
 - 41, 10,123, 10,  9,105,102, 40,118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32,
 - 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,
 -105,100, 32,109, 97,116,104, 95,103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44,
 - 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
 - 10,  9,105,102, 40,118, 97,108, 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48,
 - 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,
 -115,113,117,101,101,122,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,
 -102,108,111, 97,116, 32, 99,101,110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
 -123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56,
 - 50, 56, 49, 56, 51, 44, 32, 45, 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,
 -125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101,
 - 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,
 -116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,  9,
 -111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,
 -117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59,
 - 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,
 -101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
 - 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10,
 -  9,111,117,116,118, 97,108, 32, 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,
 -111,117,116,118,101, 99, 91, 49, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48,
 - 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,
 -118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,
 -116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43,
 - 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,  9,
 -111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,
 -111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118,
 - 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
 -116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59,
 - 10,  9,111,117,116,118, 97,108, 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
 -118,101, 99, 95,109, 97,116,104, 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44,
 - 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
 - 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10,  9,
 -111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100,
 - 32,118,101, 99, 95,109, 97,116,104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,
 -118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
 - 10,  9,111,117,116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61, 32,
 -110,111,114,109, 97,108,105,122,101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,
 -101,103, 97,116,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10,  9,
 -111,117,116,118, 32, 61, 32, 45,118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,
 -105,114, 44, 32,118,101, 99, 51, 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,
 -117,116, 32,102,108,111, 97,116, 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,110,111,114, 32, 61, 32,100,105,114,
 - 59, 10,  9,111,117,116,100,111,116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,
 -111,105,100, 32, 99,117,114,118,101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,
 -101, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51,
 - 32,111,117,116,118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 50, 68,
 - 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46,
 - 53, 44, 32, 48, 46, 48, 41, 41, 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50,
 - 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48,
 - 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,121, 59, 10,  9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101,
 - 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42,
 - 48, 46, 53, 44, 32, 48, 46, 48, 41, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,
 -  9,  9,111,117,116,118,101, 99, 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40,
 - 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,
 -108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,
 -114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,
 -111,108, 46,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,
 -116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,114, 44, 32,
 - 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,114, 59, 10,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,
 -120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68,
 - 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32,
 - 48, 46, 48, 41, 41, 46,103, 59, 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,
 -117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112,
 - 44, 32,118,101, 99, 50, 40, 99,111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46, 98, 59, 10,
 - 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,
 -116, 99,111,108, 42,102, 97, 99, 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,  9,111,
 -117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,
 -117,101, 40,102,108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,
 -123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98,
 - 40,118,101, 99, 51, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,
 -117,116, 99,111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101,
 - 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,
 -111,108, 32, 61, 32, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111,
 - 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 48,
 - 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,
 -111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,
 -118,111,105,100, 32,115,101,116, 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,
 -108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
 -100, 32,115,101,116, 95,114,103, 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41,
 - 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
 -109,105,120, 95, 98,108,101,110,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
 -118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,
 - 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,
 -111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,
 -111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,
 -108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
 -111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,
 -102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,
 -108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97,
 - 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,
 -116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
 - 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
 - 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44,
 - 32, 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32,
 - 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116,
 - 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,
 -118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44,
 - 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
 -102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99,
 - 52, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41,
 - 41, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32,
 - 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,
 -111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
 -117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102,
 - 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
 - 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,
 -116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109,
 - 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,
 -108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48,
 - 32, 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10,  9,
 -105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 42, 61,
 - 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,101,108,115,101, 10,  9,  9,
 -111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,
 - 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103,
 - 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108,
 - 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,101,108,
 -115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46,
 - 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116,
 - 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97,
 - 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99,
 - 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46,
 - 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108,
 - 49, 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49,
 - 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
++ 32, 61, 32,109, 97,120, 40,118, 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104,
++ 95,109,105,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118, 97,108, 50, 44, 32,111,117,116,
++ 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109,105,110, 40,118,
++ 97,108, 49, 44, 32,118, 97,108, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,114,111,117,110,100, 40,102,
++108,111, 97,116, 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,
++117,116,118, 97,108, 61, 32,102,108,111,111,114, 40,118, 97,108, 32, 43, 32, 48, 46, 53, 41, 59, 10,125, 10, 10,118,111,105,100,
++ 32,109, 97,116,104, 95,108,101,115,115, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,
++116, 32,118, 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,
++118, 97,108, 49, 32, 60, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,
++115,101, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,109, 97,116,104, 95,
++103,114,101, 97,116,101,114, 95,116,104, 97,110, 40,102,108,111, 97,116, 32,118, 97,108, 49, 44, 32,102,108,111, 97,116, 32,118,
++ 97,108, 50, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,105,102, 40,118, 97,108,
++ 49, 32, 62, 32,118, 97,108, 50, 41, 10,  9,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,
++  9,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,113,117,101,101,122,101, 40,
++102,108,111, 97,116, 32,118, 97,108, 44, 32,102,108,111, 97,116, 32,119,105,100,116,104, 44, 32,102,108,111, 97,116, 32, 99,101,
++110,116,101,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,
++108, 32, 61, 32, 49, 46, 48, 47, 40, 49, 46, 48, 32, 43, 32,112,111,119, 40, 50, 46, 55, 49, 56, 50, 56, 49, 56, 51, 44, 32, 45,
++ 40, 40,118, 97,108, 45, 99,101,110,116,101,114, 41, 42,119,105,100,116,104, 41, 41, 41, 59, 10,125, 10, 10,118,111,105,100, 32,
++118,101, 99, 95,109, 97,116,104, 95, 97,100,100, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,
++117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108,
++ 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32, 61,
++ 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49, 93,
++ 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,100,
++ 32,118,101, 99, 95,109, 97,116,104, 95,115,117, 98, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,
++111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,
++108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 45, 32,118, 50, 59, 10,  9,111,117,116,118, 97,108, 32,
++ 61, 32, 40, 97, 98,115, 40,111,117,116,118,101, 99, 91, 48, 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 49,
++ 93, 41, 32, 43, 32, 97, 98,115, 40,111,117,116,118,101, 99, 91, 50, 93, 41, 41, 47, 51, 46, 48, 59, 10,125, 10, 10,118,111,105,
++100, 32,118,101, 99, 95,109, 97,116,104, 95, 97,118,101,114, 97,103,101, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51,
++ 32,118, 50, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,
++111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118, 49, 32, 43, 32,118, 50, 59, 10,  9,111,117,
++116,118, 97,108, 32, 61, 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61,
++ 32,110,111,114,109, 97,108,105,122,101, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,
++109, 97,116,104, 95,100,111,116, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,
++101, 99, 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,
++  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 51, 40, 48, 44, 32, 48, 44, 32, 48, 41, 59, 10,  9,111,117,116,118, 97,108,
++ 32, 61, 32,100,111,116, 40,118, 49, 44, 32,118, 50, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104,
++ 95, 99,114,111,115,115, 40,118,101, 99, 51, 32,118, 49, 44, 32,118,101, 99, 51, 32,118, 50, 44, 32,111,117,116, 32,118,101, 99,
++ 51, 32,111,117,116,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,
++117,116,118,101, 99, 32, 61, 32, 99,114,111,115,115, 40,118, 49, 44, 32,118, 50, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 61,
++ 32,108,101,110,103,116,104, 40,111,117,116,118,101, 99, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,
++104, 95,110,111,114,109, 97,108,105,122,101, 40,118,101, 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
++118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108,
++ 32, 61, 32,108,101,110,103,116,104, 40,118, 41, 59, 10,  9,111,117,116,118,101, 99, 32, 61, 32,110,111,114,109, 97,108,105,122,
++101, 40,118, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118,101, 99, 95,109, 97,116,104, 95,110,101,103, 97,116,101, 40,118,101,
++ 99, 51, 32,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 41, 10,123, 10,  9,111,117,116,118, 32, 61, 32, 45,
++118, 59, 10,125, 10, 10,118,111,105,100, 32,110,111,114,109, 97,108, 40,118,101, 99, 51, 32,100,105,114, 44, 32,118,101, 99, 51,
++ 32,110,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116,
++ 32,111,117,116,100,111,116, 41, 10,123, 10,  9,111,117,116,110,111,114, 32, 61, 32,100,105,114, 59, 10,  9,111,117,116,100,111,
++116, 32, 61, 32, 45,100,111,116, 40,100,105,114, 44, 32,110,111,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,
++101,115, 95,118,101, 99, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,
++108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41,
++ 10,123, 10,  9,111,117,116,118,101, 99, 46,120, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,
++112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,120, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41, 41,
++ 46,120, 59, 10,  9,111,117,116,118,101, 99, 46,121, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109,
++ 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,121, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48, 41,
++ 41, 46,121, 59, 10,  9,111,117,116,118,101, 99, 46,122, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,
++109, 97,112, 44, 32,118,101, 99, 50, 40, 40,118,101, 99, 46,122, 32, 43, 32, 49, 46, 48, 41, 42, 48, 46, 53, 44, 32, 48, 46, 48,
++ 41, 41, 46,122, 59, 10, 10,  9,105,102, 32, 40,102, 97, 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116,118,101, 99,
++ 32, 61, 32, 40,111,117,116,118,101, 99, 42,102, 97, 99, 41, 32, 43, 32, 40,118,101, 99, 42, 40, 49, 46, 48, 45,102, 97, 99, 41,
++ 41, 59, 10, 10,125, 10, 10,118,111,105,100, 32, 99,117,114,118,101,115, 95,114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99,
++ 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,117,114,118,101,109, 97,112, 44, 32,
++111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,
++101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50,
++ 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,114, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44,
++ 32, 48, 46, 48, 41, 41, 46,114, 59, 10,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,
++ 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,
++112, 44, 32,118,101, 99, 50, 40, 99,111,108, 46,103, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46,103, 59,
++ 10,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44,
++ 32,118,101, 99, 50, 40,116,101,120,116,117,114,101, 50, 68, 40, 99,117,114,118,101,109, 97,112, 44, 32,118,101, 99, 50, 40, 99,
++111,108, 46, 98, 44, 32, 48, 46, 48, 41, 41, 46, 97, 44, 32, 48, 46, 48, 41, 41, 46, 98, 59, 10, 10,  9,105,102, 32, 40,102, 97,
++ 99, 32, 33, 61, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32, 40,111,117,116, 99,111,108, 42,102, 97, 99,
++ 41, 32, 43, 32, 40, 99,111,108, 42, 40, 49, 46, 48, 45,102, 97, 99, 41, 41, 59, 10, 10,  9,111,117,116, 99,111,108, 46, 97, 32,
++ 61, 32, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 40,102,108,111, 97,116,
++ 32,118, 97,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,
++108, 32, 61, 32,118, 97,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 40,118,101, 99, 51, 32, 99,111,
++108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32,
++ 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103, 98, 97, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,
++111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108,
++ 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,122,101,114,111, 40,111,117,116, 32,102,108,111,
++ 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 48, 46, 48, 59, 10,125, 10, 10,118,
++111,105,100, 32,115,101,116, 95,118, 97,108,117,101, 95,111,110,101, 40,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
++ 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 49, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116,
++ 95,114,103, 98, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,
++116,118, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,116, 95,114,103,
++ 98, 97, 95,122,101,114,111, 40,111,117,116, 32,118,101, 99, 52, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118,
++ 97,108, 32, 61, 32,118,101, 99, 52, 40, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,108,101,110,
++100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
++ 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,
++109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120,
++ 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,
++111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99,
++ 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52,
++ 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48,
++ 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49,
++ 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46,
++ 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
+ 101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
+ 116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
 - 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,
 -111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46,
 - 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97,
 - 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61,
 - 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43,
 - 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40, 99,111,108, 50, 46, 98,
 - 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,
 - 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100,
 - 32,109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,
 -118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102,
 - 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,
 -111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44,
 - 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,
 -105,100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
 - 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
 -  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,
 -116, 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103,
 - 98, 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,
 -111,105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
 -108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
 -123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,
 -111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,
 -114,103, 98, 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10,
 - 10,118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
 - 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
 - 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
 - 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33,
 - 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99,
 - 42, 99,111,108, 50, 46,114, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116,
 - 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,
 -116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61,
 - 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10,
 -  9,125, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,
 -116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,  9,105,102, 40,116,
 -109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,
 -101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49,
 - 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,
 -  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98,
 - 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
 - 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,
 -117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,
 -111,117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98,
 - 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112,
 - 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
++ 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32,
++ 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,
++125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101,
++ 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
++ 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46,
++ 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,
++117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32,
++ 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40,
++ 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97,
++ 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
+  32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
+ 111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
 - 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,
 -102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,116,109,112, 32, 61, 32,102, 97,
 - 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41,
 - 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112,
 - 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41,
 - 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,
 -105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,
 -  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10,  9,116,109,112, 32, 61, 32,
 -102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46,
 - 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,116,
 -109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112,
 - 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,
 -101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48,
 - 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10,  9,116,109,112, 32,
 - 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32,
 - 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40,
 - 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,
 -109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,
 -108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49,
 - 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,
 -111,105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
++ 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10,
++ 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60,
++ 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102,
++ 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46,
++ 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,
++114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,
++108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32,
++ 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103,
++ 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32,
++ 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10,  9,105,102, 40,
++111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97,
++ 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116,
++ 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49,
++ 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,
++125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
 + 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
 + 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
-  10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59,
-  10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120,
-  95, 97,100,100, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32,
-  99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32,
-  99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,
- 109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 43, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,
- 116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,109,117,108,
- 116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
++ 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50,
++ 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,
++111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
+  44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
+   9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,
+ 111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61,
 - 32, 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,
 -103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50,
 - 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108,
 - 44, 32,104,115,118, 41, 59, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 95,
++ 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,
++108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108,
++ 46,114, 47, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40, 99,111,108, 50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,
++116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116,
++ 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40, 99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41,
++ 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,
++111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,
++102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
 + 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,
 +109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120,
-  40, 99,111,108, 49, 44, 32, 99,111,108, 49, 32, 42, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,
- 108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 99,114,101,101,110,
-  40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50,
-  44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,
- 112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32,
-  49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 32,
-  45, 32, 40,118,101, 99, 52, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45,
-  32, 99,111,108, 50, 41, 41, 42, 40,118,101, 99, 52, 40, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116,
-  99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,111,118,101,114,
- 108, 97,121, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
++ 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10,  9,
++111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,
++ 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
++111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,
++108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 46,114,103, 98,
++ 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10,
++  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
++108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
++ 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61,
++ 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 46,114,
++103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41,
++ 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,
++120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101,
++ 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99,
++ 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108,
++ 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123,
++ 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59,
++ 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,
++ 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,
++109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,
++101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,
++117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32,
++ 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46,
++ 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40,
++ 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,
++117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,
++103, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41,
++ 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,
++ 98, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32,
++ 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46, 98,
++ 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,
++  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,125, 10, 10,
++118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,
++108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,
++123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,
++102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,
++117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99,
++ 42, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,
++108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32,
++ 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,
++  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62,
++ 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,
++111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10,  9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102,
++ 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116,
++ 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46,
++ 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48,
++ 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112,
++ 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,
++  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10, 10,  9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43,
++ 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,
++117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40,
++ 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48,
++ 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40,116,
++109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,
++101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
++104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
 +111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,
 +108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109,
 + 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,
-   9,105,102, 40,111,117,116, 99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 42,
-  61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,101,108,115,101, 10,  9,
-   9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97,
-  99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,
- 114, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,
- 108, 46,103, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,101,
- 108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50,
-  46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,
- 116, 99,111,108, 46,103, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,
- 111,117,116, 99,111,108, 46, 98, 32, 42, 61, 32,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 99,111,108, 50, 46,
-  98, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,
- 109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99, 42, 40, 49, 46, 48, 32, 45, 32, 99,111,108, 50, 46, 98, 41, 41, 42, 40, 49, 46, 48,
-  32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,117, 98, 40,102,108,
++  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,
++118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46,
++ 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10,
++  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,
++115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,
++108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10,  9,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46,
++ 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
++ 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
++111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
++ 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10,
++ 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118,
++ 50, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10,  9,105,
++102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,
++111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,
++121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10,  9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118,
++ 44, 32,111,117,116, 99,111,108, 41, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,
 +111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
 +117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102,
-  97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108,
-  49, 44, 32, 99,111,108, 49, 32, 45, 32, 99,111,108, 50, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32,
-  61, 32, 99,111,108, 49, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,105,118, 40,102,108,111, 97,116, 32,
++ 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
++ 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10,  9,114,103, 98, 95,116,
++111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,
++108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32,
++ 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,
++117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,
 +102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,
 +101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32,
 + 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102,
-  97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114,
-  32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,114, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 46,
- 114, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,114, 47, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40, 99,111,108,
-  50, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46,103, 32, 61, 32,102, 97, 99,109, 42,111,117,116, 99,
- 111,108, 46,103, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46,103, 47, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40,
-  99,111,108, 50, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,111,117,116, 99,111,108, 46, 98, 32, 61, 32,102, 97, 99,109, 42,111,
- 117,116, 99,111,108, 46, 98, 32, 43, 32,102, 97, 99, 42,111,117,116, 99,111,108, 46, 98, 47, 99,111,108, 50, 46, 98, 59, 10,125,
-  10, 10,118,111,105,100, 32,109,105,120, 95,100,105,102,102, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32,
-  99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108,
-  41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59,
-  10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 49, 44, 32, 97, 98,115, 40, 99,111,108, 49, 32, 45, 32,
-  99,111,108, 50, 41, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59,
-  10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100, 97,114,107, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
-  52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
- 111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48,
-  41, 59, 10,  9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109,105,110, 40, 99,111,108, 49, 46,114,103, 98, 44, 32, 99,
- 111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97,
-  59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,103,104,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,
- 101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
- 116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49,
-  46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 46,114,103, 98, 32, 61, 32,109, 97,120, 40, 99,111,108, 49, 46,114,103, 98, 44,
-  32, 99,111,108, 50, 46,114,103, 98, 42,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49,
-  46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,100,111,100,103,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44,
-  32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,
- 111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44,
-  32, 49, 46, 48, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40,111,117,116, 99,
- 111,108, 46,114, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48,
-  32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,
-   9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,
- 112, 32, 61, 32,111,117,116, 99,111,108, 46,114, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,
- 111,108, 46,114, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61,
-  32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,
-   9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,
-   9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49,
-  46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46,103, 47,116,109,
- 112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,
- 108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10,  9,125, 10,  9,105,102, 40,111,117,
- 116, 99,111,108, 46, 98, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,102,108,111, 97,116, 32,116,109,112, 32, 61, 32, 49,
-  46, 48, 32, 45, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,  9,105,102, 40,116,109,112, 32, 60, 61, 32, 48, 46, 48,
-  41, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 32,105,102, 40, 40,
- 116,109,112, 32, 61, 32,111,117,116, 99,111,108, 46, 98, 47,116,109,112, 41, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,  9,111,117,
- 116, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,  9,101,108,115,101, 10,  9,  9,  9,111,117,116, 99,111,108, 46, 98,
-  32, 61, 32,116,109,112, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 98,117,114,110, 40,102,108,111, 97,
- 116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116,
-  32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99,
-  44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,116,109,112, 44, 32,102, 97, 99,109, 32, 61, 32,
-  49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,116,109,
- 112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,114, 59, 10,  9,105,102, 40,116,109,112, 32, 60,
-  61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101, 32,105,
- 102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,114, 41,
-  47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32, 48, 46, 48, 59, 10,
-   9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61,
-  32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114, 32, 61, 32,116,109,112, 59, 10, 10,  9,
- 116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46,103, 59, 10,  9,105,102, 40,116,109,112,
-  32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,115,101,
-  32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,
- 103, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32, 48, 46, 48,
-  59, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103,
-  32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 32, 61, 32,116,109,112, 59, 10,
-  10,  9,116,109,112, 32, 61, 32,102, 97, 99,109, 32, 43, 32,102, 97, 99, 42, 99,111,108, 50, 46, 98, 59, 10,  9,105,102, 40,116,
- 109,112, 32, 60, 61, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48, 46, 48, 59, 10,  9,101,108,
- 115,101, 32,105,102, 40, 40,116,109,112, 32, 61, 32, 40, 49, 46, 48, 32, 45, 32, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,
- 108, 46, 98, 41, 47,116,109,112, 41, 41, 32, 60, 32, 48, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32, 48,
-  46, 48, 59, 10,  9,101,108,115,101, 32,105,102, 40,116,109,112, 32, 62, 32, 49, 46, 48, 41, 10,  9,  9,111,117,116, 99,111,108,
-  46, 98, 32, 61, 32, 49, 46, 48, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 32, 61, 32,116,109,112,
-  59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,104,117,101, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
-  52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,
- 111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48,
-  41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,
- 116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,
- 109,112, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,
- 102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,
- 111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,
-   9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10,  9,  9,111,117,116, 99,
- 111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10,  9,  9,111,117,
- 116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,
- 115, 97,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,
- 111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,
- 108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109,
-  32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,
-   9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116,
-  99,111,108, 44, 32,104,115,118, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,
-   9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,  9,104,115,118,
-  46,121, 32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10,  9,  9,
- 104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,  9,125, 10,125, 10, 10,118,
- 111,105,100, 32,109,105,120, 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
-  44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
-   9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,
- 111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118,
-  44, 32,104,115,118, 50, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10,
-   9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,104,115,118, 46,122,
-  32, 61, 32,102, 97, 99,109, 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10,  9,104,115,118,
-  95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,
- 120, 95, 99,111,108,111,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101,
-  99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99,
-  32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,
- 102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108,
-  49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,103, 98, 95,116,
- 111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33,
-  61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,
- 118, 41, 59, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,
- 104,115,118, 50, 46,121, 59, 10,  9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32,
-  10, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97,
-  99, 41, 59, 10,  9,  9,111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,
- 111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108,
-  49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123,
-  10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,
- 108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,111,110,
- 101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10,  9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,
- 111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,
- 108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49,
-  41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100,
-  32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49,
-  44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,
-   9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10,  9,111,
- 117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41,
-  10,  9,  9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40,
-  99,111,108, 50, 46,114, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114,
-  61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49,
-  46, 48, 41, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108,
-  46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32,
-  48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32,
-  43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,  9,105,102,
-  40, 99,111,108, 50, 46, 98, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46,
-  98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,
- 108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46,
-  48, 42, 40, 99,111,108, 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,
- 114,103, 98, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 49, 68, 32, 99,111,108,111,114,109, 97,
- 112, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,
- 116, 97,108,112,104, 97, 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 49, 68, 40, 99,111,
- 108,111,114,109, 97,112, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,117,116, 99,111,108,
-  46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,
- 111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,
-  99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53, 32, 43, 32, 99,111,
- 108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97, 99,116,111,114,115,
-  32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66, 84, 79, 66, 87, 32,
-  42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99,
-  52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,111,117,116, 99,111,
- 108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49, 46, 48, 44, 32, 49,
-  46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10,  9,111,117,116, 99,111,
- 108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,116, 40,102,108,111,
-  97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,
- 102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,
- 116, 99,111,108, 41, 10,123, 10,  9,118,101, 99, 52, 32,104,115,118, 59, 10, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,
-  99,111,108, 44, 32,104,115,118, 41, 59, 10, 10,  9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101, 32, 45, 32, 48, 46,
-  53, 41, 59, 10,  9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45, 61, 49, 46, 48, 59,
-  32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93, 43, 61, 32, 49, 46,
-  48, 59, 10,  9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10,  9,105,102, 40,104,115,118, 91, 49, 93, 62, 49, 46,
-  48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 49, 93, 60, 48,
-  46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10,  9,104,115,118, 91, 50, 93, 32, 42, 61, 32,118, 97,108,117,
- 101, 59, 10,  9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 49, 46, 48, 59, 32,
- 101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32, 48, 46, 48, 59,
-  10, 10,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10, 10,  9,111,117,
- 116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99, 41, 59, 10,125, 10,
-  10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116,
-  32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,102,108,111, 97,116,
-  32, 98, 41, 10,123, 10,  9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10,  9,103, 32, 61, 32, 99,111,108, 46,103, 59, 10,  9, 98,
-  32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,103, 98, 40,102,108,
- 111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,116, 32,118,101, 99,
-  52, 32, 99,111,108, 41, 10,123, 10,  9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32, 98, 44, 32, 49, 46,
-  48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99, 52, 32,114,103, 98,
-  44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,114,103, 98, 41, 10,
- 123, 10,  9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,108,112,104, 97, 41,
-  59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32, 42, 42, 42, 42, 42,
-  42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,108,105,112, 95, 98,
- 108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,118,101, 99, 41, 10,
- 123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,
- 116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111,
-  97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48, 43,118,101, 99, 46,
- 120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,113,117,
-  97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123,
-  10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 44, 32,
-  48, 46, 48, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10, 10,118,111,105,100,
-  32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,
- 102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116,
-  32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 97, 32, 61, 32,115,113,114,116, 40,
- 118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43, 32,118,101, 99, 46,
- 122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10,  9,102,108,111, 97,116, 32,119,105, 32, 61, 32, 48, 46, 53, 32, 43,
-  32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10,  9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10,  9, 99,111,108,111,
- 114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10,  9,110,111,114,109,
-  97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,
- 100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115, 97,109,112,108,101,
- 114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101,
-  99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,  9, 99,111,
- 108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,121, 32, 43, 32,118,
- 101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10,  9,118, 97,108,117,101, 32, 61, 32, 49, 46,
-  48, 59, 10, 10,  9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46,114, 32, 45, 32, 48,
-  46, 53, 41, 59, 10,  9,110,111,114,109, 97,108, 46,121, 32, 61, 32, 50, 46, 48, 42, 40, 48, 46, 53, 32, 45, 32, 99,111,108,111,
- 114, 46,103, 41, 59, 10,  9,110,111,114,109, 97,108, 46,122, 32, 61, 32, 50, 46, 48, 42, 40, 99,111,108,111,114, 46, 98, 32, 45,
-  32, 48, 46, 53, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 77, 84, 69, 88, 32, 42, 42,
-  42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111,114, 99,
- 111, 40,118,101, 99, 51, 32, 97,116,116,111,114, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,114, 99,111, 41, 10,123,
-  10,  9,111,114, 99,111, 32, 61, 32, 97,116,116,111,114, 99,111, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,
- 117,118, 40,118,101, 99, 50, 32, 97,116,116,117,118, 44, 32,111,117,116, 32,118,101, 99, 51, 32,117,118, 41, 10,123, 10,  9, 47,
-  42, 32,100,105,115, 97, 98,108,101,100, 32,102,111,114, 32,110,111,119, 44, 32,119,111,114,107,115, 32,116,111,103,101,116,104,
- 101,114, 32,119,105,116,104, 32,108,101, 97,118,105,110,103, 32,111,117,116, 32,109,116,101,120, 95, 50,100, 95,109, 97,112,112,
- 105,110,103, 10,  9, 32, 32, 32,117,118, 32, 61, 32,118,101, 99, 51, 40, 97,116,116,117,118, 42, 50, 46, 48, 32, 45, 32,118,101,
-  99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 44, 32, 48, 46, 48, 41, 59, 32, 42, 47, 10,  9,117,118, 32, 61, 32,118,101, 99,
-  51, 40, 97,116,116,117,118, 44, 32, 48, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,110,111,114,
- 109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
- 108, 41, 10,123, 10,  9, 47, 42, 32, 99,111,114,114,101,115,112,111,110,100,115, 32,116,111, 32,115,104,105, 45, 62,111,114,110,
-  44, 32,119,104,105, 99,104, 32,105,115, 32,110,101,103, 97,116,101,100, 32,115,111, 32, 99, 97,110, 99,101,108,115, 10,  9, 32,
-  32, 32,111,117,116, 32, 98,108,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,110,101,103, 97,116,105,111,110, 32, 42, 47,
-  10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,110,111,114,109, 97,108, 41, 59,
-  10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,116, 97,110,103,101,110,116, 40,118,101, 99, 52, 32,116, 97,110,103,
- 101,110,116, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,116, 97,110,103,101,110,116, 41, 10,123, 10,  9,111,117,116,
- 116, 97,110,103,101,110,116, 32, 61, 32,110,111,114,109, 97,108,105,122,101, 40,116, 97,110,103,101,110,116, 46,120,121,122, 41,
-  59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,103,108,111, 98, 97,108, 40,109, 97,116, 52, 32,118,105,101,119,
- 105,110,118,109, 97,116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,103,108,111, 98, 97,108,
-  41, 10,123, 10,  9,103,108,111, 98, 97,108, 32, 61, 32, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,101, 99, 52, 40, 99,
- 111, 44, 32, 49, 46, 48, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,111, 95,111, 98,106,101,
-  99,116, 40,109, 97,116, 52, 32,118,105,101,119,105,110,118,109, 97,116, 44, 32,109, 97,116, 52, 32,111, 98,105,110,118,109, 97,
- 116, 44, 32,118,101, 99, 51, 32, 99,111, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111, 98,106,101, 99,116, 41, 10,123, 10,  9,
- 111, 98,106,101, 99,116, 32, 61, 32, 40,111, 98,105,110,118,109, 97,116, 42, 40,118,105,101,119,105,110,118,109, 97,116, 42,118,
- 101, 99, 52, 40, 99,111, 44, 32, 49, 46, 48, 41, 41, 41, 46,120,121,122, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120, 99,
- 111, 95,114,101,102,108, 40,118,101, 99, 51, 32,118,110, 44, 32,118,101, 99, 51, 32,118,105,101,119, 44, 32,111,117,116, 32,118,
- 101, 99, 51, 32,114,101,102, 41, 10,123, 10,  9,114,101,102, 32, 61, 32,118,105,101,119, 32, 45, 32, 50, 46, 48, 42,100,111,116,
-  40,118,110, 44, 32,118,105,101,119, 41, 42,118,110, 59, 10,125, 10, 10,118,111,105,100, 32,115,104, 97,100,101, 95,110,111,114,
- 109, 40,118,101, 99, 51, 32,110,111,114,109, 97,108, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,110,111,114,109, 97,
- 108, 41, 10,123, 10,  9, 47, 42, 32, 98,108,101,110,100,101,114, 32,114,101,110,100,101,114, 32,110,111,114,109, 97,108, 32,105,
- 115, 32,110,101,103, 97,116,101,100, 32, 42, 47, 10,  9,111,117,116,110,111,114,109, 97,108, 32, 61, 32, 45,110,111,114,109, 97,
- 108,105,122,101, 40,110,111,114,109, 97,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95, 98,
- 108,101,110,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,
- 108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
- 105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,
- 102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,116, 59, 10, 10,  9,105,110, 99,111,108, 32,
-  61, 32,102, 97, 99,116, 42,116,101,120, 99,111,108, 32, 43, 32,102, 97, 99,109, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,
- 118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,109,117,108, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,
- 101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97,
-  99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,
- 109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102,
-  97, 99,103, 59, 10, 10,  9,105,110, 99,111,108, 32, 61, 32, 40,102, 97, 99,109, 32, 43, 32,102, 97, 99,116, 42,116,101,120, 99,
- 111,108, 41, 42,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,115, 99,114,
- 101,101,110, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,
- 111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,
- 110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,102,
-  97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,  9,105,110, 99,111,108, 32, 61,
-  32,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32, 40,118,101, 99, 51, 40,102, 97, 99,109, 41, 32, 43, 32,102, 97, 99,116, 42,
-  40,118,101, 99, 51, 40, 49, 46, 48, 41, 32, 45, 32,116,101,120, 99,111,108, 41, 41, 42, 40,118,101, 99, 51, 40, 49, 46, 48, 41,
-  32, 45, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,111,118,101,
- 114,108, 97,121, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,
- 108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,
- 105,110, 99,111,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 59, 10, 10,  9,102, 97, 99,116, 32, 42, 61, 32,
- 102, 97, 99,103, 59, 10,  9,102, 97, 99,109, 32, 61, 32, 49, 46, 48, 45,102, 97, 99,103, 59, 10, 10,  9,105,102, 40,111,117,116,
-  99,111,108, 46,114, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,105,110, 99,111,108, 46,114, 32, 61, 32,111,117,116, 99,111,108, 46,
- 114, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,114, 41, 59, 10,  9,101,
- 108,115,101, 10,  9,  9,105,110, 99,111,108, 46,114, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46,
-  48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46,114, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,
- 111,117,116, 99,111,108, 46,114, 41, 59, 10, 10,  9,105,102, 40,111,117,116, 99,111,108, 46,103, 32, 60, 32, 48, 46, 53, 41, 10,
-   9,  9,105,110, 99,111,108, 46,103, 32, 61, 32,111,117,116, 99,111,108, 46,103, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48,
-  42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,103, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,105,110, 99,111,108, 46,103,
-  32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45,
-  32,116,101,120, 99,111,108, 46,103, 41, 41, 42, 40, 49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46,103, 41, 59, 10, 10,  9,
- 105,102, 40,111,117,116, 99,111,108, 46, 98, 32, 60, 32, 48, 46, 53, 41, 10,  9,  9,105,110, 99,111,108, 46, 98, 32, 61, 32,111,
- 117,116, 99,111,108, 46, 98, 42, 40,102, 97, 99,109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42,116,101,120, 99,111,108, 46,
-  98, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,105,110, 99,111,108, 46, 98, 32, 61, 32, 49, 46, 48, 32, 45, 32, 40,102, 97, 99,
- 109, 32, 43, 32, 50, 46, 48, 42,102, 97, 99,116, 42, 40, 49, 46, 48, 32, 45, 32,116,101,120, 99,111,108, 46, 98, 41, 41, 42, 40,
-  49, 46, 48, 32, 45, 32,111,117,116, 99,111,108, 46, 98, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103,
-  98, 95,115,117, 98, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,
- 102,108,111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51,
-  32,105,110, 99,111,108, 41, 10,123, 10,  9,105,110, 99,111,108, 32, 61, 32, 45,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,
- 120, 99,111,108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,
-  97,100,100, 40,118,101, 99, 51, 32,111,117,116, 99,111,108, 44, 32,118,101, 99, 51, 32,116,101,120, 99,111,108, 44, 32,102,108,
- 111, 97,116, 32,102, 97, 99,116, 44, 32,102,108,111, 97,116, 32,102, 97, 99,103, 44, 32,111,117,116, 32,118,101, 99, 51, 32,105,
- 110, 99,111,108, 41, 10,123, 10,  9,105,110, 99,111,108, 32, 61, 32,102, 97, 99,116, 42,102, 97, 99,103, 42,116,101,120, 99,111,
- 108, 32, 43, 32,111,117,116, 99,111,108, 59, 10,125, 10, 10,118,111,105,100, 32,109,116,101,120, 95,114,103, 98, 95,100,105,118,
++ 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44,
++ 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,
++118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98,
++ 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10,  9,  9,104,115,118, 46,120, 32, 61, 32,
++104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121, 59, 10,  9,  9,104,115,118, 95,
+ 116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10,  9,  9,111,117,116, 99,111,108, 32, 61, 32,109,
+ 105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10,  9,  9,111,117,116, 99,111,108, 46, 97,
 - 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115, 97,116, 40,102,108,
++ 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,115,111,102,116, 40,102,
++108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,
++111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,
++102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46,
++ 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99, 52, 40, 49, 46, 48, 41, 59, 10,
++  9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32, 99,111,108, 50, 41, 42, 40,111,
++110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,102, 97, 99,109, 42, 99,111,108, 49, 32,
++ 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50, 42, 99,111,108, 49, 32, 43, 32,
++ 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,105,110,101, 97,114, 40,102,108,
+ 111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108, 50, 44, 32,111,
+ 117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,109,112, 40,102,
 - 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61, 32, 49, 46, 48,
 - 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,101, 99, 52, 32,
 -104,115,118, 44, 32,104,115,118, 50, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,
 -115,118, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 46,121, 32, 33, 61, 32, 48, 46, 48, 41, 32,123, 10,  9,  9,114,103, 98, 95,
 -116,111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,102,
 - 97, 99,109, 42,104,115,118, 46,121, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,121, 59, 10,  9,  9,104,115,118, 95,116,111,
 - 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,
 -120, 95,118, 97,108, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
 - 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61,
 - 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97,
 - 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50,
 - 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40, 99,111,108, 49, 44, 32,104,115,118, 41, 59, 10,  9,114,103, 98, 95,116,
 -111, 95,104,115,118, 40, 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,104,115,118, 46,122, 32, 61, 32,102, 97, 99,
 -109, 42,104,115,118, 46,122, 32, 43, 32,102, 97, 99, 42,104,115,118, 50, 46,122, 59, 10,  9,104,115,118, 95,116,111, 95,114,103,
 - 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95, 99,111,108,111,
 -114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52, 32, 99,111,108,
 - 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61, 32, 99,108, 97,
 -109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102, 97, 99,109, 32, 61,
 - 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32, 99,111,108, 49, 59, 10, 10,  9,118,
 -101, 99, 52, 32,104,115,118, 44, 32,104,115,118, 50, 44, 32,116,109,112, 59, 10,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,
 - 99,111,108, 50, 44, 32,104,115,118, 50, 41, 59, 10, 10,  9,105,102, 40,104,115,118, 50, 46,121, 32, 33, 61, 32, 48, 46, 48, 41,
 - 32,123, 10,  9,  9,114,103, 98, 95,116,111, 95,104,115,118, 40,111,117,116, 99,111,108, 44, 32,104,115,118, 41, 59, 10,  9,  9,
 -104,115,118, 46,120, 32, 61, 32,104,115,118, 50, 46,120, 59, 10,  9,  9,104,115,118, 46,121, 32, 61, 32,104,115,118, 50, 46,121,
 - 59, 10,  9,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,116,109,112, 41, 59, 32, 10, 10,  9,  9,111,117,
 -116, 99,111,108, 32, 61, 32,109,105,120, 40,111,117,116, 99,111,108, 44, 32,116,109,112, 44, 32,102, 97, 99, 41, 59, 10,  9,  9,
 -111,117,116, 99,111,108, 46, 97, 32, 61, 32, 99,111,108, 49, 46, 97, 59, 10,  9,125, 10,125, 10, 10,118,111,105,100, 32,109,105,
 -120, 95,115,111,102,116, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99,
 - 52, 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32,
 - 61, 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10,  9,102,108,111, 97,116, 32,102,
 - 97, 99,109, 32, 61, 32, 49, 46, 48, 32, 45, 32,102, 97, 99, 59, 10, 10,  9,118,101, 99, 52, 32,111,110,101, 61, 32,118,101, 99,
 - 52, 40, 49, 46, 48, 41, 59, 10,  9,118,101, 99, 52, 32,115, 99,114, 61, 32,111,110,101, 32, 45, 32, 40,111,110,101, 32, 45, 32,
 - 99,111,108, 50, 41, 42, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 59, 10,  9,111,117,116, 99,111,108, 32, 61, 32,102, 97,
 - 99,109, 42, 99,111,108, 49, 32, 43, 32,102, 97, 99, 42, 40, 40,111,110,101, 32, 45, 32, 99,111,108, 49, 41, 42, 99,111,108, 50,
 - 42, 99,111,108, 49, 32, 43, 32, 99,111,108, 49, 42,115, 99,114, 41, 59, 10,125, 10, 10,118,111,105,100, 32,109,105,120, 95,108,
 -105,110,101, 97,114, 40,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 49, 44, 32,118,101, 99, 52,
 - 32, 99,111,108, 50, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,102, 97, 99, 32, 61,
 - 32, 99,108, 97,109,112, 40,102, 97, 99, 44, 32, 48, 46, 48, 44, 32, 49, 46, 48, 41, 59, 10, 10,  9,111,117,116, 99,111,108, 32,
 - 61, 32, 99,111,108, 49, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,114, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116,
 - 99,111,108, 46,114, 61, 32, 99,111,108, 49, 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114,
 - 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,114, 61, 32, 99,111,108, 49,
 - 46,114, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,114, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,
 -  9,105,102, 40, 99,111,108, 50, 46,103, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,
 -108, 49, 46,103, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 32, 45, 32, 48, 46, 53, 41, 41, 59,
 - 10,  9,101,108,115,101, 10,  9,  9,111,117,116, 99,111,108, 46,103, 61, 32, 99,111,108, 49, 46,103, 32, 43, 32,102, 97, 99, 42,
 - 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46,103, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10, 10,  9,105,102, 40, 99,111,108, 50, 46,
 - 98, 32, 62, 32, 48, 46, 53, 41, 10,  9,  9,111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97,
 - 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108, 50, 46, 98, 32, 45, 32, 48, 46, 53, 41, 41, 59, 10,  9,101,108,115,101, 10,  9,  9,
 -111,117,116, 99,111,108, 46, 98, 61, 32, 99,111,108, 49, 46, 98, 32, 43, 32,102, 97, 99, 42, 40, 50, 46, 48, 42, 40, 99,111,108,
 - 50, 46, 98, 41, 32, 45, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,118, 97,108,116,111,114,103, 98, 40,102,108,
 -111, 97,116, 32,102, 97, 99, 44, 32,115, 97,109,112,108,101,114, 50, 68, 32, 99,111,108,111,114,109, 97,112, 44, 32,111,117,116,
 - 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116, 97,108,112,104, 97,
 - 41, 10,123, 10,  9,111,117,116, 99,111,108, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40, 99,111,108,111,114,109, 97,112,
 - 44, 32,118,101, 99, 50, 40,102, 97, 99, 44, 32, 48, 46, 48, 41, 41, 59, 10,  9,111,117,116, 97,108,112,104, 97, 32, 61, 32,111,
 -117,116, 99,111,108, 46, 97, 59, 10,125, 10, 10,118,111,105,100, 32,114,103, 98,116,111, 98,119, 40,118,101, 99, 52, 32, 99,111,
 -108,111,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 32, 32, 10,123, 10,  9,111,117,116,118,
 - 97,108, 32, 61, 32, 99,111,108,111,114, 46,114, 42, 48, 46, 51, 53, 32, 43, 32, 99,111,108,111,114, 46,103, 42, 48, 46, 52, 53,
 - 32, 43, 32, 99,111,108,111,114, 46, 98, 42, 48, 46, 50, 59, 32, 47, 42, 32,107,101,101,112, 32,116,104,101,115,101, 32,102, 97,
 - 99,116,111,114,115, 32,105,110, 32,115,121,110, 99, 32,119,105,116,104, 32,116,101,120,116,117,114,101, 46,104, 58, 82, 71, 66,
 - 84, 79, 66, 87, 32, 42, 47, 10,125, 10, 10,118,111,105,100, 32,105,110,118,101,114,116, 40,102,108,111, 97,116, 32,102, 97, 99,
 - 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,
 -111,117,116, 99,111,108, 46,120,121,122, 32, 61, 32,109,105,120, 40, 99,111,108, 46,120,121,122, 44, 32,118,101, 99, 51, 40, 49,
 - 46, 48, 44, 32, 49, 46, 48, 44, 32, 49, 46, 48, 41, 32, 45, 32, 99,111,108, 46,120,121,122, 44, 32,102, 97, 99, 41, 59, 10,  9,
 -111,117,116, 99,111,108, 46,119, 32, 61, 32, 99,111,108, 46,119, 59, 10,125, 10, 10,118,111,105,100, 32,104,117,101, 95,115, 97,
 -116, 40,102,108,111, 97,116, 32,104,117,101, 44, 32,102,108,111, 97,116, 32,115, 97,116, 44, 32,102,108,111, 97,116, 32,118, 97,
 -108,117,101, 44, 32,102,108,111, 97,116, 32,102, 97, 99, 44, 32,118,101, 99, 52, 32, 99,111,108, 44, 32,111,117,116, 32,118,101,
 - 99, 52, 32,111,117,116, 99,111,108, 41, 10,123, 10,  9,118,101, 99, 52, 32,104,115,118, 59, 10, 10,  9,114,103, 98, 95,116,111,
 - 95,104,115,118, 40, 99,111,108, 44, 32,104,115,118, 41, 59, 10, 10,  9,104,115,118, 91, 48, 93, 32, 43, 61, 32, 40,104,117,101,
 - 32, 45, 32, 48, 46, 53, 41, 59, 10,  9,105,102, 40,104,115,118, 91, 48, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 48, 93, 45,
 - 61, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 48, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 48, 93,
 - 43, 61, 32, 49, 46, 48, 59, 10,  9,104,115,118, 91, 49, 93, 32, 42, 61, 32,115, 97,116, 59, 10,  9,105,102, 40,104,115,118, 91,
 - 49, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118,
 - 91, 49, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 49, 93, 61, 32, 48, 46, 48, 59, 10,  9,104,115,118, 91, 50, 93, 32, 42, 61,
 - 32,118, 97,108,117,101, 59, 10,  9,105,102, 40,104,115,118, 91, 50, 93, 62, 49, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61, 32,
 - 49, 46, 48, 59, 32,101,108,115,101, 32,105,102, 40,104,115,118, 91, 50, 93, 60, 48, 46, 48, 41, 32,104,115,118, 91, 50, 93, 61,
 - 32, 48, 46, 48, 59, 10, 10,  9,104,115,118, 95,116,111, 95,114,103, 98, 40,104,115,118, 44, 32,111,117,116, 99,111,108, 41, 59,
 - 10, 10,  9,111,117,116, 99,111,108, 32, 61, 32,109,105,120, 40, 99,111,108, 44, 32,111,117,116, 99,111,108, 44, 32,102, 97, 99,
 - 41, 59, 10,125, 10, 10,118,111,105,100, 32,115,101,112, 97,114, 97,116,101, 95,114,103, 98, 40,118,101, 99, 52, 32, 99,111,108,
 - 44, 32,111,117,116, 32,102,108,111, 97,116, 32,114, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,103, 44, 32,111,117,116, 32,
 -102,108,111, 97,116, 32, 98, 41, 10,123, 10,  9,114, 32, 61, 32, 99,111,108, 46,114, 59, 10,  9,103, 32, 61, 32, 99,111,108, 46,
 -103, 59, 10,  9, 98, 32, 61, 32, 99,111,108, 46, 98, 59, 10,125, 10, 10,118,111,105,100, 32, 99,111,109, 98,105,110,101, 95,114,
 -103, 98, 40,102,108,111, 97,116, 32,114, 44, 32,102,108,111, 97,116, 32,103, 44, 32,102,108,111, 97,116, 32, 98, 44, 32,111,117,
 -116, 32,118,101, 99, 52, 32, 99,111,108, 41, 10,123, 10,  9, 99,111,108, 32, 61, 32,118,101, 99, 52, 40,114, 44, 32,103, 44, 32,
 - 98, 44, 32, 49, 46, 48, 41, 59, 10,125, 10, 10,118,111,105,100, 32,111,117,116,112,117,116, 95,110,111,100,101, 40,118,101, 99,
 - 52, 32,114,103, 98, 44, 32,102,108,111, 97,116, 32, 97,108,112,104, 97, 44, 32,111,117,116, 32,118,101, 99, 52, 32,111,117,116,
 -114,103, 98, 41, 10,123, 10,  9,111,117,116,114,103, 98, 32, 61, 32,118,101, 99, 52, 40,114,103, 98, 46,114,103, 98, 44, 32, 97,
 -108,112,104, 97, 41, 59, 10,125, 10, 10, 47, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 32, 84, 69, 88, 84, 85, 82, 69, 83, 32,
 - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 47, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,102,
 -108,105,112, 95, 98,108,101,110,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,118,101, 99, 51, 32,111,117,116,
 -118,101, 99, 41, 10,123, 10,  9,111,117,116,118,101, 99, 32, 61, 32,118,101, 99, 46,121,120,122, 59, 10,125, 10, 10,118,111,105,
 -100, 32,116,101,120,116,117,114,101, 95, 98,108,101,110,100, 95,108,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,
 -116, 32,102,108,111, 97,116, 32,111,117,116,118, 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32, 40, 49, 46, 48,
 - 43,118,101, 99, 46,120, 41, 47, 50, 46, 48, 59, 10,125, 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95, 98,108,101,
 -110,100, 95,113,117, 97,100, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,111,117,116,118,
 - 97,108, 41, 10,123, 10,  9,111,117,116,118, 97,108, 32, 61, 32,109, 97,120, 40, 40, 49, 46, 48, 43,118,101, 99, 46,120, 41, 47,
 - 50, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,  9,111,117,116,118, 97,108, 32, 42, 61, 32,111,117,116,118, 97,108, 59, 10,125, 10,
 - 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,119,111,111,100, 95,115,105,110, 40,118,101, 99, 51, 32,118,101, 99, 44,
 - 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114,
 - 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,123, 10,  9,102,108,111, 97,116, 32, 97, 32, 61, 32,
 -115,113,114,116, 40,118,101, 99, 46,120, 42,118,101, 99, 46,120, 32, 43, 32,118,101, 99, 46,121, 42,118,101, 99, 46,121, 32, 43,
 - 32,118,101, 99, 46,122, 42,118,101, 99, 46,122, 41, 42, 50, 48, 46, 48, 59, 10,  9,102,108,111, 97,116, 32,119,105, 32, 61, 32,
 - 48, 46, 53, 32, 43, 32, 48, 46, 53, 42,115,105,110, 40, 97, 41, 59, 10, 10,  9,118, 97,108,117,101, 32, 61, 32,119,105, 59, 10,
 -  9, 99,111,108,111,114, 32, 61, 32,118,101, 99, 52, 40,119,105, 44, 32,119,105, 44, 32,119,105, 44, 32, 49, 46, 48, 41, 59, 10,
 -  9,110,111,114,109, 97,108, 32, 61, 32,118,101, 99, 51, 40, 48, 46, 48, 44, 32, 48, 46, 48, 44, 32, 48, 46, 48, 41, 59, 10,125,
 - 10, 10,118,111,105,100, 32,116,101,120,116,117,114,101, 95,105,109, 97,103,101, 40,118,101, 99, 51, 32,118,101, 99, 44, 32,115,
 - 97,109,112,108,101,114, 50, 68, 32,105,109, 97, 44, 32,111,117,116, 32,102,108,111, 97,116, 32,118, 97,108,117,101, 44, 32,111,
 -117,116, 32,118,101, 99, 52, 32, 99,111,108,111,114, 44, 32,111,117,116, 32,118,101, 99, 51, 32,110,111,114,109, 97,108, 41, 10,
 -123, 10,  9, 99,111,108,111,114, 32, 61, 32,116,101,120,116,117,114,101, 50, 68, 40,105,109, 97, 44, 32, 40,118,101, 99, 46,120,
 -121, 32, 43, 32,118,101, 99, 50, 40, 49, 46, 48, 44, 32, 49, 46, 48, 41, 41, 42, 48, 46, 53, 41, 59, 10,  9,118, 97,108,117,101,
 - 32, 61, 32, 49, 46, 48, 59, 10, 10,  9,110,111,114,109, 97,108, 46,120, 32, 61, 32, 50, 46, 48,&n